/*

* JavaScript parser based on the grammar described in ECMA-262, 5th ed.
* (http://www.ecma-international.org/publications/standards/Ecma-262.htm)
*
* The parser builds a tree representing the parsed JavaScript, composed of
* basic JavaScript values, arrays and objects (basically JSON). It can be
* easily used by various JavaScript processors, transformers, etc.
*
* Intentional deviations from ECMA-262, 5th ed.:
*
*   * The specification does not consider |FunctionDeclaration| and
*     |FunctionExpression| as statements, but JavaScript implementations do and
*     so are we. This syntax is actually used in the wild (e.g. by jQuery).
*
* Limitations:
*
*   * Non-BMP characters are completely ignored to avoid surrogate
*     pair handling (JavaScript strings in most implementations are AFAIK
*     encoded in UTF-16, though this is not required by the specification --
*     see ECMA-262, 5th ed., 4.3.16).
*
*   * One can create identifiers containing illegal characters using Unicode
*     escape sequences. For example, "abcd\u0020efgh" is not a valid
*     identifier, but it is accepted by the parser.
*
*   * Strict mode is not recognized. That means that within strict mode code,
*     "implements", "interface", "let", "package", "private", "protected",
*     "public", "static" and "yield" can be used as names. Many other
*     restrictions and exceptions from ECMA-262, 5th ed., Annex C are also not
*     applied.
*
*   * The parser does not handle regular expression literal syntax (basically,
*     it treats anything between "/"'s as an opaque character sequence and also
*     does not recognize invalid flags properly).
*
*   * The parser doesn't report any early errors except syntax errors (see
*     ECMA-262, 5th ed., 16).
*
* At least some of these limitations should be fixed sometimes.
*
* Many thanks to inimino (http://inimino.org/~inimino/blog/) for his ES5 PEG
* (http://boshi.inimino.org/3box/asof/1270029991384/PEG/ECMAScript_unified.peg),
* which helped me to solve some problems (such as automatic semicolon
* insertion) and also served to double check that I converted the original
* grammar correctly.
*/

start

= __ program:Program __ { return program; }

/* ===== A.1 Lexical Grammar ===== */

SourceCharacter

= .

WhiteSpace “whitespace”

= [\t\v\f \u00A0\uFEFF]
/ Zs

LineTerminator

= [\n\r\u2028\u2029]

LineTerminatorSequence “end of line”

= "\n"
/ "\r\n"
/ "\r"
/ "\u2028" // line separator
/ "\u2029" // paragraph separator

Comment “comment”

= MultiLineComment
/ SingleLineComment

MultiLineComment

= "/*" (!"*/" SourceCharacter)* "*/"

MultiLineCommentNoLineTerminator

= "/*" (!("*/" / LineTerminator) SourceCharacter)* "*/"

SingleLineComment

= "//" (!LineTerminator SourceCharacter)*

Identifier “identifier”

= !ReservedWord name:IdentifierName { return name; }

IdentifierName “identifier”

= start:IdentifierStart parts:IdentifierPart* {
    return start + parts.join("");
  }

IdentifierStart

= UnicodeLetter
/ "$"
/ "_"
/ "\\" sequence:UnicodeEscapeSequence { return sequence; }

IdentifierPart

= IdentifierStart
/ UnicodeCombiningMark
/ UnicodeDigit
/ UnicodeConnectorPunctuation
/ "\u200C" { return "\u200C"; } // zero-width non-joiner
/ "\u200D" { return "\u200D"; } // zero-width joiner

UnicodeLetter

= Lu
/ Ll
/ Lt
/ Lm
/ Lo
/ Nl

UnicodeCombiningMark

= Mn
/ Mc

UnicodeDigit

= Nd

UnicodeConnectorPunctuation

= Pc

ReservedWord

= Keyword
/ FutureReservedWord
/ NullLiteral
/ BooleanLiteral

Keyword

= (
      "break"
    / "case"
    / "catch"
    / "continue"
    / "debugger"
    / "default"
    / "delete"
    / "do"
    / "else"
    / "finally"
    / "for"
    / "function"
    / "if"
    / "instanceof"
    / "in"
    / "new"
    / "return"
    / "switch"
    / "this"
    / "throw"
    / "try"
    / "typeof"
    / "var"
    / "void"
    / "while"
    / "with"
  )
  !IdentifierPart

FutureReservedWord

= (
      "class"
    / "const"
    / "enum"
    / "export"
    / "extends"
    / "import"
    / "super"
  )
  !IdentifierPart

/*

* This rule contains an error in the specification: |RegularExpressionLiteral|
* is missing.
*/

Literal

= NullLiteral
/ BooleanLiteral
/ value:NumericLiteral {
    return {
      type:  "NumericLiteral",
      value: value
    };
  }
/ value:StringLiteral {
    return {
      type:  "StringLiteral",
      value: value
    };
  }
/ RegularExpressionLiteral

NullLiteral

= NullToken { return { type: "NullLiteral" }; }

BooleanLiteral

= TrueToken  { return { type: "BooleanLiteral", value: true  }; }
/ FalseToken { return { type: "BooleanLiteral", value: false }; }

NumericLiteral “number”

= literal:(HexIntegerLiteral / DecimalLiteral) !IdentifierStart {
    return literal;
  }

DecimalLiteral

= parts:$(DecimalIntegerLiteral "." DecimalDigits? ExponentPart?) {
    return parseFloat(parts);
  }
/ parts:$("." DecimalDigits ExponentPart?)     { return parseFloat(parts); }
/ parts:$(DecimalIntegerLiteral ExponentPart?) { return parseFloat(parts); }

DecimalIntegerLiteral

= "0" / NonZeroDigit DecimalDigits?

DecimalDigits

= DecimalDigit+

DecimalDigit

= [0-9]

NonZeroDigit

= [1-9]

ExponentPart

= ExponentIndicator SignedInteger

ExponentIndicator

= [eE]

SignedInteger

= [-+]? DecimalDigits

HexIntegerLiteral

= "0" [xX] digits:$HexDigit+ { return parseInt(digits, 16); }

HexDigit

= [0-9a-fA-F]

StringLiteral “string”

= parts:('"' DoubleStringCharacters? '"' / "'" SingleStringCharacters? "'") {
    return parts[1];
  }

DoubleStringCharacters

= chars:DoubleStringCharacter+ { return chars.join(""); }

SingleStringCharacters

= chars:SingleStringCharacter+ { return chars.join(""); }

DoubleStringCharacter

= !('"' / "\\" / LineTerminator) char_:SourceCharacter { return char_;     }
/ "\\" sequence:EscapeSequence                         { return sequence;  }
/ LineContinuation

SingleStringCharacter

= !("'" / "\\" / LineTerminator) char_:SourceCharacter { return char_;     }
/ "\\" sequence:EscapeSequence                         { return sequence;  }
/ LineContinuation

LineContinuation

= "\\" sequence:LineTerminatorSequence { return sequence; }

EscapeSequence

= CharacterEscapeSequence
/ "0" !DecimalDigit { return "\0"; }
/ HexEscapeSequence
/ UnicodeEscapeSequence

CharacterEscapeSequence

= SingleEscapeCharacter
/ NonEscapeCharacter

SingleEscapeCharacter

= char_:['"\\bfnrtv] {
    return char_
      .replace("b", "\b")
      .replace("f", "\f")
      .replace("n", "\n")
      .replace("r", "\r")
      .replace("t", "\t")
      .replace("v", "\x0B") // IE does not recognize "\v".
  }

NonEscapeCharacter

= (!EscapeCharacter / LineTerminator) char_:SourceCharacter { return char_; }

EscapeCharacter

= SingleEscapeCharacter
/ DecimalDigit
/ "x"
/ "u"

HexEscapeSequence

= "x" digits:$(HexDigit HexDigit) {
    return String.fromCharCode(parseInt(digits, 16));
  }

UnicodeEscapeSequence

= "u" digits:$(HexDigit HexDigit HexDigit HexDigit) {
    return String.fromCharCode(parseInt(digits, 16));
  }

RegularExpressionLiteral “regular expression”

= "/" body:RegularExpressionBody "/" flags:RegularExpressionFlags {
    return {
      type:  "RegularExpressionLiteral",
      body:  body,
      flags: flags
    };
  }

RegularExpressionBody

= char_:RegularExpressionFirstChar chars:RegularExpressionChars {
    return char_ + chars;
  }

RegularExpressionChars

= chars:RegularExpressionChar* { return chars.join(""); }

RegularExpressionFirstChar

