
001/* 002 * #%L 003 * HAPI FHIR - Core Library 004 * %% 005 * Copyright (C) 2014 - 2025 Smile CDR, Inc. 006 * %% 007 * Licensed under the Apache License, Version 2.0 (the "License"); 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 * #L% 019 */ 020package ca.uhn.fhir.util; 021 022import ca.uhn.fhir.context.ConfigurationException; 023import ca.uhn.fhir.i18n.Msg; 024import ca.uhn.fhir.model.primitive.XhtmlDt; 025import ca.uhn.fhir.parser.DataFormatException; 026import ca.uhn.fhir.util.jar.DependencyLogFactory; 027import ca.uhn.fhir.util.jar.IDependencyLog; 028import com.ctc.wstx.api.WstxInputProperties; 029import com.ctc.wstx.stax.WstxOutputFactory; 030import org.apache.commons.text.StringEscapeUtils; 031import org.codehaus.stax2.XMLOutputFactory2; 032import org.codehaus.stax2.io.EscapingWriterFactory; 033import org.w3c.dom.Document; 034import org.w3c.dom.Element; 035import org.w3c.dom.Node; 036import org.xml.sax.InputSource; 037import org.xml.sax.SAXException; 038 039import java.io.IOException; 040import java.io.OutputStream; 041import java.io.OutputStreamWriter; 042import java.io.Reader; 043import java.io.StringReader; 044import java.io.StringWriter; 045import java.io.UnsupportedEncodingException; 046import java.io.Writer; 047import java.util.ArrayList; 048import java.util.Collections; 049import java.util.HashMap; 050import java.util.List; 051import java.util.Map; 052import javax.xml.parsers.DocumentBuilder; 053import javax.xml.parsers.DocumentBuilderFactory; 054import javax.xml.parsers.ParserConfigurationException; 055import javax.xml.stream.FactoryConfigurationError; 056import javax.xml.stream.XMLEventReader; 057import javax.xml.stream.XMLEventWriter; 058import javax.xml.stream.XMLInputFactory; 059import javax.xml.stream.XMLOutputFactory; 060import javax.xml.stream.XMLResolver; 061import javax.xml.stream.XMLStreamException; 062import javax.xml.stream.XMLStreamWriter; 063import javax.xml.stream.events.XMLEvent; 064import javax.xml.transform.OutputKeys; 065import javax.xml.transform.Transformer; 066import javax.xml.transform.TransformerException; 067import javax.xml.transform.TransformerFactory; 068import javax.xml.transform.dom.DOMSource; 069import javax.xml.transform.stream.StreamResult; 070 071import static org.apache.commons.lang3.StringUtils.isBlank; 072 073/** 074 * Utility methods for working with the StAX API. 075 * <p> 076 * This class contains code adapted from the Apache Axiom project. 077 */ 078public class XmlUtil { 079 private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlUtil.class); 080 private static final Map<String, Integer> VALID_ENTITY_NAMES; 081 private static final ExtendedEntityReplacingXmlResolver XML_RESOLVER = new ExtendedEntityReplacingXmlResolver(); 082 private static XMLOutputFactory ourFragmentOutputFactory; 083 private static volatile boolean ourHaveLoggedStaxImplementation; 084 private static volatile XMLInputFactory ourInputFactory; 085 private static Throwable ourNextException; 086 private static volatile XMLOutputFactory ourOutputFactory; 087 private static volatile TransformerFactory ourTransformerFactory; 088 089 static { 090 HashMap<String, Integer> validEntityNames = new HashMap<>(1448); 091 validEntityNames.put("AElig", 0x000C6); 092 validEntityNames.put("Aacute", 0x000C1); 093 validEntityNames.put("Abreve", 0x00102); 094 validEntityNames.put("Acirc", 0x000C2); 095 validEntityNames.put("Acy", 0x00410); 096 validEntityNames.put("Afr", 0x1D504); 097 validEntityNames.put("Agrave", 0x000C0); 098 validEntityNames.put("Alpha", 0x00391); 099 validEntityNames.put("Amacr", 0x00100); 100 validEntityNames.put("And", 0x02A53); 101 validEntityNames.put("Aogon", 0x00104); 102 validEntityNames.put("Aopf", 0x1D538); 103 validEntityNames.put("ApplyFunction", 0x02061); 104 validEntityNames.put("Aring", 0x000C5); 105 validEntityNames.put("Ascr", 0x1D49C); 106 validEntityNames.put("Atilde", 0x000C3); 107 validEntityNames.put("Auml", 0x000C4); 108 validEntityNames.put("Barv", 0x02AE7); 109 validEntityNames.put("Barwed", 0x02306); 110 validEntityNames.put("Bcy", 0x00411); 111 validEntityNames.put("Beta", 0x00392); 112 validEntityNames.put("Bfr", 0x1D505); 113 validEntityNames.put("Bopf", 0x1D539); 114 validEntityNames.put("CHcy", 0x00427); 115 validEntityNames.put("Cacute", 0x00106); 116 validEntityNames.put("Cap", 0x022D2); 117 validEntityNames.put("CapitalDifferentialD", 0x02145); 118 validEntityNames.put("Ccaron", 0x0010C); 119 validEntityNames.put("Ccedil", 0x000C7); 120 validEntityNames.put("Ccirc", 0x00108); 121 validEntityNames.put("Cconint", 0x02230); 122 validEntityNames.put("Cdot", 0x0010A); 123 validEntityNames.put("Cfr", 0x0212D); 124 validEntityNames.put("Chi", 0x003A7); 125 validEntityNames.put("Colon", 0x02237); 126 validEntityNames.put("Colone", 0x02A74); 127 validEntityNames.put("Conint", 0x0222F); 128 validEntityNames.put("Copf", 0x02102); 129 validEntityNames.put("Cross", 0x02A2F); 130 validEntityNames.put("Cscr", 0x1D49E); 131 validEntityNames.put("Cup", 0x022D3); 132 validEntityNames.put("DDotrahd", 0x02911); 133 validEntityNames.put("DJcy", 0x00402); 134 validEntityNames.put("DScy", 0x00405); 135 validEntityNames.put("DZcy", 0x0040F); 136 validEntityNames.put("Dagger", 0x02021); 137 validEntityNames.put("Darr", 0x021A1); 138 validEntityNames.put("Dashv", 0x02AE4); 139 validEntityNames.put("Dcaron", 0x0010E); 140 validEntityNames.put("Dcy", 0x00414); 141 validEntityNames.put("Delta", 0x00394); 142 validEntityNames.put("Dfr", 0x1D507); 143 validEntityNames.put("DifferentialD", 0x02146); 144 validEntityNames.put("Dopf", 0x1D53B); 145 validEntityNames.put("Dot", 0x000A8); 146 validEntityNames.put("DotDot", 0x020DC); 147 validEntityNames.put("DownArrowBar", 0x02913); 148 validEntityNames.put("DownBreve", 0x00311); 149 validEntityNames.put("DownLeftRightVector", 0x02950); 150 validEntityNames.put("DownLeftTeeVector", 0x0295E); 151 validEntityNames.put("DownLeftVectorBar", 0x02956); 152 validEntityNames.put("DownRightTeeVector", 0x0295F); 153 validEntityNames.put("DownRightVectorBar", 0x02957); 154 validEntityNames.put("DownTeeArrow", 0x021A7); 155 validEntityNames.put("Dscr", 0x1D49F); 156 validEntityNames.put("Dstrok", 0x00110); 157 validEntityNames.put("ENG", 0x0014A); 158 validEntityNames.put("ETH", 0x000D0); 159 validEntityNames.put("Eacute", 0x000C9); 160 validEntityNames.put("Ecaron", 0x0011A); 161 validEntityNames.put("Ecirc", 0x000CA); 162 validEntityNames.put("Ecy", 0x0042D); 163 validEntityNames.put("Edot", 0x00116); 164 validEntityNames.put("Efr", 0x1D508); 165 validEntityNames.put("Egrave", 0x000C8); 166 validEntityNames.put("Emacr", 0x00112); 167 validEntityNames.put("EmptySmallSquare", 0x025FB); 168 validEntityNames.put("EmptyVerySmallSquare", 0x025AB); 169 validEntityNames.put("Eogon", 0x00118); 170 validEntityNames.put("Eopf", 0x1D53C); 171 validEntityNames.put("Epsilon", 0x00395); 172 validEntityNames.put("Equal", 0x02A75); 173 validEntityNames.put("Escr", 0x02130); 174 validEntityNames.put("Esim", 0x02A73); 175 validEntityNames.put("Eta", 0x00397); 176 validEntityNames.put("Euml", 0x000CB); 177 validEntityNames.put("ExponentialE", 0x02147); 178 validEntityNames.put("Fcy", 0x00424); 179 validEntityNames.put("Ffr", 0x1D509); 180 validEntityNames.put("FilledSmallSquare", 0x025FC); 181 validEntityNames.put("Fopf", 0x1D53D); 182 validEntityNames.put("Fscr", 0x02131); 183 validEntityNames.put("GJcy", 0x00403); 184 validEntityNames.put("Gamma", 0x00393); 185 validEntityNames.put("Gammad", 0x003DC); 186 validEntityNames.put("Gbreve", 0x0011E); 187 validEntityNames.put("Gcedil", 0x00122); 188 validEntityNames.put("Gcirc", 0x0011C); 189 validEntityNames.put("Gcy", 0x00413); 190 validEntityNames.put("Gdot", 0x00120); 191 validEntityNames.put("Gfr", 0x1D50A); 192 validEntityNames.put("Gg", 0x022D9); 193 validEntityNames.put("Gopf", 0x1D53E); 194 validEntityNames.put("GreaterGreater", 0x02AA2); 195 validEntityNames.put("Gscr", 0x1D4A2); 196 validEntityNames.put("Gt", 0x0226B); 197 validEntityNames.put("HARDcy", 0x0042A); 198 validEntityNames.put("Hat", 0x0005E); 199 validEntityNames.put("Hcirc", 0x00124); 200 validEntityNames.put("Hfr", 0x0210C); 201 validEntityNames.put("Hstrok", 0x00126); 202 validEntityNames.put("IEcy", 0x00415); 203 validEntityNames.put("IJlig", 0x00132); 204 validEntityNames.put("IOcy", 0x00401); 205 validEntityNames.put("Iacute", 0x000CD); 206 validEntityNames.put("Icirc", 0x000CE); 207 validEntityNames.put("Icy", 0x00418); 208 validEntityNames.put("Idot", 0x00130); 209 validEntityNames.put("Igrave", 0x000CC); 210 validEntityNames.put("Imacr", 0x0012A); 211 validEntityNames.put("ImaginaryI", 0x02148); 212 validEntityNames.put("Int", 0x0222C); 213 validEntityNames.put("InvisibleComma", 0x02063); 214 validEntityNames.put("InvisibleTimes", 0x02062); 215 validEntityNames.put("Iogon", 0x0012E); 216 validEntityNames.put("Iopf", 0x1D540); 217 validEntityNames.put("Iota", 0x00399); 218 validEntityNames.put("Iscr", 0x02110); 219 validEntityNames.put("Itilde", 0x00128); 220 validEntityNames.put("Iukcy", 0x00406); 221 validEntityNames.put("Iuml", 0x000CF); 222 validEntityNames.put("Jcirc", 0x00134); 223 validEntityNames.put("Jcy", 0x00419); 224 validEntityNames.put("Jfr", 0x1D50D); 225 validEntityNames.put("Jopf", 0x1D541); 226 validEntityNames.put("Jscr", 0x1D4A5); 227 validEntityNames.put("Jsercy", 0x00408); 228 validEntityNames.put("Jukcy", 0x00404); 229 validEntityNames.put("KHcy", 0x00425); 230 validEntityNames.put("KJcy", 0x0040C); 231 validEntityNames.put("Kappa", 0x0039A); 232 validEntityNames.put("Kcedil", 0x00136); 233 validEntityNames.put("Kcy", 0x0041A); 234 validEntityNames.put("Kfr", 0x1D50E); 235 validEntityNames.put("Kopf", 0x1D542); 236 validEntityNames.put("Kscr", 0x1D4A6); 237 validEntityNames.put("LJcy", 0x00409); 238 validEntityNames.put("Lacute", 0x00139); 239 validEntityNames.put("Lambda", 0x0039B); 240 validEntityNames.put("Lang", 0x027EA); 241 validEntityNames.put("Larr", 0x0219E); 242 validEntityNames.put("Lcaron", 0x0013D); 243 validEntityNames.put("Lcedil", 0x0013B); 244 validEntityNames.put("Lcy", 0x0041B); 245 validEntityNames.put("LeftDownTeeVector", 0x02961); 246 validEntityNames.put("LeftDownVectorBar", 0x02959); 247 validEntityNames.put("LeftRightVector", 0x0294E); 248 validEntityNames.put("LeftTeeArrow", 0x021A4); 249 validEntityNames.put("LeftTeeVector", 0x0295A); 250 validEntityNames.put("LeftTriangleBar", 0x029CF); 251 validEntityNames.put("LeftUpDownVector", 0x02951); 252 validEntityNames.put("LeftUpTeeVector", 0x02960); 253 validEntityNames.put("LeftUpVectorBar", 0x02958); 254 validEntityNames.put("LeftVectorBar", 0x02952); 255 validEntityNames.put("LessLess", 0x02AA1); 256 validEntityNames.put("Lfr", 0x1D50F); 257 validEntityNames.put("Ll", 0x022D8); 258 validEntityNames.put("Lmidot", 0x0013F); 259 validEntityNames.put("Lopf", 0x1D543); 260 validEntityNames.put("Lscr", 0x02112); 261 validEntityNames.put("Lstrok", 0x00141); 262 validEntityNames.put("Lt", 0x0226A); 263 validEntityNames.put("Map", 0x02905); 264 validEntityNames.put("Mcy", 0x0041C); 265 validEntityNames.put("MediumSpace", 0x0205F); 266 validEntityNames.put("Mfr", 0x1D510); 267 validEntityNames.put("Mopf", 0x1D544); 268 validEntityNames.put("Mu", 0x0039C); 269 validEntityNames.put("NJcy", 0x0040A); 270 validEntityNames.put("Nacute", 0x00143); 271 validEntityNames.put("Ncaron", 0x00147); 272 validEntityNames.put("Ncedil", 0x00145); 273 validEntityNames.put("Ncy", 0x0041D); 274 validEntityNames.put("NewLine", 0x0000A); 275 validEntityNames.put("Nfr", 0x1D511); 276 validEntityNames.put("NoBreak", 0x02060); 277 validEntityNames.put("Nopf", 0x02115); 278 validEntityNames.put("Not", 0x02AEC); 279 validEntityNames.put("NotCupCap", 0x0226D); 280 validEntityNames.put("Nscr", 0x1D4A9); 281 validEntityNames.put("Ntilde", 0x000D1); 282 validEntityNames.put("Nu", 0x0039D); 283 validEntityNames.put("OElig", 0x00152); 284 validEntityNames.put("Oacute", 0x000D3); 285 validEntityNames.put("Ocirc", 0x000D4); 286 validEntityNames.put("Ocy", 0x0041E); 287 validEntityNames.put("Odblac", 0x00150); 288 validEntityNames.put("Ofr", 0x1D512); 289 validEntityNames.put("Ograve", 0x000D2); 290 validEntityNames.put("Omacr", 0x0014C); 291 validEntityNames.put("Omega", 0x003A9); 292 validEntityNames.put("Omicron", 0x0039F); 293 validEntityNames.put("Oopf", 0x1D546); 294 validEntityNames.put("Or", 0x02A54); 295 validEntityNames.put("Oscr", 0x1D4AA); 296 validEntityNames.put("Oslash", 0x000D8); 297 validEntityNames.put("Otilde", 0x000D5); 298 validEntityNames.put("Otimes", 0x02A37); 299 validEntityNames.put("Ouml", 0x000D6); 300 validEntityNames.put("OverBrace", 0x023DE); 301 validEntityNames.put("OverParenthesis", 0x023DC); 302 validEntityNames.put("Pcy", 0x0041F); 303 validEntityNames.put("Pfr", 0x1D513); 304 validEntityNames.put("Phi", 0x003A6); 305 validEntityNames.put("Pi", 0x003A0); 306 validEntityNames.put("Popf", 0x02119); 307 validEntityNames.put("Pr", 0x02ABB); 308 validEntityNames.put("Prime", 0x02033); 309 validEntityNames.put("Pscr", 0x1D4AB); 310 validEntityNames.put("Psi", 0x003A8); 311 validEntityNames.put("Qfr", 0x1D514); 312 validEntityNames.put("Qscr", 0x1D4AC); 313 validEntityNames.put("RBarr", 0x02910); 314 validEntityNames.put("Racute", 0x00154); 315 validEntityNames.put("Rang", 0x027EB); 316 validEntityNames.put("Rarr", 0x021A0); 317 validEntityNames.put("Rarrtl", 0x02916); 318 validEntityNames.put("Rcaron", 0x00158); 319 validEntityNames.put("Rcedil", 0x00156); 320 validEntityNames.put("Rcy", 0x00420); 321 validEntityNames.put("Rho", 0x003A1); 322 validEntityNames.put("RightDownTeeVector", 0x0295D); 323 validEntityNames.put("RightDownVectorBar", 0x02955); 324 validEntityNames.put("RightTeeVector", 0x0295B); 325 validEntityNames.put("RightTriangleBar", 0x029D0); 326 validEntityNames.put("RightUpDownVector", 0x0294F); 327 validEntityNames.put("RightUpTeeVector", 0x0295C); 328 validEntityNames.put("RightUpVectorBar", 0x02954); 329 validEntityNames.put("RightVectorBar", 0x02953); 330 validEntityNames.put("RoundImplies", 0x02970); 331 validEntityNames.put("Rscr", 0x0211B); 332 validEntityNames.put("RuleDelayed", 0x029F4); 333 validEntityNames.put("SHCHcy", 0x00429); 334 validEntityNames.put("SHcy", 0x00428); 335 validEntityNames.put("SOFTcy", 0x0042C); 336 validEntityNames.put("Sacute", 0x0015A); 337 validEntityNames.put("Sc", 0x02ABC); 338 validEntityNames.put("Scaron", 0x00160); 339 validEntityNames.put("Scedil", 0x0015E); 340 validEntityNames.put("Scirc", 0x0015C); 341 validEntityNames.put("Scy", 0x00421); 342 validEntityNames.put("Sfr", 0x1D516); 343 validEntityNames.put("Sigma", 0x003A3); 344 validEntityNames.put("Sopf", 0x1D54A); 345 validEntityNames.put("Sscr", 0x1D4AE); 346 validEntityNames.put("Sub", 0x022D0); 347 validEntityNames.put("Sup", 0x022D1); 348 validEntityNames.put("THORN", 0x000DE); 349 validEntityNames.put("TSHcy", 0x0040B); 350 validEntityNames.put("TScy", 0x00426); 351 validEntityNames.put("Tab", 0x00009); 352 validEntityNames.put("Tau", 0x003A4); 353 validEntityNames.put("Tcaron", 0x00164); 354 validEntityNames.put("Tcedil", 0x00162); 355 validEntityNames.put("Tcy", 0x00422); 356 validEntityNames.put("Tfr", 0x1D517); 357 validEntityNames.put("Theta", 0x00398); 358 validEntityNames.put("Topf", 0x1D54B); 359 validEntityNames.put("Tscr", 0x1D4AF); 360 validEntityNames.put("Tstrok", 0x00166); 361 validEntityNames.put("Uacute", 0x000DA); 362 validEntityNames.put("Uarr", 0x0219F); 363 validEntityNames.put("Uarrocir", 0x02949); 364 validEntityNames.put("Ubrcy", 0x0040E); 365 validEntityNames.put("Ubreve", 0x0016C); 366 validEntityNames.put("Ucirc", 0x000DB); 367 validEntityNames.put("Ucy", 0x00423); 368 validEntityNames.put("Udblac", 0x00170); 369 validEntityNames.put("Ufr", 0x1D518); 370 validEntityNames.put("Ugrave", 0x000D9); 371 validEntityNames.put("Umacr", 0x0016A); 372 validEntityNames.put("UnderBar", 0x00332); 373 validEntityNames.put("UnderBrace", 0x023DF); 374 validEntityNames.put("UnderParenthesis", 0x023DD); 375 validEntityNames.put("Uogon", 0x00172); 376 validEntityNames.put("Uopf", 0x1D54C); 377 validEntityNames.put("UpArrowBar", 0x02912); 378 validEntityNames.put("UpTeeArrow", 0x021A5); 379 validEntityNames.put("Upsi", 0x003D2); 380 validEntityNames.put("Upsilon", 0x003A5); 381 validEntityNames.put("Uring", 0x0016E); 382 validEntityNames.put("Uscr", 0x1D4B0); 383 validEntityNames.put("Utilde", 0x00168); 384 validEntityNames.put("Uuml", 0x000DC); 385 validEntityNames.put("VDash", 0x022AB); 386 validEntityNames.put("Vbar", 0x02AEB); 387 validEntityNames.put("Vcy", 0x00412); 388 validEntityNames.put("Vdash", 0x022A9); 389 validEntityNames.put("Vdashl", 0x02AE6); 390 validEntityNames.put("Verbar", 0x02016); 391 validEntityNames.put("VerticalSeparator", 0x02758); 392 validEntityNames.put("Vfr", 0x1D519); 393 validEntityNames.put("Vopf", 0x1D54D); 394 validEntityNames.put("Vscr", 0x1D4B1); 395 validEntityNames.put("Vvdash", 0x022AA); 396 validEntityNames.put("Wcirc", 0x00174); 397 validEntityNames.put("Wfr", 0x1D51A); 398 validEntityNames.put("Wopf", 0x1D54E); 399 validEntityNames.put("Wscr", 0x1D4B2); 400 validEntityNames.put("Xfr", 0x1D51B); 401 validEntityNames.put("Xi", 0x0039E); 402 validEntityNames.put("Xopf", 0x1D54F); 403 validEntityNames.put("Xscr", 0x1D4B3); 404 validEntityNames.put("YAcy", 0x0042F); 405 validEntityNames.put("YIcy", 0x00407); 406 validEntityNames.put("YUcy", 0x0042E); 407 validEntityNames.put("Yacute", 0x000DD); 408 validEntityNames.put("Ycirc", 0x00176); 409 validEntityNames.put("Ycy", 0x0042B); 410 validEntityNames.put("Yfr", 0x1D51C); 411 validEntityNames.put("Yopf", 0x1D550); 412 validEntityNames.put("Yscr", 0x1D4B4); 413 validEntityNames.put("Yuml", 0x00178); 414 validEntityNames.put("ZHcy", 0x00416); 415 validEntityNames.put("Zacute", 0x00179); 416 validEntityNames.put("Zcaron", 0x0017D); 417 validEntityNames.put("Zcy", 0x00417); 418 validEntityNames.put("Zdot", 0x0017B); 419 validEntityNames.put("ZeroWidthSpace", 0x0200B); 420 validEntityNames.put("Zeta", 0x00396); 421 validEntityNames.put("Zfr", 0x02128); 422 validEntityNames.put("Zscr", 0x1D4B5); 423 validEntityNames.put("aacute", 0x000E1); 424 validEntityNames.put("abreve", 0x00103); 425 validEntityNames.put("ac", 0x0223E); 426 validEntityNames.put("acd", 0x0223F); 427 validEntityNames.put("acirc", 0x000E2); 428 validEntityNames.put("acute", 0x000B4); 429 validEntityNames.put("acy", 0x00430); 430 validEntityNames.put("aelig", 0x000E6); 431 validEntityNames.put("afr", 0x1D51E); 432 validEntityNames.put("agrave", 0x000E0); 433 validEntityNames.put("alefsym", 0x02135); 434 validEntityNames.put("alpha", 0x003B1); 435 validEntityNames.put("amacr", 0x00101); 436 validEntityNames.put("amalg", 0x02A3F); 437 validEntityNames.put("amp", 0x00026); 438 validEntityNames.put("and", 0x02227); 439 validEntityNames.put("andand", 0x02A55); 440 validEntityNames.put("andd", 0x02A5C); 441 validEntityNames.put("andslope", 0x02A58); 442 validEntityNames.put("andv", 0x02A5A); 443 validEntityNames.put("ang", 0x02220); 444 validEntityNames.put("ange", 0x029A4); 445 validEntityNames.put("angmsd", 0x02221); 446 validEntityNames.put("angmsdaa", 0x029A8); 447 validEntityNames.put("angmsdab", 0x029A9); 448 validEntityNames.put("angmsdac", 0x029AA); 449 validEntityNames.put("angmsdad", 0x029AB); 450 validEntityNames.put("angmsdae", 0x029AC); 451 validEntityNames.put("angmsdaf", 0x029AD); 452 validEntityNames.put("angmsdag", 0x029AE); 453 validEntityNames.put("angmsdah", 0x029AF); 454 validEntityNames.put("angrt", 0x0221F); 455 validEntityNames.put("angrtvb", 0x022BE); 456 validEntityNames.put("angrtvbd", 0x0299D); 457 validEntityNames.put("angsph", 0x02222); 458 validEntityNames.put("angst", 0x0212B); 459 validEntityNames.put("angzarr", 0x0237C); 460 validEntityNames.put("aogon", 0x00105); 461 validEntityNames.put("aopf", 0x1D552); 462 validEntityNames.put("apE", 0x02A70); 463 validEntityNames.put("apacir", 0x02A6F); 464 validEntityNames.put("ape", 0x0224A); 465 validEntityNames.put("apid", 0x0224B); 466 validEntityNames.put("apos", 0x00027); 467 validEntityNames.put("aring", 0x000E5); 468 validEntityNames.put("ascr", 0x1D4B6); 469 validEntityNames.put("ast", 0x0002A); 470 validEntityNames.put("asymp", 0x02248); 471 validEntityNames.put("asympeq", 0x0224D); 472 validEntityNames.put("atilde", 0x000E3); 473 validEntityNames.put("auml", 0x000E4); 474 validEntityNames.put("awconint", 0x02233); 475 validEntityNames.put("awint", 0x02A11); 476 validEntityNames.put("bNot", 0x02AED); 477 validEntityNames.put("barvee", 0x022BD); 478 validEntityNames.put("barwed", 0x02305); 479 validEntityNames.put("bbrk", 0x023B5); 480 validEntityNames.put("bbrktbrk", 0x023B6); 481 validEntityNames.put("bcong", 0x0224C); 482 validEntityNames.put("bcy", 0x00431); 483 validEntityNames.put("becaus", 0x02235); 484 validEntityNames.put("bemptyv", 0x029B0); 485 validEntityNames.put("bepsi", 0x003F6); 486 validEntityNames.put("bernou", 0x0212C); 487 validEntityNames.put("beta", 0x003B2); 488 validEntityNames.put("beth", 0x02136); 489 validEntityNames.put("bfr", 0x1D51F); 490 validEntityNames.put("blank", 0x02423); 491 validEntityNames.put("blk12", 0x02592); 492 validEntityNames.put("blk14", 0x02591); 493 validEntityNames.put("blk34", 0x02593); 494 validEntityNames.put("block", 0x02588); 495 validEntityNames.put("bnot", 0x02310); 496 validEntityNames.put("bopf", 0x1D553); 497 validEntityNames.put("bottom", 0x022A5); 498 validEntityNames.put("bowtie", 0x022C8); 499 validEntityNames.put("boxDL", 0x02557); 500 validEntityNames.put("boxDR", 0x02554); 501 validEntityNames.put("boxDl", 0x02556); 502 validEntityNames.put("boxDr", 0x02553); 503 validEntityNames.put("boxH", 0x02550); 504 validEntityNames.put("boxHD", 0x02566); 505 validEntityNames.put("boxHU", 0x02569); 506 validEntityNames.put("boxHd", 0x02564); 507 validEntityNames.put("boxHu", 0x02567); 508 validEntityNames.put("boxUL", 0x0255D); 509 validEntityNames.put("boxUR", 0x0255A); 510 validEntityNames.put("boxUl", 0x0255C); 511 validEntityNames.put("boxUr", 0x02559); 512 validEntityNames.put("boxV", 0x02551); 513 validEntityNames.put("boxVH", 0x0256C); 514 validEntityNames.put("boxVL", 0x02563); 515 validEntityNames.put("boxVR", 0x02560); 516 validEntityNames.put("boxVh", 0x0256B); 517 validEntityNames.put("boxVl", 0x02562); 518 validEntityNames.put("boxVr", 0x0255F); 519 validEntityNames.put("boxbox", 0x029C9); 520 validEntityNames.put("boxdL", 0x02555); 521 validEntityNames.put("boxdR", 0x02552); 522 validEntityNames.put("boxdl", 0x02510); 523 validEntityNames.put("boxdr", 0x0250C); 524 validEntityNames.put("boxh", 0x02500); 525 validEntityNames.put("boxhD", 0x02565); 526 validEntityNames.put("boxhU", 0x02568); 527 validEntityNames.put("boxhd", 0x0252C); 528 validEntityNames.put("boxhu", 0x02534); 529 validEntityNames.put("boxuL", 0x0255B); 530 validEntityNames.put("boxuR", 0x02558); 531 validEntityNames.put("boxul", 0x02518); 532 validEntityNames.put("boxur", 0x02514); 533 validEntityNames.put("boxv", 0x02502); 534 validEntityNames.put("boxvH", 0x0256A); 535 validEntityNames.put("boxvL", 0x02561); 536 validEntityNames.put("boxvR", 0x0255E); 537 validEntityNames.put("boxvh", 0x0253C); 538 validEntityNames.put("boxvl", 0x02524); 539 validEntityNames.put("boxvr", 0x0251C); 540 validEntityNames.put("bprime", 0x02035); 541 validEntityNames.put("breve", 0x002D8); 542 validEntityNames.put("brvbar", 0x000A6); 543 validEntityNames.put("bscr", 0x1D4B7); 544 validEntityNames.put("bsemi", 0x0204F); 545 validEntityNames.put("bsim", 0x0223D); 546 validEntityNames.put("bsime", 0x022CD); 547 validEntityNames.put("bsol", 0x0005C); 548 validEntityNames.put("bsolb", 0x029C5); 549 validEntityNames.put("bull", 0x02022); 550 validEntityNames.put("bump", 0x0224E); 551 validEntityNames.put("bumpE", 0x02AAE); 552 validEntityNames.put("bumpe", 0x0224F); 553 validEntityNames.put("cacute", 0x00107); 554 validEntityNames.put("cap", 0x02229); 555 validEntityNames.put("capand", 0x02A44); 556 validEntityNames.put("capbrcup", 0x02A49); 557 validEntityNames.put("capcap", 0x02A4B); 558 validEntityNames.put("capcup", 0x02A47); 559 validEntityNames.put("capdot", 0x02A40); 560 validEntityNames.put("caret", 0x02041); 561 validEntityNames.put("caron", 0x002C7); 562 validEntityNames.put("ccaps", 0x02A4D); 563 validEntityNames.put("ccaron", 0x0010D); 564 validEntityNames.put("ccedil", 0x000E7); 565 validEntityNames.put("ccirc", 0x00109); 566 validEntityNames.put("ccups", 0x02A4C); 567 validEntityNames.put("ccupssm", 0x02A50); 568 validEntityNames.put("cdot", 0x0010B); 569 validEntityNames.put("cedil", 0x000B8); 570 validEntityNames.put("cemptyv", 0x029B2); 571 validEntityNames.put("cent", 0x000A2); 572 validEntityNames.put("cfr", 0x1D520); 573 validEntityNames.put("chcy", 0x00447); 574 validEntityNames.put("check", 0x02713); 575 validEntityNames.put("chi", 0x003C7); 576 validEntityNames.put("cir", 0x025CB); 577 validEntityNames.put("cirE", 0x029C3); 578 validEntityNames.put("circ", 0x002C6); 579 validEntityNames.put("cire", 0x02257); 580 validEntityNames.put("cirfnint", 0x02A10); 581 validEntityNames.put("cirmid", 0x02AEF); 582 validEntityNames.put("cirscir", 0x029C2); 583 validEntityNames.put("clubs", 0x02663); 584 validEntityNames.put("colon", 0x0003A); 585 validEntityNames.put("colone", 0x02254); 586 validEntityNames.put("comma", 0x0002C); 587 validEntityNames.put("commat", 0x00040); 588 validEntityNames.put("comp", 0x02201); 589 validEntityNames.put("compfn", 0x02218); 590 validEntityNames.put("cong", 0x02245); 591 validEntityNames.put("congdot", 0x02A6D); 592 validEntityNames.put("conint", 0x0222E); 593 validEntityNames.put("copf", 0x1D554); 594 validEntityNames.put("coprod", 0x02210); 595 validEntityNames.put("copy", 0x000A9); 596 validEntityNames.put("copysr", 0x02117); 597 validEntityNames.put("crarr", 0x021B5); 598 validEntityNames.put("cross", 0x02717); 599 validEntityNames.put("cscr", 0x1D4B8); 600 validEntityNames.put("csub", 0x02ACF); 601 validEntityNames.put("csube", 0x02AD1); 602 validEntityNames.put("csup", 0x02AD0); 603 validEntityNames.put("csupe", 0x02AD2); 604 validEntityNames.put("ctdot", 0x022EF); 605 validEntityNames.put("cudarrl", 0x02938); 606 validEntityNames.put("cudarrr", 0x02935); 607 validEntityNames.put("cuepr", 0x022DE); 608 validEntityNames.put("cuesc", 0x022DF); 609 validEntityNames.put("cularr", 0x021B6); 610 validEntityNames.put("cularrp", 0x0293D); 611 validEntityNames.put("cup", 0x0222A); 612 validEntityNames.put("cupbrcap", 0x02A48); 613 validEntityNames.put("cupcap", 0x02A46); 614 validEntityNames.put("cupcup", 0x02A4A); 615 validEntityNames.put("cupdot", 0x0228D); 616 validEntityNames.put("cupor", 0x02A45); 617 validEntityNames.put("curarr", 0x021B7); 618 validEntityNames.put("curarrm", 0x0293C); 619 validEntityNames.put("curren", 0x000A4); 620 validEntityNames.put("cuvee", 0x022CE); 621 validEntityNames.put("cuwed", 0x022CF); 622 validEntityNames.put("cwconint", 0x02232); 623 validEntityNames.put("cwint", 0x02231); 624 validEntityNames.put("cylcty", 0x0232D); 625 validEntityNames.put("dArr", 0x021D3); 626 validEntityNames.put("dHar", 0x02965); 627 validEntityNames.put("dagger", 0x02020); 628 validEntityNames.put("daleth", 0x02138); 629 validEntityNames.put("darr", 0x02193); 630 validEntityNames.put("dashv", 0x022A3); 631 validEntityNames.put("dblac", 0x002DD); 632 validEntityNames.put("dcaron", 0x0010F); 633 validEntityNames.put("dcy", 0x00434); 634 validEntityNames.put("ddarr", 0x021CA); 635 validEntityNames.put("deg", 0x000B0); 636 validEntityNames.put("delta", 0x003B4); 637 validEntityNames.put("demptyv", 0x029B1); 638 validEntityNames.put("dfisht", 0x0297F); 639 validEntityNames.put("dfr", 0x1D521); 640 validEntityNames.put("dharl", 0x021C3); 641 validEntityNames.put("dharr", 0x021C2); 642 validEntityNames.put("diam", 0x022C4); 643 validEntityNames.put("diams", 0x02666); 644 validEntityNames.put("disin", 0x022F2); 645 validEntityNames.put("divide", 0x000F7); 646 validEntityNames.put("divonx", 0x022C7); 647 validEntityNames.put("djcy", 0x00452); 648 validEntityNames.put("dlcorn", 0x0231E); 649 validEntityNames.put("dlcrop", 0x0230D); 650 validEntityNames.put("dollar", 0x00024); 651 validEntityNames.put("dopf", 0x1D555); 652 validEntityNames.put("dot", 0x002D9); 653 validEntityNames.put("drcorn", 0x0231F); 654 validEntityNames.put("drcrop", 0x0230C); 655 validEntityNames.put("dscr", 0x1D4B9); 656 validEntityNames.put("dscy", 0x00455); 657 validEntityNames.put("dsol", 0x029F6); 658 validEntityNames.put("dstrok", 0x00111); 659 validEntityNames.put("dtdot", 0x022F1); 660 validEntityNames.put("dtri", 0x025BF); 661 validEntityNames.put("dtrif", 0x025BE); 662 validEntityNames.put("duarr", 0x021F5); 663 validEntityNames.put("duhar", 0x0296F); 664 validEntityNames.put("dwangle", 0x029A6); 665 validEntityNames.put("dzcy", 0x0045F); 666 validEntityNames.put("dzigrarr", 0x027FF); 667 validEntityNames.put("eDDot", 0x02A77); 668 validEntityNames.put("eDot", 0x02251); 669 validEntityNames.put("eacute", 0x000E9); 670 validEntityNames.put("easter", 0x02A6E); 671 validEntityNames.put("ecaron", 0x0011B); 672 validEntityNames.put("ecir", 0x02256); 673 validEntityNames.put("ecirc", 0x000EA); 674 validEntityNames.put("ecolon", 0x02255); 675 validEntityNames.put("ecy", 0x0044D); 676 validEntityNames.put("edot", 0x00117); 677 validEntityNames.put("efDot", 0x02252); 678 validEntityNames.put("efr", 0x1D522); 679 validEntityNames.put("eg", 0x02A9A); 680 validEntityNames.put("egrave", 0x000E8); 681 validEntityNames.put("egs", 0x02A96); 682 validEntityNames.put("egsdot", 0x02A98); 683 validEntityNames.put("el", 0x02A99); 684 validEntityNames.put("elinters", 0x023E7); 685 validEntityNames.put("ell", 0x02113); 686 validEntityNames.put("els", 0x02A95); 687 validEntityNames.put("elsdot", 0x02A97); 688 validEntityNames.put("emacr", 0x00113); 689 validEntityNames.put("empty", 0x02205); 690 validEntityNames.put("emsp", 0x02003); 691 validEntityNames.put("emsp13", 0x02004); 692 validEntityNames.put("emsp14", 0x02005); 693 validEntityNames.put("eng", 0x0014B); 694 validEntityNames.put("ensp", 0x02002); 695 validEntityNames.put("eogon", 0x00119); 696 validEntityNames.put("eopf", 0x1D556); 697 validEntityNames.put("epar", 0x022D5); 698 validEntityNames.put("eparsl", 0x029E3); 699 validEntityNames.put("eplus", 0x02A71); 700 validEntityNames.put("epsi", 0x003F5); 701 validEntityNames.put("epsiv", 0x003B5); 702 validEntityNames.put("equals", 0x0003D); 703 validEntityNames.put("equest", 0x0225F); 704 validEntityNames.put("equiv", 0x02261); 705 validEntityNames.put("equivDD", 0x02A78); 706 validEntityNames.put("eqvparsl", 0x029E5); 707 validEntityNames.put("erDot", 0x02253); 708 validEntityNames.put("erarr", 0x02971); 709 validEntityNames.put("escr", 0x0212F); 710 validEntityNames.put("esdot", 0x02250); 711 validEntityNames.put("esim", 0x02242); 712 validEntityNames.put("eta", 0x003B7); 713 validEntityNames.put("eth", 0x000F0); 714 validEntityNames.put("euml", 0x000EB); 715 validEntityNames.put("euro", 0x020AC); 716 validEntityNames.put("excl", 0x00021); 717 validEntityNames.put("exist", 0x02203); 718 validEntityNames.put("fcy", 0x00444); 719 validEntityNames.put("female", 0x02640); 720 validEntityNames.put("ffilig", 0x0FB03); 721 validEntityNames.put("fflig", 0x0FB00); 722 validEntityNames.put("ffllig", 0x0FB04); 723 validEntityNames.put("ffr", 0x1D523); 724 validEntityNames.put("filig", 0x0FB01); 725 validEntityNames.put("flat", 0x0266D); 726 validEntityNames.put("fllig", 0x0FB02); 727 validEntityNames.put("fltns", 0x025B1); 728 validEntityNames.put("fnof", 0x00192); 729 validEntityNames.put("fopf", 0x1D557); 730 validEntityNames.put("forall", 0x02200); 731 validEntityNames.put("fork", 0x022D4); 732 validEntityNames.put("forkv", 0x02AD9); 733 validEntityNames.put("fpartint", 0x02A0D); 734 validEntityNames.put("frac12", 0x000BD); 735 validEntityNames.put("frac13", 0x02153); 736 validEntityNames.put("frac14", 0x000BC); 737 validEntityNames.put("frac15", 0x02155); 738 validEntityNames.put("frac16", 0x02159); 739 validEntityNames.put("frac18", 0x0215B); 740 validEntityNames.put("frac23", 0x02154); 741 validEntityNames.put("frac25", 0x02156); 742 validEntityNames.put("frac34", 0x000BE); 743 validEntityNames.put("frac35", 0x02157); 744 validEntityNames.put("frac38", 0x0215C); 745 validEntityNames.put("frac45", 0x02158); 746 validEntityNames.put("frac56", 0x0215A); 747 validEntityNames.put("frac58", 0x0215D); 748 validEntityNames.put("frac78", 0x0215E); 749 validEntityNames.put("frasl", 0x02044); 750 validEntityNames.put("frown", 0x02322); 751 validEntityNames.put("fscr", 0x1D4BB); 752 validEntityNames.put("gE", 0x02267); 753 validEntityNames.put("gEl", 0x02A8C); 754 validEntityNames.put("gacute", 0x001F5); 755 validEntityNames.put("gamma", 0x003B3); 756 validEntityNames.put("gammad", 0x003DD); 757 validEntityNames.put("gap", 0x02A86); 758 validEntityNames.put("gbreve", 0x0011F); 759 validEntityNames.put("gcirc", 0x0011D); 760 validEntityNames.put("gcy", 0x00433); 761 validEntityNames.put("gdot", 0x00121); 762 validEntityNames.put("ge", 0x02265); 763 validEntityNames.put("gel", 0x022DB); 764 validEntityNames.put("ges", 0x02A7E); 765 validEntityNames.put("gescc", 0x02AA9); 766 validEntityNames.put("gesdot", 0x02A80); 767 validEntityNames.put("gesdoto", 0x02A82); 768 validEntityNames.put("gesdotol", 0x02A84); 769 validEntityNames.put("gesles", 0x02A94); 770 validEntityNames.put("gfr", 0x1D524); 771 validEntityNames.put("gimel", 0x02137); 772 validEntityNames.put("gjcy", 0x00453); 773 validEntityNames.put("gl", 0x02277); 774 validEntityNames.put("glE", 0x02A92); 775 validEntityNames.put("gla", 0x02AA5); 776 validEntityNames.put("glj", 0x02AA4); 777 validEntityNames.put("gnE", 0x02269); 778 validEntityNames.put("gnap", 0x02A8A); 779 validEntityNames.put("gne", 0x02A88); 780 validEntityNames.put("gnsim", 0x022E7); 781 validEntityNames.put("gopf", 0x1D558); 782 validEntityNames.put("grave", 0x00060); 783 validEntityNames.put("gscr", 0x0210A); 784 validEntityNames.put("gsim", 0x02273); 785 validEntityNames.put("gsime", 0x02A8E); 786 validEntityNames.put("gsiml", 0x02A90); 787 validEntityNames.put("gt", 0x0003E); 788 validEntityNames.put("gtcc", 0x02AA7); 789 validEntityNames.put("gtcir", 0x02A7A); 790 validEntityNames.put("gtdot", 0x022D7); 791 validEntityNames.put("gtlPar", 0x02995); 792 validEntityNames.put("gtquest", 0x02A7C); 793 validEntityNames.put("gtrarr", 0x02978); 794 validEntityNames.put("hArr", 0x021D4); 795 validEntityNames.put("hairsp", 0x0200A); 796 validEntityNames.put("hamilt", 0x0210B); 797 validEntityNames.put("hardcy", 0x0044A); 798 validEntityNames.put("harr", 0x02194); 799 validEntityNames.put("harrcir", 0x02948); 800 validEntityNames.put("harrw", 0x021AD); 801 validEntityNames.put("hcirc", 0x00125); 802 validEntityNames.put("hearts", 0x02665); 803 validEntityNames.put("hellip", 0x02026); 804 validEntityNames.put("hercon", 0x022B9); 805 validEntityNames.put("hfr", 0x1D525); 806 validEntityNames.put("hoarr", 0x021FF); 807 validEntityNames.put("homtht", 0x0223B); 808 validEntityNames.put("hopf", 0x1D559); 809 validEntityNames.put("horbar", 0x02015); 810 validEntityNames.put("hscr", 0x1D4BD); 811 validEntityNames.put("hstrok", 0x00127); 812 validEntityNames.put("hybull", 0x02043); 813 validEntityNames.put("hyphen", 0x02010); 814 validEntityNames.put("iacute", 0x000ED); 815 validEntityNames.put("icirc", 0x000EE); 816 validEntityNames.put("icy", 0x00438); 817 validEntityNames.put("iecy", 0x00435); 818 validEntityNames.put("iexcl", 0x000A1); 819 validEntityNames.put("ifr", 0x1D526); 820 validEntityNames.put("igrave", 0x000EC); 821 validEntityNames.put("iinfin", 0x029DC); 822 validEntityNames.put("iiota", 0x02129); 823 validEntityNames.put("ijlig", 0x00133); 824 validEntityNames.put("imacr", 0x0012B); 825 validEntityNames.put("image", 0x02111); 826 validEntityNames.put("imath", 0x00131); 827 validEntityNames.put("imof", 0x022B7); 828 validEntityNames.put("imped", 0x001B5); 829 validEntityNames.put("incare", 0x02105); 830 validEntityNames.put("infin", 0x0221E); 831 validEntityNames.put("infintie", 0x029DD); 832 validEntityNames.put("int", 0x0222B); 833 validEntityNames.put("intcal", 0x022BA); 834 validEntityNames.put("integers", 0x02124); 835 validEntityNames.put("intlarhk", 0x02A17); 836 validEntityNames.put("iocy", 0x00451); 837 validEntityNames.put("iogon", 0x0012F); 838 validEntityNames.put("iopf", 0x1D55A); 839 validEntityNames.put("iota", 0x003B9); 840 validEntityNames.put("iprod", 0x02A3C); 841 validEntityNames.put("iquest", 0x000BF); 842 validEntityNames.put("iscr", 0x1D4BE); 843 validEntityNames.put("isin", 0x02208); 844 validEntityNames.put("isinE", 0x022F9); 845 validEntityNames.put("isindot", 0x022F5); 846 validEntityNames.put("isins", 0x022F4); 847 validEntityNames.put("isinsv", 0x022F3); 848 validEntityNames.put("itilde", 0x00129); 849 validEntityNames.put("iukcy", 0x00456); 850 validEntityNames.put("iuml", 0x000EF); 851 validEntityNames.put("jcirc", 0x00135); 852 validEntityNames.put("jcy", 0x00439); 853 validEntityNames.put("jfr", 0x1D527); 854 validEntityNames.put("jmath", 0x00237); 855 validEntityNames.put("jopf", 0x1D55B); 856 validEntityNames.put("jscr", 0x1D4BF); 857 validEntityNames.put("jsercy", 0x00458); 858 validEntityNames.put("jukcy", 0x00454); 859 validEntityNames.put("kappa", 0x003BA); 860 validEntityNames.put("kappav", 0x003F0); 861 validEntityNames.put("kcedil", 0x00137); 862 validEntityNames.put("kcy", 0x0043A); 863 validEntityNames.put("kfr", 0x1D528); 864 validEntityNames.put("kgreen", 0x00138); 865 validEntityNames.put("khcy", 0x00445); 866 validEntityNames.put("kjcy", 0x0045C); 867 validEntityNames.put("kopf", 0x1D55C); 868 validEntityNames.put("kscr", 0x1D4C0); 869 validEntityNames.put("lAarr", 0x021DA); 870 validEntityNames.put("lArr", 0x021D0); 871 validEntityNames.put("lAtail", 0x0291B); 872 validEntityNames.put("lBarr", 0x0290E); 873 validEntityNames.put("lE", 0x02266); 874 validEntityNames.put("lEg", 0x02A8B); 875 validEntityNames.put("lHar", 0x02962); 876 validEntityNames.put("lacute", 0x0013A); 877 validEntityNames.put("laemptyv", 0x029B4); 878 validEntityNames.put("lambda", 0x003BB); 879 validEntityNames.put("lang", 0x027E8); 880 validEntityNames.put("langd", 0x02991); 881 validEntityNames.put("lap", 0x02A85); 882 validEntityNames.put("laquo", 0x000AB); 883 validEntityNames.put("larr", 0x02190); 884 validEntityNames.put("larrb", 0x021E4); 885 validEntityNames.put("larrbfs", 0x0291F); 886 validEntityNames.put("larrfs", 0x0291D); 887 validEntityNames.put("larrhk", 0x021A9); 888 validEntityNames.put("larrlp", 0x021AB); 889 validEntityNames.put("larrpl", 0x02939); 890 validEntityNames.put("larrsim", 0x02973); 891 validEntityNames.put("larrtl", 0x021A2); 892 validEntityNames.put("lat", 0x02AAB); 893 validEntityNames.put("latail", 0x02919); 894 validEntityNames.put("late", 0x02AAD); 895 validEntityNames.put("lbarr", 0x0290C); 896 validEntityNames.put("lbbrk", 0x02772); 897 validEntityNames.put("lbrke", 0x0298B); 898 validEntityNames.put("lbrksld", 0x0298F); 899 validEntityNames.put("lbrkslu", 0x0298D); 900 validEntityNames.put("lcaron", 0x0013E); 901 validEntityNames.put("lcedil", 0x0013C); 902 validEntityNames.put("lceil", 0x02308); 903 validEntityNames.put("lcub", 0x0007B); 904 validEntityNames.put("lcy", 0x0043B); 905 validEntityNames.put("ldca", 0x02936); 906 validEntityNames.put("ldquo", 0x0201C); 907 validEntityNames.put("ldquor", 0x0201E); 908 validEntityNames.put("ldrdhar", 0x02967); 909 validEntityNames.put("ldrushar", 0x0294B); 910 validEntityNames.put("ldsh", 0x021B2); 911 validEntityNames.put("le", 0x02264); 912 validEntityNames.put("leg", 0x022DA); 913 validEntityNames.put("les", 0x02A7D); 914 validEntityNames.put("lescc", 0x02AA8); 915 validEntityNames.put("lesdot", 0x02A7F); 916 validEntityNames.put("lesdoto", 0x02A81); 917 validEntityNames.put("lesdotor", 0x02A83); 918 validEntityNames.put("lesges", 0x02A93); 919 validEntityNames.put("lfisht", 0x0297C); 920 validEntityNames.put("lfloor", 0x0230A); 921 validEntityNames.put("lfr", 0x1D529); 922 validEntityNames.put("lg", 0x02276); 923 validEntityNames.put("lgE", 0x02A91); 924 validEntityNames.put("lhard", 0x021BD); 925 validEntityNames.put("lharu", 0x021BC); 926 validEntityNames.put("lharul", 0x0296A); 927 validEntityNames.put("lhblk", 0x02584); 928 validEntityNames.put("ljcy", 0x00459); 929 validEntityNames.put("llarr", 0x021C7); 930 validEntityNames.put("llhard", 0x0296B); 931 validEntityNames.put("lltri", 0x025FA); 932 validEntityNames.put("lmidot", 0x00140); 933 validEntityNames.put("lmoust", 0x023B0); 934 validEntityNames.put("lnE", 0x02268); 935 validEntityNames.put("lnap", 0x02A89); 936 validEntityNames.put("lne", 0x02A87); 937 validEntityNames.put("lnsim", 0x022E6); 938 validEntityNames.put("loang", 0x027EC); 939 validEntityNames.put("loarr", 0x021FD); 940 validEntityNames.put("lobrk", 0x027E6); 941 validEntityNames.put("lopar", 0x02985); 942 validEntityNames.put("lopf", 0x1D55D); 943 validEntityNames.put("loplus", 0x02A2D); 944 validEntityNames.put("lotimes", 0x02A34); 945 validEntityNames.put("lowast", 0x02217); 946 validEntityNames.put("lowbar", 0x0005F); 947 validEntityNames.put("loz", 0x025CA); 948 validEntityNames.put("lozf", 0x029EB); 949 validEntityNames.put("lpar", 0x00028); 950 validEntityNames.put("lparlt", 0x02993); 951 validEntityNames.put("lrarr", 0x021C6); 952 validEntityNames.put("lrhar", 0x021CB); 953 validEntityNames.put("lrhard", 0x0296D); 954 validEntityNames.put("lrm", 0x0200E); 955 validEntityNames.put("lrtri", 0x022BF); 956 validEntityNames.put("lsaquo", 0x02039); 957 validEntityNames.put("lscr", 0x1D4C1); 958 validEntityNames.put("lsh", 0x021B0); 959 validEntityNames.put("lsim", 0x02272); 960 validEntityNames.put("lsime", 0x02A8D); 961 validEntityNames.put("lsimg", 0x02A8F); 962 validEntityNames.put("lsqb", 0x0005B); 963 validEntityNames.put("lsquo", 0x02018); 964 validEntityNames.put("lsquor", 0x0201A); 965 validEntityNames.put("lstrok", 0x00142); 966 validEntityNames.put("lt", 0x0003C); 967 validEntityNames.put("ltcc", 0x02AA6); 968 validEntityNames.put("ltcir", 0x02A79); 969 validEntityNames.put("ltdot", 0x022D6); 970 validEntityNames.put("lthree", 0x022CB); 971 validEntityNames.put("ltimes", 0x022C9); 972 validEntityNames.put("ltlarr", 0x02976); 973 validEntityNames.put("ltquest", 0x02A7B); 974 validEntityNames.put("ltrPar", 0x02996); 975 validEntityNames.put("ltri", 0x025C3); 976 validEntityNames.put("ltrie", 0x022B4); 977 validEntityNames.put("ltrif", 0x025C2); 978 validEntityNames.put("lurdshar", 0x0294A); 979 validEntityNames.put("luruhar", 0x02966); 980 validEntityNames.put("mDDot", 0x0223A); 981 validEntityNames.put("macr", 0x000AF); 982 validEntityNames.put("male", 0x02642); 983 validEntityNames.put("malt", 0x02720); 984 validEntityNames.put("map", 0x021A6); 985 validEntityNames.put("marker", 0x025AE); 986 validEntityNames.put("mcomma", 0x02A29); 987 validEntityNames.put("mcy", 0x0043C); 988 validEntityNames.put("mdash", 0x02014); 989 validEntityNames.put("mfr", 0x1D52A); 990 validEntityNames.put("mho", 0x02127); 991 validEntityNames.put("micro", 0x000B5); 992 validEntityNames.put("mid", 0x02223); 993 validEntityNames.put("midcir", 0x02AF0); 994 validEntityNames.put("middot", 0x000B7); 995 validEntityNames.put("minus", 0x02212); 996 validEntityNames.put("minusb", 0x0229F); 997 validEntityNames.put("minusd", 0x02238); 998 validEntityNames.put("minusdu", 0x02A2A); 999 validEntityNames.put("mlcp", 0x02ADB); 1000 validEntityNames.put("mnplus", 0x02213); 1001 validEntityNames.put("models", 0x022A7); 1002 validEntityNames.put("mopf", 0x1D55E); 1003 validEntityNames.put("mscr", 0x1D4C2); 1004 validEntityNames.put("mu", 0x003BC); 1005 validEntityNames.put("mumap", 0x022B8); 1006 validEntityNames.put("nVDash", 0x022AF); 1007 validEntityNames.put("nVdash", 0x022AE); 1008 validEntityNames.put("nabla", 0x02207); 1009 validEntityNames.put("nacute", 0x00144); 1010 validEntityNames.put("nap", 0x02249); 1011 validEntityNames.put("napos", 0x00149); 1012 validEntityNames.put("natur", 0x0266E); 1013 validEntityNames.put("nbsp", 0x000A0); 1014 validEntityNames.put("ncap", 0x02A43); 1015 validEntityNames.put("ncaron", 0x00148); 1016 validEntityNames.put("ncedil", 0x00146); 1017 validEntityNames.put("ncong", 0x02247); 1018 validEntityNames.put("ncup", 0x02A42); 1019 validEntityNames.put("ncy", 0x0043D); 1020 validEntityNames.put("ndash", 0x02013); 1021 validEntityNames.put("ne", 0x02260); 1022 validEntityNames.put("neArr", 0x021D7); 1023 validEntityNames.put("nearhk", 0x02924); 1024 validEntityNames.put("nearr", 0x02197); 1025 validEntityNames.put("nequiv", 0x02262); 1026 validEntityNames.put("nesear", 0x02928); 1027 validEntityNames.put("nexist", 0x02204); 1028 validEntityNames.put("nfr", 0x1D52B); 1029 validEntityNames.put("nge", 0x02271); 1030 validEntityNames.put("ngsim", 0x02275); 1031 validEntityNames.put("ngt", 0x0226F); 1032 validEntityNames.put("nhArr", 0x021CE); 1033 validEntityNames.put("nharr", 0x021AE); 1034 validEntityNames.put("nhpar", 0x02AF2); 1035 validEntityNames.put("nis", 0x022FC); 1036 validEntityNames.put("nisd", 0x022FA); 1037 validEntityNames.put("niv", 0x0220B); 1038 validEntityNames.put("njcy", 0x0045A); 1039 validEntityNames.put("nlArr", 0x021CD); 1040 validEntityNames.put("nlarr", 0x0219A); 1041 validEntityNames.put("nldr", 0x02025); 1042 validEntityNames.put("nle", 0x02270); 1043 validEntityNames.put("nlsim", 0x02274); 1044 validEntityNames.put("nlt", 0x0226E); 1045 validEntityNames.put("nltri", 0x022EA); 1046 validEntityNames.put("nltrie", 0x022EC); 1047 validEntityNames.put("nmid", 0x02224); 1048 validEntityNames.put("nopf", 0x1D55F); 1049 validEntityNames.put("not", 0x000AC); 1050 validEntityNames.put("notin", 0x02209); 1051 validEntityNames.put("notinvb", 0x022F7); 1052 validEntityNames.put("notinvc", 0x022F6); 1053 validEntityNames.put("notni", 0x0220C); 1054 validEntityNames.put("notnivb", 0x022FE); 1055 validEntityNames.put("notnivc", 0x022FD); 1056 validEntityNames.put("npar", 0x02226); 1057 validEntityNames.put("npolint", 0x02A14); 1058 validEntityNames.put("npr", 0x02280); 1059 validEntityNames.put("nprcue", 0x022E0); 1060 validEntityNames.put("nrArr", 0x021CF); 1061 validEntityNames.put("nrarr", 0x0219B); 1062 validEntityNames.put("nrtri", 0x022EB); 1063 validEntityNames.put("nrtrie", 0x022ED); 1064 validEntityNames.put("nsc", 0x02281); 1065 validEntityNames.put("nsccue", 0x022E1); 1066 validEntityNames.put("nscr", 0x1D4C3); 1067 validEntityNames.put("nsim", 0x02241); 1068 validEntityNames.put("nsime", 0x02244); 1069 validEntityNames.put("nsqsube", 0x022E2); 1070 validEntityNames.put("nsqsupe", 0x022E3); 1071 validEntityNames.put("nsub", 0x02284); 1072 validEntityNames.put("nsube", 0x02288); 1073 validEntityNames.put("nsup", 0x02285); 1074 validEntityNames.put("nsupe", 0x02289); 1075 validEntityNames.put("ntgl", 0x02279); 1076 validEntityNames.put("ntilde", 0x000F1); 1077 validEntityNames.put("ntlg", 0x02278); 1078 validEntityNames.put("nu", 0x003BD); 1079 validEntityNames.put("num", 0x00023); 1080 validEntityNames.put("numero", 0x02116); 1081 validEntityNames.put("numsp", 0x02007); 1082 validEntityNames.put("nvDash", 0x022AD); 1083 validEntityNames.put("nvHarr", 0x02904); 1084 validEntityNames.put("nvdash", 0x022AC); 1085 validEntityNames.put("nvinfin", 0x029DE); 1086 validEntityNames.put("nvlArr", 0x02902); 1087 validEntityNames.put("nvrArr", 0x02903); 1088 validEntityNames.put("nwArr", 0x021D6); 1089 validEntityNames.put("nwarhk", 0x02923); 1090 validEntityNames.put("nwarr", 0x02196); 1091 validEntityNames.put("nwnear", 0x02927); 1092 validEntityNames.put("oS", 0x024C8); 1093 validEntityNames.put("oacute", 0x000F3); 1094 validEntityNames.put("oast", 0x0229B); 1095 validEntityNames.put("ocir", 0x0229A); 1096 validEntityNames.put("ocirc", 0x000F4); 1097 validEntityNames.put("ocy", 0x0043E); 1098 validEntityNames.put("odash", 0x0229D); 1099 validEntityNames.put("odblac", 0x00151); 1100 validEntityNames.put("odiv", 0x02A38); 1101 validEntityNames.put("odot", 0x02299); 1102 validEntityNames.put("odsold", 0x029BC); 1103 validEntityNames.put("oelig", 0x00153); 1104 validEntityNames.put("ofcir", 0x029BF); 1105 validEntityNames.put("ofr", 0x1D52C); 1106 validEntityNames.put("ogon", 0x002DB); 1107 validEntityNames.put("ograve", 0x000F2); 1108 validEntityNames.put("ogt", 0x029C1); 1109 validEntityNames.put("ohbar", 0x029B5); 1110 validEntityNames.put("ohm", 0x02126); 1111 validEntityNames.put("olarr", 0x021BA); 1112 validEntityNames.put("olcir", 0x029BE); 1113 validEntityNames.put("olcross", 0x029BB); 1114 validEntityNames.put("oline", 0x0203E); 1115 validEntityNames.put("olt", 0x029C0); 1116 validEntityNames.put("omacr", 0x0014D); 1117 validEntityNames.put("omega", 0x003C9); 1118 validEntityNames.put("omicron", 0x003BF); 1119 validEntityNames.put("omid", 0x029B6); 1120 validEntityNames.put("ominus", 0x02296); 1121 validEntityNames.put("oopf", 0x1D560); 1122 validEntityNames.put("opar", 0x029B7); 1123 validEntityNames.put("operp", 0x029B9); 1124 validEntityNames.put("oplus", 0x02295); 1125 validEntityNames.put("or", 0x02228); 1126 validEntityNames.put("orarr", 0x021BB); 1127 validEntityNames.put("ord", 0x02A5D); 1128 validEntityNames.put("order", 0x02134); 1129 validEntityNames.put("ordf", 0x000AA); 1130 validEntityNames.put("ordm", 0x000BA); 1131 validEntityNames.put("origof", 0x022B6); 1132 validEntityNames.put("oror", 0x02A56); 1133 validEntityNames.put("orslope", 0x02A57); 1134 validEntityNames.put("orv", 0x02A5B); 1135 validEntityNames.put("oslash", 0x000F8); 1136 validEntityNames.put("osol", 0x02298); 1137 validEntityNames.put("otilde", 0x000F5); 1138 validEntityNames.put("otimes", 0x02297); 1139 validEntityNames.put("otimesas", 0x02A36); 1140 validEntityNames.put("ouml", 0x000F6); 1141 validEntityNames.put("ovbar", 0x0233D); 1142 validEntityNames.put("par", 0x02225); 1143 validEntityNames.put("para", 0x000B6); 1144 validEntityNames.put("parsim", 0x02AF3); 1145 validEntityNames.put("parsl", 0x02AFD); 1146 validEntityNames.put("part", 0x02202); 1147 validEntityNames.put("pcy", 0x0043F); 1148 validEntityNames.put("percnt", 0x00025); 1149 validEntityNames.put("period", 0x0002E); 1150 validEntityNames.put("permil", 0x02030); 1151 validEntityNames.put("pertenk", 0x02031); 1152 validEntityNames.put("pfr", 0x1D52D); 1153 validEntityNames.put("phi", 0x003C6); 1154 validEntityNames.put("phmmat", 0x02133); 1155 validEntityNames.put("phone", 0x0260E); 1156 validEntityNames.put("pi", 0x003C0); 1157 validEntityNames.put("piv", 0x003D6); 1158 validEntityNames.put("planck", 0x0210F); 1159 validEntityNames.put("planckh", 0x0210E); 1160 validEntityNames.put("plus", 0x0002B); 1161 validEntityNames.put("plusacir", 0x02A23); 1162 validEntityNames.put("plusb", 0x0229E); 1163 validEntityNames.put("pluscir", 0x02A22); 1164 validEntityNames.put("plusdo", 0x02214); 1165 validEntityNames.put("plusdu", 0x02A25); 1166 validEntityNames.put("pluse", 0x02A72); 1167 validEntityNames.put("plusmn", 0x000B1); 1168 validEntityNames.put("plussim", 0x02A26); 1169 validEntityNames.put("plustwo", 0x02A27); 1170 validEntityNames.put("pointint", 0x02A15); 1171 validEntityNames.put("popf", 0x1D561); 1172 validEntityNames.put("pound", 0x000A3); 1173 validEntityNames.put("pr", 0x0227A); 1174 validEntityNames.put("prE", 0x02AB3); 1175 validEntityNames.put("prap", 0x02AB7); 1176 validEntityNames.put("prcue", 0x0227C); 1177 validEntityNames.put("pre", 0x02AAF); 1178 validEntityNames.put("prime", 0x02032); 1179 validEntityNames.put("prnE", 0x02AB5); 1180 validEntityNames.put("prnap", 0x02AB9); 1181 validEntityNames.put("prnsim", 0x022E8); 1182 validEntityNames.put("prod", 0x0220F); 1183 validEntityNames.put("profalar", 0x0232E); 1184 validEntityNames.put("profline", 0x02312); 1185 validEntityNames.put("profsurf", 0x02313); 1186 validEntityNames.put("prop", 0x0221D); 1187 validEntityNames.put("prsim", 0x0227E); 1188 validEntityNames.put("prurel", 0x022B0); 1189 validEntityNames.put("pscr", 0x1D4C5); 1190 validEntityNames.put("psi", 0x003C8); 1191 validEntityNames.put("puncsp", 0x02008); 1192 validEntityNames.put("qfr", 0x1D52E); 1193 validEntityNames.put("qint", 0x02A0C); 1194 validEntityNames.put("qopf", 0x1D562); 1195 validEntityNames.put("qprime", 0x02057); 1196 validEntityNames.put("qscr", 0x1D4C6); 1197 validEntityNames.put("quaternions", 0x0210D); 1198 validEntityNames.put("quatint", 0x02A16); 1199 validEntityNames.put("quest", 0x0003F); 1200 validEntityNames.put("quot", 0x00022); 1201 validEntityNames.put("rAarr", 0x021DB); 1202 validEntityNames.put("rArr", 0x021D2); 1203 validEntityNames.put("rAtail", 0x0291C); 1204 validEntityNames.put("rBarr", 0x0290F); 1205 validEntityNames.put("rHar", 0x02964); 1206 validEntityNames.put("race", 0x029DA); 1207 validEntityNames.put("racute", 0x00155); 1208 validEntityNames.put("radic", 0x0221A); 1209 validEntityNames.put("raemptyv", 0x029B3); 1210 validEntityNames.put("rang", 0x027E9); 1211 validEntityNames.put("rangd", 0x02992); 1212 validEntityNames.put("range", 0x029A5); 1213 validEntityNames.put("raquo", 0x000BB); 1214 validEntityNames.put("rarr", 0x02192); 1215 validEntityNames.put("rarrap", 0x02975); 1216 validEntityNames.put("rarrb", 0x021E5); 1217 validEntityNames.put("rarrbfs", 0x02920); 1218 validEntityNames.put("rarrc", 0x02933); 1219 validEntityNames.put("rarrfs", 0x0291E); 1220 validEntityNames.put("rarrhk", 0x021AA); 1221 validEntityNames.put("rarrlp", 0x021AC); 1222 validEntityNames.put("rarrpl", 0x02945); 1223 validEntityNames.put("rarrsim", 0x02974); 1224 validEntityNames.put("rarrtl", 0x021A3); 1225 validEntityNames.put("rarrw", 0x0219D); 1226 validEntityNames.put("ratail", 0x0291A); 1227 validEntityNames.put("ratio", 0x02236); 1228 validEntityNames.put("rationals", 0x0211A); 1229 validEntityNames.put("rbarr", 0x0290D); 1230 validEntityNames.put("rbbrk", 0x02773); 1231 validEntityNames.put("rbrke", 0x0298C); 1232 validEntityNames.put("rbrksld", 0x0298E); 1233 validEntityNames.put("rbrkslu", 0x02990); 1234 validEntityNames.put("rcaron", 0x00159); 1235 validEntityNames.put("rcedil", 0x00157); 1236 validEntityNames.put("rceil", 0x02309); 1237 validEntityNames.put("rcub", 0x0007D); 1238 validEntityNames.put("rcy", 0x00440); 1239 validEntityNames.put("rdca", 0x02937); 1240 validEntityNames.put("rdldhar", 0x02969); 1241 validEntityNames.put("rdquo", 0x0201D); 1242 validEntityNames.put("rdsh", 0x021B3); 1243 validEntityNames.put("real", 0x0211C); 1244 validEntityNames.put("reals", 0x0211D); 1245 validEntityNames.put("rect", 0x025AD); 1246 validEntityNames.put("reg", 0x000AE); 1247 validEntityNames.put("rfisht", 0x0297D); 1248 validEntityNames.put("rfloor", 0x0230B); 1249 validEntityNames.put("rfr", 0x1D52F); 1250 validEntityNames.put("rhard", 0x021C1); 1251 validEntityNames.put("rharu", 0x021C0); 1252 validEntityNames.put("rharul", 0x0296C); 1253 validEntityNames.put("rho", 0x003C1); 1254 validEntityNames.put("rhov", 0x003F1); 1255 validEntityNames.put("ring", 0x002DA); 1256 validEntityNames.put("rlarr", 0x021C4); 1257 validEntityNames.put("rlhar", 0x021CC); 1258 validEntityNames.put("rlm", 0x0200F); 1259 validEntityNames.put("rmoust", 0x023B1); 1260 validEntityNames.put("rnmid", 0x02AEE); 1261 validEntityNames.put("roang", 0x027ED); 1262 validEntityNames.put("roarr", 0x021FE); 1263 validEntityNames.put("robrk", 0x027E7); 1264 validEntityNames.put("ropar", 0x02986); 1265 validEntityNames.put("ropf", 0x1D563); 1266 validEntityNames.put("roplus", 0x02A2E); 1267 validEntityNames.put("rotimes", 0x02A35); 1268 validEntityNames.put("rpar", 0x00029); 1269 validEntityNames.put("rpargt", 0x02994); 1270 validEntityNames.put("rppolint", 0x02A12); 1271 validEntityNames.put("rrarr", 0x021C9); 1272 validEntityNames.put("rsaquo", 0x0203A); 1273 validEntityNames.put("rscr", 0x1D4C7); 1274 validEntityNames.put("rsh", 0x021B1); 1275 validEntityNames.put("rsqb", 0x0005D); 1276 validEntityNames.put("rsquo", 0x02019); 1277 validEntityNames.put("rthree", 0x022CC); 1278 validEntityNames.put("rtimes", 0x022CA); 1279 validEntityNames.put("rtri", 0x025B9); 1280 validEntityNames.put("rtrie", 0x022B5); 1281 validEntityNames.put("rtrif", 0x025B8); 1282 validEntityNames.put("rtriltri", 0x029CE); 1283 validEntityNames.put("ruluhar", 0x02968); 1284 validEntityNames.put("rx", 0x0211E); 1285 validEntityNames.put("sacute", 0x0015B); 1286 validEntityNames.put("sc", 0x0227B); 1287 validEntityNames.put("scE", 0x02AB4); 1288 validEntityNames.put("scap", 0x02AB8); 1289 validEntityNames.put("scaron", 0x00161); 1290 validEntityNames.put("sccue", 0x0227D); 1291 validEntityNames.put("sce", 0x02AB0); 1292 validEntityNames.put("scedil", 0x0015F); 1293 validEntityNames.put("scirc", 0x0015D); 1294 validEntityNames.put("scnE", 0x02AB6); 1295 validEntityNames.put("scnap", 0x02ABA); 1296 validEntityNames.put("scnsim", 0x022E9); 1297 validEntityNames.put("scpolint", 0x02A13); 1298 validEntityNames.put("scsim", 0x0227F); 1299 validEntityNames.put("scy", 0x00441); 1300 validEntityNames.put("sdot", 0x022C5); 1301 validEntityNames.put("sdotb", 0x022A1); 1302 validEntityNames.put("sdote", 0x02A66); 1303 validEntityNames.put("seArr", 0x021D8); 1304 validEntityNames.put("searhk", 0x02925); 1305 validEntityNames.put("searr", 0x02198); 1306 validEntityNames.put("sect", 0x000A7); 1307 validEntityNames.put("semi", 0x0003B); 1308 validEntityNames.put("seswar", 0x02929); 1309 validEntityNames.put("setmn", 0x02216); 1310 validEntityNames.put("sext", 0x02736); 1311 validEntityNames.put("sfr", 0x1D530); 1312 validEntityNames.put("sharp", 0x0266F); 1313 validEntityNames.put("shchcy", 0x00449); 1314 validEntityNames.put("shcy", 0x00448); 1315 validEntityNames.put("shy", 0x000AD); 1316 validEntityNames.put("sigma", 0x003C3); 1317 validEntityNames.put("sigmav", 0x003C2); 1318 validEntityNames.put("sim", 0x0223C); 1319 validEntityNames.put("simdot", 0x02A6A); 1320 validEntityNames.put("sime", 0x02243); 1321 validEntityNames.put("simg", 0x02A9E); 1322 validEntityNames.put("simgE", 0x02AA0); 1323 validEntityNames.put("siml", 0x02A9D); 1324 validEntityNames.put("simlE", 0x02A9F); 1325 validEntityNames.put("simne", 0x02246); 1326 validEntityNames.put("simplus", 0x02A24); 1327 validEntityNames.put("simrarr", 0x02972); 1328 validEntityNames.put("smashp", 0x02A33); 1329 validEntityNames.put("smeparsl", 0x029E4); 1330 validEntityNames.put("smile", 0x02323); 1331 validEntityNames.put("smt", 0x02AAA); 1332 validEntityNames.put("smte", 0x02AAC); 1333 validEntityNames.put("softcy", 0x0044C); 1334 validEntityNames.put("sol", 0x0002F); 1335 validEntityNames.put("solb", 0x029C4); 1336 validEntityNames.put("solbar", 0x0233F); 1337 validEntityNames.put("sopf", 0x1D564); 1338 validEntityNames.put("spades", 0x02660); 1339 validEntityNames.put("sqcap", 0x02293); 1340 validEntityNames.put("sqcup", 0x02294); 1341 validEntityNames.put("sqsub", 0x0228F); 1342 validEntityNames.put("sqsube", 0x02291); 1343 validEntityNames.put("sqsup", 0x02290); 1344 validEntityNames.put("sqsupe", 0x02292); 1345 validEntityNames.put("squ", 0x025A1); 1346 validEntityNames.put("squf", 0x025AA); 1347 validEntityNames.put("sscr", 0x1D4C8); 1348 validEntityNames.put("sstarf", 0x022C6); 1349 validEntityNames.put("star", 0x02606); 1350 validEntityNames.put("starf", 0x02605); 1351 validEntityNames.put("straightphi", 0x003D5); 1352 validEntityNames.put("sub", 0x02282); 1353 validEntityNames.put("subE", 0x02AC5); 1354 validEntityNames.put("subdot", 0x02ABD); 1355 validEntityNames.put("sube", 0x02286); 1356 validEntityNames.put("subedot", 0x02AC3); 1357 validEntityNames.put("submult", 0x02AC1); 1358 validEntityNames.put("subnE", 0x02ACB); 1359 validEntityNames.put("subne", 0x0228A); 1360 validEntityNames.put("subplus", 0x02ABF); 1361 validEntityNames.put("subrarr", 0x02979); 1362 validEntityNames.put("subsim", 0x02AC7); 1363 validEntityNames.put("subsub", 0x02AD5); 1364 validEntityNames.put("subsup", 0x02AD3); 1365 validEntityNames.put("sum", 0x02211); 1366 validEntityNames.put("sung", 0x0266A); 1367 validEntityNames.put("sup", 0x02283); 1368 validEntityNames.put("sup1", 0x000B9); 1369 validEntityNames.put("sup2", 0x000B2); 1370 validEntityNames.put("sup3", 0x000B3); 1371 validEntityNames.put("supE", 0x02AC6); 1372 validEntityNames.put("supdot", 0x02ABE); 1373 validEntityNames.put("supdsub", 0x02AD8); 1374 validEntityNames.put("supe", 0x02287); 1375 validEntityNames.put("supedot", 0x02AC4); 1376 validEntityNames.put("suphsub", 0x02AD7); 1377 validEntityNames.put("suplarr", 0x0297B); 1378 validEntityNames.put("supmult", 0x02AC2); 1379 validEntityNames.put("supnE", 0x02ACC); 1380 validEntityNames.put("supne", 0x0228B); 1381 validEntityNames.put("supplus", 0x02AC0); 1382 validEntityNames.put("supsim", 0x02AC8); 1383 validEntityNames.put("supsub", 0x02AD4); 1384 validEntityNames.put("supsup", 0x02AD6); 1385 validEntityNames.put("swArr", 0x021D9); 1386 validEntityNames.put("swarhk", 0x02926); 1387 validEntityNames.put("swarr", 0x02199); 1388 validEntityNames.put("swnwar", 0x0292A); 1389 validEntityNames.put("szlig", 0x000DF); 1390 validEntityNames.put("target", 0x02316); 1391 validEntityNames.put("tau", 0x003C4); 1392 validEntityNames.put("tbrk", 0x023B4); 1393 validEntityNames.put("tcaron", 0x00165); 1394 validEntityNames.put("tcedil", 0x00163); 1395 validEntityNames.put("tcy", 0x00442); 1396 validEntityNames.put("tdot", 0x020DB); 1397 validEntityNames.put("telrec", 0x02315); 1398 validEntityNames.put("tfr", 0x1D531); 1399 validEntityNames.put("there4", 0x02234); 1400 validEntityNames.put("theta", 0x003B8); 1401 validEntityNames.put("thetav", 0x003D1); 1402 validEntityNames.put("thinsp", 0x02009); 1403 validEntityNames.put("thorn", 0x000FE); 1404 validEntityNames.put("tilde", 0x002DC); 1405 validEntityNames.put("times", 0x000D7); 1406 validEntityNames.put("timesb", 0x022A0); 1407 validEntityNames.put("timesbar", 0x02A31); 1408 validEntityNames.put("timesd", 0x02A30); 1409 validEntityNames.put("tint", 0x0222D); 1410 validEntityNames.put("top", 0x022A4); 1411 validEntityNames.put("topbot", 0x02336); 1412 validEntityNames.put("topcir", 0x02AF1); 1413 validEntityNames.put("topf", 0x1D565); 1414 validEntityNames.put("topfork", 0x02ADA); 1415 validEntityNames.put("tprime", 0x02034); 1416 validEntityNames.put("trade", 0x02122); 1417 validEntityNames.put("tridot", 0x025EC); 1418 validEntityNames.put("trie", 0x0225C); 1419 validEntityNames.put("triminus", 0x02A3A); 1420 validEntityNames.put("triplus", 0x02A39); 1421 validEntityNames.put("trisb", 0x029CD); 1422 validEntityNames.put("tritime", 0x02A3B); 1423 validEntityNames.put("trpezium", 0x023E2); 1424 validEntityNames.put("tscr", 0x1D4C9); 1425 validEntityNames.put("tscy", 0x00446); 1426 validEntityNames.put("tshcy", 0x0045B); 1427 validEntityNames.put("tstrok", 0x00167); 1428 validEntityNames.put("twixt", 0x0226C); 1429 validEntityNames.put("uArr", 0x021D1); 1430 validEntityNames.put("uHar", 0x02963); 1431 validEntityNames.put("uacute", 0x000FA); 1432 validEntityNames.put("uarr", 0x02191); 1433 validEntityNames.put("ubrcy", 0x0045E); 1434 validEntityNames.put("ubreve", 0x0016D); 1435 validEntityNames.put("ucirc", 0x000FB); 1436 validEntityNames.put("ucy", 0x00443); 1437 validEntityNames.put("udarr", 0x021C5); 1438 validEntityNames.put("udblac", 0x00171); 1439 validEntityNames.put("udhar", 0x0296E); 1440 validEntityNames.put("ufisht", 0x0297E); 1441 validEntityNames.put("ufr", 0x1D532); 1442 validEntityNames.put("ugrave", 0x000F9); 1443 validEntityNames.put("uharl", 0x021BF); 1444 validEntityNames.put("uharr", 0x021BE); 1445 validEntityNames.put("uhblk", 0x02580); 1446 validEntityNames.put("ulcorn", 0x0231C); 1447 validEntityNames.put("ulcrop", 0x0230F); 1448 validEntityNames.put("ultri", 0x025F8); 1449 validEntityNames.put("umacr", 0x0016B); 1450 validEntityNames.put("uogon", 0x00173); 1451 validEntityNames.put("uopf", 0x1D566); 1452 validEntityNames.put("uplus", 0x0228E); 1453 validEntityNames.put("upsi", 0x003C5); 1454 validEntityNames.put("urcorn", 0x0231D); 1455 validEntityNames.put("urcrop", 0x0230E); 1456 validEntityNames.put("uring", 0x0016F); 1457 validEntityNames.put("urtri", 0x025F9); 1458 validEntityNames.put("uscr", 0x1D4CA); 1459 validEntityNames.put("utdot", 0x022F0); 1460 validEntityNames.put("utilde", 0x00169); 1461 validEntityNames.put("utri", 0x025B5); 1462 validEntityNames.put("utrif", 0x025B4); 1463 validEntityNames.put("uuarr", 0x021C8); 1464 validEntityNames.put("uuml", 0x000FC); 1465 validEntityNames.put("uwangle", 0x029A7); 1466 validEntityNames.put("vArr", 0x021D5); 1467 validEntityNames.put("vBar", 0x02AE8); 1468 validEntityNames.put("vBarv", 0x02AE9); 1469 validEntityNames.put("vDash", 0x022A8); 1470 validEntityNames.put("vangrt", 0x0299C); 1471 validEntityNames.put("varr", 0x02195); 1472 validEntityNames.put("vcy", 0x00432); 1473 validEntityNames.put("vdash", 0x022A2); 1474 validEntityNames.put("veebar", 0x022BB); 1475 validEntityNames.put("veeeq", 0x0225A); 1476 validEntityNames.put("vellip", 0x022EE); 1477 validEntityNames.put("verbar", 0x0007C); 1478 validEntityNames.put("vfr", 0x1D533); 1479 validEntityNames.put("vltri", 0x022B2); 1480 validEntityNames.put("vopf", 0x1D567); 1481 validEntityNames.put("vrtri", 0x022B3); 1482 validEntityNames.put("vscr", 0x1D4CB); 1483 validEntityNames.put("vzigzag", 0x0299A); 1484 validEntityNames.put("wcirc", 0x00175); 1485 validEntityNames.put("wedbar", 0x02A5F); 1486 validEntityNames.put("wedgeq", 0x02259); 1487 validEntityNames.put("weierp", 0x02118); 1488 validEntityNames.put("wfr", 0x1D534); 1489 validEntityNames.put("wopf", 0x1D568); 1490 validEntityNames.put("wreath", 0x02240); 1491 validEntityNames.put("wscr", 0x1D4CC); 1492 validEntityNames.put("xcap", 0x022C2); 1493 validEntityNames.put("xcirc", 0x025EF); 1494 validEntityNames.put("xcup", 0x022C3); 1495 validEntityNames.put("xdtri", 0x025BD); 1496 validEntityNames.put("xfr", 0x1D535); 1497 validEntityNames.put("xhArr", 0x027FA); 1498 validEntityNames.put("xharr", 0x027F7); 1499 validEntityNames.put("xi", 0x003BE); 1500 validEntityNames.put("xlArr", 0x027F8); 1501 validEntityNames.put("xlarr", 0x027F5); 1502 validEntityNames.put("xmap", 0x027FC); 1503 validEntityNames.put("xnis", 0x022FB); 1504 validEntityNames.put("xodot", 0x02A00); 1505 validEntityNames.put("xopf", 0x1D569); 1506 validEntityNames.put("xoplus", 0x02A01); 1507 validEntityNames.put("xotime", 0x02A02); 1508 validEntityNames.put("xrArr", 0x027F9); 1509 validEntityNames.put("xrarr", 0x027F6); 1510 validEntityNames.put("xscr", 0x1D4CD); 1511 validEntityNames.put("xsqcup", 0x02A06); 1512 validEntityNames.put("xuplus", 0x02A04); 1513 validEntityNames.put("xutri", 0x025B3); 1514 validEntityNames.put("xvee", 0x022C1); 1515 validEntityNames.put("xwedge", 0x022C0); 1516 validEntityNames.put("yacute", 0x000FD); 1517 validEntityNames.put("yacy", 0x0044F); 1518 validEntityNames.put("ycirc", 0x00177); 1519 validEntityNames.put("ycy", 0x0044B); 1520 validEntityNames.put("yen", 0x000A5); 1521 validEntityNames.put("yfr", 0x1D536); 1522 validEntityNames.put("yicy", 0x00457); 1523 validEntityNames.put("yopf", 0x1D56A); 1524 validEntityNames.put("yscr", 0x1D4CE); 1525 validEntityNames.put("yucy", 0x0044E); 1526 validEntityNames.put("yuml", 0x000FF); 1527 validEntityNames.put("zacute", 0x0017A); 1528 validEntityNames.put("zcaron", 0x0017E); 1529 validEntityNames.put("zcy", 0x00437); 1530 validEntityNames.put("zdot", 0x0017C); 1531 validEntityNames.put("zeta", 0x003B6); 1532 validEntityNames.put("zfr", 0x1D537); 1533 validEntityNames.put("zhcy", 0x00436); 1534 validEntityNames.put("zigrarr", 0x021DD); 1535 validEntityNames.put("zopf", 0x1D56B); 1536 validEntityNames.put("zscr", 0x1D4CF); 1537 validEntityNames.put("zwj", 0x0200D); 1538 validEntityNames.put("zwnj", 0x0200C); 1539 1540 VALID_ENTITY_NAMES = Collections.unmodifiableMap(validEntityNames); 1541 } 1542 1543 /** 1544 * Non-instantiable 1545 */ 1546 private XmlUtil() {} 1547 1548 private static XMLOutputFactory createOutputFactory() throws FactoryConfigurationError { 1549 try { 1550 // Detect if we're running with the Android lib, and force repackaged Woodstox to be used 1551 Class.forName("ca.uhn.fhir.repackage.javax.xml.stream.XMLOutputFactory"); 1552 System.setProperty( 1553 javax.xml.stream.XMLOutputFactory.class.getName(), 1554 com.ctc.wstx.stax.WstxOutputFactory.class.getName()); 1555 } catch (ClassNotFoundException e) { 1556 // ok 1557 } 1558 1559 XMLOutputFactory outputFactory = newOutputFactory(); 1560 1561 if (!ourHaveLoggedStaxImplementation) { 1562 logStaxImplementation(outputFactory.getClass()); 1563 } 1564 1565 /* 1566 * Note that these properties are Woodstox specific and they cause a crash in environments where SJSXP is 1567 * being used (e.g. glassfish) so we don't set them there. 1568 */ 1569 try { 1570 Class.forName("com.ctc.wstx.stax.WstxOutputFactory"); 1571 if (outputFactory instanceof WstxOutputFactory) { 1572 // ((WstxOutputFactory)outputFactory).getConfig().setAttrValueEscaperFactory(new MyEscaper()); 1573 outputFactory.setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, new MyEscaper()); 1574 } 1575 } catch (ClassNotFoundException e) { 1576 ourLog.debug("WstxOutputFactory (Woodstox) not found on classpath"); 1577 } 1578 return outputFactory; 1579 } 1580 1581 private static XMLEventWriter createXmlFragmentWriter(Writer theWriter) 1582 throws FactoryConfigurationError, XMLStreamException { 1583 XMLOutputFactory outputFactory = getOrCreateFragmentOutputFactory(); 1584 return outputFactory.createXMLEventWriter(theWriter); 1585 } 1586 1587 public static XMLEventReader createXmlReader(Reader reader) throws FactoryConfigurationError, XMLStreamException { 1588 throwUnitTestExceptionIfConfiguredToDoSo(); 1589 1590 XMLInputFactory inputFactory = getOrCreateInputFactory(); 1591 1592 // Now.. create the reader and return it 1593 return inputFactory.createXMLEventReader(reader); 1594 } 1595 1596 public static XMLStreamWriter createXmlStreamWriter(Writer theWriter) 1597 throws FactoryConfigurationError, XMLStreamException { 1598 throwUnitTestExceptionIfConfiguredToDoSo(); 1599 1600 XMLOutputFactory outputFactory = getOrCreateOutputFactory(); 1601 return outputFactory.createXMLStreamWriter(theWriter); 1602 } 1603 1604 public static XMLEventWriter createXmlWriter(Writer theWriter) 1605 throws FactoryConfigurationError, XMLStreamException { 1606 XMLOutputFactory outputFactory = getOrCreateOutputFactory(); 1607 return outputFactory.createXMLEventWriter(theWriter); 1608 } 1609 1610 /** 1611 * Encode a set of StAX events into a String 1612 */ 1613 public static String encode(List<XMLEvent> theEvents) { 1614 try { 1615 StringWriter w = new StringWriter(); 1616 XMLEventWriter ew = XmlUtil.createXmlFragmentWriter(w); 1617 1618 for (XMLEvent next : theEvents) { 1619 ew.add(next); 1620 } 1621 ew.close(); 1622 return w.toString(); 1623 } catch (XMLStreamException e) { 1624 throw new DataFormatException(Msg.code(1751) + "Problem with the contained XML events", e); 1625 } catch (FactoryConfigurationError e) { 1626 throw new ConfigurationException(Msg.code(1752) + e); 1627 } 1628 } 1629 1630 private static XMLOutputFactory getOrCreateFragmentOutputFactory() throws FactoryConfigurationError { 1631 XMLOutputFactory retVal = ourFragmentOutputFactory; 1632 if (retVal == null) { 1633 retVal = createOutputFactory(); 1634 retVal.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE); 1635 ourFragmentOutputFactory = retVal; 1636 return retVal; 1637 } 1638 return retVal; 1639 } 1640 1641 private static XMLInputFactory getOrCreateInputFactory() throws FactoryConfigurationError { 1642 if (ourInputFactory == null) { 1643 1644 try { 1645 // Detect if we're running with the Android lib, and force repackaged Woodstox to be used 1646 Class.forName("ca.uhn.fhir.repackage.javax.xml.stream.XMLInputFactory"); 1647 System.setProperty( 1648 javax.xml.stream.XMLInputFactory.class.getName(), 1649 com.ctc.wstx.stax.WstxInputFactory.class.getName()); 1650 } catch (ClassNotFoundException e) { 1651 // ok 1652 } 1653 1654 XMLInputFactory inputFactory = newInputFactory(); 1655 1656 if (!ourHaveLoggedStaxImplementation) { 1657 logStaxImplementation(inputFactory.getClass()); 1658 } 1659 1660 /* 1661 * These two properties disable external entity processing, which can 1662 * be a security vulnerability. 1663 * 1664 * See https://github.com/hapifhir/hapi-fhir/issues/339 1665 * https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing 1666 */ 1667 inputFactory.setProperty( 1668 XMLInputFactory.SUPPORT_DTD, false); // This disables DTDs entirely for that factory 1669 inputFactory.setProperty( 1670 "javax.xml.stream.isSupportingExternalEntities", false); // disable external entities 1671 1672 /* 1673 * In the following few lines, you can uncomment the first and comment the second to disable automatic 1674 * parsing of extended entities, e.g. § 1675 * 1676 * Note that these properties are Woodstox specific and they cause a crash in environments where SJSXP is 1677 * being used (e.g. glassfish) so we don't set them there. 1678 */ 1679 try { 1680 Class.forName("com.ctc.wstx.stax.WstxInputFactory"); 1681 boolean isWoodstox = inputFactory instanceof com.ctc.wstx.stax.WstxInputFactory; 1682 if (!isWoodstox) { 1683 // Check if implementation is woodstox by property since instanceof check does not work if running 1684 // in JBoss 1685 try { 1686 isWoodstox = inputFactory.getProperty("org.codehaus.stax2.implVersion") != null; 1687 } catch (Exception e) { 1688 // ignore 1689 } 1690 } 1691 if (isWoodstox) { 1692 // inputFactory.setProperty(WstxInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); 1693 inputFactory.setProperty(WstxInputProperties.P_UNDECLARED_ENTITY_RESOLVER, XML_RESOLVER); 1694 try { 1695 inputFactory.setProperty(WstxInputProperties.P_MAX_ATTRIBUTE_SIZE, "100000000"); 1696 } catch (IllegalArgumentException e) { 1697 // ignore 1698 } 1699 } 1700 } catch (ClassNotFoundException e) { 1701 ourLog.debug("WstxOutputFactory (Woodstox) not found on classpath"); 1702 } 1703 ourInputFactory = inputFactory; 1704 } 1705 return ourInputFactory; 1706 } 1707 1708 private static XMLOutputFactory getOrCreateOutputFactory() throws FactoryConfigurationError { 1709 if (ourOutputFactory == null) { 1710 ourOutputFactory = createOutputFactory(); 1711 } 1712 return ourOutputFactory; 1713 } 1714 1715 private static void logStaxImplementation(Class<?> theClass) { 1716 IDependencyLog logger = DependencyLogFactory.createJarLogger(); 1717 if (logger != null) { 1718 logger.logStaxImplementation(theClass); 1719 } 1720 ourHaveLoggedStaxImplementation = true; 1721 } 1722 1723 static XMLInputFactory newInputFactory() throws FactoryConfigurationError { 1724 XMLInputFactory inputFactory; 1725 try { 1726 inputFactory = XMLInputFactory.newInstance(); 1727 if (inputFactory.isPropertySupported(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)) { 1728 inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, true); 1729 } 1730 throwUnitTestExceptionIfConfiguredToDoSo(); 1731 } catch (Throwable e) { 1732 throw new ConfigurationException( 1733 Msg.code(1753) + "Unable to initialize StAX - XML processing is disabled", e); 1734 } 1735 return inputFactory; 1736 } 1737 1738 static XMLOutputFactory newOutputFactory() throws FactoryConfigurationError { 1739 XMLOutputFactory outputFactory; 1740 try { 1741 outputFactory = XMLOutputFactory.newInstance(); 1742 throwUnitTestExceptionIfConfiguredToDoSo(); 1743 } catch (Throwable e) { 1744 throw new ConfigurationException( 1745 Msg.code(1754) + "Unable to initialize StAX - XML processing is disabled", e); 1746 } 1747 return outputFactory; 1748 } 1749 1750 /** 1751 * Parses an XML string into a set of StAX events 1752 */ 1753 public static List<XMLEvent> parse(String theValue) { 1754 if (isBlank(theValue)) { 1755 return Collections.emptyList(); 1756 } 1757 1758 String val = theValue.trim(); 1759 if (!val.startsWith("<")) { 1760 val = XhtmlDt.DIV_OPEN_FIRST + val + "</div>"; 1761 } 1762 boolean hasProcessingInstruction = val.startsWith("<?"); 1763 if (hasProcessingInstruction && val.endsWith("?>")) { 1764 return null; 1765 } 1766 1767 try { 1768 ArrayList<XMLEvent> value = new ArrayList<>(); 1769 StringReader reader = new StringReader(val); 1770 XMLEventReader er = XmlUtil.createXmlReader(reader); 1771 boolean first = true; 1772 while (er.hasNext()) { 1773 XMLEvent next = er.nextEvent(); 1774 if (first) { 1775 first = false; 1776 continue; 1777 } 1778 if (er.hasNext()) { 1779 // don't add the last event 1780 value.add(next); 1781 } 1782 } 1783 return value; 1784 1785 } catch (XMLStreamException e) { 1786 throw new DataFormatException( 1787 Msg.code(1755) + "String does not appear to be valid XML/XHTML (error is \"" + e.getMessage() 1788 + "\"): " + theValue, 1789 e); 1790 } catch (FactoryConfigurationError e) { 1791 throw new ConfigurationException(Msg.code(1756) + e); 1792 } 1793 } 1794 1795 /** 1796 * FOR UNIT TESTS ONLY - Throw this exception for the next operation 1797 */ 1798 static void setThrowExceptionForUnitTest(Throwable theException) { 1799 ourNextException = theException; 1800 } 1801 1802 private static void throwUnitTestExceptionIfConfiguredToDoSo() 1803 throws FactoryConfigurationError, XMLStreamException { 1804 if (ourNextException != null) { 1805 if (ourNextException instanceof javax.xml.stream.FactoryConfigurationError) { 1806 throw ((javax.xml.stream.FactoryConfigurationError) ourNextException); 1807 } 1808 throw (XMLStreamException) ourNextException; 1809 } 1810 } 1811 1812 public static Document parseDocument(String theInput) throws IOException, SAXException { 1813 StringReader reader = new StringReader(theInput); 1814 return parseDocument(reader); 1815 } 1816 1817 public static Document parseDocument(Reader reader) throws SAXException, IOException { 1818 return parseDocument(reader, true, false); 1819 } 1820 1821 public static Document parseDocument(Reader theReader, boolean theNamespaceAware, boolean allowDoctypeDeclaration) 1822 throws SAXException, IOException { 1823 DocumentBuilder builder; 1824 try { 1825 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 1826 docBuilderFactory.setNamespaceAware(theNamespaceAware); 1827 docBuilderFactory.setXIncludeAware(false); 1828 docBuilderFactory.setExpandEntityReferences(false); 1829 try { 1830 docBuilderFactory.setFeature( 1831 "http://apache.org/xml/features/disallow-doctype-decl", !allowDoctypeDeclaration); 1832 docBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); 1833 docBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 1834 docBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 1835 docBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 1836 throwUnitTestExceptionIfConfiguredToDoSo(); 1837 } catch (Exception e) { 1838 ourLog.warn("Failed to set feature on XML parser: " + e.toString()); 1839 } 1840 1841 builder = docBuilderFactory.newDocumentBuilder(); 1842 } catch (ParserConfigurationException e) { 1843 throw new ConfigurationException(Msg.code(1757) + e); 1844 } 1845 1846 InputSource src = new InputSource(theReader); 1847 return builder.parse(src); 1848 } 1849 1850 public static List<Element> getChildrenByTagName(Element theParent, String theName) { 1851 List<Element> nodeList = new ArrayList<Element>(); 1852 for (Node child = theParent.getFirstChild(); child != null; child = child.getNextSibling()) { 1853 if (child.getNodeType() == Node.ELEMENT_NODE && theName.equals(child.getNodeName())) { 1854 nodeList.add((Element) child); 1855 } 1856 } 1857 1858 return nodeList; 1859 } 1860 1861 public static String encodeDocument(Node theElement) throws TransformerException { 1862 return encodeDocument(theElement, false); 1863 } 1864 1865 public static String encodeDocument(Node theElement, boolean theIndent) throws TransformerException { 1866 TransformerFactory transFactory = getTransformerFactory(); 1867 Transformer transformer = transFactory.newTransformer(); 1868 StringWriter buffer = new StringWriter(); 1869 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 1870 if (theIndent) { 1871 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 1872 } 1873 transformer.transform(new DOMSource(theElement), new StreamResult(buffer)); 1874 return buffer.toString(); 1875 } 1876 1877 /** 1878 * Returns a singleton transformer factory with lazy initialization 1879 */ 1880 private static TransformerFactory getTransformerFactory() { 1881 TransformerFactory transFactory = ourTransformerFactory; 1882 if (transFactory == null) { 1883 // This call is surprisingly expensive at large scale, so we lazy-initialize it 1884 // as opposed to calling it each time 1885 transFactory = TransformerFactory.newInstance(); 1886 ourTransformerFactory = transFactory; 1887 } 1888 return transFactory; 1889 } 1890 1891 /** 1892 * FOR UNIT TESTS ONLY - Used to reset OutputFactory for test cases that customize OutputFactory 1893 */ 1894 public static void resetOutputFactoryForTest() { 1895 ourOutputFactory = null; 1896 } 1897 1898 private static final class ExtendedEntityReplacingXmlResolver implements XMLResolver { 1899 @Override 1900 public Object resolveEntity(String thePublicID, String theSystemID, String theBaseURI, String theNamespace) { 1901 if (thePublicID == null && theSystemID == null) { 1902 if (theNamespace != null && VALID_ENTITY_NAMES.containsKey(theNamespace)) { 1903 return new String(Character.toChars(VALID_ENTITY_NAMES.get(theNamespace))); 1904 } 1905 } 1906 1907 return null; 1908 } 1909 } 1910 1911 public static class MyEscaper implements EscapingWriterFactory { 1912 1913 @Override 1914 public Writer createEscapingWriterFor(OutputStream theOut, String theEnc) throws UnsupportedEncodingException { 1915 return createEscapingWriterFor(new OutputStreamWriter(theOut, theEnc), theEnc); 1916 } 1917 1918 @Override 1919 public Writer createEscapingWriterFor(final Writer theW, String theEnc) { 1920 return new Writer() { 1921 1922 @Override 1923 public void close() throws IOException { 1924 theW.close(); 1925 } 1926 1927 @Override 1928 public void flush() throws IOException { 1929 theW.flush(); 1930 } 1931 1932 @Override 1933 public void write(char[] theCbuf, int theOff, int theLen) throws IOException { 1934 boolean hasEscapable = false; 1935 for (int i = 0; i < theLen && !hasEscapable; i++) { 1936 char nextChar = theCbuf[i + theOff]; 1937 switch (nextChar) { 1938 case '<': 1939 case '>': 1940 case '"': 1941 case '&': 1942 hasEscapable = true; 1943 break; 1944 default: 1945 break; 1946 } 1947 } 1948 1949 if (!hasEscapable) { 1950 theW.write(theCbuf, theOff, theLen); 1951 return; 1952 } 1953 1954 String escaped = StringEscapeUtils.escapeXml10(new String(theCbuf, theOff, theLen)); 1955 theW.write(escaped.toCharArray()); 1956 } 1957 }; 1958 } 1959 } 1960}