Changeset 60771 for trunk/src/wp-includes/SimplePie/src/Parser.php
- Timestamp:
- 09/16/2025 10:45:37 PM (2 months ago)
- File:
-
- 1 edited
-
trunk/src/wp-includes/SimplePie/src/Parser.php (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/SimplePie/src/Parser.php
r59141 r60771 1 1 <?php 2 2 3 /** 4 * SimplePie 5 * 6 * A PHP-Based RSS and Atom Feed Framework. 7 * Takes the hard work out of managing a complete RSS/Atom solution. 8 * 9 * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without modification, are 13 * permitted provided that the following conditions are met: 14 * 15 * * Redistributions of source code must retain the above copyright notice, this list of 16 * conditions and the following disclaimer. 17 * 18 * * Redistributions in binary form must reproduce the above copyright notice, this list 19 * of conditions and the following disclaimer in the documentation and/or other materials 20 * provided with the distribution. 21 * 22 * * Neither the name of the SimplePie Team nor the names of its contributors may be used 23 * to endorse or promote products derived from this software without specific prior 24 * written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 27 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 28 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS 29 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 33 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 * 36 * @package SimplePie 37 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue 38 * @author Ryan Parman 39 * @author Sam Sneddon 40 * @author Ryan McCue 41 * @link http://simplepie.org/ SimplePie 42 * @license http://www.opensource.org/licenses/bsd-license.php BSD License 43 */ 3 // SPDX-FileCopyrightText: 2004-2023 Ryan Parman, Sam Sneddon, Ryan McCue 4 // SPDX-License-Identifier: BSD-3-Clause 5 6 declare(strict_types=1); 44 7 45 8 namespace SimplePie; 46 9 47 10 use SimplePie\XML\Declaration\Parser as DeclarationParser; 11 use XMLParser; 48 12 49 13 /** … … 52 16 * 53 17 * This class can be overloaded with {@see \SimplePie\SimplePie::set_parser_class()} 54 *55 * @package SimplePie56 * @subpackage Parsing57 18 */ 58 19 class Parser implements RegistryAware 59 20 { 21 /** @var int */ 60 22 public $error_code; 23 /** @var string */ 61 24 public $error_string; 25 /** @var int */ 62 26 public $current_line; 27 /** @var int */ 63 28 public $current_column; 29 /** @var int */ 64 30 public $current_byte; 31 /** @var string */ 65 32 public $separator = ' '; 33 /** @var string[] */ 66 34 public $namespace = ['']; 35 /** @var string[] */ 67 36 public $element = ['']; 37 /** @var string[] */ 68 38 public $xml_base = ['']; 39 /** @var bool[] */ 69 40 public $xml_base_explicit = [false]; 41 /** @var string[] */ 70 42 public $xml_lang = ['']; 43 /** @var array<string, mixed> */ 71 44 public $data = []; 45 /** @var array<array<string, mixed>> */ 72 46 public $datas = [[]]; 47 /** @var int */ 73 48 public $current_xhtml_construct = -1; 49 /** @var string */ 74 50 public $encoding; 51 /** @var Registry */ 75 52 protected $registry; 76 53 77 public function set_registry(\SimplePie\Registry $registry)/* : void */ 54 /** 55 * @return void 56 */ 57 public function set_registry(\SimplePie\Registry $registry) 78 58 { 79 59 $this->registry = $registry; 80 60 } 81 61 82 public function parse(&$data, $encoding, $url = '') 62 /** 63 * @return bool 64 */ 65 public function parse(string &$data, string $encoding, string $url = '') 83 66 { 84 67 if (class_exists('DOMXpath') && function_exists('Mf2\parse')) { … … 90 73 $query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '. 91 74 'contains(concat(" ", @class, " "), " h-entry ")]'; 75 /** @var \DOMNodeList<\DOMElement> $result */ 92 76 $result = $xpath->query($query); 93 77 if ($result->length !== 0) { … … 129 113 if ($declaration->parse()) { 130 114 $data = substr($data, $pos + 2); 131 $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data; 115 $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . "\n" . 116 self::set_doctype($data); 132 117 } else { 133 118 $this->error_string = 'SimplePie bug! Please report this!'; 134 119 return false; 135 120 } 121 } else { 122 $data = self::set_doctype($data); 136 123 } 137 124 … … 142 129 $parser_check = xml_parser_create(); 143 130 xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); 144 xml_parser_free($parser_check); 131 if (\PHP_VERSION_ID < 80000) { 132 xml_parser_free($parser_check); 133 } 145 134 $xml_is_sane = isset($values[0]['value']); 146 135 } … … 161 150 //Parse by chunks not to use too much memory 162 151 do { 163 $stream_data = fread($stream, 1048576); 164 if (!xml_parse($xml, $stream_data === false ? '' : $stream_data, feof($stream))) { 152 $stream_data = (string) fread($stream, 1048576); 153 154 if (!xml_parse($xml, $stream_data, feof($stream))) { 165 155 $this->error_code = xml_get_error_code($xml); 166 $this->error_string = xml_error_string($this->error_code) ;156 $this->error_string = xml_error_string($this->error_code) ?: "Unknown"; 167 157 $return = false; 168 158 break; … … 177 167 $this->current_column = xml_get_current_column_number($xml); 178 168 $this->current_byte = xml_get_current_byte_index($xml); 179 xml_parser_free($xml); 169 if (\PHP_VERSION_ID < 80000) { 170 xml_parser_free($xml); 171 } 180 172 return $return; 181 173 } … … 186 178 while (@$xml->read()) { 187 179 switch ($xml->nodeType) { 188 case constant('XMLReader::END_ELEMENT'):180 case \XMLReader::END_ELEMENT: 189 181 if ($xml->namespaceURI !== '') { 190 182 $tagName = $xml->namespaceURI . $this->separator . $xml->localName; … … 194 186 $this->tag_close(null, $tagName); 195 187 break; 196 case constant('XMLReader::ELEMENT'):188 case \XMLReader::ELEMENT: 197 189 $empty = $xml->isEmptyElement; 198 190 if ($xml->namespaceURI !== '') { … … 215 207 } 216 208 break; 217 case constant('XMLReader::TEXT'):218 219 case constant('XMLReader::CDATA'):209 case \XMLReader::TEXT: 210 211 case \XMLReader::CDATA: 220 212 $this->cdata(null, $xml->value); 221 213 break; … … 233 225 } 234 226 227 /** 228 * @return int 229 */ 235 230 public function get_error_code() 236 231 { … … 238 233 } 239 234 235 /** 236 * @return string 237 */ 240 238 public function get_error_string() 241 239 { … … 243 241 } 244 242 243 /** 244 * @return int 245 */ 245 246 public function get_current_line() 246 247 { … … 248 249 } 249 250 251 /** 252 * @return int 253 */ 250 254 public function get_current_column() 251 255 { … … 253 257 } 254 258 259 /** 260 * @return int 261 */ 255 262 public function get_current_byte() 256 263 { … … 258 265 } 259 266 267 /** 268 * @return array<string, mixed> 269 */ 260 270 public function get_data() 261 271 { … … 263 273 } 264 274 265 public function tag_open($parser, $tag, $attributes) 275 /** 276 * @param XMLParser|resource|null $parser 277 * @param array<string, string> $attributes 278 * @return void 279 */ 280 public function tag_open($parser, string $tag, array $attributes) 266 281 { 267 282 [$this->namespace[], $this->element[]] = $this->split_ns($tag); … … 280 295 } 281 296 } else { 282 $this->xml_base[] = end($this->xml_base) ;297 $this->xml_base[] = end($this->xml_base) ?: ''; 283 298 $this->xml_base_explicit[] = end($this->xml_base_explicit); 284 299 } … … 287 302 $this->xml_lang[] = $attribs[\SimplePie\SimplePie::NAMESPACE_XML]['lang']; 288 303 } else { 289 $this->xml_lang[] = end($this->xml_lang) ;304 $this->xml_lang[] = end($this->xml_lang) ?: ''; 290 305 } 291 306 … … 315 330 } 316 331 317 public function cdata($parser, $cdata) 332 /** 333 * @param XMLParser|resource|null $parser 334 * @return void 335 */ 336 public function cdata($parser, string $cdata) 318 337 { 319 338 if ($this->current_xhtml_construct >= 0) { … … 324 343 } 325 344 326 public function tag_close($parser, $tag) 345 /** 346 * @param XMLParser|resource|null $parser 347 * @return void 348 */ 349 public function tag_close($parser, string $tag) 327 350 { 328 351 if ($this->current_xhtml_construct >= 0) { … … 344 367 } 345 368 346 public function split_ns($string) 369 /** 370 * @return array{string, string} 371 */ 372 public function split_ns(string $string) 347 373 { 348 374 static $cache = []; … … 375 401 } 376 402 377 private function parse_hcard($data, $category = false) 403 /** 404 * @param array<string, mixed> $data 405 */ 406 private function parse_hcard(array $data, bool $category = false): string 378 407 { 379 408 $name = ''; … … 399 428 } 400 429 401 private function parse_microformats(&$data, $url) 402 { 430 /** 431 * @return true 432 */ 433 private function parse_microformats(string &$data, string $url): bool 434 { 435 // For PHPStan, we already check that in call site. 436 \assert(function_exists('Mf2\parse')); 437 \assert(function_exists('Mf2\fetch')); 403 438 $feed_title = ''; 404 439 $feed_author = null; … … 486 521 $author = $author_cache[$author]; 487 522 } else { 488 $mf = \Mf2\fetch($author); 489 foreach ($mf['items'] as $hcard) { 490 // Only interested in an h-card by itself in this case. 491 if (!in_array('h-card', $hcard['type'])) { 492 continue; 523 if ($mf = \Mf2\fetch($author)) { 524 foreach ($mf['items'] as $hcard) { 525 // Only interested in an h-card by itself in this case. 526 if (!in_array('h-card', $hcard['type'])) { 527 continue; 528 } 529 // It must have a url property matching what we fetched. 530 if (!isset($hcard['properties']['url']) || 531 !(in_array($author, $hcard['properties']['url']))) { 532 continue; 533 } 534 // Save parse_hcard the trouble of finding the correct url. 535 $hcard['properties']['url'][0] = $author; 536 // Cache this h-card for the next h-entry to check. 537 $author_cache[$author] = $this->parse_hcard($hcard); 538 $author = $author_cache[$author]; 539 break; 493 540 } 494 // It must have a url property matching what we fetched.495 if (!isset($hcard['properties']['url']) ||496 !(in_array($author, $hcard['properties']['url']))) {497 continue;498 }499 // Save parse_hcard the trouble of finding the correct url.500 $hcard['properties']['url'][0] = $author;501 // Cache this h-card for the next h-entry to check.502 $author_cache[$author] = $this->parse_hcard($hcard);503 $author = $author_cache[$author];504 break;505 541 } 506 542 } … … 620 656 } 621 657 622 private function declare_html_entities() 658 private static function set_doctype(string $data): string 659 { 660 // Strip DOCTYPE except if containing an [internal subset] 661 $data = preg_replace('/^\\s*<!DOCTYPE\\s[^>\\[\\]]*>\s*/', '', $data) ?? $data; 662 // Declare HTML entities only if no remaining DOCTYPE 663 $doctype = preg_match('/^\\s*<!DOCTYPE\\s/', $data) ? '' : self::declare_html_entities(); 664 return $doctype . $data; 665 } 666 667 private static function declare_html_entities(): string 623 668 { 624 669 // This is required because the RSS specification says that entity-encoded 625 670 // html is allowed, but the xml specification says they must be declared. 626 return '<!DOCTYPE html[ <!ENTITY nbsp " "> <!ENTITY iexcl "¡"> <!ENTITY cent "¢"> <!ENTITY pound "£"> <!ENTITY curren "¤"> <!ENTITY yen "¥"> <!ENTITY brvbar "¦"> <!ENTITY sect "§"> <!ENTITY uml "¨"> <!ENTITY copy "©"> <!ENTITY ordf "ª"> <!ENTITY laquo "«"> <!ENTITY not "¬"> <!ENTITY shy "­"> <!ENTITY reg "®"> <!ENTITY macr "¯"> <!ENTITY deg "°"> <!ENTITY plusmn "±"> <!ENTITY sup2 "²"> <!ENTITY sup3 "³"> <!ENTITY acute "´"> <!ENTITY micro "µ"> <!ENTITY para "¶"> <!ENTITY middot "·"> <!ENTITY cedil "¸"> <!ENTITY sup1 "¹"> <!ENTITY ordm "º"> <!ENTITY raquo "»"> <!ENTITY frac14 "¼"> <!ENTITY frac12 "½"> <!ENTITY frac34 "¾"> <!ENTITY iquest "¿"> <!ENTITY Agrave "À"> <!ENTITY Aacute "Á"> <!ENTITY Acirc "Â"> <!ENTITY Atilde "Ã"> <!ENTITY Auml "Ä"> <!ENTITY Aring "Å"> <!ENTITY AElig "Æ"> <!ENTITY Ccedil "Ç"> <!ENTITY Egrave "È"> <!ENTITY Eacute "É"> <!ENTITY Ecirc "Ê"> <!ENTITY Euml "Ë"> <!ENTITY Igrave "Ì"> <!ENTITY Iacute "Í"> <!ENTITY Icirc "Î"> <!ENTITY Iuml "Ï"> <!ENTITY ETH "Ð"> <!ENTITY Ntilde "Ñ"> <!ENTITY Ograve "Ò"> <!ENTITY Oacute "Ó"> <!ENTITY Ocirc "Ô"> <!ENTITY Otilde "Õ"> <!ENTITY Ouml "Ö"> <!ENTITY times "×"> <!ENTITY Oslash "Ø"> <!ENTITY Ugrave "Ù"> <!ENTITY Uacute "Ú"> <!ENTITY Ucirc "Û"> <!ENTITY Uuml "Ü"> <!ENTITY Yacute "Ý"> <!ENTITY THORN "Þ"> <!ENTITY szlig "ß"> <!ENTITY agrave "à"> <!ENTITY aacute "á"> <!ENTITY acirc "â"> <!ENTITY atilde "ã"> <!ENTITY auml "ä"> <!ENTITY aring "å"> <!ENTITY aelig "æ"> <!ENTITY ccedil "ç"> <!ENTITY egrave "è"> <!ENTITY eacute "é"> <!ENTITY ecirc "ê"> <!ENTITY euml "ë"> <!ENTITY igrave "ì"> <!ENTITY iacute "í"> <!ENTITY icirc "î"> <!ENTITY iuml "ï"> <!ENTITY eth "ð"> <!ENTITY ntilde "ñ"> <!ENTITY ograve "ò"> <!ENTITY oacute "ó"> <!ENTITY ocirc "ô"> <!ENTITY otilde "õ"> <!ENTITY ouml "ö"> <!ENTITY divide "÷"> <!ENTITY oslash "ø"> <!ENTITY ugrave "ù"> <!ENTITY uacute "ú"> <!ENTITY ucirc "û"> <!ENTITY uuml "ü"> <!ENTITY yacute "ý"> <!ENTITY thorn "þ"> <!ENTITY yuml "ÿ"> <!ENTITY OElig "Œ"> <!ENTITY oelig "œ"> <!ENTITY Scaron "Š"> <!ENTITY scaron "š"> <!ENTITY Yuml "Ÿ"> <!ENTITY fnof "ƒ"> <!ENTITY circ "ˆ"> <!ENTITY tilde "˜"> <!ENTITY Alpha "Α"> <!ENTITY Beta "Β"> <!ENTITY Gamma "Γ"> <!ENTITY Epsilon "Ε"> <!ENTITY Zeta "Ζ"> <!ENTITY Eta "Η"> <!ENTITY Theta "Θ"> <!ENTITY Iota "Ι"> <!ENTITY Kappa "Κ"> <!ENTITY Lambda "Λ"> <!ENTITY Mu "Μ"> <!ENTITY Nu "Ν"> <!ENTITY Xi "Ξ"> <!ENTITY Omicron "Ο"> <!ENTITY Pi "Π"> <!ENTITY Rho "Ρ"> <!ENTITY Sigma "Σ"> <!ENTITY Tau "Τ"> <!ENTITY Upsilon "Υ"> <!ENTITY Phi "Φ"> <!ENTITY Chi "Χ"> <!ENTITY Psi "Ψ"> <!ENTITY Omega "Ω"> <!ENTITY alpha "α"> <!ENTITY beta "β"> <!ENTITY gamma "γ"> <!ENTITY delta "δ"> <!ENTITY epsilon "ε"> <!ENTITY zeta "ζ"> <!ENTITY eta "η"> <!ENTITY theta "θ"> <!ENTITY iota "ι"> <!ENTITY kappa "κ"> <!ENTITY lambda "λ"> <!ENTITY mu "μ"> <!ENTITY nu "ν"> <!ENTITY xi "ξ"> <!ENTITY omicron "ο"> <!ENTITY pi "π"> <!ENTITY rho "ρ"> <!ENTITY sigmaf "ς"> <!ENTITY sigma "σ"> <!ENTITY tau "τ"> <!ENTITY upsilon "υ"> <!ENTITY phi "φ"> <!ENTITY chi "χ"> <!ENTITY psi "ψ"> <!ENTITY omega "ω"> <!ENTITY thetasym "ϑ"> <!ENTITY upsih "ϒ"> <!ENTITY piv "ϖ"> <!ENTITY ensp " "> <!ENTITY emsp " "> <!ENTITY thinsp " "> <!ENTITY zwnj "‌"> <!ENTITY zwj "‍"> <!ENTITY lrm "‎"> <!ENTITY rlm "‏"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY sbquo "‚"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY bdquo "„"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> <!ENTITY bull "•"> <!ENTITY hellip "…"> <!ENTITY permil "‰"> <!ENTITY prime "′"> <!ENTITY Prime "″"> <!ENTITY lsaquo "‹"> <!ENTITY rsaquo "›"> <!ENTITY oline "‾"> <!ENTITY frasl "⁄"> <!ENTITY euro "€"> <!ENTITY image "ℑ"> <!ENTITY weierp "℘"> <!ENTITY real "ℜ"> <!ENTITY trade "™"> <!ENTITY alefsym "ℵ"> <!ENTITY larr "←"> <!ENTITY uarr "↑"> <!ENTITY rarr "→"> <!ENTITY darr "↓"> <!ENTITY harr "↔"> <!ENTITY crarr "↵"> <!ENTITY lArr "⇐"> <!ENTITY uArr "⇑"> <!ENTITY rArr "⇒"> <!ENTITY dArr "⇓"> <!ENTITY hArr "⇔"> <!ENTITY forall "∀"> <!ENTITY part "∂"> <!ENTITY exist "∃"> <!ENTITY empty "∅"> <!ENTITY nabla "∇"> <!ENTITY isin "∈"> <!ENTITY notin "∉"> <!ENTITY ni "∋"> <!ENTITY prod "∏"> <!ENTITY sum "∑"> <!ENTITY minus "−"> <!ENTITY lowast "∗"> <!ENTITY radic "√"> <!ENTITY prop "∝"> <!ENTITY infin "∞"> <!ENTITY ang "∠"> <!ENTITY and "∧"> <!ENTITY or "∨"> <!ENTITY cap "∩"> <!ENTITY cup "∪"> <!ENTITY int "∫"> <!ENTITY there4 "∴"> <!ENTITY sim "∼"> <!ENTITY cong "≅"> <!ENTITY asymp "≈"> <!ENTITY ne "≠"> <!ENTITY equiv "≡"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY sub "⊂"> <!ENTITY sup "⊃"> <!ENTITY nsub "⊄"> <!ENTITY sube "⊆"> <!ENTITY supe "⊇"> <!ENTITY oplus "⊕"> <!ENTITY otimes "⊗"> <!ENTITY perp "⊥"> <!ENTITY sdot "⋅"> <!ENTITY lceil "⌈"> <!ENTITY rceil "⌉"> <!ENTITY lfloor "⌊"> <!ENTITY rfloor "⌋"> <!ENTITY lang "〈"> <!ENTITY rang "〉"> <!ENTITY loz "◊"> <!ENTITY spades "♠"> <!ENTITY clubs "♣"> <!ENTITY hearts "♥"> <!ENTITY diams "♦"> ]>';671 return '<!DOCTYPE rss [ <!ENTITY nbsp " "> <!ENTITY iexcl "¡"> <!ENTITY cent "¢"> <!ENTITY pound "£"> <!ENTITY curren "¤"> <!ENTITY yen "¥"> <!ENTITY brvbar "¦"> <!ENTITY sect "§"> <!ENTITY uml "¨"> <!ENTITY copy "©"> <!ENTITY ordf "ª"> <!ENTITY laquo "«"> <!ENTITY not "¬"> <!ENTITY shy "­"> <!ENTITY reg "®"> <!ENTITY macr "¯"> <!ENTITY deg "°"> <!ENTITY plusmn "±"> <!ENTITY sup2 "²"> <!ENTITY sup3 "³"> <!ENTITY acute "´"> <!ENTITY micro "µ"> <!ENTITY para "¶"> <!ENTITY middot "·"> <!ENTITY cedil "¸"> <!ENTITY sup1 "¹"> <!ENTITY ordm "º"> <!ENTITY raquo "»"> <!ENTITY frac14 "¼"> <!ENTITY frac12 "½"> <!ENTITY frac34 "¾"> <!ENTITY iquest "¿"> <!ENTITY Agrave "À"> <!ENTITY Aacute "Á"> <!ENTITY Acirc "Â"> <!ENTITY Atilde "Ã"> <!ENTITY Auml "Ä"> <!ENTITY Aring "Å"> <!ENTITY AElig "Æ"> <!ENTITY Ccedil "Ç"> <!ENTITY Egrave "È"> <!ENTITY Eacute "É"> <!ENTITY Ecirc "Ê"> <!ENTITY Euml "Ë"> <!ENTITY Igrave "Ì"> <!ENTITY Iacute "Í"> <!ENTITY Icirc "Î"> <!ENTITY Iuml "Ï"> <!ENTITY ETH "Ð"> <!ENTITY Ntilde "Ñ"> <!ENTITY Ograve "Ò"> <!ENTITY Oacute "Ó"> <!ENTITY Ocirc "Ô"> <!ENTITY Otilde "Õ"> <!ENTITY Ouml "Ö"> <!ENTITY times "×"> <!ENTITY Oslash "Ø"> <!ENTITY Ugrave "Ù"> <!ENTITY Uacute "Ú"> <!ENTITY Ucirc "Û"> <!ENTITY Uuml "Ü"> <!ENTITY Yacute "Ý"> <!ENTITY THORN "Þ"> <!ENTITY szlig "ß"> <!ENTITY agrave "à"> <!ENTITY aacute "á"> <!ENTITY acirc "â"> <!ENTITY atilde "ã"> <!ENTITY auml "ä"> <!ENTITY aring "å"> <!ENTITY aelig "æ"> <!ENTITY ccedil "ç"> <!ENTITY egrave "è"> <!ENTITY eacute "é"> <!ENTITY ecirc "ê"> <!ENTITY euml "ë"> <!ENTITY igrave "ì"> <!ENTITY iacute "í"> <!ENTITY icirc "î"> <!ENTITY iuml "ï"> <!ENTITY eth "ð"> <!ENTITY ntilde "ñ"> <!ENTITY ograve "ò"> <!ENTITY oacute "ó"> <!ENTITY ocirc "ô"> <!ENTITY otilde "õ"> <!ENTITY ouml "ö"> <!ENTITY divide "÷"> <!ENTITY oslash "ø"> <!ENTITY ugrave "ù"> <!ENTITY uacute "ú"> <!ENTITY ucirc "û"> <!ENTITY uuml "ü"> <!ENTITY yacute "ý"> <!ENTITY thorn "þ"> <!ENTITY yuml "ÿ"> <!ENTITY OElig "Œ"> <!ENTITY oelig "œ"> <!ENTITY Scaron "Š"> <!ENTITY scaron "š"> <!ENTITY Yuml "Ÿ"> <!ENTITY fnof "ƒ"> <!ENTITY circ "ˆ"> <!ENTITY tilde "˜"> <!ENTITY Alpha "Α"> <!ENTITY Beta "Β"> <!ENTITY Gamma "Γ"> <!ENTITY Epsilon "Ε"> <!ENTITY Zeta "Ζ"> <!ENTITY Eta "Η"> <!ENTITY Theta "Θ"> <!ENTITY Iota "Ι"> <!ENTITY Kappa "Κ"> <!ENTITY Lambda "Λ"> <!ENTITY Mu "Μ"> <!ENTITY Nu "Ν"> <!ENTITY Xi "Ξ"> <!ENTITY Omicron "Ο"> <!ENTITY Pi "Π"> <!ENTITY Rho "Ρ"> <!ENTITY Sigma "Σ"> <!ENTITY Tau "Τ"> <!ENTITY Upsilon "Υ"> <!ENTITY Phi "Φ"> <!ENTITY Chi "Χ"> <!ENTITY Psi "Ψ"> <!ENTITY Omega "Ω"> <!ENTITY alpha "α"> <!ENTITY beta "β"> <!ENTITY gamma "γ"> <!ENTITY delta "δ"> <!ENTITY epsilon "ε"> <!ENTITY zeta "ζ"> <!ENTITY eta "η"> <!ENTITY theta "θ"> <!ENTITY iota "ι"> <!ENTITY kappa "κ"> <!ENTITY lambda "λ"> <!ENTITY mu "μ"> <!ENTITY nu "ν"> <!ENTITY xi "ξ"> <!ENTITY omicron "ο"> <!ENTITY pi "π"> <!ENTITY rho "ρ"> <!ENTITY sigmaf "ς"> <!ENTITY sigma "σ"> <!ENTITY tau "τ"> <!ENTITY upsilon "υ"> <!ENTITY phi "φ"> <!ENTITY chi "χ"> <!ENTITY psi "ψ"> <!ENTITY omega "ω"> <!ENTITY thetasym "ϑ"> <!ENTITY upsih "ϒ"> <!ENTITY piv "ϖ"> <!ENTITY ensp " "> <!ENTITY emsp " "> <!ENTITY thinsp " "> <!ENTITY zwnj "‌"> <!ENTITY zwj "‍"> <!ENTITY lrm "‎"> <!ENTITY rlm "‏"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY sbquo "‚"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY bdquo "„"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> <!ENTITY bull "•"> <!ENTITY hellip "…"> <!ENTITY permil "‰"> <!ENTITY prime "′"> <!ENTITY Prime "″"> <!ENTITY lsaquo "‹"> <!ENTITY rsaquo "›"> <!ENTITY oline "‾"> <!ENTITY frasl "⁄"> <!ENTITY euro "€"> <!ENTITY image "ℑ"> <!ENTITY weierp "℘"> <!ENTITY real "ℜ"> <!ENTITY trade "™"> <!ENTITY alefsym "ℵ"> <!ENTITY larr "←"> <!ENTITY uarr "↑"> <!ENTITY rarr "→"> <!ENTITY darr "↓"> <!ENTITY harr "↔"> <!ENTITY crarr "↵"> <!ENTITY lArr "⇐"> <!ENTITY uArr "⇑"> <!ENTITY rArr "⇒"> <!ENTITY dArr "⇓"> <!ENTITY hArr "⇔"> <!ENTITY forall "∀"> <!ENTITY part "∂"> <!ENTITY exist "∃"> <!ENTITY empty "∅"> <!ENTITY nabla "∇"> <!ENTITY isin "∈"> <!ENTITY notin "∉"> <!ENTITY ni "∋"> <!ENTITY prod "∏"> <!ENTITY sum "∑"> <!ENTITY minus "−"> <!ENTITY lowast "∗"> <!ENTITY radic "√"> <!ENTITY prop "∝"> <!ENTITY infin "∞"> <!ENTITY ang "∠"> <!ENTITY and "∧"> <!ENTITY or "∨"> <!ENTITY cap "∩"> <!ENTITY cup "∪"> <!ENTITY int "∫"> <!ENTITY there4 "∴"> <!ENTITY sim "∼"> <!ENTITY cong "≅"> <!ENTITY asymp "≈"> <!ENTITY ne "≠"> <!ENTITY equiv "≡"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY sub "⊂"> <!ENTITY sup "⊃"> <!ENTITY nsub "⊄"> <!ENTITY sube "⊆"> <!ENTITY supe "⊇"> <!ENTITY oplus "⊕"> <!ENTITY otimes "⊗"> <!ENTITY perp "⊥"> <!ENTITY sdot "⋅"> <!ENTITY lceil "⌈"> <!ENTITY rceil "⌉"> <!ENTITY lfloor "⌊"> <!ENTITY rfloor "⌋"> <!ENTITY lang "〈"> <!ENTITY rang "〉"> <!ENTITY loz "◊"> <!ENTITY spades "♠"> <!ENTITY clubs "♣"> <!ENTITY hearts "♥"> <!ENTITY diams "♦"> ]>'; 627 672 } 628 673 }
Note: See TracChangeset
for help on using the changeset viewer.