= ![*\\/[] char_:RegularExpressionNonTerminator { return char_; }
/ RegularExpressionBackslashSequence
/ RegularExpressionClass

RegularExpressionChar

= ![\\/[] char_:RegularExpressionNonTerminator { return char_; }
/ RegularExpressionBackslashSequence
/ RegularExpressionClass

/*

* This rule contains an error in the specification: "NonTerminator" instead of
* "RegularExpressionNonTerminator".
*/

RegularExpressionBackslashSequence

= "\\" char_:RegularExpressionNonTerminator { return "\\" + char_; }

RegularExpressionNonTerminator

= !LineTerminator char_:SourceCharacter { return char_; }

RegularExpressionClass

= "[" chars:RegularExpressionClassChars "]" { return "[" + chars + "]"; }

RegularExpressionClassChars

= chars:RegularExpressionClassChar* { return chars.join(""); }

RegularExpressionClassChar

= ![\]\\] char_:RegularExpressionNonTerminator { return char_; }
/ RegularExpressionBackslashSequence

RegularExpressionFlags

= parts:IdentifierPart* { return parts.join(""); }

/* Tokens */

BreakToken = “break” !IdentifierPart CaseToken = “case” !IdentifierPart CatchToken = “catch” !IdentifierPart ContinueToken = “continue” !IdentifierPart DebuggerToken = “debugger” !IdentifierPart DefaultToken = “default” !IdentifierPart DeleteToken = “delete” !IdentifierPart { return “delete”; } DoToken = “do” !IdentifierPart ElseToken = “else” !IdentifierPart FalseToken = “false” !IdentifierPart FinallyToken = “finally” !IdentifierPart ForToken = “for” !IdentifierPart FunctionToken = “function” !IdentifierPart GetToken = “get” !IdentifierPart IfToken = “if” !IdentifierPart InstanceofToken = “instanceof” !IdentifierPart { return “instanceof”; } InToken = “in” !IdentifierPart { return “in”; } NewToken = “new” !IdentifierPart NullToken = “null” !IdentifierPart ReturnToken = “return” !IdentifierPart SetToken = “set” !IdentifierPart SwitchToken = “switch” !IdentifierPart ThisToken = “this” !IdentifierPart ThrowToken = “throw” !IdentifierPart TrueToken = “true” !IdentifierPart TryToken = “try” !IdentifierPart TypeofToken = “typeof” !IdentifierPart { return “typeof”; } VarToken = “var” !IdentifierPart VoidToken = “void” !IdentifierPart { return “void”; } WhileToken = “while” !IdentifierPart WithToken = “with” !IdentifierPart

/*

* Unicode Character Categories
*
* Source: http://www.fileformat.info/info/unicode/category/index.htm
*/

/*

* Non-BMP characters are completely ignored to avoid surrogate pair handling
* (JavaScript strings in most implementations are encoded in UTF-16, though
* this is not required by the specification -- see ECMA-262, 5th ed., 4.3.16).
*
* If you ever need to correctly recognize all the characters, please feel free
* to implement that and send a patch.
*/

// Letter, Lowercase Ll = [u0061u0062u0063u0064u0065u0066u0067u0068u0069u006Au006Bu006Cu006Du006Eu006Fu0070u0071u0072u0073u0074u0075u0076u0077u0078u0079u007Au00AAu00B5u00BAu00DFu00E0u00E1u00E2u00E3u00E4u00E5u00E6u00E7u00E8u00E9u00EAu00EBu00ECu00EDu00EEu00EFu00F0u00F1u00F2u00F3u00F4u00F5u00F6u00F8u00F9u00FAu00FBu00FCu00FDu00FEu00FFu0101u0103u0105u0107u0109u010Bu010Du010Fu0111u0113u0115u0117u0119u011Bu011Du011Fu0121u0123u0125u0127u0129u012Bu012Du012Fu0131u0133u0135u0137u0138u013Au013Cu013Eu0140u0142u0144u0146u0148u0149u014Bu014Du014Fu0151u0153u0155u0157u0159u015Bu015Du015Fu0161u0163u0165u0167u0169u016Bu016Du016Fu0171u0173u0175u0177u017Au017Cu017Eu017Fu0180u0183u0185u0188u018Cu018Du0192u0195u0199u019Au019Bu019Eu01A1u01A3u01A5u01A8u01AAu01ABu01ADu01B0u01B4u01B6u01B9u01BAu01BDu01BEu01BFu01C6u01C9u01CCu01CEu01D0u01D2u01D4u01D6u01D8u01DAu01DCu01DDu01DFu01E1u01E3u01E5u01E7u01E9u01EBu01EDu01EFu01F0u01F3u01F5u01F9u01FBu01FDu01FFu0201u0203u0205u0207u0209u020Bu020Du020Fu0211u0213u0215u0217u0219u021Bu021Du021Fu0221u0223u0225u0227u0229u022Bu022Du022Fu0231u0233u0234u0235u0236u0237u0238u0239u023Cu023Fu0240u0242u0247u0249u024Bu024Du024Fu0250u0251u0252u0253u0254u0255u0256u0257u0258u0259u025Au025Bu025Cu025Du025Eu025Fu0260u0261u0262u0263u0264u0265u0266u0267u0268u0269u026Au026Bu026Cu026Du026Eu026Fu0270u0271u0272u0273u0274u0275u0276u0277u0278u0279u027Au027Bu027Cu027Du027Eu027Fu0280u0281u0282u0283u0284u0285u0286u0287u0288u0289u028Au028Bu028Cu028Du028Eu028Fu0290u0291u0292u0293u0295u0296u0297u0298u0299u029Au029Bu029Cu029Du029Eu029Fu02A0u02A1u02A2u02A3u02A4u02A5u02A6u02A7u02A8u02A9u02AAu02ABu02ACu02ADu02AEu02AFu0371u0373u0377u037Bu037Cu037Du0390u03ACu03ADu03AEu03AFu03B0u03B1u03B2u03B3u03B4u03B5u03B6u03B7u03B8u03B9u03BAu03BBu03BCu03BDu03BEu03BFu03C0u03C1u03C2u03C3u03C4u03C5u03C6u03C7u03C8u03C9u03CAu03CBu03CCu03CDu03CEu03D0u03D1u03D5u03D6u03D7u03D9u03DBu03DDu03DFu03E1u03E3u03E5u03E7u03E9u03EBu03EDu03EFu03F0u03F1u03F2u03F3u03F5u03F8u03FBu03FCu0430u0431u0432u0433u0434u0435u0436u0437u0438u0439u043Au043Bu043Cu043Du043Eu043Fu0440u0441u0442u0443u0444u0445u0446u0447u0448u0449u044Au044Bu044Cu044Du044Eu044Fu0450u0451u0452u0453u0454u0455u0456u0457u0458u0459u045Au045Bu045Cu045Du045Eu045Fu0461u0463u0465u0467u0469u046Bu046Du046Fu0471u0473u0475u0477u0479u047Bu047Du047Fu0481u048Bu048Du048Fu0491u0493u0495u0497u0499u049Bu049Du049Fu04A1u04A3u04A5u04A7u04A9u04ABu04ADu04AFu04B1u04B3u04B5u04B7u04B9u04BBu04BDu04BFu04C2u04C4u04C6u04C8u04CAu04CCu04CEu04CFu04D1u04D3u04D5u04D7u04D9u04DBu04DDu04DFu04E1u04E3u04E5u04E7u04E9u04EBu04EDu04EFu04F1u04F3u04F5u04F7u04F9u04FBu04FDu04FFu0501u0503u0505u0507u0509u050Bu050Du050Fu0511u0513u0515u0517u0519u051Bu051Du051Fu0521u0523u0561u0562u0563u0564u0565u0566u0567u0568u0569u056Au056Bu056Cu056Du056Eu056Fu0570u0571u0572u0573u0574u0575u0576u0577u0578u0579u057Au057Bu057Cu057Du057Eu057Fu0580u0581u0582u0583u0584u0585u0586u0587u1D00u1D01u1D02u1D03u1D04u1D05u1D06u1D07u1D08u1D09u1D0Au1D0Bu1D0Cu1D0Du1D0Eu1D0Fu1D10u1D11u1D12u1D13u1D14u1D15u1D16u1D17u1D18u1D19u1D1Au1D1Bu1D1Cu1D1Du1D1Eu1D1Fu1D20u1D21u1D22u1D23u1D24u1D25u1D26u1D27u1D28u1D29u1D2Au1D2Bu1D62u1D63u1D64u1D65u1D66u1D67u1D68u1D69u1D6Au1D6Bu1D6Cu1D6Du1D6Eu1D6Fu1D70u1D71u1D72u1D73u1D74u1D75u1D76u1D77u1D79u1D7Au1D7Bu1D7Cu1D7Du1D7Eu1D7Fu1D80u1D81u1D82u1D83u1D84u1D85u1D86u1D87u1D88u1D89u1D8Au1D8Bu1D8Cu1D8Du1D8Eu1D8Fu1D90u1D91u1D92u1D93u1D94u1D95u1D96u1D97u1D98u1D99u1D9Au1E01u1E03u1E05u1E07u1E09u1E0Bu1E0Du1E0Fu1E11u1E13u1E15u1E17u1E19u1E1Bu1E1Du1E1Fu1E21u1E23u1E25u1E27u1E29u1E2Bu1E2Du1E2Fu1E31u1E33u1E35u1E37u1E39u1E3Bu1E3Du1E3Fu1E41u1E43u1E45u1E47u1E49u1E4Bu1E4Du1E4Fu1E51u1E53u1E55u1E57u1E59u1E5Bu1E5Du1E5Fu1E61u1E63u1E65u1E67u1E69u1E6Bu1E6Du1E6Fu1E71u1E73u1E75u1E77u1E79u1E7Bu1E7Du1E7Fu1E81u1E83u1E85u1E87u1E89u1E8Bu1E8Du1E8Fu1E91u1E93u1E95u1E96u1E97u1E98u1E99u1E9Au1E9Bu1E9Cu1E9Du1E9Fu1EA1u1EA3u1EA5u1EA7u1EA9u1EABu1EADu1EAFu1EB1u1EB3u1EB5u1EB7u1EB9u1EBBu1EBDu1EBFu1EC1u1EC3u1EC5u1EC7u1EC9u1ECBu1ECDu1ECFu1ED1u1ED3u1ED5u1ED7u1ED9u1EDBu1EDDu1EDFu1EE1u1EE3u1EE5u1EE7u1EE9u1EEBu1EEDu1EEFu1EF1u1EF3u1EF5u1EF7u1EF9u1EFBu1EFDu1EFFu1F00u1F01u1F02u1F03u1F04u1F05u1F06u1F07u1F10u1F11u1F12u1F13u1F14u1F15u1F20u1F21u1F22u1F23u1F24u1F25u1F26u1F27u1F30u1F31u1F32u1F33u1F34u1F35u1F36u1F37u1F40u1F41u1F42u1F43u1F44u1F45u1F50u1F51u1F52u1F53u1F54u1F55u1F56u1F57u1F60u1F61u1F62u1F63u1F64u1F65u1F66u1F67u1F70u1F71u1F72u1F73u1F74u1F75u1F76u1F77u1F78u1F79u1F7Au1F7Bu1F7Cu1F7Du1F80u1F81u1F82u1F83u1F84u1F85u1F86u1F87u1F90u1F91u1F92u1F93u1F94u1F95u1F96u1F97u1FA0u1FA1u1FA2u1FA3u1FA4u1FA5u1FA6u1FA7u1FB0u1FB1u1FB2u1FB3u1FB4u1FB6u1FB7u1FBEu1FC2u1FC3u1FC4u1FC6u1FC7u1FD0u1FD1u1FD2u1FD3u1FD6u1FD7u1FE0u1FE1u1FE2u1FE3u1FE4u1FE5u1FE6u1FE7u1FF2u1FF3u1FF4u1FF6u1FF7u2071u207Fu210Au210Eu210Fu2113u212Fu2134u2139u213Cu213Du2146u2147u2148u2149u214Eu2184u2C30u2C31u2C32u2C33u2C34u2C35u2C36u2C37u2C38u2C39u2C3Au2C3Bu2C3Cu2C3Du2C3Eu2C3Fu2C40u2C41u2C42u2C43u2C44u2C45u2C46u2C47u2C48u2C49u2C4Au2C4Bu2C4Cu2C4Du2C4Eu2C4Fu2C50u2C51u2C52u2C53u2C54u2C55u2C56u2C57u2C58u2C59u2C5Au2C5Bu2C5Cu2C5Du2C5Eu2C61u2C65u2C66u2C68u2C6Au2C6Cu2C71u2C73u2C74u2C76u2C77u2C78u2C79u2C7Au2C7Bu2C7Cu2C81u2C83u2C85u2C87u2C89u2C8Bu2C8Du2C8Fu2C91u2C93u2C95u2C97u2C99u2C9Bu2C9Du2C9Fu2CA1u2CA3u2CA5u2CA7u2CA9u2CABu2CADu2CAFu2CB1u2CB3u2CB5u2CB7u2CB9u2CBBu2CBDu2CBFu2CC1u2CC3u2CC5u2CC7u2CC9u2CCBu2CCDu2CCFu2CD1u2CD3u2CD5u2CD7u2CD9u2CDBu2CDDu2CDFu2CE1u2CE3u2CE4u2D00u2D01u2D02u2D03u2D04u2D05u2D06u2D07u2D08u2D09u2D0Au2D0Bu2D0Cu2D0Du2D0Eu2D0Fu2D10u2D11u2D12u2D13u2D14u2D15u2D16u2D17u2D18u2D19u2D1Au2D1Bu2D1Cu2D1Du2D1Eu2D1Fu2D20u2D21u2D22u2D23u2D24u2D25uA641uA643uA645uA647uA649uA64BuA64DuA64FuA651uA653uA655uA657uA659uA65BuA65DuA65FuA663uA665uA667uA669uA66BuA66DuA681uA683uA685uA687uA689uA68BuA68DuA68FuA691uA693uA695uA697uA723uA725uA727uA729uA72BuA72DuA72FuA730uA731uA733uA735uA737uA739uA73BuA73DuA73FuA741uA743uA745uA747uA749uA74BuA74DuA74FuA751uA753uA755uA757uA759uA75BuA75DuA75FuA761uA763uA765uA767uA769uA76BuA76DuA76FuA771uA772uA773uA774uA775uA776uA777uA778uA77AuA77CuA77FuA781uA783uA785uA787uA78CuFB00uFB01uFB02uFB03uFB04uFB05uFB06uFB13uFB14uFB15uFB16uFB17uFF41uFF42uFF43uFF44uFF45uFF46uFF47uFF48uFF49uFF4AuFF4BuFF4CuFF4DuFF4EuFF4FuFF50uFF51uFF52uFF53uFF54uFF55uFF56uFF57uFF58uFF59uFF5A]

// Letter, Modifier Lm = [u02B0u02B1u02B2u02B3u02B4u02B5u02B6u02B7u02B8u02B9u02BAu02BBu02BCu02BDu02BEu02BFu02C0u02C1u02C6u02C7u02C8u02C9u02CAu02CBu02CCu02CDu02CEu02CFu02D0u02D1u02E0u02E1u02E2u02E3u02E4u02ECu02EEu0374u037Au0559u0640u06E5u06E6u07F4u07F5u07FAu0971u0E46u0EC6u10FCu17D7u1843u1C78u1C79u1C7Au1C7Bu1C7Cu1C7Du1D2Cu1D2Du1D2Eu1D2Fu1D30u1D31u1D32u1D33u1D34u1D35u1D36u1D37u1D38u1D39u1D3Au1D3Bu1D3Cu1D3Du1D3Eu1D3Fu1D40u1D41u1D42u1D43u1D44u1D45u1D46u1D47u1D48u1D49u1D4Au1D4Bu1D4Cu1D4Du1D4Eu1D4Fu1D50u1D51u1D52u1D53u1D54u1D55u1D56u1D57u1D58u1D59u1D5Au1D5Bu1D5Cu1D5Du1D5Eu1D5Fu1D60u1D61u1D78u1D9Bu1D9Cu1D9Du1D9Eu1D9Fu1DA0u1DA1u1DA2u1DA3u1DA4u1DA5u1DA6u1DA7u1DA8u1DA9u1DAAu1DABu1DACu1DADu1DAEu1DAFu1DB0u1DB1u1DB2u1DB3u1DB4u1DB5u1DB6u1DB7u1DB8u1DB9u1DBAu1DBBu1DBCu1DBDu1DBEu1DBFu2090u2091u2092u2093u2094u2C7Du2D6Fu2E2Fu3005u3031u3032u3033u3034u3035u303Bu309Du309Eu30FCu30FDu30FEuA015uA60CuA67FuA717uA718uA719uA71AuA71BuA71CuA71DuA71EuA71FuA770uA788uFF70uFF9EuFF9F]

// Letter, Other Lo = [u01BBu01C0u01C1u01C2u01C3u0294u05D0u05D1u05D2u05D3u05D4u05D5u05D6u05D7u05D8u05D9u05DAu05DBu05DCu05DDu05DEu05DFu05E0u05E1u05E2u05E3u05E4u05E5u05E6u05E7u05E8u05E9u05EAu05F0u05F1u05F2u0621u0622u0623u0624u0625u0626u0627u0628u0629u062Au062Bu062Cu062Du062Eu062Fu0630u0631u0632u0633u0634u0635u0636u0637u0638u0639u063Au063Bu063Cu063Du063Eu063Fu0641u0642u0643u0644u0645u0646u0647u0648u0649u064Au066Eu066Fu0671u0672u0673u0674u0675u0676u0677u0678u0679u067Au067Bu067Cu067Du067Eu067Fu0680u0681u0682u0683u0684u0685u0686u0687u0688u0689u068Au068Bu068Cu068Du068Eu068Fu0690u0691u0692u0693u0694u0695u0696u0697u0698u0699u069Au069Bu069Cu069Du069Eu069Fu06A0u06A1u06A2u06A3u06A4u06A5u06A6u06A7u06A8u06A9u06AAu06ABu06ACu06ADu06AEu06AFu06B0u06B1u06B2u06B3u06B4u06B5u06B6u06B7u06B8u06B9u06BAu06BBu06BCu06BDu06BEu06BFu06C0u06C1u06C2u06C3u06C4u06C5u06C6u06C7u06C8u06C9u06CAu06CBu06CCu06CDu06CEu06CFu06D0u06D1u06D2u06D3u06D5u06EEu06EFu06FAu06FBu06FCu06FFu0710u0712u0713u0714u0715u0716u0717u0718u0719u071Au071Bu071Cu071Du071Eu071Fu0720u0721u0722u0723u0724u0725u0726u0727u0728u0729u072Au072Bu072Cu072Du072Eu072Fu074Du074Eu074Fu0750u0751u0752u0753u0754u0755u0756u0757u0758u0759u075Au075Bu075Cu075Du075Eu075Fu0760u0761u0762u0763u0764u0765u0766u0767u0768u0769u076Au076Bu076Cu076Du076Eu076Fu0770u0771u0772u0773u0774u0775u0776u0777u0778u0779u077Au077Bu077Cu077Du077Eu077Fu0780u0781u0782u0783u0784u0785u0786u0787u0788u0789u078Au078Bu078Cu078Du078Eu078Fu0790u0791u0792u0793u0794u0795u0796u0797u0798u0799u079Au079Bu079Cu079Du079Eu079Fu07A0u07A1u07A2u07A3u07A4u07A5u07B1u07CAu07CBu07CCu07CDu07CEu07CFu07D0u07D1u07D2u07D3u07D4u07D5u07D6u07D7u07D8u07D9u07DAu07DBu07DCu07DDu07DEu07DFu07E0u07E1u07E2u07E3u07E4u07E5u07E6u07E7u07E8u07E9u07EAu0904u0905u0906u0907u0908u0909u090Au090Bu090Cu090Du090Eu090Fu0910u0911u0912u0913u0914u0915u0916u0917u0918u0919u091Au091Bu091Cu091Du091Eu091Fu0920u0921u0922u0923u0924u0925u0926u0927u0928u0929u092Au092Bu092Cu092Du092Eu092Fu0930u0931u0932u0933u0934u0935u0936u0937u0938u0939u093Du0950u0958u0959u095Au095Bu095Cu095Du095Eu095Fu0960u0961u0972u097Bu097Cu097Du097Eu097Fu0985u0986u0987u0988u0989u098Au098Bu098Cu098Fu0990u0993u0994u0995u0996u0997u0998u0999u099Au099Bu099Cu099Du099Eu099Fu09A0u09A1u09A2u09A3u09A4u09A5u09A6u09A7u09A8u09AAu09ABu09ACu09ADu09AEu09AFu09B0u09B2u09B6u09B7u09B8u09B9u09BDu09CEu09DCu09DDu09DFu09E0u09E1u09F0u09F1u0A05u0A06u0A07u0A08u0A09u0A0Au0A0Fu0A10u0A13u0A14u0A15u0A16u0A17u0A18u0A19u0A1Au0A1Bu0A1Cu0A1Du0A1Eu0A1Fu0A20u0A21u0A22u0A23u0A24u0A25u0A26u0A27u0A28u0A2Au0A2Bu0A2Cu0A2Du0A2Eu0A2Fu0A30u0A32u0A33u0A35u0A36u0A38u0A39u0A59u0A5Au0A5Bu0A5Cu0A5Eu0A72u0A73u0A74u0A85u0A86u0A87u0A88u0A89u0A8Au0A8Bu0A8Cu0A8Du0A8Fu0A90u0A91u0A93u0A94u0A95u0A96u0A97u0A98u0A99u0A9Au0A9Bu0A9Cu0A9Du0A9Eu0A9Fu0AA0u0AA1u0AA2u0AA3u0AA4u0AA5u0AA6u0AA7u0AA8u0AAAu0AABu0AACu0AADu0AAEu0AAFu0AB0u0AB2u0AB3u0AB5u0AB6u0AB7u0AB8u0AB9u0ABDu0AD0u0AE0u0AE1u0B05u0B06u0B07u0B08u0B09u0B0Au0B0Bu0B0Cu0B0Fu0B10u0B13u0B14u0B15u0B16u0B17u0B18u0B19u0B1Au0B1Bu0B1Cu0B1Du0B1Eu0B1Fu0B20u0B21u0B22u0B23u0B24u0B25u0B26u0B27u0B28u0B2Au0B2Bu0B2Cu0B2Du0B2Eu0B2Fu0B30u0B32u0B33u0B35u0B36u0B37u0B38u0B39u0B3Du0B5Cu0B5Du0B5Fu0B60u0B61u0B71u0B83u0B85u0B86u0B87u0B88u0B89u0B8Au0B8Eu0B8Fu0B90u0B92u0B93u0B94u0B95u0B99u0B9Au0B9Cu0B9Eu0B9Fu0BA3u0BA4u0BA8u0BA9u0BAAu0BAEu0BAFu0BB0u0BB1u0BB2u0BB3u0BB4u0BB5u0BB6u0BB7u0BB8u0BB9u0BD0u0C05u0C06u0C07u0C08u0C09u0C0Au0C0Bu0C0Cu0C0Eu0C0Fu0C10u0C12u0C13u0C14u0C15u0C16u0C17u0C18u0C19u0C1Au0C1Bu0C1Cu0C1Du0C1Eu0C1Fu0C20u0C21u0C22u0C23u0C24u0C25u0C26u0C27u0C28u0C2Au0C2Bu0C2Cu0C2Du0C2Eu0C2Fu0C30u0C31u0C32u0C33u0C35u0C36u0C37u0C38u0C39u0C3Du0C58u0C59u0C60u0C61u0C85u0C86u0C87u0C88u0C89u0C8Au0C8Bu0C8Cu0C8Eu0C8Fu0C90u0C92u0C93u0C94u0C95u0C96u0C97u0C98u0C99u0C9Au0C9Bu0C9Cu0C9Du0C9Eu0C9Fu0CA0u0CA1u0CA2u0CA3u0CA4u0CA5u0CA6u0CA7u0CA8u0CAAu0CABu0CACu0CADu0CAEu0CAFu0CB0u0CB1u0CB2u0CB3u0CB5u0CB6u0CB7u0CB8u0CB9u0CBDu0CDEu0CE0u0CE1u0D05u0D06u0D07u0D08u0D09u0D0Au0D0Bu0D0Cu0D0Eu0D0Fu0D10u0D12u0D13u0D14u0D15u0D16u0D17u0D18u0D19u0D1Au0D1Bu0D1Cu0D1Du0D1Eu0D1Fu0D20u0D21u0D22u0D23u0D24u0D25u0D26u0D27u0D28u0D2Au0D2Bu0D2Cu0D2Du0D2Eu0D2Fu0D30u0D31u0D32u0D33u0D34u0D35u0D36u0D37u0D38u0D39u0D3Du0D60u0D61u0D7Au0D7Bu0D7Cu0D7Du0D7Eu0D7Fu0D85u0D86u0D87u0D88u0D89u0D8Au0D8Bu0D8Cu0D8Du0D8Eu0D8Fu0D90u0D91u0D92u0D93u0D94u0D95u0D96u0D9Au0D9Bu0D9Cu0D9Du0D9Eu0D9Fu0DA0u0DA1u0DA2u0DA3u0DA4u0DA5u0DA6u0DA7u0DA8u0DA9u0DAAu0DABu0DACu0DADu0DAEu0DAFu0DB0u0DB1u0DB3u0DB4u0DB5u0DB6u0DB7u0DB8u0DB9u0DBAu0DBBu0DBDu0DC0u0DC1u0DC2u0DC3u0DC4u0DC5u0DC6u0E01u0E02u0E03u0E04u0E05u0E06u0E07u0E08u0E09u0E0Au0E0Bu0E0Cu0E0Du0E0Eu0E0Fu0E10u0E11u0E12u0E13u0E14u0E15u0E16u0E17u0E18u0E19u0E1Au0E1Bu0E1Cu0E1Du0E1Eu0E1Fu0E20u0E21u0E22u0E23u0E24u0E25u0E26u0E27u0E28u0E29u0E2Au0E2Bu0E2Cu0E2Du0E2Eu0E2Fu0E30u0E32u0E33u0E40u0E41u0E42u0E43u0E44u0E45u0E81u0E82u0E84u0E87u0E88u0E8Au0E8Du0E94u0E95u0E96u0E97u0E99u0E9Au0E9Bu0E9Cu0E9Du0E9Eu0E9Fu0EA1u0EA2u0EA3u0EA5u0EA7u0EAAu0EABu0EADu0EAEu0EAFu0EB0u0EB2u0EB3u0EBDu0EC0u0EC1u0EC2u0EC3u0EC4u0EDCu0EDDu0F00u0F40u0F41u0F42u0F43u0F44u0F45u0F46u0F47u0F49u0F4Au0F4Bu0F4Cu0F4Du0F4Eu0F4Fu0F50u0F51u0F52u0F53u0F54u0F55u0F56u0F57u0F58u0F59u0F5Au0F5Bu0F5Cu0F5Du0F5Eu0F5Fu0F60u0F61u0F62u0F63u0F64u0F65u0F66u0F67u0F68u0F69u0F6Au0F6Bu0F6Cu0F88u0F89u0F8Au0F8Bu1000u1001u1002u1003u1004u1005u1006u1007u1008u1009u100Au100Bu100Cu100Du100Eu100Fu1010u1011u1012u1013u1014u1015u1016u1017u1018u1019u101Au101Bu101Cu101Du101Eu101Fu1020u1021u1022u1023u1024u1025u1026u1027u1028u1029u102Au103Fu1050u1051u1052u1053u1054u1055u105Au105Bu105Cu105Du1061u1065u1066u106Eu106Fu1070u1075u1076u1077u1078u1079u107Au107Bu107Cu107Du107Eu107Fu1080u1081u108Eu10D0u10D1u10D2u10D3u10D4u10D5u10D6u10D7u10D8u10D9u10DAu10DBu10DCu10DDu10DEu10DFu10E0u10E1u10E2u10E3u10E4u10E5u10E6u10E7u10E8u10E9u10EAu10EBu10ECu10EDu10EEu10EFu10F0u10F1u10F2u10F3u10F4u10F5u10F6u10F7u10F8u10F9u10FAu1100u1101u1102u1103u1104u1105u1106u1107u1108u1109u110Au110Bu110Cu110Du110Eu110Fu1110u1111u1112u1113u1114u1115u1116u1117u1118u1119u111Au111Bu111Cu111Du111Eu111Fu1120u1121u1122u1123u1124u1125u1126u1127u1128u1129u112Au112Bu112Cu112Du112Eu112Fu1130u1131u1132u1133u1134u1135u1136u1137u1138u1139u113Au113Bu113Cu113Du113Eu113Fu1140u1141u1142u1143u1144u1145u1146u1147u1148u1149u114Au114Bu114Cu114Du114Eu114Fu1150u1151u1152u1153u1154u1155u1156u1157u1158u1159u115Fu1160u1161u1162u1163u1164u1165u1166u1167u1168u1169u116Au116Bu116Cu116Du116Eu116Fu1170u1171u1172u1173u1174u1175u1176u1177u1178u1179u117Au117Bu117Cu117Du117Eu117Fu1180u1181u1182u1183u1184u1185u1186u1187u1188u1189u118Au118Bu118Cu118Du118Eu118Fu1190u1191u1192u1193u1194u1195u1196u1197u1198u1199u119Au119Bu119Cu119Du119Eu119Fu11A0u11A1u11A2u11A8u11A9u11AAu11ABu11ACu11ADu11AEu11AFu11B0u11B1u11B2u11B3u11B4u11B5u11B6u11B7u11B8u11B9u11BAu11BBu11BCu11BDu11BEu11BFu11C0u11C1u11C2u11C3u11C4u11C5u11C6u11C7u11C8u11C9u11CAu11CBu11CCu11CDu11CEu11CFu11D0u11D1u11D2u11D3u11D4u11D5u11D6u11D7u11D8u11D9u11DAu11DBu11DCu11DDu11DEu11DFu11E0u11E1u11E2u11E3u11E4u11E5u11E6u11E7u11E8u11E9u11EAu11EBu11ECu11EDu11EEu11EFu11F0u11F1u11F2u11F3u11F4u11F5u11F6u11F7u11F8u11F9u1200u1201u1202u1203u1204u1205u1206u1207u1208u1209u120Au120Bu120Cu120Du120Eu120Fu1210u1211u1212u1213u1214u1215u1216u1217u1218u1219u121Au121Bu121Cu121Du121Eu121Fu1220u1221u1222u1223u1224u1225u1226u1227u1228u1229u122Au122Bu122Cu122Du122Eu122Fu1230u1231u1232u1233u1234u1235u1236u1237u1238u1239u123Au123Bu123Cu123Du123Eu123Fu1240u1241u1242u1243u1244u1245u1246u1247u1248u124Au124Bu124Cu124Du1250u1251u1252u1253u1254u1255u1256u1258u125Au125Bu125Cu125Du1260u1261u1262u1263u1264u1265u1266u1267u1268u1269u126Au126Bu126Cu126Du126Eu126Fu1270u1271u1272u1273u1274u1275u1276u1277u1278u1279u127Au127Bu127Cu127Du127Eu127Fu1280u1281u1282u1283u1284u1285u1286u1287u1288u128Au128Bu128Cu128Du1290u1291u1292u1293u1294u1295u1296u1297u1298u1299u129Au129Bu129Cu129Du129Eu129Fu12A0u12A1u12A2u12A3u12A4u12A5u12A6u12A7u12A8u12A9u12AAu12ABu12ACu12ADu12AEu12AFu12B0u12B2u12B3u12B4u12B5u12B8u12B9u12BAu12BBu12BCu12BDu12BEu12C0u12C2u12C3u12C4u12C5u12C8u12C9u12CAu12CBu12CCu12CDu12CEu12CFu12D0u12D1u12D2u12D3u12D4u12D5u12D6u12D8u12D9u12DAu12DBu12DCu12DDu12DEu12DFu12E0u12E1u12E2u12E3u12E4u12E5u12E6u12E7u12E8u12E9u12EAu12EBu12ECu12EDu12EEu12EFu12F0u12F1u12F2u12F3u12F4u12F5u12F6u12F7u12F8u12F9u12FAu12FBu12FCu12FDu12FEu12FFu1300u1301u1302u1303u1304u1305u1306u1307u1308u1309u130Au130Bu130Cu130Du130Eu130Fu1310u1312u1313u1314u1315u1318u1319u131Au131Bu131Cu131Du131Eu131Fu1320u1321u1322u1323u1324u1325u1326u1327u1328u1329u132Au132Bu132Cu132Du132Eu132Fu1330u1331u1332u1333u1334u1335u1336u1337u1338u1339u133Au133Bu133Cu133Du133Eu133Fu1340u1341u1342u1343u1344u1345u1346u1347u1348u1349u134Au134Bu134Cu134Du134Eu134Fu1350u1351u1352u1353u1354u1355u1356u1357u1358u1359u135Au1380u1381u1382u1383u1384u1385u1386u1387u1388u1389u138Au138Bu138Cu138Du138Eu138Fu13A0u13A1u13A2u13A3u13A4u13A5u13A6u13A7u13A8u13A9u13AAu13ABu13ACu13ADu13AEu13AFu13B0u13B1u13B2u13B3u13B4u13B5u13B6u13B7u13B8u13B9u13BAu13BBu13BCu13BDu13BEu13BFu13C0u13C1u13C2u13C3u13C4u13C5u13C6u13C7u13C8u13C9u13CAu13CBu13CCu13CDu13CEu13CFu13D0u13D1u13D2u13D3u13D4u13D5u13D6u13D7u13D8u13D9u13DAu13DBu13DCu13DDu13DEu13DFu13E0u13E1u13E2u13E3u13E4u13E5u13E6u13E7u13E8u13E9u13EAu13EBu13ECu13EDu13EEu13EFu13F0u13F1u13F2u13F3u13F4u1401u1402u1403u1404u1405u1406u1407u1408u1409u140Au140Bu140Cu140Du140Eu140Fu1410u1411u1412u1413u1414u1415u1416u1417u1418u1419u141Au141Bu141Cu141Du141Eu141Fu1420u1421u1422u1423u1424u1425u1426u1427u1428u1429u142Au142Bu142Cu142Du142Eu142Fu1430u1431u1432u1433u1434u1435u1436u1437u1438u1439u143Au143Bu143Cu143Du143Eu143Fu1440u1441u1442u1443u1444u1445u1446u1447u1448u1449u144Au144Bu144Cu144Du144Eu144Fu1450u1451u1452u1453u1454u1455u1456u1457u1458u1459u145Au145Bu145Cu145Du145Eu145Fu1460u1461u1462u1463u1464u1465u1466u1467u1468u1469u146Au146Bu146Cu146Du146Eu146Fu1470u1471u1472u1473u1474u1475u1476u1477u1478u1479u147Au147Bu147Cu147Du147Eu147Fu1480u1481u1482u1483u1484u1485u1486u1487u1488u1489u148Au148Bu148Cu148Du148Eu148Fu1490u1491u1492u1493u1494u1495u1496u1497u1498u1499u149Au149Bu149Cu149Du149Eu149Fu14A0u14A1u14A2u14A3u14A4u14A5u14A6u14A7u14A8u14A9u14AAu14ABu14ACu14ADu14AEu14AFu14B0u14B1u14B2u14B3u14B4u14B5u14B6u14B7u14B8u14B9u14BAu14BBu14BCu14BDu14BEu14BFu14C0u14C1u14C2u14C3u14C4u14C5u14C6u14C7u14C8u14C9u14CAu14CBu14CCu14CDu14CEu14CFu14D0u14D1u14D2u14D3u14D4u14D5u14D6u14D7u14D8u14D9u14DAu14DBu14DCu14DDu14DEu14DFu14E0u14E1u14E2u14E3u14E4u14E5u14E6u14E7u14E8u14E9u14EAu14EBu14ECu14EDu14EEu14EFu14F0u14F1u14F2u14F3u14F4u14F5u14F6u14F7u14F8u14F9u14FAu14FBu14FCu14FDu14FEu14FFu1500u1501u1502u1503u1504u1505u1506u1507u1508u1509u150Au150Bu150Cu150Du150Eu150Fu1510u1511u1512u1513u1514u1515u1516u1517u1518u1519u151Au151Bu151Cu151Du151Eu151Fu1520u1521u1522u1523u1524u1525u1526u1527u1528u1529u152Au152Bu152Cu152Du152Eu152Fu1530u1531u1532u1533u1534u1535u1536u1537u1538u1539u153Au153Bu153Cu153Du153Eu153Fu1540u1541u1542u1543u1544u1545u1546u1547u1548u1549u154Au154Bu154Cu154Du154Eu154Fu1550u1551u1552u1553u1554u1555u1556u1557u1558u1559u155Au155Bu155Cu155Du155Eu155Fu1560u1561u1562u1563u1564u1565u1566u1567u1568u1569u156Au156Bu156Cu156Du156Eu156Fu1570u1571u1572u1573u1574u1575u1576u1577u1578u1579u157Au157Bu157Cu157Du157Eu157Fu1580u1581u1582u1583u1584u1585u1586u1587u1588u1589u158Au158Bu158Cu158Du158Eu158Fu1590u1591u1592u1593u1594u1595u1596u1597u1598u1599u159Au159Bu159Cu159Du159Eu159Fu15A0u15A1u15A2u15A3u15A4u15A5u15A6u15A7u15A8u15A9u15AAu15ABu15ACu15ADu15AEu15AFu15B0u15B1u15B2u15B3u15B4u15B5u15B6u15B7u15B8u15B9u15BAu15BBu15BCu15BDu15BEu15BFu15C0u15C1u15C2u15C3u15C4u15C5u15C6u15C7u15C8u15C9u15CAu15CBu15CCu15CDu15CEu15CFu15D0u15D1u15D2u15D3u15D4u15D5u15D6u15D7u15D8u15D9u15DAu15DBu15DCu15DDu15DEu15DFu15E0u15E1u15E2u15E3u15E4u15E5u15E6u15E7u15E8u15E9u15EAu15EBu15ECu15EDu15EEu15EFu15F0u15F1u15F2u15F3u15F4u15F5u15F6u15F7u15F8u15F9u15FAu15FBu15FCu15FDu15FEu15FFu1600u1601u1602u1603u1604u1605u1606u1607u1608u1609u160Au160Bu160Cu160Du160Eu160Fu1610u1611u1612u1613u1614u1615u1616u1617u1618u1619u161Au161Bu161Cu161Du161Eu161Fu1620u1621u1622u1623u1624u1625u1626u1627u1628u1629u162Au162Bu162Cu162Du162Eu162Fu1630u1631u1632u1633u1634u1635u1636u1637u1638u1639u163Au163Bu163Cu163Du163Eu163Fu1640u1641u1642u1643u1644u1645u1646u1647u1648u1649u164Au164Bu164Cu164Du164Eu164Fu1650u1651u1652u1653u1654u1655u1656u1657u1658u1659u165Au165Bu165Cu165Du165Eu165Fu1660u1661u1662u1663u1664u1665u1666u1667u1668u1669u166Au166Bu166Cu166Fu1670u1671u1672u1673u1674u1675u1676u1681u1682u1683u1684u1685u1686u1687u1688u1689u168Au168Bu168Cu168Du168Eu168Fu1690u1691u1692u1693u1694u1695u1696u1697u1698u1699u169Au16A0u16A1u16A2u16A3u16A4u16A5u16A6u16A7u16A8u16A9u16AAu16ABu16ACu16ADu16AEu16AFu16B0u16B1u16B2u16B3u16B4u16B5u16B6u16B7u16B8u16B9u16BAu16BBu16BCu16BDu16BEu16BFu16C0u16C1u16C2u16C3u16C4u16C5u16C6u16C7u16C8u16C9u16CAu16CBu16CCu16CDu16CEu16CFu16D0u16D1u16D2u16D3u16D4u16D5u16D6u16D7u16D8u16D9u16DAu16DBu16DCu16DDu16DEu16DFu16E0u16E1u16E2u16E3u16E4u16E5u16E6u16E7u16E8u16E9u16EAu1700u1701u1702u1703u1704u1705u1706u1707u1708u1709u170Au170Bu170Cu170Eu170Fu1710u1711u1720u1721u1722u1723u1724u1725u1726u1727u1728u1729u172Au172Bu172Cu172Du172Eu172Fu1730u1731u1740u1741u1742u1743u1744u1745u1746u1747u1748u1749u174Au174Bu174Cu174Du174Eu174Fu1750u1751u1760u1761u1762u1763u1764u1765u1766u1767u1768u1769u176Au176Bu176Cu176Eu176Fu1770u1780u1781u1782u1783u1784u1785u1786u1787u1788u1789u178Au178Bu178Cu178Du178Eu178Fu1790u1791u1792u1793u1794u1795u1796u1797u1798u1799u179Au179Bu179Cu179Du179Eu179Fu17A0u17A1u17A2u17A3u17A4u17A5u17A6u17A7u17A8u17A9u17AAu17ABu17ACu17ADu17AEu17AFu17B0u17B1u17B2u17B3u17DCu1820u1821u1822u1823u1824u1825u1826u1827u1828u1829u182Au182Bu182Cu182Du182Eu182Fu1830u1831u1832u1833u1834u1835u1836u1837u1838u1839u183Au183Bu183Cu183Du183Eu183Fu1840u1841u1842u1844u1845u1846u1847u1848u1849u184Au184Bu184Cu184Du184Eu184Fu1850u1851u1852u1853u1854u1855u1856u1857u1858u1859u185Au185Bu185Cu185Du185Eu185Fu1860u1861u1862u1863u1864u1865u1866u1867u1868u1869u186Au186Bu186Cu186Du186Eu186Fu1870u1871u1872u1873u1874u1875u1876u1877u1880u1881u1882u1883u1884u1885u1886u1887u1888u1889u188Au188Bu188Cu188Du188Eu188Fu1890u1891u1892u1893u1894u1895u1896u1897u1898u1899u189Au189Bu189Cu189Du189Eu189Fu18A0u18A1u18A2u18A3u18A4u18A5u18A6u18A7u18A8u18AAu1900u1901u1902u1903u1904u1905u1906u1907u1908u1909u190Au190Bu190Cu190Du190Eu190Fu1910u1911u1912u1913u1914u1915u1916u1917u1918u1919u191Au191Bu191Cu1950u1951u1952u1953u1954u1955u1956u1957u1958u1959u195Au195Bu195Cu195Du195Eu195Fu1960u1961u1962u1963u1964u1965u1966u1967u1968u1969u196Au196Bu196Cu196Du1970u1971u1972u1973u1974u1980u1981u1982u1983u1984u1985u1986u1987u1988u1989u198Au198Bu198Cu198Du198Eu198Fu1990u1991u1992u1993u1994u1995u1996u1997u1998u1999u199Au199Bu199Cu199Du199Eu199Fu19A0u19A1u19A2u19A3u19A4u19A5u19A6u19A7u19A8u19A9u19C1u19C2u19C3u19C4u19C5u19C6u19C7u1A00u1A01u1A02u1A03u1A04u1A05u1A06u1A07u1A08u1A09u1A0Au1A0Bu1A0Cu1A0Du1A0Eu1A0Fu1A10u1A11u1A12u1A13u1A14u1A15u1A16u1B05u1B06u1B07u1B08u1B09u1B0Au1B0Bu1B0Cu1B0Du1B0Eu1B0Fu1B10u1B11u1B12u1B13u1B14u1B15u1B16u1B17u1B18u1B19u1B1Au1B1Bu1B1Cu1B1Du1B1Eu1B1Fu1B20u1B21u1B22u1B23u1B24u1B25u1B26u1B27u1B28u1B29u1B2Au1B2Bu1B2Cu1B2Du1B2Eu1B2Fu1B30u1B31u1B32u1B33u1B45u1B46u1B47u1B48u1B49u1B4Au1B4Bu1B83u1B84u1B85u1B86u1B87u1B88u1B89u1B8Au1B8Bu1B8Cu1B8Du1B8Eu1B8Fu1B90u1B91u1B92u1B93u1B94u1B95u1B96u1B97u1B98u1B99u1B9Au1B9Bu1B9Cu1B9Du1B9Eu1B9Fu1BA0u1BAEu1BAFu1C00u1C01u1C02u1C03u1C04u1C05u1C06u1C07u1C08u1C09u1C0Au1C0Bu1C0Cu1C0Du1C0Eu1C0Fu1C10u1C11u1C12u1C13u1C14u1C15u1C16u1C17u1C18u1C19u1C1Au1C1Bu1C1Cu1C1Du1C1Eu1C1Fu1C20u1C21u1C22u1C23u1C4Du1C4Eu1C4Fu1C5Au1C5Bu1C5Cu1C5Du1C5Eu1C5Fu1C60u1C61u1C62u1C63u1C64u1C65u1C66u1C67u1C68u1C69u1C6Au1C6Bu1C6Cu1C6Du1C6Eu1C6Fu1C70u1C71u1C72u1C73u1C74u1C75u1C76u1C77u2135u2136u2137u2138u2D30u2D31u2D32u2D33u2D34u2D35u2D36u2D37u2D38u2D39u2D3Au2D3Bu2D3Cu2D3Du2D3Eu2D3Fu2D40u2D41u2D42u2D43u2D44u2D45u2D46u2D47u2D48u2D49u2D4Au2D4Bu2D4Cu2D4Du2D4Eu2D4Fu2D50u2D51u2D52u2D53u2D54u2D55u2D56u2D57u2D58u2D59u2D5Au2D5Bu2D5Cu2D5Du2D5Eu2D5Fu2D60u2D61u2D62u2D63u2D64u2D65u2D80u2D81u2D82u2D83u2D84u2D85u2D86u2D87u2D88u2D89u2D8Au2D8Bu2D8Cu2D8Du2D8Eu2D8Fu2D90u2D91u2D92u2D93u2D94u2D95u2D96u2DA0u2DA1u2DA2u2DA3u2DA4u2DA5u2DA6u2DA8u2DA9u2DAAu2DABu2DACu2DADu2DAEu2DB0u2DB1u2DB2u2DB3u2DB4u2DB5u2DB6u2DB8u2DB9u2DBAu2DBBu2DBCu2DBDu2DBEu2DC0u2DC1u2DC2u2DC3u2DC4u2DC5u2DC6u2DC8u2DC9u2DCAu2DCBu2DCCu2DCDu2DCEu2DD0u2DD1u2DD2u2DD3u2DD4u2DD5u2DD6u2DD8u2DD9u2DDAu2DDBu2DDCu2DDDu2DDEu3006u303Cu3041u3042u3043u3044u3045u3046u3047u3048u3049u304Au304Bu304Cu304Du304Eu304Fu3050u3051u3052u3053u3054u3055u3056u3057u3058u3059u305Au305Bu305Cu305Du305Eu305Fu3060u3061u3062u3063u3064u3065u3066u3067u3068u3069u306Au306Bu306Cu306Du306Eu306Fu3070u3071u3072u3073u3074u3075u3076u3077u3078u3079u307Au307Bu307Cu307Du307Eu307Fu3080u3081u3082u3083u3084u3085u3086u3087u3088u3089u308Au308Bu308Cu308Du308Eu308Fu3090u3091u3092u3093u3094u3095u3096u309Fu30A1u30A2u30A3u30A4u30A5u30A6u30A7u30A8u30A9u30AAu30ABu30ACu30ADu30AEu30AFu30B0u30B1u30B2u30B3u30B4u30B5u30B6u30B7u30B8u30B9u30BAu30BBu30BCu30BDu30BEu30BFu30C0u30C1u30C2u30C3u30C4u30C5u30C6u30C7u30C8u30C9u30CAu30CBu30CCu30CDu30CEu30CFu30D0u30D1u30D2u30D3u30D4u30D5u30D6u30D7u30D8u30D9u30DAu30DBu30DCu30DDu30DEu30DFu30E0u30E1u30E2u30E3u30E4u30E5u30E6u30E7u30E8u30E9u30EAu30EBu30ECu30EDu30EEu30EFu30F0u30F1u30F2u30F3u30F4u30F5u30F6u30F7u30F8u30F9u30FAu30FFu3105u3106u3107u3108u3109u310Au310Bu310Cu310Du310Eu310Fu3110u3111u3112u3113u3114u3115u3116u3117u3118u3119u311Au311Bu311Cu311Du311Eu311Fu3120u3121u3122u3123u3124u3125u3126u3127u3128u3129u312Au312Bu312Cu312Du3131u3132u3133u3134u3135u3136u3137u3138u3139u313Au313Bu313Cu313Du313Eu313Fu3140u3141u3142u3143u3144u3145u3146u3147u3148u3149u314Au314Bu314Cu314Du314Eu314Fu3150u3151u3152u3153u3154u3155u3156u3157u3158u3159u315Au315Bu315Cu315Du315Eu315Fu3160u3161u3162u3163u3164u3165u3166u3167u3168u3169u316Au316Bu316Cu316Du316Eu316Fu3170u3171u3172u3173u3174u3175u3176u3177u3178u3179u317Au317Bu317Cu317Du317Eu317Fu3180u3181u3182u3183u3184u3185u3186u3187u3188u3189u318Au318Bu318Cu318Du318Eu31A0u31A1u31A2u31A3u31A4u31A5u31A6u31A7u31A8u31A9u31AAu31ABu31ACu31ADu31AEu31AFu31B0u31B1u31B2u31B3u31B4u31B5u31B6u31B7u31F0u31F1u31F2u31F3u31F4u31F5u31F6u31F7u31F8u31F9u31FAu31FBu31FCu31FDu31FEu31FFu3400u4DB5u4E00u9FC3uA000uA001uA002uA003uA004uA005uA006uA007uA008uA009uA00AuA00BuA00CuA00DuA00EuA00FuA010uA011uA012uA013uA014uA016uA017uA018uA019uA01AuA01BuA01CuA01DuA01EuA01FuA020uA021uA022uA023uA024uA025uA026uA027uA028uA029uA02AuA02BuA02CuA02DuA02EuA02FuA030uA031uA032uA033uA034uA035uA036uA037uA038uA039uA03AuA03BuA03CuA03DuA03EuA03FuA040uA041uA042uA043uA044uA045uA046uA047uA048uA049uA04AuA04BuA04CuA04DuA04EuA04FuA050uA051uA052uA053uA054uA055uA056uA057uA058uA059uA05AuA05BuA05CuA05DuA05EuA05FuA060uA061uA062uA063uA064uA065uA066uA067uA068uA069uA06AuA06BuA06CuA06DuA06EuA06FuA070uA071uA072uA073uA074uA075uA076uA077uA078uA079uA07AuA07BuA07CuA07DuA07EuA07FuA080uA081uA082uA083uA084uA085uA086uA087uA088uA089uA08AuA08BuA08CuA08DuA08EuA08FuA090uA091uA092uA093uA094uA095uA096uA097uA098uA099uA09AuA09BuA09CuA09DuA09EuA09FuA0A0uA0A1uA0A2uA0A3uA0A4uA0A5uA0A6uA0A7uA0A8uA0A9uA0AAuA0ABuA0ACuA0ADuA0AEuA0AFuA0B0uA0B1uA0B2uA0B3uA0B4uA0B5uA0B6uA0B7uA0B8uA0B9uA0BAuA0BBuA0BCuA0BDuA0BEuA0BFuA0C0uA0C1uA0C2uA0C3uA0C4uA0C5uA0C6uA0C7uA0C8uA0C9uA0CAuA0CBuA0CCuA0CDuA0CEuA0CFuA0D0uA0D1uA0D2uA0D3uA0D4uA0D5uA0D6uA0D7uA0D8uA0D9uA0DAuA0DBuA0DCuA0DDuA0DEuA0DFuA0E0uA0E1uA0E2uA0E3uA0E4uA0E5uA0E6uA0E7uA0E8uA0E9uA0EAuA0EBuA0ECuA0EDuA0EEuA0EFuA0F0uA0F1uA0F2uA0F3uA0F4uA0F5uA0F6uA0F7uA0F8uA0F9uA0FAuA0FBuA0FCuA0FDuA0FEuA0FFuA100uA101uA102uA103uA104uA105uA106uA107uA108uA109uA10AuA10BuA10CuA10DuA10EuA10FuA110uA111uA112uA113uA114uA115uA116uA117uA118uA119uA11AuA11BuA11CuA11DuA11EuA11FuA120uA121uA122uA123uA124uA125uA126uA127uA128uA129uA12AuA12BuA12CuA12DuA12EuA12FuA130uA131uA132uA133uA134uA135uA136uA137uA138uA139uA13AuA13BuA13CuA13DuA13EuA13FuA140uA141uA142uA143uA144uA145uA146uA147uA148uA149uA14AuA14BuA14CuA14DuA14EuA14FuA150uA151uA152uA153uA154uA155uA156uA157uA158uA159uA15AuA15BuA15CuA15DuA15EuA15FuA160uA161uA162uA163uA164uA165uA166uA167uA168uA169uA16AuA16BuA16CuA16DuA16EuA16FuA170uA171uA172uA173uA174uA175uA176uA177uA178uA179uA17AuA17BuA17CuA17DuA17EuA17FuA180uA181uA182uA183uA184uA185uA186uA187uA188uA189uA18AuA18BuA18CuA18DuA18EuA18FuA190uA191uA192uA193uA194uA195uA196uA197uA198uA199uA19AuA19BuA19CuA19DuA19EuA19FuA1A0uA1A1uA1A2uA1A3uA1A4uA1A5uA1A6uA1A7uA1A8uA1A9uA1AAuA1ABuA1ACuA1ADuA1AEuA1AFuA1B0uA1B1uA1B2uA1B3uA1B4uA1B5uA1B6uA1B7uA1B8uA1B9uA1BAuA1BBuA1BCuA1BDuA1BEuA1BFuA1C0uA1C1uA1C2uA1C3uA1C4uA1C5uA1C6uA1C7uA1C8uA1C9uA1CAuA1CBuA1CCuA1CDuA1CEuA1CFuA1D0uA1D1uA1D2uA1D3uA1D4uA1D5uA1D6uA1D7uA1D8uA1D9uA1DAuA1DBuA1DCuA1DDuA1DEuA1DFuA1E0uA1E1uA1E2uA1E3uA1E4uA1E5uA1E6uA1E7uA1E8uA1E9uA1EAuA1EBuA1ECuA1EDuA1EEuA1EFuA1F0uA1F1uA1F2uA1F3uA1F4uA1F5uA1F6uA1F7uA1F8uA1F9uA1FAuA1FBuA1FCuA1FDuA1FEuA1FFuA200uA201uA202uA203uA204uA205uA206uA207uA208uA209uA20AuA20BuA20CuA20DuA20EuA20FuA210uA211uA212uA213uA214uA215uA216uA217uA218uA219uA21AuA21BuA21CuA21DuA21EuA21FuA220uA221uA222uA223uA224uA225uA226uA227uA228uA229uA22AuA22BuA22CuA22DuA22EuA22FuA230uA231uA232uA233uA234uA235uA236uA237uA238uA239uA23AuA23BuA23CuA23DuA23EuA23FuA240uA241uA242uA243uA244uA245uA246uA247uA248uA249uA24AuA24BuA24CuA24DuA24EuA24FuA250uA251uA252uA253uA254uA255uA256uA257uA258uA259uA25AuA25BuA25CuA25DuA25EuA25FuA260uA261uA262uA263uA264uA265uA266uA267uA268uA269uA26AuA26BuA26CuA26DuA26EuA26FuA270uA271uA272uA273uA274uA275uA276uA277uA278uA279uA27AuA27BuA27CuA27DuA27EuA27FuA280uA281uA282uA283uA284uA285uA286uA287uA288uA289uA28AuA28BuA28CuA28DuA28EuA28FuA290uA291uA292uA293uA294uA295uA296uA297uA298uA299uA29AuA29BuA29CuA29DuA29EuA29FuA2A0uA2A1uA2A2uA2A3uA2A4uA2A5uA2A6uA2A7uA2A8uA2A9uA2AAuA2ABuA2ACuA2ADuA2AEuA2AFuA2B0uA2B1uA2B2uA2B3uA2B4uA2B5uA2B6uA2B7uA2B8uA2B9uA2BAuA2BBuA2BCuA2BDuA2BEuA2BFuA2C0uA2C1uA2C2uA2C3uA2C4uA2C5uA2C6uA2C7uA2C8uA2C9uA2CAuA2CBuA2CCuA2CDuA2CEuA2CFuA2D0uA2D1uA2D2uA2D3uA2D4uA2D5uA2D6uA2D7uA2D8uA2D9uA2DAuA2DBuA2DCuA2DDuA2DEuA2DFuA2E0uA2E1uA2E2uA2E3uA2E4uA2E5uA2E6uA2E7uA2E8uA2E9uA2EAuA2EBuA2ECuA2EDuA2EEuA2EFuA2F0uA2F1uA2F2uA2F3uA2F4uA2F5uA2F6uA2F7uA2F8uA2F9uA2FAuA2FBuA2FCuA2FDuA2FEuA2FFuA300uA301uA302uA303uA304uA305uA306uA307uA308uA309uA30AuA30BuA30CuA30DuA30EuA30FuA310uA311uA312uA313uA314uA315uA316uA317uA318uA319uA31AuA31BuA31CuA31DuA31EuA31FuA320uA321uA322uA323uA324uA325uA326uA327uA328uA329uA32AuA32BuA32CuA32DuA32EuA32FuA330uA331uA332uA333uA334uA335uA336uA337uA338uA339uA33AuA33BuA33CuA33DuA33EuA33FuA340uA341uA342uA343uA344uA345uA346uA347uA348uA349uA34AuA34BuA34CuA34DuA34EuA34FuA350uA351uA352uA353uA354uA355uA356uA357uA358uA359uA35AuA35BuA35CuA35DuA35EuA35FuA360uA361uA362uA363uA364uA365uA366uA367uA368uA369uA36AuA36BuA36CuA36DuA36EuA36FuA370uA371uA372uA373uA374uA375uA376uA377uA378uA379uA37AuA37BuA37CuA37DuA37EuA37FuA380uA381uA382uA383uA384uA385uA386uA387uA388uA389uA38AuA38BuA38CuA38DuA38EuA38FuA390uA391uA392uA393uA394uA395uA396uA397uA398uA399uA39AuA39BuA39CuA39DuA39EuA39FuA3A0uA3A1uA3A2uA3A3uA3A4uA3A5uA3A6uA3A7uA3A8uA3A9uA3AAuA3ABuA3ACuA3ADuA3AEuA3AFuA3B0uA3B1uA3B2uA3B3uA3B4uA3B5uA3B6uA3B7uA3B8uA3B9uA3BAuA3BBuA3BCuA3BDuA3BEuA3BFuA3C0uA3C1uA3C2uA3C3uA3C4uA3C5uA3C6uA3C7uA3C8uA3C9uA3CAuA3CBuA3CCuA3CDuA3CEuA3CFuA3D0uA3D1uA3D2uA3D3uA3D4uA3D5uA3D6uA3D7uA3D8uA3D9uA3DAuA3DBuA3DCuA3DDuA3DEuA3DFuA3E0uA3E1uA3E2uA3E3uA3E4uA3E5uA3E6uA3E7uA3E8uA3E9uA3EAuA3EBuA3ECuA3EDuA3EEuA3EFuA3F0uA3F1uA3F2uA3F3uA3F4uA3F5uA3F6uA3F7uA3F8uA3F9uA3FAuA3FBuA3FCuA3FDuA3FEuA3FFuA400uA401uA402uA403uA404uA405uA406uA407uA408uA409uA40AuA40BuA40CuA40DuA40EuA40FuA410uA411uA412uA413uA414uA415uA416uA417uA418uA419uA41AuA41BuA41CuA41DuA41EuA41FuA420uA421uA422uA423uA424uA425uA426uA427uA428uA429uA42AuA42BuA42CuA42DuA42EuA42FuA430uA431uA432uA433uA434uA435uA436uA437uA438uA439uA43AuA43BuA43CuA43DuA43EuA43FuA440uA441uA442uA443uA444uA445uA446uA447uA448uA449uA44AuA44BuA44CuA44DuA44EuA44FuA450uA451uA452uA453uA454uA455uA456uA457uA458uA459uA45AuA45BuA45CuA45DuA45EuA45FuA460uA461uA462uA463uA464uA465uA466uA467uA468uA469uA46AuA46BuA46CuA46DuA46EuA46FuA470uA471uA472uA473uA474uA475uA476uA477uA478uA479uA47AuA47BuA47CuA47DuA47EuA47FuA480uA481uA482uA483uA484uA485uA486uA487uA488uA489uA48AuA48BuA48CuA500uA501uA502uA503uA504uA505uA506uA507uA508uA509uA50AuA50BuA50CuA50DuA50EuA50FuA510uA511uA512uA513uA514uA515uA516uA517uA518uA519uA51AuA51BuA51CuA51DuA51EuA51FuA520uA521uA522uA523uA524uA525uA526uA527uA528uA529uA52AuA52BuA52CuA52DuA52EuA52FuA530uA531uA532uA533uA534uA535uA536uA537uA538uA539uA53AuA53BuA53CuA53DuA53EuA53FuA540uA541uA542uA543uA544uA545uA546uA547uA548uA549uA54AuA54BuA54CuA54DuA54EuA54FuA550uA551uA552uA553uA554uA555uA556uA557uA558uA559uA55AuA55BuA55CuA55DuA55EuA55FuA560uA561uA562uA563uA564uA565uA566uA567uA568uA569uA56AuA56BuA56CuA56DuA56EuA56FuA570uA571uA572uA573uA574uA575uA576uA577uA578uA579uA57AuA57BuA57CuA57DuA57EuA57FuA580uA581uA582uA583uA584uA585uA586uA587uA588uA589uA58AuA58BuA58CuA58DuA58EuA58FuA590uA591uA592uA593uA594uA595uA596uA597uA598uA599uA59AuA59BuA59CuA59DuA59EuA59FuA5A0uA5A1uA5A2uA5A3uA5A4uA5A5uA5A6uA5A7uA5A8uA5A9uA5AAuA5ABuA5ACuA5ADuA5AEuA5AFuA5B0uA5B1uA5B2uA5B3uA5B4uA5B5uA5B6uA5B7uA5B8uA5B9uA5BAuA5BBuA5BCuA5BDuA5BEuA5BFuA5C0uA5C1uA5C2uA5C3uA5C4uA5C5uA5C6uA5C7uA5C8uA5C9uA5CAuA5CBuA5CCuA5CDuA5CEuA5CFuA5D0uA5D1uA5D2uA5D3uA5D4uA5D5uA5D6uA5D7uA5D8uA5D9uA5DAuA5DBuA5DCuA5DDuA5DEuA5DFuA5E0uA5E1uA5E2uA5E3uA5E4uA5E5uA5E6uA5E7uA5E8uA5E9uA5EAuA5EBuA5ECuA5EDuA5EEuA5EFuA5F0uA5F1uA5F2uA5F3uA5F4uA5F5uA5F6uA5F7uA5F8uA5F9uA5FAuA5FBuA5FCuA5FDuA5FEuA5FFuA600uA601uA602uA603uA604uA605uA606uA607uA608uA609uA60AuA60BuA610uA611uA612uA613uA614uA615uA616uA617uA618uA619uA61AuA61BuA61CuA61DuA61EuA61FuA62AuA62BuA66EuA7FBuA7FCuA7FDuA7FEuA7FFuA800uA801uA803uA804uA805uA807uA808uA809uA80AuA80CuA80DuA80EuA80FuA810uA811uA812uA813uA814uA815uA816uA817uA818uA819uA81AuA81BuA81CuA81DuA81EuA81FuA820uA821uA822uA840uA841uA842uA843uA844uA845uA846uA847uA848uA849uA84AuA84BuA84CuA84DuA84EuA84FuA850uA851uA852uA853uA854uA855uA856uA857uA858uA859uA85AuA85BuA85CuA85DuA85EuA85FuA860uA861uA862uA863uA864uA865uA866uA867uA868uA869uA86AuA86BuA86CuA86DuA86EuA86FuA870uA871uA872uA873uA882uA883uA884uA885uA886uA887uA888uA889uA88AuA88BuA88CuA88DuA88EuA88FuA890uA891uA892uA893uA894uA895uA896uA897uA898uA899uA89AuA89BuA89CuA89DuA89EuA89FuA8A0uA8A1uA8A2uA8A3uA8A4uA8A5uA8A6uA8A7uA8A8uA8A9uA8AAuA8ABuA8ACuA8ADuA8AEuA8AFuA8B0uA8B1uA8B2uA8B3uA90AuA90BuA90CuA90DuA90EuA90FuA910uA911uA912uA913uA914uA915uA916uA917uA918uA919uA91AuA91BuA91CuA91DuA91EuA91FuA920uA921uA922uA923uA924uA925uA930uA931uA932uA933uA934uA935uA936uA937uA938uA939uA93AuA93BuA93CuA93DuA93EuA93FuA940uA941uA942uA943uA944uA945uA946uAA00uAA01uAA02uAA03uAA04uAA05uAA06uAA07uAA08uAA09uAA0AuAA0BuAA0CuAA0DuAA0EuAA0FuAA10uAA11uAA12uAA13uAA14uAA15uAA16uAA17uAA18uAA19uAA1AuAA1BuAA1CuAA1DuAA1EuAA1FuAA20uAA21uAA22uAA23uAA24uAA25uAA26uAA27uAA28uAA40uAA41uAA42uAA44uAA45uAA46uAA47uAA48uAA49uAA4AuAA4BuAC00uD7A3uF900uF901uF902uF903uF904uF905uF906uF907uF908uF909uF90AuF90BuF90CuF90DuF90EuF90FuF910uF911uF912uF913uF914uF915uF916uF917uF918uF919uF91AuF91BuF91CuF91DuF91EuF91FuF920uF921uF922uF923uF924uF925uF926uF927uF928uF929uF92AuF92BuF92CuF92DuF92EuF92FuF930uF931uF932uF933uF934uF935uF936uF937uF938uF939uF93AuF93BuF93CuF93DuF93EuF93FuF940uF941uF942uF943uF944uF945uF946uF947uF948uF949uF94AuF94BuF94CuF94DuF94EuF94FuF950uF951uF952uF953uF954uF955uF956uF957uF958uF959uF95AuF95BuF95CuF95DuF95EuF95FuF960uF961uF962uF963uF964uF965uF966uF967uF968uF969uF96AuF96BuF96CuF96DuF96EuF96FuF970uF971uF972uF973uF974uF975uF976uF977uF978uF979uF97AuF97BuF97CuF97DuF97EuF97FuF980uF981uF982uF983uF984uF985uF986uF987uF988uF989uF98AuF98BuF98CuF98DuF98EuF98FuF990uF991uF992uF993uF994uF995uF996uF997uF998uF999uF99AuF99BuF99CuF99DuF99EuF99FuF9A0uF9A1uF9A2uF9A3uF9A4uF9A5uF9A6uF9A7uF9A8uF9A9uF9AAuF9ABuF9ACuF9ADuF9AEuF9AFuF9B0uF9B1uF9B2uF9B3uF9B4uF9B5uF9B6uF9B7uF9B8uF9B9uF9BAuF9BBuF9BCuF9BDuF9BEuF9BFuF9C0uF9C1uF9C2uF9C3uF9C4uF9C5uF9C6uF9C7uF9C8uF9C9uF9CAuF9CBuF9CCuF9CDuF9CEuF9CFuF9D0uF9D1uF9D2uF9D3uF9D4uF9D5uF9D6uF9D7uF9D8uF9D9uF9DAuF9DBuF9DCuF9DDuF9DEuF9DFuF9E0uF9E1uF9E2uF9E3uF9E4uF9E5uF9E6uF9E7uF9E8uF9E9uF9EAuF9EBuF9ECuF9EDuF9EEuF9EFuF9F0uF9F1uF9F2uF9F3uF9F4uF9F5uF9F6uF9F7uF9F8uF9F9uF9FAuF9FBuF9FCuF9FDuF9FEuF9FFuFA00uFA01uFA02uFA03uFA04uFA05uFA06uFA07uFA08uFA09uFA0AuFA0BuFA0CuFA0DuFA0EuFA0FuFA10uFA11uFA12uFA13uFA14uFA15uFA16uFA17uFA18uFA19uFA1AuFA1BuFA1CuFA1DuFA1EuFA1FuFA20uFA21uFA22uFA23uFA24uFA25uFA26uFA27uFA28uFA29uFA2AuFA2BuFA2CuFA2DuFA30uFA31uFA32uFA33uFA34uFA35uFA36uFA37uFA38uFA39uFA3AuFA3BuFA3CuFA3DuFA3EuFA3FuFA40uFA41uFA42uFA43uFA44uFA45uFA46uFA47uFA48uFA49uFA4AuFA4BuFA4CuFA4DuFA4EuFA4FuFA50uFA51uFA52uFA53uFA54uFA55uFA56uFA57uFA58uFA59uFA5AuFA5BuFA5CuFA5DuFA5EuFA5FuFA60uFA61uFA62uFA63uFA64uFA65uFA66uFA67uFA68uFA69uFA6AuFA70uFA71uFA72uFA73uFA74uFA75uFA76uFA77uFA78uFA79uFA7AuFA7BuFA7CuFA7DuFA7EuFA7FuFA80uFA81uFA82uFA83uFA84uFA85uFA86uFA87uFA88uFA89uFA8AuFA8BuFA8CuFA8DuFA8EuFA8FuFA90uFA91uFA92uFA93uFA94uFA95uFA96uFA97uFA98uFA99uFA9AuFA9BuFA9CuFA9DuFA9EuFA9FuFAA0uFAA1uFAA2uFAA3uFAA4uFAA5uFAA6uFAA7uFAA8uFAA9uFAAAuFAABuFAACuFAADuFAAEuFAAFuFAB0uFAB1uFAB2uFAB3uFAB4uFAB5uFAB6uFAB7uFAB8uFAB9uFABAuFABBuFABCuFABDuFABEuFABFuFAC0uFAC1uFAC2uFAC3uFAC4uFAC5uFAC6uFAC7uFAC8uFAC9uFACAuFACBuFACCuFACDuFACEuFACFuFAD0uFAD1uFAD2uFAD3uFAD4uFAD5uFAD6uFAD7uFAD8uFAD9uFB1DuFB1FuFB20uFB21uFB22uFB23uFB24uFB25uFB26uFB27uFB28uFB2AuFB2BuFB2CuFB2DuFB2EuFB2FuFB30uFB31uFB32uFB33uFB34uFB35uFB36uFB38uFB39uFB3AuFB3BuFB3CuFB3EuFB40uFB41uFB43uFB44uFB46uFB47uFB48uFB49uFB4AuFB4BuFB4CuFB4DuFB4EuFB4FuFB50uFB51uFB52uFB53uFB54uFB55uFB56uFB57uFB58uFB59uFB5AuFB5BuFB5CuFB5DuFB5EuFB5FuFB60uFB61uFB62uFB63uFB64uFB65uFB66uFB67uFB68uFB69uFB6AuFB6BuFB6CuFB6DuFB6EuFB6FuFB70uFB71uFB72uFB73uFB74uFB75uFB76uFB77uFB78uFB79uFB7AuFB7BuFB7CuFB7DuFB7EuFB7FuFB80uFB81uFB82uFB83uFB84uFB85uFB86uFB87uFB88uFB89uFB8AuFB8BuFB8CuFB8DuFB8EuFB8FuFB90uFB91uFB92uFB93uFB94uFB95uFB96uFB97uFB98uFB99uFB9AuFB9BuFB9CuFB9DuFB9EuFB9FuFBA0uFBA1uFBA2uFBA3uFBA4uFBA5uFBA6uFBA7uFBA8uFBA9uFBAAuFBABuFBACuFBADuFBAEuFBAFuFBB0uFBB1uFBD3uFBD4uFBD5uFBD6uFBD7uFBD8uFBD9uFBDAuFBDBuFBDCuFBDDuFBDEuFBDFuFBE0uFBE1uFBE2uFBE3uFBE4uFBE5uFBE6uFBE7uFBE8uFBE9uFBEAuFBEBuFBECuFBEDuFBEEuFBEFuFBF0uFBF1uFBF2uFBF3uFBF4uFBF5uFBF6uFBF7uFBF8uFBF9uFBFAuFBFBuFBFCuFBFDuFBFEuFBFFuFC00uFC01uFC02uFC03uFC04uFC05uFC06uFC07uFC08uFC09uFC0AuFC0BuFC0CuFC0DuFC0EuFC0FuFC10uFC11uFC12uFC13uFC14uFC15uFC16uFC17uFC18uFC19uFC1AuFC1BuFC1CuFC1DuFC1EuFC1FuFC20uFC21uFC22uFC23uFC24uFC25uFC26uFC27uFC28uFC29uFC2AuFC2BuFC2CuFC2DuFC2EuFC2FuFC30uFC31uFC32uFC33uFC34uFC35uFC36uFC37uFC38uFC39uFC3AuFC3BuFC3CuFC3DuFC3EuFC3FuFC40uFC41uFC42uFC43uFC44uFC45uFC46uFC47uFC48uFC49uFC4AuFC4BuFC4CuFC4DuFC4EuFC4FuFC50uFC51uFC52uFC53uFC54uFC55uFC56uFC57uFC58uFC59uFC5AuFC5BuFC5CuFC5DuFC5EuFC5FuFC60uFC61uFC62uFC63uFC64uFC65uFC66uFC67uFC68uFC69uFC6AuFC6BuFC6CuFC6DuFC6EuFC6FuFC70uFC71uFC72uFC73uFC74uFC75uFC76uFC77uFC78uFC79uFC7AuFC7BuFC7CuFC7DuFC7EuFC7FuFC80uFC81uFC82uFC83uFC84uFC85uFC86uFC87uFC88uFC89uFC8AuFC8BuFC8CuFC8DuFC8EuFC8FuFC90uFC91uFC92uFC93uFC94uFC95uFC96uFC97uFC98uFC99uFC9AuFC9BuFC9CuFC9DuFC9EuFC9FuFCA0uFCA1uFCA2uFCA3uFCA4uFCA5uFCA6uFCA7uFCA8uFCA9uFCAAuFCABuFCACuFCADuFCAEuFCAFuFCB0uFCB1uFCB2uFCB3uFCB4uFCB5uFCB6uFCB7uFCB8uFCB9uFCBAuFCBBuFCBCuFCBDuFCBEuFCBFuFCC0uFCC1uFCC2uFCC3uFCC4uFCC5uFCC6uFCC7uFCC8uFCC9uFCCAuFCCBuFCCCuFCCDuFCCEuFCCFuFCD0uFCD1uFCD2uFCD3uFCD4uFCD5uFCD6uFCD7uFCD8uFCD9uFCDAuFCDBuFCDCuFCDDuFCDEuFCDFuFCE0uFCE1uFCE2uFCE3uFCE4uFCE5uFCE6uFCE7uFCE8uFCE9uFCEAuFCEBuFCECuFCEDuFCEEuFCEFuFCF0uFCF1uFCF2uFCF3uFCF4uFCF5uFCF6uFCF7uFCF8uFCF9uFCFAuFCFBuFCFCuFCFDuFCFEuFCFFuFD00uFD01uFD02uFD03uFD04uFD05uFD06uFD07uFD08uFD09uFD0AuFD0BuFD0CuFD0DuFD0EuFD0FuFD10uFD11uFD12uFD13uFD14uFD15uFD16uFD17uFD18uFD19uFD1AuFD1BuFD1CuFD1DuFD1EuFD1FuFD20uFD21uFD22uFD23uFD24uFD25uFD26uFD27uFD28uFD29uFD2AuFD2BuFD2CuFD2DuFD2EuFD2FuFD30uFD31uFD32uFD33uFD34uFD35uFD36uFD37uFD38uFD39uFD3AuFD3BuFD3CuFD3DuFD50uFD51uFD52uFD53uFD54uFD55uFD56uFD57uFD58uFD59uFD5AuFD5BuFD5CuFD5DuFD5EuFD5FuFD60uFD61uFD62uFD63uFD64uFD65uFD66uFD67uFD68uFD69uFD6AuFD6BuFD6CuFD6DuFD6EuFD6FuFD70uFD71uFD72uFD73uFD74uFD75uFD76uFD77uFD78uFD79uFD7AuFD7BuFD7CuFD7DuFD7EuFD7FuFD80uFD81uFD82uFD83uFD84uFD85uFD86uFD87uFD88uFD89uFD8AuFD8BuFD8CuFD8DuFD8EuFD8FuFD92uFD93uFD94uFD95uFD96uFD97uFD98uFD99uFD9AuFD9BuFD9CuFD9DuFD9EuFD9FuFDA0uFDA1uFDA2uFDA3uFDA4uFDA5uFDA6uFDA7uFDA8uFDA9uFDAAuFDABuFDACuFDADuFDAEuFDAFuFDB0uFDB1uFDB2uFDB3uFDB4uFDB5uFDB6uFDB7uFDB8uFDB9uFDBAuFDBBuFDBCuFDBDuFDBEuFDBFuFDC0uFDC1uFDC2uFDC3uFDC4uFDC5uFDC6uFDC7uFDF0uFDF1uFDF2uFDF3uFDF4uFDF5uFDF6uFDF7uFDF8uFDF9uFDFAuFDFBuFE70uFE71uFE72uFE73uFE74uFE76uFE77uFE78uFE79uFE7AuFE7BuFE7CuFE7DuFE7EuFE7FuFE80uFE81uFE82uFE83uFE84uFE85uFE86uFE87uFE88uFE89uFE8AuFE8BuFE8CuFE8DuFE8EuFE8FuFE90uFE91uFE92uFE93uFE94uFE95uFE96uFE97uFE98uFE99uFE9AuFE9BuFE9CuFE9DuFE9EuFE9FuFEA0uFEA1uFEA2uFEA3uFEA4uFEA5uFEA6uFEA7uFEA8uFEA9uFEAAuFEABuFEACuFEADuFEAEuFEAFuFEB0uFEB1uFEB2uFEB3uFEB4uFEB5uFEB6uFEB7uFEB8uFEB9uFEBAuFEBBuFEBCuFEBDuFEBEuFEBFuFEC0uFEC1uFEC2uFEC3uFEC4uFEC5uFEC6uFEC7uFEC8uFEC9uFECAuFECBuFECCuFECDuFECEuFECFuFED0uFED1uFED2uFED3uFED4uFED5uFED6uFED7uFED8uFED9uFEDAuFEDBuFEDCuFEDDuFEDEuFEDFuFEE0uFEE1uFEE2uFEE3uFEE4uFEE5uFEE6uFEE7uFEE8uFEE9uFEEAuFEEBuFEECuFEEDuFEEEuFEEFuFEF0uFEF1uFEF2uFEF3uFEF4uFEF5uFEF6uFEF7uFEF8uFEF9uFEFAuFEFBuFEFCuFF66uFF67uFF68uFF69uFF6AuFF6BuFF6CuFF6DuFF6EuFF6FuFF71uFF72uFF73uFF74uFF75uFF76uFF77uFF78uFF79uFF7AuFF7BuFF7CuFF7DuFF7EuFF7FuFF80uFF81uFF82uFF83uFF84uFF85uFF86uFF87uFF88uFF89uFF8AuFF8BuFF8CuFF8DuFF8EuFF8FuFF90uFF91uFF92uFF93uFF94uFF95uFF96uFF97uFF98uFF99uFF9AuFF9BuFF9CuFF9DuFFA0uFFA1uFFA2uFFA3uFFA4uFFA5uFFA6uFFA7uFFA8uFFA9uFFAAuFFABuFFACuFFADuFFAEuFFAFuFFB0uFFB1uFFB2uFFB3uFFB4uFFB5uFFB6uFFB7uFFB8uFFB9uFFBAuFFBBuFFBCuFFBDuFFBEuFFC2uFFC3uFFC4uFFC5uFFC6uFFC7uFFCAuFFCBuFFCCuFFCDuFFCEuFFCFuFFD2uFFD3uFFD4uFFD5uFFD6uFFD7uFFDAuFFDBuFFDC]

// Letter, Titlecase Lt = [u01C5u01C8u01CBu01F2u1F88u1F89u1F8Au1F8Bu1F8Cu1F8Du1F8Eu1F8Fu1F98u1F99u1F9Au1F9Bu1F9Cu1F9Du1F9Eu1F9Fu1FA8u1FA9u1FAAu1FABu1FACu1FADu1FAEu1FAFu1FBCu1FCCu1FFC]

// Letter, Uppercase Lu = [u0041u0042u0043u0044u0045u0046u0047u0048u0049u004Au004Bu004Cu004Du004Eu004Fu0050u0051u0052u0053u0054u0055u0056u0057u0058u0059u005Au00C0u00C1u00C2u00C3u00C4u00C5u00C6u00C7u00C8u00C9u00CAu00CBu00CCu00CDu00CEu00CFu00D0u00D1u00D2u00D3u00D4u00D5u00D6u00D8u00D9u00DAu00DBu00DCu00DDu00DEu0100u0102u0104u0106u0108u010Au010Cu010Eu0110u0112u0114u0116u0118u011Au011Cu011Eu0120u0122u0124u0126u0128u012Au012Cu012Eu0130u0132u0134u0136u0139u013Bu013Du013Fu0141u0143u0145u0147u014Au014Cu014Eu0150u0152u0154u0156u0158u015Au015Cu015Eu0160u0162u0164u0166u0168u016Au016Cu016Eu0170u0172u0174u0176u0178u0179u017Bu017Du0181u0182u0184u0186u0187u0189u018Au018Bu018Eu018Fu0190u0191u0193u0194u0196u0197u0198u019Cu019Du019Fu01A0u01A2u01A4u01A6u01A7u01A9u01ACu01AEu01AFu01B1u01B2u01B3u01B5u01B7u01B8u01BCu01C4u01C7u01CAu01CDu01CFu01D1u01D3u01D5u01D7u01D9u01DBu01DEu01E0u01E2u01E4u01E6u01E8u01EAu01ECu01EEu01F1u01F4u01F6u01F7u01F8u01FAu01FCu01FEu0200u0202u0204u0206u0208u020Au020Cu020Eu0210u0212u0214u0216u0218u021Au021Cu021Eu0220u0222u0224u0226u0228u022Au022Cu022Eu0230u0232u023Au023Bu023Du023Eu0241u0243u0244u0245u0246u0248u024Au024Cu024Eu0370u0372u0376u0386u0388u0389u038Au038Cu038Eu038Fu0391u0392u0393u0394u0395u0396u0397u0398u0399u039Au039Bu039Cu039Du039Eu039Fu03A0u03A1u03A3u03A4u03A5u03A6u03A7u03A8u03A9u03AAu03ABu03CFu03D2u03D3u03D4u03D8u03DAu03DCu03DEu03E0u03E2u03E4u03E6u03E8u03EAu03ECu03EEu03F4u03F7u03F9u03FAu03FDu03FEu03FFu0400u0401u0402u0403u0404u0405u0406u0407u0408u0409u040Au040Bu040Cu040Du040Eu040Fu0410u0411u0412u0413u0414u0415u0416u0417u0418u0419u041Au041Bu041Cu041Du041Eu041Fu0420u0421u0422u0423u0424u0425u0426u0427u0428u0429u042Au042Bu042Cu042Du042Eu042Fu0460u0462u0464u0466u0468u046Au046Cu046Eu0470u0472u0474u0476u0478u047Au047Cu047Eu0480u048Au048Cu048Eu0490u0492u0494u0496u0498u049Au049Cu049Eu04A0u04A2u04A4u04A6u04A8u04AAu04ACu04AEu04B0u04B2u04B4u04B6u04B8u04BAu04BCu04BEu04C0u04C1u04C3u04C5u04C7u04C9u04CBu04CDu04D0u04D2u04D4u04D6u04D8u04DAu04DCu04DEu04E0u04E2u04E4u04E6u04E8u04EAu04ECu04EEu04F0u04F2u04F4u04F6u04F8u04FAu04FCu04FEu0500u0502u0504u0506u0508u050Au050Cu050Eu0510u0512u0514u0516u0518u051Au051Cu051Eu0520u0522u0531u0532u0533u0534u0535u0536u0537u0538u0539u053Au053Bu053Cu053Du053Eu053Fu0540u0541u0542u0543u0544u0545u0546u0547u0548u0549u054Au054Bu054Cu054Du054Eu054Fu0550u0551u0552u0553u0554u0555u0556u10A0u10A1u10A2u10A3u10A4u10A5u10A6u10A7u10A8u10A9u10AAu10ABu10ACu10ADu10AEu10AFu10B0u10B1u10B2u10B3u10B4u10B5u10B6u10B7u10B8u10B9u10BAu10BBu10BCu10BDu10BEu10BFu10C0u10C1u10C2u10C3u10C4u10C5u1E00u1E02u1E04u1E06u1E08u1E0Au1E0Cu1E0Eu1E10u1E12u1E14u1E16u1E18u1E1Au1E1Cu1E1Eu1E20u1E22u1E24u1E26u1E28u1E2Au1E2Cu1E2Eu1E30u1E32u1E34u1E36u1E38u1E3Au1E3Cu1E3Eu1E40u1E42u1E44u1E46u1E48u1E4Au1E4Cu1E4Eu1E50u1E52u1E54u1E56u1E58u1E5Au1E5Cu1E5Eu1E60u1E62u1E64u1E66u1E68u1E6Au1E6Cu1E6Eu1E70u1E72u1E74u1E76u1E78u1E7Au1E7Cu1E7Eu1E80u1E82u1E84u1E86u1E88u1E8Au1E8Cu1E8Eu1E90u1E92u1E94u1E9Eu1EA0u1EA2u1EA4u1EA6u1EA8u1EAAu1EACu1EAEu1EB0u1EB2u1EB4u1EB6u1EB8u1EBAu1EBCu1EBEu1EC0u1EC2u1EC4u1EC6u1EC8u1ECAu1ECCu1ECEu1ED0u1ED2u1ED4u1ED6u1ED8u1EDAu1EDCu1EDEu1EE0u1EE2u1EE4u1EE6u1EE8u1EEAu1EECu1EEEu1EF0u1EF2u1EF4u1EF6u1EF8u1EFAu1EFCu1EFEu1F08u1F09u1F0Au1F0Bu1F0Cu1F0Du1F0Eu1F0Fu1F18u1F19u1F1Au1F1Bu1F1Cu1F1Du1F28u1F29u1F2Au1F2Bu1F2Cu1F2Du1F2Eu1F2Fu1F38u1F39u1F3Au1F3Bu1F3Cu1F3Du1F3Eu1F3Fu1F48u1F49u1F4Au1F4Bu1F4Cu1F4Du1F59u1F5Bu1F5Du1F5Fu1F68u1F69u1F6Au1F6Bu1F6Cu1F6Du1F6Eu1F6Fu1FB8u1FB9u1FBAu1FBBu1FC8u1FC9u1FCAu1FCBu1FD8u1FD9u1FDAu1FDBu1FE8u1FE9u1FEAu1FEBu1FECu1FF8u1FF9u1FFAu1FFBu2102u2107u210Bu210Cu210Du2110u2111u2112u2115u2119u211Au211Bu211Cu211Du2124u2126u2128u212Au212Bu212Cu212Du2130u2131u2132u2133u213Eu213Fu2145u2183u2C00u2C01u2C02u2C03u2C04u2C05u2C06u2C07u2C08u2C09u2C0Au2C0Bu2C0Cu2C0Du2C0Eu2C0Fu2C10u2C11u2C12u2C13u2C14u2C15u2C16u2C17u2C18u2C19u2C1Au2C1Bu2C1Cu2C1Du2C1Eu2C1Fu2C20u2C21u2C22u2C23u2C24u2C25u2C26u2C27u2C28u2C29u2C2Au2C2Bu2C2Cu2C2Du2C2Eu2C60u2C62u2C63u2C64u2C67u2C69u2C6Bu2C6Du2C6Eu2C6Fu2C72u2C75u2C80u2C82u2C84u2C86u2C88u2C8Au2C8Cu2C8Eu2C90u2C92u2C94u2C96u2C98u2C9Au2C9Cu2C9Eu2CA0u2CA2u2CA4u2CA6u2CA8u2CAAu2CACu2CAEu2CB0u2CB2u2CB4u2CB6u2CB8u2CBAu2CBCu2CBEu2CC0u2CC2u2CC4u2CC6u2CC8u2CCAu2CCCu2CCEu2CD0u2CD2u2CD4u2CD6u2CD8u2CDAu2CDCu2CDEu2CE0u2CE2uA640uA642uA644uA646uA648uA64AuA64CuA64EuA650uA652uA654uA656uA658uA65AuA65CuA65EuA662uA664uA666uA668uA66AuA66CuA680uA682uA684uA686uA688uA68AuA68CuA68EuA690uA692uA694uA696uA722uA724uA726uA728uA72AuA72CuA72EuA732uA734uA736uA738uA73AuA73CuA73EuA740uA742uA744uA746uA748uA74AuA74CuA74EuA750uA752uA754uA756uA758uA75AuA75CuA75EuA760uA762uA764uA766uA768uA76AuA76CuA76EuA779uA77BuA77DuA77EuA780uA782uA784uA786uA78BuFF21uFF22uFF23uFF24uFF25uFF26uFF27uFF28uFF29uFF2AuFF2BuFF2CuFF2DuFF2EuFF2FuFF30uFF31uFF32uFF33uFF34uFF35uFF36uFF37uFF38uFF39uFF3A]

// Mark, Spacing Combining Mc = [u0903u093Eu093Fu0940u0949u094Au094Bu094Cu0982u0983u09BEu09BFu09C0u09C7u09C8u09CBu09CCu09D7u0A03u0A3Eu0A3Fu0A40u0A83u0ABEu0ABFu0AC0u0AC9u0ACBu0ACCu0B02u0B03u0B3Eu0B40u0B47u0B48u0B4Bu0B4Cu0B57u0BBEu0BBFu0BC1u0BC2u0BC6u0BC7u0BC8u0BCAu0BCBu0BCCu0BD7u0C01u0C02u0C03u0C41u0C42u0C43u0C44u0C82u0C83u0CBEu0CC0u0CC1u0CC2u0CC3u0CC4u0CC7u0CC8u0CCAu0CCBu0CD5u0CD6u0D02u0D03u0D3Eu0D3Fu0D40u0D46u0D47u0D48u0D4Au0D4Bu0D4Cu0D57u0D82u0D83u0DCFu0DD0u0DD1u0DD8u0DD9u0DDAu0DDBu0DDCu0DDDu0DDEu0DDFu0DF2u0DF3u0F3Eu0F3Fu0F7Fu102Bu102Cu1031u1038u103Bu103Cu1056u1057u1062u1063u1064u1067u1068u1069u106Au106Bu106Cu106Du1083u1084u1087u1088u1089u108Au108Bu108Cu108Fu17B6u17BEu17BFu17C0u17C1u17C2u17C3u17C4u17C5u17C7u17C8u1923u1924u1925u1926u1929u192Au192Bu1930u1931u1933u1934u1935u1936u1937u1938u19B0u19B1u19B2u19B3u19B4u19B5u19B6u19B7u19B8u19B9u19BAu19BBu19BCu19BDu19BEu19BFu19C0u19C8u19C9u1A19u1A1Au1A1Bu1B04u1B35u1B3Bu1B3Du1B3Eu1B3Fu1B40u1B41u1B43u1B44u1B82u1BA1u1BA6u1BA7u1BAAu1C24u1C25u1C26u1C27u1C28u1C29u1C2Au1C2Bu1C34u1C35uA823uA824uA827uA880uA881uA8B4uA8B5uA8B6uA8B7uA8B8uA8B9uA8BAuA8BBuA8BCuA8BDuA8BEuA8BFuA8C0uA8C1uA8C2uA8C3uA952uA953uAA2FuAA30uAA33uAA34uAA4D]

// Mark, Nonspacing Mn = [u0300u0301u0302u0303u0304u0305u0306u0307u0308u0309u030Au030Bu030Cu030Du030Eu030Fu0310u0311u0312u0313u0314u0315u0316u0317u0318u0319u031Au031Bu031Cu031Du031Eu031Fu0320u0321u0322u0323u0324u0325u0326u0327u0328u0329u032Au032Bu032Cu032Du032Eu032Fu0330u0331u0332u0333u0334u0335u0336u0337u0338u0339u033Au033Bu033Cu033Du033Eu033Fu0340u0341u0342u0343u0344u0345u0346u0347u0348u0349u034Au034Bu034Cu034Du034Eu034Fu0350u0351u0352u0353u0354u0355u0356u0357u0358u0359u035Au035Bu035Cu035Du035Eu035Fu0360u0361u0362u0363u0364u0365u0366u0367u0368u0369u036Au036Bu036Cu036Du036Eu036Fu0483u0484u0485u0486u0487u0591u0592u0593u0594u0595u0596u0597u0598u0599u059Au059Bu059Cu059Du059Eu059Fu05A0u05A1u05A2u05A3u05A4u05A5u05A6u05A7u05A8u05A9u05AAu05ABu05ACu05ADu05AEu05AFu05B0u05B1u05B2u05B3u05B4u05B5u05B6u05B7u05B8u05B9u05BAu05BBu05BCu05BDu05BFu05C1u05C2u05C4u05C5u05C7u0610u0611u0612u0613u0614u0615u0616u0617u0618u0619u061Au064Bu064Cu064Du064Eu064Fu0650u0651u0652u0653u0654u0655u0656u0657u0658u0659u065Au065Bu065Cu065Du065Eu0670u06D6u06D7u06D8u06D9u06DAu06DBu06DCu06DFu06E0u06E1u06E2u06E3u06E4u06E7u06E8u06EAu06EBu06ECu06EDu0711u0730u0731u0732u0733u0734u0735u0736u0737u0738u0739u073Au073Bu073Cu073Du073Eu073Fu0740u0741u0742u0743u0744u0745u0746u0747u0748u0749u074Au07A6u07A7u07A8u07A9u07AAu07ABu07ACu07ADu07AEu07AFu07B0u07EBu07ECu07EDu07EEu07EFu07F0u07F1u07F2u07F3u0901u0902u093Cu0941u0942u0943u0944u0945u0946u0947u0948u094Du0951u0952u0953u0954u0962u0963u0981u09BCu09C1u09C2u09C3u09C4u09CDu09E2u09E3u0A01u0A02u0A3Cu0A41u0A42u0A47u0A48u0A4Bu0A4Cu0A4Du0A51u0A70u0A71u0A75u0A81u0A82u0ABCu0AC1u0AC2u0AC3u0AC4u0AC5u0AC7u0AC8u0ACDu0AE2u0AE3u0B01u0B3Cu0B3Fu0B41u0B42u0B43u0B44u0B4Du0B56u0B62u0B63u0B82u0BC0u0BCDu0C3Eu0C3Fu0C40u0C46u0C47u0C48u0C4Au0C4Bu0C4Cu0C4Du0C55u0C56u0C62u0C63u0CBCu0CBFu0CC6u0CCCu0CCDu0CE2u0CE3u0D41u0D42u0D43u0D44u0D4Du0D62u0D63u0DCAu0DD2u0DD3u0DD4u0DD6u0E31u0E34u0E35u0E36u0E37u0E38u0E39u0E3Au0E47u0E48u0E49u0E4Au0E4Bu0E4Cu0E4Du0E4Eu0EB1u0EB4u0EB5u0EB6u0EB7u0EB8u0EB9u0EBBu0EBCu0EC8u0EC9u0ECAu0ECBu0ECCu0ECDu0F18u0F19u0F35u0F37u0F39u0F71u0F72u0F73u0F74u0F75u0F76u0F77u0F78u0F79u0F7Au0F7Bu0F7Cu0F7Du0F7Eu0F80u0F81u0F82u0F83u0F84u0F86u0F87u0F90u0F91u0F92u0F93u0F94u0F95u0F96u0F97u0F99u0F9Au0F9Bu0F9Cu0F9Du0F9Eu0F9Fu0FA0u0FA1u0FA2u0FA3u0FA4u0FA5u0FA6u0FA7u0FA8u0FA9u0FAAu0FABu0FACu0FADu0FAEu0FAFu0FB0u0FB1u0FB2u0FB3u0FB4u0FB5u0FB6u0FB7u0FB8u0FB9u0FBAu0FBBu0FBCu0FC6u102Du102Eu102Fu1030u1032u1033u1034u1035u1036u1037u1039u103Au103Du103Eu1058u1059u105Eu105Fu1060u1071u1072u1073u1074u1082u1085u1086u108Du135Fu1712u1713u1714u1732u1733u1734u1752u1753u1772u1773u17B7u17B8u17B9u17BAu17BBu17BCu17BDu17C6u17C9u17CAu17CBu17CCu17CDu17CEu17CFu17D0u17D1u17D2u17D3u17DDu180Bu180Cu180Du18A9u1920u1921u1922u1927u1928u1932u1939u193Au193Bu1A17u1A18u1B00u1B01u1B02u1B03u1B34u1B36u1B37u1B38u1B39u1B3Au1B3Cu1B42u1B6Bu1B6Cu1B6Du1B6Eu1B6Fu1B70u1B71u1B72u1B73u1B80u1B81u1BA2u1BA3u1BA4u1BA5u1BA8u1BA9u1C2Cu1C2Du1C2Eu1C2Fu1C30u1C31u1C32u1C33u1C36u1C37u1DC0u1DC1u1DC2u1DC3u1DC4u1DC5u1DC6u1DC7u1DC8u1DC9u1DCAu1DCBu1DCCu1DCDu1DCEu1DCFu1DD0u1DD1u1DD2u1DD3u1DD4u1DD5u1DD6u1DD7u1DD8u1DD9u1DDAu1DDBu1DDCu1DDDu1DDEu1DDFu1DE0u1DE1u1DE2u1DE3u1DE4u1DE5u1DE6u1DFEu1DFFu20D0u20D1u20D2u20D3u20D4u20D5u20D6u20D7u20D8u20D9u20DAu20DBu20DCu20E1u20E5u20E6u20E7u20E8u20E9u20EAu20EBu20ECu20EDu20EEu20EFu20F0u2DE0u2DE1u2DE2u2DE3u2DE4u2DE5u2DE6u2DE7u2DE8u2DE9u2DEAu2DEBu2DECu2DEDu2DEEu2DEFu2DF0u2DF1u2DF2u2DF3u2DF4u2DF5u2DF6u2DF7u2DF8u2DF9u2DFAu2DFBu2DFCu2DFDu2DFEu2DFFu302Au302Bu302Cu302Du302Eu302Fu3099u309AuA66FuA67CuA67DuA802uA806uA80BuA825uA826uA8C4uA926uA927uA928uA929uA92AuA92BuA92CuA92DuA947uA948uA949uA94AuA94BuA94CuA94DuA94EuA94FuA950uA951uAA29uAA2AuAA2BuAA2CuAA2DuAA2EuAA31uAA32uAA35uAA36uAA43uAA4CuFB1EuFE00uFE01uFE02uFE03uFE04uFE05uFE06uFE07uFE08uFE09uFE0AuFE0BuFE0CuFE0DuFE0EuFE0FuFE20uFE21uFE22uFE23uFE24uFE25uFE26]

// Number, Decimal Digit Nd = [u0030u0031u0032u0033u0034u0035u0036u0037u0038u0039u0660u0661u0662u0663u0664u0665u0666u0667u0668u0669u06F0u06F1u06F2u06F3u06F4u06F5u06F6u06F7u06F8u06F9u07C0u07C1u07C2u07C3u07C4u07C5u07C6u07C7u07C8u07C9u0966u0967u0968u0969u096Au096Bu096Cu096Du096Eu096Fu09E6u09E7u09E8u09E9u09EAu09EBu09ECu09EDu09EEu09EFu0A66u0A67u0A68u0A69u0A6Au0A6Bu0A6Cu0A6Du0A6Eu0A6Fu0AE6u0AE7u0AE8u0AE9u0AEAu0AEBu0AECu0AEDu0AEEu0AEFu0B66u0B67u0B68u0B69u0B6Au0B6Bu0B6Cu0B6Du0B6Eu0B6Fu0BE6u0BE7u0BE8u0BE9u0BEAu0BEBu0BECu0BEDu0BEEu0BEFu0C66u0C67u0C68u0C69u0C6Au0C6Bu0C6Cu0C6Du0C6Eu0C6Fu0CE6u0CE7u0CE8u0CE9u0CEAu0CEBu0CECu0CEDu0CEEu0CEFu0D66u0D67u0D68u0D69u0D6Au0D6Bu0D6Cu0D6Du0D6Eu0D6Fu0E50u0E51u0E52u0E53u0E54u0E55u0E56u0E57u0E58u0E59u0ED0u0ED1u0ED2u0ED3u0ED4u0ED5u0ED6u0ED7u0ED8u0ED9u0F20u0F21u0F22u0F23u0F24u0F25u0F26u0F27u0F28u0F29u1040u1041u1042u1043u1044u1045u1046u1047u1048u1049u1090u1091u1092u1093u1094u1095u1096u1097u1098u1099u17E0u17E1u17E2u17E3u17E4u17E5u17E6u17E7u17E8u17E9u1810u1811u1812u1813u1814u1815u1816u1817u1818u1819u1946u1947u1948u1949u194Au194Bu194Cu194Du194Eu194Fu19D0u19D1u19D2u19D3u19D4u19D5u19D6u19D7u19D8u19D9u1B50u1B51u1B52u1B53u1B54u1B55u1B56u1B57u1B58u1B59u1BB0u1BB1u1BB2u1BB3u1BB4u1BB5u1BB6u1BB7u1BB8u1BB9u1C40u1C41u1C42u1C43u1C44u1C45u1C46u1C47u1C48u1C49u1C50u1C51u1C52u1C53u1C54u1C55u1C56u1C57u1C58u1C59uA620uA621uA622uA623uA624uA625uA626uA627uA628uA629uA8D0uA8D1uA8D2uA8D3uA8D4uA8D5uA8D6uA8D7uA8D8uA8D9uA900uA901uA902uA903uA904uA905uA906uA907uA908uA909uAA50uAA51uAA52uAA53uAA54uAA55uAA56uAA57uAA58uAA59uFF10uFF11uFF12uFF13uFF14uFF15uFF16uFF17uFF18uFF19]

// Number, Letter Nl = [u16EEu16EFu16F0u2160u2161u2162u2163u2164u2165u2166u2167u2168u2169u216Au216Bu216Cu216Du216Eu216Fu2170u2171u2172u2173u2174u2175u2176u2177u2178u2179u217Au217Bu217Cu217Du217Eu217Fu2180u2181u2182u2185u2186u2187u2188u3007u3021u3022u3023u3024u3025u3026u3027u3028u3029u3038u3039u303A]

// Punctuation, Connector Pc = [u005Fu203Fu2040u2054uFE33uFE34uFE4DuFE4EuFE4FuFF3F]

// Separator, Space Zs = [u0020u00A0u1680u180Eu2000u2001u2002u2003u2004u2005u2006u2007u2008u2009u200Au202Fu205Fu3000]

/* Automatic Semicolon Insertion */

EOS

= __ ";"
/ _ LineTerminatorSequence
/ _ &"}"
/ __ EOF

EOSNoLineTerminator

= _ ";"
/ _ LineTerminatorSequence
/ _ &"}"
/ _ EOF

EOF

= !.

/* Whitespace */

_

= (WhiteSpace / MultiLineCommentNoLineTerminator / SingleLineComment)*

__

= (WhiteSpace / LineTerminatorSequence / Comment)*

/* ===== A.2 Number Conversions ===== */

/*

* Rules from this section are either unused or merged into previous section of
* the grammar.
*/

/* ===== A.3 Expressions ===== */

PrimaryExpression

= ThisToken       { return { type: "This" }; }
/ name:Identifier { return { type: "Variable", name: name }; }
/ Literal
/ ArrayLiteral
/ ObjectLiteral
/ "(" __ expression:Expression __ ")" { return expression; }

ArrayLiteral

= "[" __ elision:(Elision __)? "]" {
    return {
      type:     "ArrayLiteral",
      elements: elision !== null ? elision[0] : []
    };
  }
/ "[" __ elements:ElementList __ elision:("," __ (Elision __)?)? "]" {
    return {
      type:     "ArrayLiteral",
      elements: elements.concat(elision !== null && elision[2] !== null ? elision[2][0] : [])
    };
  }

ElementList

= head:(
    elision:(Elision __)? element:AssignmentExpression {
      return (elision !== null ? elision[0] : []).concat(element);
    }
  )
  tail:(
    __ "," __ elision:(Elision __)? element:AssignmentExpression {
      return (elision !== null ? elision[0] : []).concat(element);
    }
  )* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = result.concat(tail[i]);
    }
    return result;
  }

