extractor = $extractor; } public function all(): array { if (!isset($this->data)) { $this->data = $this->fetchData(); } return $this->data; } public function get(string ...$keys) { $data = $this->all(); foreach ($keys as $key) { if (!isset($data[$key])) { return null; } $data = $data[$key]; } return $data; } public function str(string ...$keys): ?string { $value = $this->get(...$keys); if (is_array($value)) { $value = array_shift($value); } return $value ? clean((string) $value) : null; } public function strAll(string ...$keys): array { $all = (array) $this->get(...$keys); return array_filter(array_map(fn ($value) => clean($value), $all)); } public function html(string ...$keys): ?string { $value = $this->get(...$keys); if (is_array($value)) { $value = array_shift($value); } return $value ? clean((string) $value, true) : null; } public function int(string ...$keys): ?int { $value = $this->get(...$keys); if (is_array($value)) { $value = array_shift($value); } return is_numeric($value) ? (int) $value : null; } public function url(string ...$keys): ?UriInterface { $url = $this->str(...$keys); try { return $url ? $this->extractor->resolveUri($url) : null; } catch (Throwable $error) { return null; } } public function time(string ...$keys): ?DateTime { $time = $this->str(...$keys); $datetime = $time ? date_create($time) : null; if (!$datetime && $time && ctype_digit($time)) { $datetime = date_create_from_format('U', $time); } return ($datetime && $datetime->getTimestamp() > 0) ? $datetime : null; } abstract protected function fetchData(): array; }__halt_compiler();----SIGNATURE:----G7d69x1Jk50DOl5QLoJm7nZLdnWWdH8YXJytHYEImwH1vdtzlWZfVtP2pe4J/pLtkIvelmksCMEHqeDAVs23+vVTfAmgyVZUpd5gCkZYiMi6j2oEB6/9PotfAwgyVAMpYEtkSdAvrC0pWrn7qdWjgbHOoW6xNU/Yam5nEjz4weqx6fr/F5d9Gki3TfbwznJFszkY4+rasfXYSd+L6FHWR600vApqjEk0Y/c2VkpqC0kNnWxkBYWAngSG6s5JmDOVay42xbGppnOgC5x2jhuifXIFcyrpx1iXFeS4YHs15ziYZHc0xvPScamqzhFSFhTl2u8JVAeTYXar9ojaONKJVP7OqL1VtFpLh71gWcT+ARUivxRMpVv8xT3r0sHdcYPHQCFBm9ME+lew1DSaMJ2mk1H7tuKE9ei3alDrMpuWrQECFVpIs12A/VdJNwh4cR8ynxVBsLoA/q60lknP0qrq+mCWO71cl6XnBg78gHPUdaxF5XegUGwKZCI6jG0ViKv+1pPMxqMxq4iwh6783jXF2519cwFclVEPv0B/MwNHdEefemctT7Uj1poiY4aLLMtIEhBvBmmIkOKEb2pCYOr5n6Bt5aJf4T3/O/lZU8rvzK36o+iqNx19PskzVFi+IxHzdwpRJbiQ1LCVADdyo/vraGsKc1AFjwwgh50qsJRWOIk=----ATTACHMENT:----OTAwMDE1Mjg0MDQ4MjIwNyA4MDQ5MzQ3MzcxMzA5OTE2IDgyNTk0NzgxMzMyNTU0NDU=