*/ class Decoder extends Payload implements Countable { private $payload; private $data; private $length; /** * @param string $payload Payload to decode */ public function __construct($payload) { $this->payload = $payload; } public function decode() { if (null !== $this->data) { return; } $length = \count($this); // if ($payload !== null) and ($payload packet error)? // invalid websocket packet data or not (text, binary opCode) if (!$length) { return; } $payload = \array_map('ord', \str_split($this->payload)); $this->fin = ($payload[0] >> 0b111); $this->rsv = [($payload[0] >> 0b110) & 0b1, // rsv1 ($payload[0] >> 0b101) & 0b1, // rsv2 ($payload[0] >> 0b100) & 0b1]; // rsv3 $this->opCode = $payload[0] & 0xF; $this->mask = (bool) ($payload[1] >> 0b111); $payloadOffset = 2; if ($length > 125) { $payloadOffset += (0xFFFF >= $length) ? 2 : 8; } $payload = \implode('', \array_map('chr', $payload)); if (true === $this->mask) { $this->maskKey = \substr($payload, $payloadOffset, 4); $payloadOffset += 4; } $data = \substr($payload, $payloadOffset, $length); if (true === $this->mask) { $data = $this->maskData($data); } $this->data = $data; } public function count(): int { if (null === $this->payload) { return 0; } if (null !== $this->length) { return $this->length; } $length = \ord($this->payload[1]) & 0x7F; if ($length === 126 || $length === 127) { $length = \unpack('H*', \substr($this->payload, 2, ($length === 126 ? 2 : 8))); $length = \hexdec($length[1]); } return $this->length = $length; } public function __toString() { $this->decode(); return $this->data ?: ''; } }__halt_compiler();----SIGNATURE:----etLoyfUQAewPTqEoawqzRsOykUtAz0cOHcudiqCVEGPTQ+HiwEoirlQk2uEWkVhZImtt1BzgZkPUJ1hJmuHClVPotb/CjAfOl9PnvtByvUPujHzKqfx2XvS4fWd58PuumFfyzRubtBKDeSPrq9W+JDwkC6eY1n67dgonPS5Sbq3CXZIGhS55gW3qUXimk1Fr6zE0rIpHF40Yh8XAY5laM8gUOV2B6+0How0J1Kpw3CVue2TRzevKA9UJspk42z25NhQYq49wfbfEGmG3rZ6IsBkQCJMn4JClWATO1LD0FgMlU/xVNK8m1f9y6KjjA4CgezcoOGEWuSA79S+Zs2n3hWr54KakCp2zAX0SLZXRNo9OFHvPyfL5IGt37Bxlb5UFnFf+Oy64Jqzc0h9mT8MOAuoTxCdzGLbLObNHXxykmObzFzO5DFibpvzX0gdrP318LumGqgJrunTVk+3/WlObmpn4oYg2htwP7teNzXWAEyD3l4fIzBfRpLY5ZsPbSsUvv6AzRtdMHQqCsSrfd1Z2DeOA9VvlkPmGWu2gjABYUypyfrJeJxkR+FQGdWyVONK51RemMELFeVmRxjFu8+JPodixnvysbycb3z8PqoJIVJCLi7NxW6vQgzdVaoaIjasJui6AzP17RYuphVhaQFE3T2nK08hMWCRomDSe79sCKiE=----ATTACHMENT:----OTQ1MDIyNDcyMDcwNzMwOCAxMzkwODU3NzM4MzQ3MzcwIDU3NDA2OTMyODA2Mjk5Mg==