Elision

= "," elision:(__ ",")* {
    var result = [null];
    for (var i = 0; i < elision.length; i++) {
      result.push(null);
    }
    return result;
  }

ObjectLiteral

= "{" __ properties:(PropertyNameAndValueList __ ("," __)?)? "}" {
    return {
      type:       "ObjectLiteral",
      properties: properties !== null ? properties[0] : []
    };
  }

PropertyNameAndValueList

= head:PropertyAssignment tail:(__ "," __ PropertyAssignment)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][3]);
    }
    return result;
  }

PropertyAssignment

= name:PropertyName __ ":" __ value:AssignmentExpression {
    return {
      type:  "PropertyAssignment",
      name:  name,
      value: value
    };
  }
/ GetToken __ name:PropertyName __
  "(" __ ")" __
  "{" __ body:FunctionBody __ "}" {
    return {
      type: "GetterDefinition",
      name: name,
      body: body
    };
  }
/ SetToken __ name:PropertyName __
  "(" __ param:PropertySetParameterList __ ")" __
  "{" __ body:FunctionBody __ "}" {
    return {
      type:  "SetterDefinition",
      name:  name,
      param: param,
      body:  body
    };
  }

PropertyName

= IdentifierName
/ StringLiteral
/ NumericLiteral

PropertySetParameterList

= Identifier

MemberExpression

= base:(
      PrimaryExpression
    / FunctionExpression
    / NewToken __ constructor:MemberExpression __ args:Arguments {
        return {
          type:        "NewOperator",
          constructor: constructor,
          arguments:   args
        };
      }
  )
  accessors:(
      __ "[" __ name:Expression __ "]" { return name; }
    / __ "." __ name:IdentifierName    { return name; }
  )* {
    var result = base;
    for (var i = 0; i < accessors.length; i++) {
      result = {
        type: "PropertyAccess",
        base: result,
        name: accessors[i]
      };
    }
    return result;
  }

NewExpression

= MemberExpression
/ NewToken __ constructor:NewExpression {
    return {
      type:        "NewOperator",
      constructor: constructor,
      arguments:   []
    };
  }

CallExpression

= base:(
    name:MemberExpression __ args:Arguments {
      return {
        type:      "FunctionCall",
        name:      name,
        arguments: args
      };
    }
  )
  argumentsOrAccessors:(
      __ args:Arguments {
        return {
          type:      "FunctionCallArguments",
          arguments: args
        };
      }
    / __ "[" __ name:Expression __ "]" {
        return {
          type: "PropertyAccessProperty",
          name: name
        };
      }
    / __ "." __ name:IdentifierName {
        return {
          type: "PropertyAccessProperty",
          name: name
        };
      }
  )* {
    var result = base;
    for (var i = 0; i < argumentsOrAccessors.length; i++) {
      switch (argumentsOrAccessors[i].type) {
        case "FunctionCallArguments":
          result = {
            type:      "FunctionCall",
            name:      result,
            arguments: argumentsOrAccessors[i].arguments
          };
          break;
        case "PropertyAccessProperty":
          result = {
            type: "PropertyAccess",
            base: result,
            name: argumentsOrAccessors[i].name
          };
          break;
        default:
          throw new Error(
            "Invalid expression type: " + argumentsOrAccessors[i].type
          );
      }
    }
    return result;
  }

Arguments

= "(" __ args:ArgumentList? __ ")" {
  return args !== null ? args : [];
}

ArgumentList

= head:AssignmentExpression tail:(__ "," __ AssignmentExpression)* {
  var result = [head];
  for (var i = 0; i < tail.length; i++) {
    result.push(tail[i][3]);
  }
  return result;
}

LeftHandSideExpression

= CallExpression
/ NewExpression

PostfixExpression

= expression:LeftHandSideExpression _ operator:PostfixOperator {
    return {
      type:       "PostfixExpression",
      operator:   operator,
      expression: expression
    };
  }
/ LeftHandSideExpression

PostfixOperator

= "++"
/ "--"

UnaryExpression

= PostfixExpression
/ operator:UnaryOperator __ expression:UnaryExpression {
    return {
      type:       "UnaryExpression",
      operator:   operator,
      expression: expression
    };
  }

UnaryOperator

= DeleteToken
/ VoidToken
/ TypeofToken
/ "++"
/ "--"
/ "+"
/ "-"
/ "~"
/  "!"

MultiplicativeExpression

= head:UnaryExpression
  tail:(__ MultiplicativeOperator __ UnaryExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

MultiplicativeOperator

= operator:("*" / "/" / "%") !"=" { return operator; }

AdditiveExpression

= head:MultiplicativeExpression
  tail:(__ AdditiveOperator __ MultiplicativeExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

AdditiveOperator

= "+" !("+" / "=") { return "+"; }
/ "-" !("-" / "=") { return "-"; }

ShiftExpression

= head:AdditiveExpression
  tail:(__ ShiftOperator __ AdditiveExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

ShiftOperator

= "<<"
/ ">>>"
/ ">>"

RelationalExpression

= head:ShiftExpression
  tail:(__ RelationalOperator __ ShiftExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

RelationalOperator

= "<="
/ ">="
/ "<"
/ ">"
/ InstanceofToken
/ InToken

RelationalExpressionNoIn

= head:ShiftExpression
  tail:(__ RelationalOperatorNoIn __ ShiftExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

RelationalOperatorNoIn

= "<="
/ ">="
/ "<"
/ ">"
/ InstanceofToken

EqualityExpression

= head:RelationalExpression
  tail:(__ EqualityOperator __ RelationalExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

EqualityExpressionNoIn

= head:RelationalExpressionNoIn
  tail:(__ EqualityOperator __ RelationalExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

EqualityOperator

= "==="
/ "!=="
/ "=="
/ "!="

BitwiseANDExpression

= head:EqualityExpression
  tail:(__ BitwiseANDOperator __ EqualityExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

BitwiseANDExpressionNoIn

= head:EqualityExpressionNoIn
  tail:(__ BitwiseANDOperator __ EqualityExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

BitwiseANDOperator

= "&" !("&" / "=") { return "&"; }

BitwiseXORExpression

= head:BitwiseANDExpression
  tail:(__ BitwiseXOROperator __ BitwiseANDExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

BitwiseXORExpressionNoIn

= head:BitwiseANDExpressionNoIn
  tail:(__ BitwiseXOROperator __ BitwiseANDExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

BitwiseXOROperator

= "^" !("^" / "=") { return "^"; }

BitwiseORExpression

= head:BitwiseXORExpression
  tail:(__ BitwiseOROperator __ BitwiseXORExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

BitwiseORExpressionNoIn

= head:BitwiseXORExpressionNoIn
  tail:(__ BitwiseOROperator __ BitwiseXORExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

BitwiseOROperator

= "|" !("|" / "=") { return "|"; }

LogicalANDExpression

= head:BitwiseORExpression
  tail:(__ LogicalANDOperator __ BitwiseORExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

LogicalANDExpressionNoIn

= head:BitwiseORExpressionNoIn
  tail:(__ LogicalANDOperator __ BitwiseORExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

LogicalANDOperator

= "&&" !"=" { return "&&"; }

LogicalORExpression

= head:LogicalANDExpression
  tail:(__ LogicalOROperator __ LogicalANDExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

LogicalORExpressionNoIn

= head:LogicalANDExpressionNoIn
  tail:(__ LogicalOROperator __ LogicalANDExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

LogicalOROperator

= "||" !"=" { return "||"; }

ConditionalExpression

= condition:LogicalORExpression __
  "?" __ trueExpression:AssignmentExpression __
  ":" __ falseExpression:AssignmentExpression {
    return {
      type:            "ConditionalExpression",
      condition:       condition,
      trueExpression:  trueExpression,
      falseExpression: falseExpression
    };
  }
/ LogicalORExpression

ConditionalExpressionNoIn

= condition:LogicalORExpressionNoIn __
  "?" __ trueExpression:AssignmentExpressionNoIn __
  ":" __ falseExpression:AssignmentExpressionNoIn {
    return {
      type:            "ConditionalExpression",
      condition:       condition,
      trueExpression:  trueExpression,
      falseExpression: falseExpression
    };
  }
/ LogicalORExpressionNoIn

AssignmentExpression

= left:LeftHandSideExpression __
  operator:AssignmentOperator __
  right:AssignmentExpression {
    return {
      type:     "AssignmentExpression",
      operator: operator,
      left:     left,
      right:    right
    };
  }
/ ConditionalExpression

AssignmentExpressionNoIn

= left:LeftHandSideExpression __
  operator:AssignmentOperator __
  right:AssignmentExpressionNoIn {
    return {
      type:     "AssignmentExpression",
      operator: operator,
      left:     left,
      right:    right
    };
  }
/ ConditionalExpressionNoIn

AssignmentOperator

= "=" (!"=") { return "="; }
/ "*="
/ "/="
/ "%="
/ "+="
/ "-="
/ "<<="
/ ">>="
/ ">>>="
/ "&="
/ "^="
/ "|="

Expression

= head:AssignmentExpression
  tail:(__ "," __ AssignmentExpression)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

ExpressionNoIn

= head:AssignmentExpressionNoIn
  tail:(__ "," __ AssignmentExpressionNoIn)* {
    var result = head;
    for (var i = 0; i < tail.length; i++) {
      result = {
        type:     "BinaryExpression",
        operator: tail[i][1],
        left:     result,
        right:    tail[i][3]
      };
    }
    return result;
  }

/* ===== A.4 Statements ===== */

/*

* The specification does not consider |FunctionDeclaration| and
* |FunctionExpression| as statements, but JavaScript implementations do and so
* are we. This syntax is actually used in the wild (e.g. by jQuery).
*/

Statement

= Block
/ VariableStatement
/ EmptyStatement
/ ExpressionStatement
/ IfStatement
/ IterationStatement
/ ContinueStatement
/ BreakStatement
/ ReturnStatement
/ WithStatement
/ LabelledStatement
/ SwitchStatement
/ ThrowStatement
/ TryStatement
/ DebuggerStatement
/ FunctionDeclaration
/ FunctionExpression

Block

= "{" __ statements:(StatementList __)? "}" {
    return {
      type:       "Block",
      statements: statements !== null ? statements[0] : []
    };
  }

StatementList

= head:Statement tail:(__ Statement)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][1]);
    }
    return result;
  }

VariableStatement

= VarToken __ declarations:VariableDeclarationList EOS {
    return {
      type:         "VariableStatement",
      declarations: declarations
    };
  }

VariableDeclarationList

= head:VariableDeclaration tail:(__ "," __ VariableDeclaration)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][3]);
    }
    return result;
  }

VariableDeclarationListNoIn

= head:VariableDeclarationNoIn tail:(__ "," __ VariableDeclarationNoIn)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][3]);
    }
    return result;
  }

VariableDeclaration

= name:Identifier value:(__ Initialiser)? {
    return {
      type:  "VariableDeclaration",
      name:  name,
      value: value !== null ? value[1] : null
    };
  }

VariableDeclarationNoIn

= name:Identifier value:(__ InitialiserNoIn)? {
    return {
      type:  "VariableDeclaration",
      name:  name,
      value: value !== null ? value[1] : null
    };
  }

Initialiser

= "=" (!"=") __ expression:AssignmentExpression { return expression; }

InitialiserNoIn

= "=" (!"=") __ expression:AssignmentExpressionNoIn { return expression; }

EmptyStatement

= ";" { return { type: "EmptyStatement" }; }

ExpressionStatement

= !("{" / FunctionToken) expression:Expression EOS { return expression; }

IfStatement

= IfToken __
  "(" __ condition:Expression __ ")" __
  ifStatement:Statement
  elseStatement:(__ ElseToken __ Statement)? {
    return {
      type:          "IfStatement",
      condition:     condition,
      ifStatement:   ifStatement,
      elseStatement: elseStatement !== null ? elseStatement[3] : null
    };
  }

IterationStatement

= DoWhileStatement
/ WhileStatement
/ ForStatement
/ ForInStatement

DoWhileStatement

= DoToken __
  statement:Statement __
  WhileToken __ "(" __ condition:Expression __ ")" EOS {
    return {
      type: "DoWhileStatement",
      condition: condition,
      statement: statement
    };
  }

WhileStatement

= WhileToken __ "(" __ condition:Expression __ ")" __ statement:Statement {
    return {
      type: "WhileStatement",
      condition: condition,
      statement: statement
    };
  }

ForStatement

= ForToken __
  "(" __
  initializer:(
      VarToken __ declarations:VariableDeclarationListNoIn {
        return {
          type:         "VariableStatement",
          declarations: declarations
        };
      }
    / ExpressionNoIn?
  ) __
  ";" __
  test:Expression? __
  ";" __
  counter:Expression? __
  ")" __
  statement:Statement
  {
    return {
      type:        "ForStatement",
      initializer: initializer,
      test:        test,
      counter:     counter,
      statement:   statement
    };
  }

ForInStatement

= ForToken __
  "(" __
  iterator:(
      VarToken __ declaration:VariableDeclarationNoIn { return declaration; }
    / LeftHandSideExpression
  ) __
  InToken __
  collection:Expression __
  ")" __
  statement:Statement
  {
    return {
      type:       "ForInStatement",
      iterator:   iterator,
      collection: collection,
      statement:  statement
    };
  }

ContinueStatement

= ContinueToken _
  label:(
      identifier:Identifier EOS { return identifier; }
    / EOSNoLineTerminator       { return "";         }
  ) {
    return {
      type:  "ContinueStatement",
      label: label !== "" ? label : null
    };
  }

BreakStatement

= BreakToken _
  label:(
      identifier:Identifier EOS { return identifier; }
    / EOSNoLineTerminator       { return ""; }
  ) {
    return {
      type:  "BreakStatement",
      label: label !== "" ? label : null
    };
  }

ReturnStatement

= ReturnToken _
  value:(
      expression:Expression EOS { return expression; }
    / EOSNoLineTerminator       { return ""; }
  ) {
    return {
      type:  "ReturnStatement",
      value: value !== "" ? value : null
    };
  }

WithStatement

= WithToken __ "(" __ environment:Expression __ ")" __ statement:Statement {
    return {
      type:        "WithStatement",
      environment: environment,
      statement:   statement
    };
  }

SwitchStatement

= SwitchToken __ "(" __ expression:Expression __ ")" __ clauses:CaseBlock {
    return {
      type:       "SwitchStatement",
      expression: expression,
      clauses:    clauses
    };
  }

CaseBlock

= "{" __
  before:CaseClauses?
  defaultAndAfter:(__ DefaultClause __ CaseClauses?)? __
  "}" {
    var before = before !== null ? before : [];
    if (defaultAndAfter !== null) {
      var defaultClause = defaultAndAfter[1];
      var clausesAfter = defaultAndAfter[3] !== null
        ? defaultAndAfter[3]
        : [];
    } else {
      var defaultClause = null;
      var clausesAfter = [];
    }

    return (defaultClause ? before.concat(defaultClause) : before).concat(clausesAfter);
  }

CaseClauses

= head:CaseClause tail:(__ CaseClause)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][1]);
    }
    return result;
  }

CaseClause

= CaseToken __ selector:Expression __ ":" statements:(__ StatementList)? {
    return {
      type:       "CaseClause",
      selector:   selector,
      statements: statements !== null ? statements[1] : []
    };
  }

DefaultClause

= DefaultToken __ ":" statements:(__ StatementList)? {
    return {
      type:       "DefaultClause",
      statements: statements !== null ? statements[1] : []
    };
  }

LabelledStatement

= label:Identifier __ ":" __ statement:Statement {
    return {
      type:      "LabelledStatement",
      label:     label,
      statement: statement
    };
  }

ThrowStatement

= ThrowToken _ exception:Expression EOSNoLineTerminator {
    return {
      type:      "ThrowStatement",
      exception: exception
    };
  }

TryStatement

= TryToken __ block:Block __ catch_:Catch __ finally_:Finally {
    return {
      type:      "TryStatement",
      block:     block,
      "catch":   catch_,
      "finally": finally_
    };
  }
/ TryToken __ block:Block __ catch_:Catch {
    return {
      type:      "TryStatement",
      block:     block,
      "catch":   catch_,
      "finally": null
    };
  }
/ TryToken __ block:Block __ finally_:Finally {
    return {
      type:      "TryStatement",
      block:     block,
      "catch":   null,
      "finally": finally_
    };
  }

Catch

= CatchToken __ "(" __ identifier:Identifier __ ")" __ block:Block {
    return {
      type:       "Catch",
      identifier: identifier,
      block:      block
    };
  }

Finally

= FinallyToken __ block:Block {
    return {
      type:  "Finally",
      block: block
    };
  }

DebuggerStatement

= DebuggerToken EOS { return { type: "DebuggerStatement" }; }

/* ===== A.5 Functions and Programs ===== */

FunctionDeclaration

= FunctionToken __ name:Identifier __
  "(" __ params:FormalParameterList? __ ")" __
  "{" __ elements:FunctionBody __ "}" {
    return {
      type:     "Function",
      name:     name,
      params:   params !== null ? params : [],
      elements: elements
    };
  }

FunctionExpression

= FunctionToken __ name:Identifier? __
  "(" __ params:FormalParameterList? __ ")" __
  "{" __ elements:FunctionBody __ "}" {
    return {
      type:     "Function",
      name:     name,
      params:   params !== null ? params : [],
      elements: elements
    };
  }

FormalParameterList

= head:Identifier tail:(__ "," __ Identifier)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][3]);
    }
    return result;
  }

FunctionBody

= elements:SourceElements? { return elements !== null ? elements : []; }

Program

= elements:SourceElements? {
    return {
      type:     "Program",
      elements: elements !== null ? elements : []
    };
  }

SourceElements

= head:SourceElement tail:(__ SourceElement)* {
    var result = [head];
    for (var i = 0; i < tail.length; i++) {
      result.push(tail[i][1]);
    }
    return result;
  }

/*

* The specification also allows |FunctionDeclaration| here. We do it
* implicitly, because we consider |FunctionDeclaration| and
* |FunctionExpression| as statements. See the comment at the |Statement| rule.
*/

SourceElement

= Statement

/* ===== A.6 Universal Resource Identifier Character Classes ===== */

/* Irrelevant. */

/* ===== A.7 Regular Expressions ===== */

/*

* We treat regular expressions as opaque character sequences and we do not use
* rules from this part of the grammar to parse them further.
*/

/* ===== A.8 JSON ===== */

/* Irrelevant. */