Grammalecte  Hex Artifact Content

Artifact ad61c520455e82c6e1da76ca46b2cdd7035feabc0d10eeefa35ca60459fa33d1:


0000: 2f 2f 20 47 72 61 6d 6d 61 72 20 63 68 65 63 6b  // Grammar check
0010: 65 72 20 65 6e 67 69 6e 65 0a 2f 2a 6a 73 6c 69  er engine./*jsli
0020: 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20 36 2a  nt esversion: 6*
0030: 2f 0a 2f 2a 67 6c 6f 62 61 6c 20 63 6f 6e 73 6f  /./*global conso
0040: 6c 65 2c 72 65 71 75 69 72 65 2c 65 78 70 6f 72  le,require,expor
0050: 74 73 2a 2f 0a 0a 22 75 73 65 20 73 74 72 69 63  ts*/.."use stric
0060: 74 22 3b 0a 0a 24 7b 73 74 72 69 6e 67 7d 0a 24  t";..${string}.$
0070: 7b 72 65 67 65 78 7d 0a 24 7b 6d 61 70 7d 0a 0a  {regex}.${map}..
0080: 0a 69 66 20 28 74 79 70 65 6f 66 28 72 65 71 75  .if (typeof(requ
0090: 69 72 65 29 20 21 3d 3d 20 27 75 6e 64 65 66 69  ire) !== 'undefi
00a0: 6e 65 64 27 29 20 7b 0a 20 20 20 20 76 61 72 20  ned') {.    var 
00b0: 67 63 5f 6f 70 74 69 6f 6e 73 20 3d 20 72 65 71  gc_options = req
00c0: 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f  uire("resource:/
00d0: 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c  /grammalecte/${l
00e0: 61 6e 67 7d 2f 67 63 5f 6f 70 74 69 6f 6e 73 2e  ang}/gc_options.
00f0: 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 67 63  js");.    var gc
0100: 5f 72 75 6c 65 73 20 3d 20 72 65 71 75 69 72 65  _rules = require
0110: 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61  ("resource://gra
0120: 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d  mmalecte/${lang}
0130: 2f 67 63 5f 72 75 6c 65 73 2e 6a 73 22 29 3b 0a  /gc_rules.js");.
0140: 20 20 20 20 76 61 72 20 67 63 5f 72 75 6c 65 73      var gc_rules
0150: 5f 67 72 61 70 68 20 3d 20 72 65 71 75 69 72 65  _graph = require
0160: 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61  ("resource://gra
0170: 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d  mmalecte/${lang}
0180: 2f 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 2e  /gc_rules_graph.
0190: 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 63 72  js");.    var cr
01a0: 65 67 65 78 20 3d 20 72 65 71 75 69 72 65 28 22  egex = require("
01b0: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
01c0: 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 63  alecte/${lang}/c
01d0: 72 65 67 65 78 2e 6a 73 22 29 3b 0a 20 20 20 20  regex.js");.    
01e0: 76 61 72 20 74 65 78 74 20 3d 20 72 65 71 75 69  var text = requi
01f0: 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67  re("resource://g
0200: 72 61 6d 6d 61 6c 65 63 74 65 2f 74 65 78 74 2e  rammalecte/text.
0210: 6a 73 22 29 3b 0a 7d 0a 0a 0a 66 75 6e 63 74 69  js");.}...functi
0220: 6f 6e 20 63 61 70 69 74 61 6c 69 7a 65 41 72 72  on capitalizeArr
0230: 61 79 20 28 61 41 72 72 61 79 29 20 7b 0a 20 20  ay (aArray) {.  
0240: 20 20 2f 2f 20 63 61 6e e2 80 99 74 20 6d 61 70    // can...t map
0250: 20 6f 6e 20 75 73 65 72 20 64 65 66 69 6e 65 64   on user defined
0260: 20 66 75 6e 63 74 69 6f 6e 3f 3f 0a 20 20 20 20   function??.    
0270: 6c 65 74 20 61 4e 65 77 20 3d 20 5b 5d 3b 0a 20  let aNew = [];. 
0280: 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20     for (let i = 
0290: 30 3b 20 69 20 3c 20 61 41 72 72 61 79 2e 6c 65  0; i < aArray.le
02a0: 6e 67 74 68 3b 20 69 20 3d 20 69 20 2b 20 31 29  ngth; i = i + 1)
02b0: 20 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b   {.        aNew[
02c0: 69 5d 20 3d 20 61 41 72 72 61 79 5b 69 5d 2e 67  i] = aArray[i].g
02d0: 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29  l_toCapitalize()
02e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
02f0: 72 6e 20 61 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2f 20  rn aNew;.}...// 
0300: 64 61 74 61 0a 6c 65 74 20 5f 73 41 70 70 43 6f  data.let _sAppCo
0310: 6e 74 65 78 74 20 3d 20 22 22 3b 20 20 20 20 20  ntext = "";     
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
0340: 77 68 61 74 20 73 6f 66 74 77 61 72 65 20 69 73  what software is
0350: 20 72 75 6e 6e 69 6e 67 0a 6c 65 74 20 5f 64 4f   running.let _dO
0360: 70 74 69 6f 6e 73 20 3d 20 6e 75 6c 6c 3b 0a 6c  ptions = null;.l
0370: 65 74 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65  et _oSpellChecke
0380: 72 20 3d 20 6e 75 6c 6c 3b 0a 6c 65 74 20 5f 6f  r = null;.let _o
0390: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 6e 75 6c 6c  Tokenizer = null
03a0: 3b 0a 6c 65 74 20 5f 61 49 67 6e 6f 72 65 64 52  ;.let _aIgnoredR
03b0: 75 6c 65 73 20 3d 20 6e 65 77 20 53 65 74 28 29  ules = new Set()
03c0: 3b 0a 0a 0a 0a 76 61 72 20 67 63 5f 65 6e 67 69  ;....var gc_engi
03d0: 6e 65 20 3d 20 7b 0a 0a 20 20 20 20 2f 2f 2f 2f  ne = {..    ////
03e0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 73 0a 0a 20   Informations.. 
03f0: 20 20 20 6c 61 6e 67 3a 20 22 24 7b 6c 61 6e 67     lang: "${lang
0400: 7d 22 2c 0a 20 20 20 20 6c 6f 63 61 6c 65 73 3a  }",.    locales:
0410: 20 24 7b 6c 6f 63 7d 2c 0a 20 20 20 20 70 6b 67   ${loc},.    pkg
0420: 3a 20 22 24 7b 69 6d 70 6c 6e 61 6d 65 7d 22 2c  : "${implname}",
0430: 0a 20 20 20 20 6e 61 6d 65 3a 20 22 24 7b 6e 61  .    name: "${na
0440: 6d 65 7d 22 2c 0a 20 20 20 20 76 65 72 73 69 6f  me}",.    versio
0450: 6e 3a 20 22 24 7b 76 65 72 73 69 6f 6e 7d 22 2c  n: "${version}",
0460: 0a 20 20 20 20 61 75 74 68 6f 72 3a 20 22 24 7b  .    author: "${
0470: 61 75 74 68 6f 72 7d 22 2c 0a 0a 20 20 20 20 2f  author}",..    /
0480: 2f 2f 2f 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  /// Initializati
0490: 6f 6e 0a 0a 20 20 20 20 6c 6f 61 64 3a 20 66 75  on..    load: fu
04a0: 6e 63 74 69 6f 6e 20 28 73 43 6f 6e 74 65 78 74  nction (sContext
04b0: 3d 22 4a 61 76 61 53 63 72 69 70 74 22 2c 20 73  ="JavaScript", s
04c0: 50 61 74 68 3d 22 22 29 20 7b 0a 20 20 20 20 20  Path="") {.     
04d0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
04e0: 20 20 20 20 20 69 66 20 28 74 79 70 65 6f 66 28       if (typeof(
04f0: 72 65 71 75 69 72 65 29 20 21 3d 3d 20 27 75 6e  require) !== 'un
0500: 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20  defined') {.    
0510: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
0520: 73 70 65 6c 6c 63 68 65 63 6b 65 72 20 3d 20 72  spellchecker = r
0530: 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65  equire("resource
0540: 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67  ://grammalecte/g
0550: 72 61 70 68 73 70 65 6c 6c 2f 73 70 65 6c 6c 63  raphspell/spellc
0560: 68 65 63 6b 65 72 2e 6a 73 22 29 3b 0a 20 20 20  hecker.js");.   
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 6f 53               _oS
0580: 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65  pellChecker = ne
0590: 77 20 73 70 65 6c 6c 63 68 65 63 6b 65 72 2e 53  w spellchecker.S
05a0: 70 65 6c 6c 43 68 65 63 6b 65 72 28 22 24 7b 6c  pellChecker("${l
05b0: 61 6e 67 7d 22 2c 20 22 22 2c 20 22 24 7b 64 69  ang}", "", "${di
05c0: 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f  c_main_filename_
05d0: 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f 65 78 74  js}", "${dic_ext
05e0: 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65 5f 6a  ended_filename_j
05f0: 73 7d 22 2c 20 22 24 7b 64 69 63 5f 63 6f 6d 6d  s}", "${dic_comm
0600: 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a  unity_filename_j
0610: 73 7d 22 2c 20 22 24 7b 64 69 63 5f 70 65 72 73  s}", "${dic_pers
0620: 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73  onal_filename_js
0630: 7d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  }");.           
0640: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0650: 20 20 20 20 20 20 20 20 20 20 5f 6f 53 70 65 6c            _oSpel
0660: 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65 77 20 53  lChecker = new S
0670: 70 65 6c 6c 43 68 65 63 6b 65 72 28 22 24 7b 6c  pellChecker("${l
0680: 61 6e 67 7d 22 2c 20 73 50 61 74 68 2c 20 22 24  ang}", sPath, "$
0690: 7b 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61  {dic_main_filena
06a0: 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f  me_js}", "${dic_
06b0: 65 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d  extended_filenam
06c0: 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f 63  e_js}", "${dic_c
06d0: 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d  ommunity_filenam
06e0: 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f 70  e_js}", "${dic_p
06f0: 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65  ersonal_filename
0700: 5f 6a 73 7d 22 29 3b 0a 20 20 20 20 20 20 20 20  _js}");.        
0710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
0720: 20 20 5f 73 41 70 70 43 6f 6e 74 65 78 74 20 3d    _sAppContext =
0730: 20 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20   sContext;.     
0740: 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73         _dOptions
0750: 20 3d 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67 65   = gc_options.ge
0760: 74 4f 70 74 69 6f 6e 73 28 73 43 6f 6e 74 65 78  tOptions(sContex
0770: 74 29 2e 67 6c 5f 73 68 61 6c 6c 6f 77 43 6f 70  t).gl_shallowCop
0780: 79 28 29 3b 20 20 20 20 20 2f 2f 20 64 75 70 6c  y();     // dupl
0790: 69 63 61 74 69 6f 6e 20 6e 65 63 65 73 73 61 72  ication necessar
07a0: 79 2c 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  y, to be able to
07b0: 20 72 65 73 65 74 20 74 6f 20 64 65 66 61 75 6c   reset to defaul
07c0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 6f  t.            _o
07d0: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 5f 6f 53 70  Tokenizer = _oSp
07e0: 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 54 6f  ellChecker.getTo
07f0: 6b 65 6e 69 7a 65 72 28 29 3b 0a 20 20 20 20 20  kenizer();.     
0800: 20 20 20 20 20 20 20 5f 6f 53 70 65 6c 6c 43 68         _oSpellCh
0810: 65 63 6b 65 72 2e 61 63 74 69 76 61 74 65 53 74  ecker.activateSt
0820: 6f 72 61 67 65 28 29 3b 0a 20 20 20 20 20 20 20  orage();.       
0830: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68   }.        catch
0840: 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20   (e) {.         
0850: 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72     console.error
0860: 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (e);.        }. 
0870: 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65 74 53 70     },..    getSp
0880: 65 6c 6c 43 68 65 63 6b 65 72 3a 20 66 75 6e 63  ellChecker: func
0890: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
08a0: 20 20 72 65 74 75 72 6e 20 5f 6f 53 70 65 6c 6c    return _oSpell
08b0: 43 68 65 63 6b 65 72 3b 0a 20 20 20 20 7d 2c 0a  Checker;.    },.
08c0: 0a 20 20 20 20 2f 2f 2f 2f 20 52 75 6c 65 73 0a  .    //// Rules.
08d0: 0a 20 20 20 20 67 65 74 52 75 6c 65 73 3a 20 66  .    getRules: f
08e0: 75 6e 63 74 69 6f 6e 20 28 62 50 61 72 61 67 72  unction (bParagr
08f0: 61 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20 69  aph) {.        i
0900: 66 20 28 21 62 50 61 72 61 67 72 61 70 68 29 20  f (!bParagraph) 
0910: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
0920: 74 75 72 6e 20 67 63 5f 72 75 6c 65 73 2e 6c 53  turn gc_rules.lS
0930: 65 6e 74 65 6e 63 65 52 75 6c 65 73 3b 0a 20 20  entenceRules;.  
0940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0950: 72 65 74 75 72 6e 20 67 63 5f 72 75 6c 65 73 2e  return gc_rules.
0960: 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73 3b  lParagraphRules;
0970: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 69 67 6e  .    },..    ign
0980: 6f 72 65 52 75 6c 65 3a 20 66 75 6e 63 74 69 6f  oreRule: functio
0990: 6e 20 28 73 52 75 6c 65 49 64 29 20 7b 0a 20 20  n (sRuleId) {.  
09a0: 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64 52        _aIgnoredR
09b0: 75 6c 65 73 2e 61 64 64 28 73 52 75 6c 65 49 64  ules.add(sRuleId
09c0: 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72  );.    },..    r
09d0: 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 3a  esetIgnoreRules:
09e0: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
09f0: 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64         _aIgnored
0a00: 52 75 6c 65 73 2e 63 6c 65 61 72 28 29 3b 0a 20  Rules.clear();. 
0a10: 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65 61 63 74     },..    react
0a20: 69 76 61 74 65 52 75 6c 65 3a 20 66 75 6e 63 74  ivateRule: funct
0a30: 69 6f 6e 20 28 73 52 75 6c 65 49 64 29 20 7b 0a  ion (sRuleId) {.
0a40: 20 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65          _aIgnore
0a50: 64 52 75 6c 65 73 2e 64 65 6c 65 74 65 28 73 52  dRules.delete(sR
0a60: 75 6c 65 49 64 29 3b 0a 20 20 20 20 7d 2c 0a 0a  uleId);.    },..
0a70: 20 20 20 20 6c 69 73 74 52 75 6c 65 73 3a 20 66      listRules: f
0a80: 75 6e 63 74 69 6f 6e 2a 20 28 73 46 69 6c 74 65  unction* (sFilte
0a90: 72 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  r=null) {.      
0aa0: 20 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20    // generator: 
0ab0: 72 65 74 75 72 6e 73 20 74 75 70 6c 65 20 28 73  returns tuple (s
0ac0: 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c  Option, sLineId,
0ad0: 20 73 52 75 6c 65 49 64 29 0a 20 20 20 20 20 20   sRuleId).      
0ae0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
0af0: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73 4f      for (let [sO
0b00: 70 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72 6f 75  ption, lRuleGrou
0b10: 70 5d 20 6f 66 20 74 68 69 73 2e 67 65 74 52 75  p] of this.getRu
0b20: 6c 65 73 28 74 72 75 65 29 29 20 7b 0a 20 20 20  les(true)) {.   
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
0b40: 20 28 6c 65 74 20 5b 2c 2c 20 73 4c 69 6e 65 49   (let [,, sLineI
0b50: 64 2c 20 73 52 75 6c 65 49 64 2c 2c 5d 20 6f 66  d, sRuleId,,] of
0b60: 20 6c 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20   lRuleGroup) {. 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 69 66 20 28 21 73 46 69 6c 74 65 72 20     if (!sFilter 
0b90: 7c 7c 20 73 52 75 6c 65 49 64 2e 74 65 73 74 28  || sRuleId.test(
0ba0: 73 46 69 6c 74 65 72 29 29 20 7b 0a 20 20 20 20  sFilter)) {.    
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 20 20 20 20 79 69 65 6c 64 20 5b 73 4f 70 74 69      yield [sOpti
0bd0: 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  on, sLineId, sRu
0be0: 6c 65 49 64 5d 3b 0a 20 20 20 20 20 20 20 20 20  leId];.         
0bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0c10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0c20: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
0c30: 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c  t [sOption, lRul
0c40: 65 47 72 6f 75 70 5d 20 6f 66 20 74 68 69 73 2e  eGroup] of this.
0c50: 67 65 74 52 75 6c 65 73 28 66 61 6c 73 65 29 29  getRules(false))
0c60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0c70: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 2c 2c 20     for (let [,, 
0c80: 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64  sLineId, sRuleId
0c90: 2c 2c 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75  ,,] of lRuleGrou
0ca0: 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p) {.           
0cb0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 46           if (!sF
0cc0: 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49 64  ilter || sRuleId
0cd0: 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29 29 20  .test(sFilter)) 
0ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0cf0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
0d00: 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49  [sOption, sLineI
0d10: 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20 20  d, sRuleId];.   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
0d40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
0d50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
0d60: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
0d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
0d80: 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20  sole.error(e);. 
0d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 2c 0a         }.    },.
0da0: 0a 20 20 20 20 2f 2f 2f 2f 20 4f 70 74 69 6f 6e  .    //// Option
0db0: 73 0a 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e  s..    setOption
0dc0: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 4f 70 74  : function (sOpt
0dd0: 2c 20 62 56 61 6c 29 20 7b 0a 20 20 20 20 20 20  , bVal) {.      
0de0: 20 20 69 66 20 28 5f 64 4f 70 74 69 6f 6e 73 2e    if (_dOptions.
0df0: 68 61 73 28 73 4f 70 74 29 29 20 7b 0a 20 20 20  has(sOpt)) {.   
0e00: 20 20 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f           _dOptio
0e10: 6e 73 2e 73 65 74 28 73 4f 70 74 2c 20 62 56 61  ns.set(sOpt, bVa
0e20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
0e30: 20 20 7d 2c 0a 0a 20 20 20 20 73 65 74 4f 70 74    },..    setOpt
0e40: 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28  ions: function (
0e50: 64 4f 70 74 29 20 7b 0a 20 20 20 20 20 20 20 20  dOpt) {.        
0e60: 5f 64 4f 70 74 69 6f 6e 73 2e 67 6c 5f 75 70 64  _dOptions.gl_upd
0e70: 61 74 65 4f 6e 6c 79 45 78 69 73 74 69 6e 67 4b  ateOnlyExistingK
0e80: 65 79 73 28 64 4f 70 74 29 3b 0a 20 20 20 20 7d  eys(dOpt);.    }
0e90: 2c 0a 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e  ,..    getOption
0ea0: 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  s: function () {
0eb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ec0: 5f 64 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 7d  _dOptions;.    }
0ed0: 2c 0a 0a 20 20 20 20 67 65 74 44 65 66 61 75 6c  ,..    getDefaul
0ee0: 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69  tOptions: functi
0ef0: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
0f00: 72 65 74 75 72 6e 20 67 63 5f 6f 70 74 69 6f 6e  return gc_option
0f10: 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 5f 73 41  s.getOptions(_sA
0f20: 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c 5f 73 68  ppContext).gl_sh
0f30: 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a 20 20 20  allowCopy();.   
0f40: 20 7d 2c 0a 0a 20 20 20 20 72 65 73 65 74 4f 70   },..    resetOp
0f50: 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20  tions: function 
0f60: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 5f 64 4f  () {.        _dO
0f70: 70 74 69 6f 6e 73 20 3d 20 67 63 5f 6f 70 74 69  ptions = gc_opti
0f80: 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 5f  ons.getOptions(_
0f90: 73 41 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c 5f  sAppContext).gl_
0fa0: 73 68 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a 20  shallowCopy();. 
0fb0: 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20     },..    //// 
0fc0: 50 61 72 73 69 6e 67 0a 0a 20 20 20 20 70 61 72  Parsing..    par
0fd0: 73 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 54  se: function (sT
0fe0: 65 78 74 2c 20 73 43 6f 75 6e 74 72 79 3d 22 24  ext, sCountry="$
0ff0: 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75 6c 74  {country_default
1000: 7d 22 2c 20 62 44 65 62 75 67 3d 66 61 6c 73 65  }", bDebug=false
1010: 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75 6c 6c 2c  , dOptions=null,
1020: 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c 73 65 29   bContext=false)
1030: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6f   {.        let o
1040: 54 65 78 74 20 3d 20 6e 65 77 20 54 65 78 74 50  Text = new TextP
1050: 61 72 73 65 72 28 73 54 65 78 74 29 3b 0a 20 20  arser(sText);.  
1060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 54 65        return oTe
1070: 78 74 2e 70 61 72 73 65 28 73 43 6f 75 6e 74 72  xt.parse(sCountr
1080: 79 2c 20 62 44 65 62 75 67 2c 20 64 4f 70 74 69  y, bDebug, dOpti
1090: 6f 6e 73 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a  ons, bContext);.
10a0: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 5f 7a 45 6e      },..    _zEn
10b0: 64 4f 66 53 65 6e 74 65 6e 63 65 3a 20 6e 65 77  dOfSentence: new
10c0: 20 52 65 67 45 78 70 20 28 27 28 5b 2e 3f 21 3a   RegExp ('([.?!:
10d0: 3b e2 80 a6 5d 5b 20 2e 3f 21 e2 80 a6 20 c2 bb  ;...][ .?!... ..
10e0: e2 80 9d 22 29 5d 2a 7c 2e 24 29 27 2c 20 22 67  ...")]*|.$)', "g
10f0: 22 29 2c 0a 20 20 20 20 5f 7a 42 65 67 69 6e 4f  "),.    _zBeginO
1100: 66 50 61 72 61 67 72 61 70 68 3a 20 6e 65 77 20  fParagraph: new 
1110: 52 65 67 45 78 70 20 28 22 5e 5b 2d 20 c2 a0 e2  RegExp ("^[- ...
1120: 80 93 e2 80 94 2e 2c 3b 3f 21 e2 80 a6 5d 2a 22  ......,;?!...]*"
1130: 2c 20 22 69 67 22 29 2c 0a 20 20 20 20 5f 7a 45  , "ig"),.    _zE
1140: 6e 64 4f 66 50 61 72 61 67 72 61 70 68 3a 20 6e  ndOfParagraph: n
1150: 65 77 20 52 65 67 45 78 70 20 28 22 5b 2d 20 c2  ew RegExp ("[- .
1160: a0 2e 2c 3b 3f 21 e2 80 a6 e2 80 93 e2 80 94 5d  ..,;?!.........]
1170: 2a 24 22 2c 20 22 69 67 22 29 2c 0a 0a 20 20 20  *$", "ig"),..   
1180: 20 67 65 74 53 65 6e 74 65 6e 63 65 42 6f 75 6e   getSentenceBoun
1190: 64 61 72 69 65 73 3a 20 66 75 6e 63 74 69 6f 6e  daries: function
11a0: 2a 20 28 73 54 65 78 74 29 20 7b 0a 20 20 20 20  * (sText) {.    
11b0: 20 20 20 20 6c 65 74 20 6d 42 65 67 69 6e 4f 66      let mBeginOf
11c0: 53 65 6e 74 65 6e 63 65 20 3d 20 74 68 69 73 2e  Sentence = this.
11d0: 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72 61  _zBeginOfParagra
11e0: 70 68 2e 65 78 65 63 28 73 54 65 78 74 29 3b 0a  ph.exec(sText);.
11f0: 20 20 20 20 20 20 20 20 6c 65 74 20 69 53 74 61          let iSta
1200: 72 74 20 3d 20 74 68 69 73 2e 5f 7a 42 65 67 69  rt = this._zBegi
1210: 6e 4f 66 50 61 72 61 67 72 61 70 68 2e 6c 61 73  nOfParagraph.las
1220: 74 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  tIndex;.        
1230: 6c 65 74 20 6d 3b 0a 20 20 20 20 20 20 20 20 77  let m;.        w
1240: 68 69 6c 65 20 28 28 6d 20 3d 20 74 68 69 73 2e  hile ((m = this.
1250: 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 2e  _zEndOfSentence.
1260: 65 78 65 63 28 73 54 65 78 74 29 29 20 21 3d 3d  exec(sText)) !==
1270: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
1280: 20 20 20 20 20 79 69 65 6c 64 20 5b 69 53 74 61       yield [iSta
1290: 72 74 2c 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66  rt, this._zEndOf
12a0: 53 65 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e 64  Sentence.lastInd
12b0: 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex];.           
12c0: 20 69 53 74 61 72 74 20 3d 20 74 68 69 73 2e 5f   iStart = this._
12d0: 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 2e 6c  zEndOfSentence.l
12e0: 61 73 74 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  astIndex;.      
12f0: 20 20 7d 0a 20 20 20 20 7d 0a 7d 3b 0a 0a 0a 63    }.    }.};...c
1300: 6c 61 73 73 20 54 65 78 74 50 61 72 73 65 72 20  lass TextParser 
1310: 7b 0a 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74  {..    construct
1320: 6f 72 20 28 73 54 65 78 74 29 20 7b 0a 20 20 20  or (sText) {.   
1330: 20 20 20 20 20 74 68 69 73 2e 73 54 65 78 74 20       this.sText 
1340: 3d 20 73 54 65 78 74 3b 0a 20 20 20 20 20 20 20  = sText;.       
1350: 20 74 68 69 73 2e 73 54 65 78 74 30 20 3d 20 73   this.sText0 = s
1360: 54 65 78 74 3b 0a 20 20 20 20 20 20 20 20 74 68  Text;.        th
1370: 69 73 2e 73 53 65 6e 74 65 6e 63 65 20 3d 20 22  is.sSentence = "
1380: 22 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ";.        this.
1390: 73 53 65 6e 74 65 6e 63 65 30 20 3d 20 22 22 3b  sSentence0 = "";
13a0: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 4f  .        this.nO
13b0: 66 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67  ffsetWithinParag
13c0: 72 61 70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  raph = 0;.      
13d0: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 20 3d 20    this.lToken = 
13e0: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73  [];.        this
13f0: 2e 64 54 6f 6b 65 6e 50 6f 73 20 3d 20 6e 65 77  .dTokenPos = new
1400: 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20   Map();.        
1410: 74 68 69 73 2e 64 54 61 67 73 20 3d 20 6e 65 77  this.dTags = new
1420: 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20   Map();.        
1430: 74 68 69 73 2e 64 45 72 72 6f 72 20 3d 20 6e 65  this.dError = ne
1440: 77 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20  w Map();.       
1450: 20 74 68 69 73 2e 64 45 72 72 6f 72 50 72 69 6f   this.dErrorPrio
1460: 72 69 74 79 20 3d 20 6e 65 77 20 4d 61 70 28 29  rity = new Map()
1470: 3b 20 20 2f 2f 20 4b 65 79 20 3d 20 70 6f 73 69  ;  // Key = posi
1480: 74 69 6f 6e 3b 20 76 61 6c 75 65 20 3d 20 70 72  tion; value = pr
1490: 69 6f 72 69 74 79 0a 20 20 20 20 7d 0a 0a 20 20  iority.    }..  
14a0: 20 20 61 73 53 74 72 69 6e 67 20 28 29 20 7b 0a    asString () {.
14b0: 20 20 20 20 20 20 20 20 6c 65 74 20 73 20 3d 20          let s = 
14c0: 22 3d 3d 3d 3d 3d 20 54 45 58 54 20 3d 3d 3d 3d  "===== TEXT ====
14d0: 3d 5c 6e 22 0a 20 20 20 20 20 20 20 20 73 20 2b  =\n".        s +
14e0: 3d 20 22 73 65 6e 74 65 6e 63 65 3a 20 22 20 2b  = "sentence: " +
14f0: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 30   this.sSentence0
1500: 20 2b 20 22 5c 6e 22 3b 0a 20 20 20 20 20 20 20   + "\n";.       
1510: 20 73 20 2b 3d 20 22 6e 6f 77 3a 20 20 20 20 20   s += "now:     
1520: 20 22 20 2b 20 74 68 69 73 2e 73 53 65 6e 74 65   " + this.sSente
1530: 6e 63 65 20 20 2b 20 22 5c 6e 22 3b 0a 20 20 20  nce  + "\n";.   
1540: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64 54       for (let dT
1550: 6f 6b 65 6e 20 6f 66 20 74 68 69 73 2e 6c 54 6f  oken of this.lTo
1560: 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ken) {.         
1570: 20 20 20 73 20 2b 3d 20 27 23 24 7b 64 54 6f 6b     s += '#${dTok
1580: 65 6e 5b 22 69 22 5d 7d 5c 74 24 7b 64 54 6f 6b  en["i"]}\t${dTok
1590: 65 6e 5b 22 6e 53 74 61 72 74 22 5d 7d 3a 7b 24  en["nStart"]}:{$
15a0: 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 7d 5c  dToken["nEnd"]}\
15b0: 74 24 7b 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75  t${dToken["sValu
15c0: 65 22 5d 7d 5c 74 24 7b 64 54 6f 6b 65 6e 5b 22  e"]}\t${dToken["
15d0: 73 54 79 70 65 22 5d 7d 27 3b 0a 20 20 20 20 20  sType"]}';.     
15e0: 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65         if (dToke
15f0: 6e 2e 68 61 73 28 22 6c 4d 6f 72 70 68 22 29 29  n.has("lMorph"))
1600: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1610: 20 20 20 73 20 2b 3d 20 22 5c 74 22 20 2b 20 64     s += "\t" + d
1620: 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 2e  Token["lMorph"].
1630: 74 6f 53 74 72 69 6e 67 28 29 3b 0a 20 20 20 20  toString();.    
1640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1650: 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e        if (dToken
1660: 2e 68 61 73 28 22 74 61 67 73 22 29 29 20 7b 0a  .has("tags")) {.
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 73 20 2b 3d 20 22 5c 74 22 20 2b 20 64 54 6f 6b  s += "\t" + dTok
1690: 65 6e 5b 22 74 61 67 73 22 5d 2e 74 6f 53 74 72  en["tags"].toStr
16a0: 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ing();.         
16b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16c0: 20 73 20 2b 3d 20 22 5c 6e 22 3b 0a 20 20 20 20   s += "\n";.    
16d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
16e0: 74 75 72 6e 20 73 3b 0a 20 20 20 20 7d 0a 0a 20  turn s;.    }.. 
16f0: 20 20 20 70 61 72 73 65 20 28 73 54 65 78 74 2c     parse (sText,
1700: 20 73 43 6f 75 6e 74 72 79 3d 22 24 7b 63 6f 75   sCountry="${cou
1710: 6e 74 72 79 5f 64 65 66 61 75 6c 74 7d 22 2c 20  ntry_default}", 
1720: 62 44 65 62 75 67 3d 66 61 6c 73 65 2c 20 64 4f  bDebug=false, dO
1730: 70 74 69 6f 6e 73 3d 6e 75 6c 6c 2c 20 62 43 6f  ptions=null, bCo
1740: 6e 74 65 78 74 3d 66 61 6c 73 65 29 20 7b 0a 20  ntext=false) {. 
1750: 20 20 20 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73         // analys
1760: 65 73 20 74 68 65 20 70 61 72 61 67 72 61 70 68  es the paragraph
1770: 20 73 54 65 78 74 20 61 6e 64 20 72 65 74 75 72   sText and retur
1780: 6e 73 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72  ns list of error
1790: 73 0a 20 20 20 20 20 20 20 20 6c 65 74 20 64 4f  s.        let dO
17a0: 70 74 20 3d 20 64 4f 70 74 69 6f 6e 73 20 7c 7c  pt = dOptions ||
17b0: 20 67 63 5f 65 6e 67 69 6e 65 2e 64 4f 70 74 69   gc_engine.dOpti
17c0: 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20  ons;.        // 
17d0: 70 61 72 73 65 20 70 61 72 61 67 72 61 70 68 0a  parse paragraph.
17e0: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
17f0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 70            this.p
1800: 61 72 73 65 54 65 78 74 28 74 68 69 73 2e 73 54  arseText(this.sT
1810: 65 78 74 2c 20 74 68 69 73 2e 73 54 65 78 74 30  ext, this.sText0
1820: 2c 20 74 72 75 65 2c 20 30 2c 20 73 43 6f 75 6e  , true, 0, sCoun
1830: 74 72 79 2c 20 64 4f 70 74 2c 20 62 44 65 62 75  try, dOpt, bDebu
1840: 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20  g, bContext);.  
1850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1860: 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20  catch (e) {.    
1870: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
1880: 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20  error(e);.      
1890: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20    }..        // 
18a0: 63 6c 65 61 6e 75 70 0a 20 20 20 20 20 20 20 20  cleanup.        
18b0: 69 66 20 28 74 68 69 73 2e 73 54 65 78 74 2e 69  if (this.sText.i
18c0: 6e 63 6c 75 64 65 73 28 22 c2 a0 22 29 29 20 7b  ncludes("..")) {
18d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
18e0: 73 2e 73 54 65 78 74 20 3d 20 74 68 69 73 2e 73  s.sText = this.s
18f0: 54 65 78 74 2e 72 65 70 6c 61 63 65 28 2f c2 a0  Text.replace(/..
1900: 2f 67 2c 20 27 20 27 29 3b 20 2f 2f 20 6e 62 73  /g, ' '); // nbs
1910: 70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  p.        }.    
1920: 20 20 20 20 69 66 20 28 74 68 69 73 2e 73 54 65      if (this.sTe
1930: 78 74 2e 69 6e 63 6c 75 64 65 73 28 22 e2 80 af  xt.includes("...
1940: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
1950: 20 20 74 68 69 73 2e 73 54 65 78 74 20 3d 20 74    this.sText = t
1960: 68 69 73 2e 73 54 65 78 74 2e 72 65 70 6c 61 63  his.sText.replac
1970: 65 28 2f e2 80 af 2f 67 2c 20 27 20 27 29 3b 20  e(/.../g, ' '); 
1980: 2f 2f 20 73 6e 62 73 70 0a 20 20 20 20 20 20 20  // snbsp.       
1990: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 74   }.        if (t
19a0: 68 69 73 2e 73 54 65 78 74 2e 69 6e 63 6c 75 64  his.sText.includ
19b0: 65 73 28 22 27 22 29 29 20 7b 0a 20 20 20 20 20  es("'")) {.     
19c0: 20 20 20 20 20 20 20 74 68 69 73 2e 73 54 65 78         this.sTex
19d0: 74 20 3d 20 74 68 69 73 2e 73 54 65 78 74 2e 72  t = this.sText.r
19e0: 65 70 6c 61 63 65 28 2f 27 2f 67 2c 20 22 e2 80  eplace(/'/g, "..
19f0: 99 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .");.        }. 
1a00: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
1a10: 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28 22  sText.includes("
1a20: e2 80 91 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ...")) {.       
1a30: 20 20 20 20 20 74 68 69 73 2e 73 54 65 78 74 20       this.sText 
1a40: 3d 20 74 68 69 73 2e 73 54 65 78 74 2e 72 65 70  = this.sText.rep
1a50: 6c 61 63 65 28 2f e2 80 91 2f 67 2c 20 22 2d 22  lace(/.../g, "-"
1a60: 29 3b 20 2f 2f 20 6e 6f 62 72 65 61 6b 64 61 73  ); // nobreakdas
1a70: 68 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  h.        }..   
1a80: 20 20 20 20 20 2f 2f 20 70 61 72 73 65 20 73 65       // parse se
1a90: 6e 74 65 6e 63 65 0a 20 20 20 20 20 20 20 20 66  ntence.        f
1aa0: 6f 72 20 28 6c 65 74 20 5b 69 53 74 61 72 74 2c  or (let [iStart,
1ab0: 20 69 45 6e 64 5d 20 6f 66 20 67 63 5f 65 6e 67   iEnd] of gc_eng
1ac0: 69 6e 65 2e 67 65 74 53 65 6e 74 65 6e 63 65 42  ine.getSentenceB
1ad0: 6f 75 6e 64 61 72 69 65 73 28 74 68 69 73 2e 73  oundaries(this.s
1ae0: 54 65 78 74 29 29 20 7b 0a 20 20 20 20 20 20 20  Text)) {.       
1af0: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
1b00: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1b10: 73 53 65 6e 74 65 6e 63 65 20 3d 20 74 68 69 73  sSentence = this
1b20: 2e 73 54 65 78 74 2e 73 6c 69 63 65 28 69 53 74  .sText.slice(iSt
1b30: 61 72 74 2c 20 69 45 6e 64 29 3b 0a 20 20 20 20  art, iEnd);.    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
1b50: 2e 73 53 65 6e 74 65 6e 63 65 30 20 3d 20 74 68  .sSentence0 = th
1b60: 69 73 2e 73 54 65 78 74 30 2e 73 6c 69 63 65 28  is.sText0.slice(
1b70: 69 53 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a 20  iStart, iEnd);. 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1b90: 68 69 73 2e 6e 4f 66 66 73 65 74 57 69 74 68 69  his.nOffsetWithi
1ba0: 6e 50 61 72 61 67 72 61 70 68 20 3d 20 69 53 74  nParagraph = iSt
1bb0: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  art;.           
1bc0: 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e       this.lToken
1bd0: 20 3d 20 41 72 72 61 79 2e 66 72 6f 6d 28 5f 6f   = Array.from(_o
1be0: 54 6f 6b 65 6e 69 7a 65 72 2e 67 65 6e 54 6f 6b  Tokenizer.genTok
1bf0: 65 6e 73 28 74 68 69 73 2e 73 53 65 6e 74 65 6e  ens(this.sSenten
1c00: 63 65 2c 20 74 72 75 65 29 29 3b 0a 20 20 20 20  ce, true));.    
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
1c20: 2e 64 54 6f 6b 65 6e 50 6f 73 2e 63 6c 65 61 72  .dTokenPos.clear
1c30: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
1c40: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64 54 6f      for (let dTo
1c50: 6b 65 6e 20 6f 66 20 74 68 69 73 2e 6c 54 6f 6b  ken of this.lTok
1c60: 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  en) {.          
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54            if (dT
1c80: 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20 21 3d  oken["sType"] !=
1c90: 20 22 49 4e 46 4f 22 29 20 7b 0a 20 20 20 20 20   "INFO") {.     
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f     this.dTokenPo
1cc0: 73 2e 73 65 74 28 64 54 6f 6b 65 6e 5b 22 6e 53  s.set(dToken["nS
1cd0: 74 61 72 74 22 5d 2c 20 64 54 6f 6b 65 6e 29 3b  tart"], dToken);
1ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d10: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 70 61           this.pa
1d20: 72 73 65 54 65 78 74 28 74 68 69 73 2e 73 53 65  rseText(this.sSe
1d30: 6e 74 65 6e 63 65 2c 20 74 68 69 73 2e 73 53 65  ntence, this.sSe
1d40: 6e 74 65 6e 63 65 30 2c 20 66 61 6c 73 65 2c 20  ntence0, false, 
1d50: 69 53 74 61 72 74 2c 20 73 43 6f 75 6e 74 72 79  iStart, sCountry
1d60: 2c 20 64 4f 70 74 2c 20 62 44 65 62 75 67 2c 20  , dOpt, bDebug, 
1d70: 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  bContext);.     
1d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d90: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
1da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db0: 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65   console.error(e
1dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1dd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1de0: 20 20 20 72 65 74 75 72 6e 20 41 72 72 61 79 2e     return Array.
1df0: 66 72 6f 6d 28 74 68 69 73 2e 64 45 72 72 6f 72  from(this.dError
1e00: 2e 76 61 6c 75 65 73 28 29 29 3b 0a 20 20 20 20  .values());.    
1e10: 7d 0a 0a 20 20 20 20 70 61 72 73 65 54 65 78 74  }..    parseText
1e20: 20 28 73 54 65 78 74 2c 20 73 54 65 78 74 30 2c   (sText, sText0,
1e30: 20 62 50 61 72 61 67 72 61 70 68 2c 20 6e 4f 66   bParagraph, nOf
1e40: 66 73 65 74 2c 20 73 43 6f 75 6e 74 72 79 2c 20  fset, sCountry, 
1e50: 64 4f 70 74 69 6f 6e 73 2c 20 62 44 65 62 75 67  dOptions, bDebug
1e60: 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a 20 20  , bContext) {.  
1e70: 20 20 20 20 20 20 6c 65 74 20 62 43 68 61 6e 67        let bChang
1e80: 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  e = false;.     
1e90: 20 20 20 6c 65 74 20 62 49 64 52 75 6c 65 20 3d     let bIdRule =
1ea0: 20 6f 70 74 69 6f 6e 28 27 69 64 72 75 6c 65 27   option('idrule'
1eb0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20  );..        for 
1ec0: 28 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c  (let [sOption, l
1ed0: 52 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20 67 63  RuleGroup] of gc
1ee0: 5f 65 6e 67 69 6e 65 2e 67 65 74 52 75 6c 65 73  _engine.getRules
1ef0: 28 62 50 61 72 61 67 72 61 70 68 29 29 20 7b 0a  (bParagraph)) {.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1f10: 73 4f 70 74 69 6f 6e 20 3d 3d 20 22 40 40 40 40  sOption == "@@@@
1f20: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
1f30: 20 20 20 20 20 2f 2f 20 67 72 61 70 68 20 72 75       // graph ru
1f40: 6c 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  les.            
1f50: 20 20 20 20 69 66 20 28 21 62 50 61 72 61 67 72      if (!bParagr
1f60: 61 70 68 20 26 26 20 62 43 68 61 6e 67 65 29 20  aph && bChange) 
1f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f80: 20 20 20 20 20 20 74 68 69 73 2e 75 70 64 61 74        this.updat
1f90: 65 28 73 54 65 78 74 2c 20 62 44 65 62 75 67 29  e(sText, bDebug)
1fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fb0: 20 20 20 20 20 20 62 43 68 61 6e 67 65 20 3d 20        bChange = 
1fc0: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20  false;.         
1fd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fe0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
1ff0: 74 20 5b 73 47 72 61 70 68 4e 61 6d 65 2c 20 73  t [sGraphName, s
2000: 4c 69 6e 65 49 64 5d 20 6f 66 20 6c 52 75 6c 65  LineId] of lRule
2010: 47 72 6f 75 70 29 20 7b 0a 20 20 20 20 20 20 20  Group) {.       
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2030: 28 21 64 4f 70 74 69 6f 6e 73 2e 68 61 73 28 73  (!dOptions.has(s
2040: 47 72 61 70 68 4e 61 6d 65 29 20 7c 7c 20 64 4f  GraphName) || dO
2050: 70 74 69 6f 6e 73 2e 67 65 74 28 73 47 72 61 70  ptions.get(sGrap
2060: 68 4e 61 6d 65 29 29 20 7b 0a 20 20 20 20 20 20  hName)) {.      
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a    if (bDebug) {.
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
20b0: 6f 6c 65 2e 6c 6f 67 28 22 5c 6e 3e 3e 3e 3e 20  ole.log("\n>>>> 
20c0: 47 52 41 50 48 3a 20 22 20 2b 20 73 47 72 61 70  GRAPH: " + sGrap
20d0: 68 4e 61 6d 65 20 2b 20 22 20 22 20 2b 20 73 4c  hName + " " + sL
20e0: 69 6e 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ineId);.        
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2110: 20 20 20 20 20 20 20 20 20 20 73 54 65 78 74 20            sText 
2120: 3d 20 74 68 69 73 2e 70 61 72 73 65 47 72 61 70  = this.parseGrap
2130: 68 28 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68  h(gc_rules_graph
2140: 2e 64 41 6c 6c 47 72 61 70 68 2e 67 65 74 28 73  .dAllGraph.get(s
2150: 47 72 61 70 68 4e 61 6d 65 29 2c 20 73 43 6f 75  GraphName), sCou
2160: 6e 74 72 79 2c 20 64 4f 70 74 69 6f 6e 73 2c 20  ntry, dOptions, 
2170: 62 44 65 62 75 67 2c 20 62 43 6f 6e 74 65 78 74  bDebug, bContext
2180: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21c0: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 21 73       else if (!s
21d0: 4f 70 74 69 6f 6e 20 7c 7c 20 6f 70 74 69 6f 6e  Option || option
21e0: 28 73 4f 70 74 69 6f 6e 29 29 20 7b 0a 20 20 20  (sOption)) {.   
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2200: 20 28 6c 65 74 20 5b 7a 52 65 67 65 78 2c 20 62   (let [zRegex, b
2210: 55 70 70 65 72 63 61 73 65 2c 20 73 4c 69 6e 65  Uppercase, sLine
2220: 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 6e 50 72  Id, sRuleId, nPr
2230: 69 6f 72 69 74 79 2c 20 6c 41 63 74 69 6f 6e 73  iority, lActions
2240: 2c 20 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67 4c  , lGroups, lNegL
2250: 6f 6f 6b 42 65 66 6f 72 65 5d 20 6f 66 20 6c 52  ookBefore] of lR
2260: 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20 20  uleGroup) {.    
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 69 66 20 28 21 5f 61 49 67 6e 6f 72 65 64 52 75  if (!_aIgnoredRu
2290: 6c 65 73 2e 68 61 73 28 73 52 75 6c 65 49 64 29  les.has(sRuleId)
22a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
22c0: 65 20 28 28 6d 20 3d 20 7a 52 65 67 65 78 2e 67  e ((m = zRegex.g
22d0: 6c 5f 65 78 65 63 32 28 73 54 65 78 74 2c 20 6c  l_exec2(sText, l
22e0: 47 72 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f 6f 6b  Groups, lNegLook
22f0: 42 65 66 6f 72 65 29 29 20 21 3d 3d 20 6e 75 6c  Before)) !== nul
2300: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e 75 6c   bCondMemo = nul
2330: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2350: 6f 72 20 28 6c 65 74 20 5b 73 46 75 6e 63 43 6f  or (let [sFuncCo
2360: 6e 64 2c 20 63 41 63 74 69 6f 6e 54 79 70 65 2c  nd, cActionType,
2370: 20 73 57 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d   sWhat, ...eAct]
2380: 20 6f 66 20 6c 41 63 74 69 6f 6e 73 29 20 7b 0a   of lActions) {.
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 2f 2f 20 61 63 74 69 6f 6e 20 69 6e 20 6c 41 63  // action in lAc
23c0: 74 69 6f 6e 73 3a 20 5b 20 63 6f 6e 64 69 74 69  tions: [ conditi
23d0: 6f 6e 2c 20 61 63 74 69 6f 6e 20 74 79 70 65 2c  on, action type,
23e0: 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67   replacement/sug
23f0: 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 5b 2c  gestion/action[,
2400: 20 69 47 72 6f 75 70 5b 2c 20 6d 65 73 73 61 67   iGroup[, messag
2410: 65 2c 20 55 52 4c 5d 5d 20 5d 0a 20 20 20 20 20  e, URL]] ].     
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b             try {
2440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d       bCondMemo =
2470: 20 28 21 73 46 75 6e 63 43 6f 6e 64 20 7c 7c 20   (!sFuncCond || 
2480: 6f 45 76 61 6c 46 75 6e 63 5b 73 46 75 6e 63 43  oEvalFunc[sFuncC
2490: 6f 6e 64 5d 28 73 54 65 78 74 2c 20 73 54 65 78  ond](sText, sTex
24a0: 74 30 2c 20 6d 2c 20 64 44 41 2c 20 73 43 6f 75  t0, m, dDA, sCou
24b0: 6e 74 72 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 29  ntry, bCondMemo)
24c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 69 66 20 28 62 43 6f 6e 64         if (bCond
24f0: 4d 65 6d 6f 29 20 7b 0a 20 20 20 20 20 20 20 20  Memo) {.        
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 73 77 69 74 63 68 20 28 63 41 63 74 69 6f 6e 54  switch (cActionT
2530: 79 70 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ype) {.         
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 63 61 73 65 20 22 2d 22 3a 0a 20 20 20     case "-":.   
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
25a0: 67 72 61 6d 6d 61 72 20 65 72 72 6f 72 0a 20 20  grammar error.  
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
25e0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20  console.log("-> 
25f0: 65 72 72 6f 72 20 64 65 74 65 63 74 65 64 20 69  error detected i
2600: 6e 20 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20  n " + sLineId + 
2610: 22 5c 6e 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a  "\nzRegex: " + z
2620: 52 65 67 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20  Regex.source);. 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2660: 45 72 72 6f 72 53 74 61 72 74 20 3d 20 6e 4f 66  ErrorStart = nOf
2670: 66 73 65 74 20 2b 20 6d 2e 73 74 61 72 74 5b 65  fset + m.start[e
2680: 41 63 74 5b 30 5d 5d 3b 0a 20 20 20 20 20 20 20  Act[0]];.       
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 74 68           if (!th
26c0: 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28 6e 45  is.dError.has(nE
26d0: 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20 6e 50  rrorStart) || nP
26e0: 72 69 6f 72 69 74 79 20 3e 20 74 68 69 73 2e 64  riority > this.d
26f0: 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e 67 65  ErrorPriority.ge
2700: 74 28 6e 45 72 72 6f 72 53 74 61 72 74 29 29 20  t(nErrorStart)) 
2710: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 74 68 69 73 2e 64 45 72 72 6f        this.dErro
2750: 72 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61 72  r.set(nErrorStar
2760: 74 2c 20 74 68 69 73 2e 5f 63 72 65 61 74 65 45  t, this._createE
2770: 72 72 6f 72 46 72 6f 6d 52 65 67 65 78 28 73 54  rrorFromRegex(sT
2780: 65 78 74 2c 20 73 54 65 78 74 30 2c 20 73 57 68  ext, sText0, sWh
2790: 61 74 2c 20 6e 4f 66 66 73 65 74 2c 20 6d 2c 20  at, nOffset, m, 
27a0: 65 41 63 74 5b 30 5d 2c 20 73 4c 69 6e 65 49 64  eAct[0], sLineId
27b0: 2c 20 73 52 75 6c 65 49 64 2c 20 62 55 70 70 65  , sRuleId, bUppe
27c0: 72 63 61 73 65 2c 20 65 41 63 74 5b 31 5d 2c 20  rcase, eAct[1], 
27d0: 65 41 63 74 5b 32 5d 2c 20 62 49 64 52 75 6c 65  eAct[2], bIdRule
27e0: 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74  , sOption, bCont
27f0: 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ext));.         
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
2830: 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e 73  dErrorPriority.s
2840: 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20  et(nErrorStart, 
2850: 6e 50 72 69 6f 72 69 74 79 29 3b 0a 20 20 20 20  nPriority);.    
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
28c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 63 61 73 65 20 22 7e 22 3a 0a 20 20 20 20 20   case "~":.     
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 65             // te
2930: 78 74 20 70 72 6f 63 65 73 73 6f 72 0a 20 20 20  xt processor.   
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 63               //c
2970: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20 74  onsole.log("-> t
2980: 65 78 74 20 70 72 6f 63 65 73 73 6f 72 20 62 79  ext processor by
2990: 20 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22   " + sLineId + "
29a0: 5c 6e 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52  \nzRegex: " + zR
29b0: 65 67 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20  egex.source);.  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 54                sT
29f0: 65 78 74 20 3d 20 74 68 69 73 2e 72 65 77 72 69  ext = this.rewri
2a00: 74 65 54 65 78 74 28 73 54 65 78 74 2c 20 73 57  teText(sText, sW
2a10: 68 61 74 2c 20 65 41 63 74 5b 30 5d 2c 20 6d 2c  hat, eAct[0], m,
2a20: 20 62 55 70 70 65 72 63 61 73 65 29 3b 0a 20 20   bUppercase);.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 43                bC
2a60: 68 61 6e 67 65 20 3d 20 74 72 75 65 3b 0a 20 20  hange = true;.  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2aa0: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 7e 20 22  console.log("~ "
2af0: 20 2b 20 73 54 65 78 74 20 2b 20 22 20 20 2d 2d   + sText + "  --
2b00: 20 22 20 2b 20 6d 5b 65 41 63 74 5b 30 5d 5d 20   " + m[eAct[0]] 
2b10: 2b 20 22 20 20 23 20 22 20 2b 20 73 4c 69 6e 65  + "  # " + sLine
2b20: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Id);.           
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22            case "
2bc0: 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  =":.            
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 2f 2f 20 64 69 73 61 6d 62 69 67 75      // disambigu
2c00: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e        //console.
2c40: 6c 6f 67 28 22 2d 3e 20 64 69 73 61 6d 62 69 67  log("-> disambig
2c50: 75 61 74 69 6f 6e 20 62 79 20 22 20 2b 20 73 4c  uation by " + sL
2c60: 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65  ineId + "\nzRege
2c70: 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f  x: " + zRegex.so
2c80: 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  urce);.         
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 6f 45 76 61 6c 46 75 6e 63         oEvalFunc
2cc0: 5b 73 57 68 61 74 5d 28 73 54 65 78 74 2c 20 6d  [sWhat](sText, m
2cd0: 2c 20 64 44 41 29 3b 0a 20 20 20 20 20 20 20 20  , dDA);.        
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
2d10: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
2d50: 65 2e 6c 6f 67 28 22 3d 20 22 20 2b 20 6d 5b 30  e.log("= " + m[0
2d60: 5d 20 2b 20 22 20 20 23 20 22 20 2b 20 73 4c 69  ] + "  # " + sLi
2d70: 6e 65 49 64 20 2b 20 22 5c 6e 44 41 3a 20 22 20  neId + "\nDA: " 
2d80: 2b 20 64 44 41 2e 67 6c 5f 74 6f 53 74 72 69 6e  + dDA.gl_toStrin
2d90: 67 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  g());.          
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
2e30: 22 3e 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ">":.           
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 2f 2f 20 77 65 20 64 6f 20 6e 6f       // we do no
2e70: 74 68 69 6e 67 2c 20 74 68 69 73 20 74 65 73 74  thing, this test
2e80: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 64 69   is just a condi
2e90: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 61 6c  tion to apply al
2ea0: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 63 74 69  l following acti
2eb0: 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ons.            
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 23 20 65  console.log("# e
2f60: 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 61 63  rror: unknown ac
2f70: 74 69 6f 6e 20 61 74 20 22 20 2b 20 73 4c 69 6e  tion at " + sLin
2f80: 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eId);.          
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 69 66 20 28 63 41 63 74 69 6f 6e       if (cAction
3010: 54 79 70 65 20 3d 3d 20 22 3e 22 29 20 7b 0a 20  Type == ">") {. 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
3050: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a      catch (e) {.
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
3120: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
3150: 6c 6f 67 28 22 23 20 6c 69 6e 65 20 69 64 3a 20  log("# line id: 
3160: 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c  " + sLineId + "\
3170: 6e 23 20 72 75 6c 65 20 69 64 3a 20 22 20 2b 20  n# rule id: " + 
3180: 73 52 75 6c 65 49 64 29 3b 0a 20 20 20 20 20 20  sRuleId);.      
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
31b0: 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a  nsole.error(e);.
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3250: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3260: 20 20 69 66 20 28 62 43 68 61 6e 67 65 29 20 7b    if (bChange) {
3270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3280: 28 62 50 61 72 61 67 72 61 70 68 29 20 7b 0a 20  (bParagraph) {. 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
32a0: 68 69 73 2e 73 54 65 78 74 20 3d 20 73 54 65 78  his.sText = sTex
32b0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
32c0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
32d0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 53 65          this.sSe
32e0: 6e 74 65 6e 63 65 20 3d 20 73 54 65 78 74 0a 20  ntence = sText. 
32f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3300: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3310: 20 20 75 70 64 61 74 65 20 28 73 53 65 6e 74 65    update (sSente
3320: 6e 63 65 2c 20 62 44 65 62 75 67 3d 66 61 6c 73  nce, bDebug=fals
3330: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  e) {.        // 
3340: 75 70 64 61 74 65 20 3c 73 53 65 6e 74 65 6e 63  update <sSentenc
3350: 65 3e 20 61 6e 64 20 72 65 74 6f 6b 65 6e 69 7a  e> and retokeniz
3360: 65 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 73  e.        this.s
3370: 53 65 6e 74 65 6e 63 65 20 3d 20 73 53 65 6e 74  Sentence = sSent
3380: 65 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 6c 65  ence;.        le
3390: 74 20 6c 4e 65 77 54 6f 6b 65 6e 20 3d 20 41 72  t lNewToken = Ar
33a0: 72 61 79 2e 66 72 6f 6d 28 5f 6f 54 6f 6b 65 6e  ray.from(_oToken
33b0: 69 7a 65 72 2e 67 65 6e 54 6f 6b 65 6e 73 28 73  izer.genTokens(s
33c0: 53 65 6e 74 65 6e 63 65 2c 20 74 72 75 65 29 29  Sentence, true))
33d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c  ;.        for (l
33e0: 65 74 20 64 54 6f 6b 65 6e 20 6f 66 20 6c 4e 65  et dToken of lNe
33f0: 77 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20  wToken) {.      
3400: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64        if (this.d
3410: 54 6f 6b 65 6e 50 6f 73 2e 67 6c 5f 67 65 74 28  TokenPos.gl_get(
3420: 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d  dToken["nStart"]
3430: 2c 20 7b 7d 29 2e 68 61 73 28 22 6c 4d 6f 72 70  , {}).has("lMorp
3440: 68 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  h")) {.         
3450: 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c         dToken["l
3460: 4d 6f 72 70 68 22 5d 20 3d 20 74 68 69 73 2e 64  Morph"] = this.d
3470: 54 6f 6b 65 6e 50 6f 73 2e 67 6c 5f 67 65 74 28  TokenPos.gl_get(
3480: 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d  dToken["nStart"]
3490: 2c 20 7b 7d 29 2e 67 65 74 28 22 6c 4d 6f 72 70  , {}).get("lMorp
34a0: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  h");.           
34b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
34c0: 66 20 28 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f  f (this.dTokenPo
34d0: 73 2e 67 6c 5f 67 65 74 28 64 54 6f 6b 65 6e 5b  s.gl_get(dToken[
34e0: 22 6e 53 74 61 72 74 22 5d 2c 20 7b 7d 29 2e 68  "nStart"], {}).h
34f0: 61 73 28 22 74 61 67 73 22 29 29 20 7b 0a 20 20  as("tags")) {.  
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 54                dT
3510: 6f 6b 65 6e 5b 22 74 61 67 73 22 5d 20 3d 20 74  oken["tags"] = t
3520: 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 67 6c  his.dTokenPos.gl
3530: 5f 67 65 74 28 64 54 6f 6b 65 6e 5b 22 6e 53 74  _get(dToken["nSt
3540: 61 72 74 22 5d 2c 20 7b 7d 29 2e 67 65 74 28 22  art"], {}).get("
3550: 74 61 67 73 22 29 3b 0a 20 20 20 20 20 20 20 20  tags");.        
3560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3570: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f          this.lTo
3580: 6b 65 6e 20 3d 20 6c 4e 65 77 54 6f 6b 65 6e 3b  ken = lNewToken;
3590: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 54  .        this.dT
35a0: 6f 6b 65 6e 50 6f 73 2e 63 6c 65 61 72 28 29 3b  okenPos.clear();
35b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
35c0: 74 20 64 54 6f 6b 65 6e 20 6f 66 20 74 68 69 73  t dToken of this
35d0: 2e 6c 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20  .lToken) {.     
35e0: 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65         if (dToke
35f0: 6e 5b 22 73 54 79 70 65 22 5d 20 21 3d 20 22 49  n["sType"] != "I
3600: 4e 46 4f 22 29 20 7b 0a 20 20 20 20 20 20 20 20  NFO") {.        
3610: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 54 6f          this.dTo
3620: 6b 65 6e 50 6f 73 2e 73 65 74 28 64 54 6f 6b 65  kenPos.set(dToke
3630: 6e 5b 22 6e 53 74 61 72 74 22 5d 2c 20 64 54 6f  n["nStart"], dTo
3640: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
3650: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3660: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
3670: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3680: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 55 50 44  console.log("UPD
3690: 41 54 45 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  ATE:");.        
36a0: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
36b0: 74 68 69 73 2e 61 73 53 74 72 69 6e 67 28 29 29  this.asString())
36c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36d0: 7d 0a 0a 20 20 20 20 2a 20 5f 67 65 74 4e 65 78  }..    * _getNex
36e0: 74 50 6f 69 6e 74 65 72 73 20 28 73 65 6c 66 2c  tPointers (self,
36f0: 20 64 54 6f 6b 65 6e 2c 20 64 47 72 61 70 68 2c   dToken, dGraph,
3700: 20 64 50 6f 69 6e 74 65 72 2c 20 62 44 65 62 75   dPointer, bDebu
3710: 67 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 20  g=false) {.     
3720: 20 20 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a     // generator:
3730: 20 72 65 74 75 72 6e 20 6e 6f 64 65 73 20 77 68   return nodes wh
3740: 65 72 65 20 3c 64 54 6f 6b 65 6e 3e 20 e2 80 9c  ere <dToken> ...
3750: 76 61 6c 75 65 73 e2 80 9d 20 6d 61 74 63 68 20  values... match 
3760: 3c 64 4e 6f 64 65 3e 20 61 72 63 73 0a 20 20 20  <dNode> arcs.   
3770: 20 20 20 20 20 6c 65 74 20 64 4e 6f 64 65 20 3d       let dNode =
3780: 20 64 50 6f 69 6e 74 65 72 5b 22 64 4e 6f 64 65   dPointer["dNode
3790: 22 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  "];.        let 
37a0: 69 4e 6f 64 65 31 20 3d 20 64 50 6f 69 6e 74 65  iNode1 = dPointe
37b0: 72 5b 22 69 4e 6f 64 65 31 22 5d 3b 0a 20 20 20  r["iNode1"];.   
37c0: 20 20 20 20 20 6c 65 74 20 62 54 6f 6b 65 6e 46       let bTokenF
37d0: 6f 75 6e 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  ound = false;.  
37e0: 20 20 20 20 20 20 2f 2f 20 74 6f 6b 65 6e 20 76        // token v
37f0: 61 6c 75 65 0a 20 20 20 20 20 20 20 20 69 66 20  alue.        if 
3800: 28 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f  (dNode.hasOwnPro
3810: 70 65 72 74 79 28 64 54 6f 6b 65 6e 5b 22 73 56  perty(dToken["sV
3820: 61 6c 75 65 22 5d 29 29 20 7b 0a 20 20 20 20 20  alue"])) {.     
3830: 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75         if (bDebu
3840: 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g) {.           
3850: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
3860: 28 22 20 20 4d 41 54 43 48 3a 20 22 20 2b 20 64  ("  MATCH: " + d
3870: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29  Token["sValue"])
3880: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
3890: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
38a0: 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e  d { "iNode1": iN
38b0: 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64  ode1, "dNode": d
38c0: 47 72 61 70 68 5b 64 4e 6f 64 65 5b 64 54 6f 6b  Graph[dNode[dTok
38d0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 5d 5d 20 7d  en["sValue"]]] }
38e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 54  ;.            bT
38f0: 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65  okenFound = true
3900: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3910: 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22      if (dToken["
3920: 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28 30  sValue"].slice(0
3930: 2c 32 29 2e 67 6c 5f 69 73 54 69 74 6c 65 28 29  ,2).gl_isTitle()
3940: 29 20 7b 20 2f 2f 20 77 65 20 74 65 73 74 20 6f  ) { // we test o
3950: 6e 6c 79 20 32 20 66 69 72 73 74 20 63 68 61 72  nly 2 first char
3960: 73 2c 20 74 6f 20 6d 61 6b 65 20 76 61 6c 69 64  s, to make valid
3970: 20 77 6f 72 64 73 20 73 75 63 68 20 61 73 20 22   words such as "
3980: 4c 61 69 73 73 65 7a 2d 6c 65 73 22 2c 20 22 50  Laissez-les", "P
3990: 61 73 73 65 2d 70 61 72 74 6f 75 74 22 2e 0a 20  asse-partout".. 
39a0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73             let s
39b0: 56 61 6c 75 65 20 3d 20 64 54 6f 6b 65 6e 5b 22  Value = dToken["
39c0: 73 56 61 6c 75 65 22 5d 2e 74 6f 4c 6f 77 65 72  sValue"].toLower
39d0: 43 61 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20  Case();.        
39e0: 20 20 20 20 69 66 20 28 64 4e 6f 64 65 2e 68 61      if (dNode.ha
39f0: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73 56 61  sOwnProperty(sVa
3a00: 6c 75 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20  lue)) {.        
3a10: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
3a20: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
3a30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
3a40: 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20  e.log("  MATCH: 
3a50: 22 20 2b 20 73 56 61 6c 75 65 29 3b 0a 20 20 20  " + sValue);.   
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
3a80: 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a  ield { "iNode1":
3a90: 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22   iNode1, "dNode"
3aa0: 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 73  : dGraph[dNode[s
3ab0: 56 61 6c 75 65 5d 5d 20 7d 3b 0a 20 20 20 20 20  Value]] };.     
3ac0: 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65             bToke
3ad0: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
3ae0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
3b00: 6c 73 65 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22  lse if (dToken["
3b10: 73 56 61 6c 75 65 22 5d 2e 67 6c 5f 69 73 55 70  sValue"].gl_isUp
3b20: 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20  perCase()) {.   
3b30: 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 56 61           let sVa
3b40: 6c 75 65 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 56  lue = dToken["sV
3b50: 61 6c 75 65 22 5d 2e 74 6f 4c 6f 77 65 72 43 61  alue"].toLowerCa
3b60: 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  se();.          
3b70: 20 20 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f    if (dNode.hasO
3b80: 77 6e 50 72 6f 70 65 72 74 79 28 73 56 61 6c 75  wnProperty(sValu
3b90: 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e)) {.          
3ba0: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
3bb0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3bc0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
3bd0: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 22 20  log("  MATCH: " 
3be0: 2b 20 73 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  + sValue);.     
3bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
3c10: 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69  ld { "iNode1": i
3c20: 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20  Node1, "dNode": 
3c30: 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 73 56 61  dGraph[dNode[sVa
3c40: 6c 75 65 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20  lue]] };.       
3c50: 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46           bTokenF
3c60: 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20  ound = true;.   
3c70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3c80: 20 20 20 20 20 20 20 73 56 61 6c 75 65 20 3d 20         sValue = 
3c90: 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d  dToken["sValue"]
3ca0: 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65  .gl_toCapitalize
3cb0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
3cc0: 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77 6e  if (dNode.hasOwn
3cd0: 50 72 6f 70 65 72 74 79 28 73 56 61 6c 75 65 29  Property(sValue)
3ce0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3cf0: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
3d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3d10: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
3d20: 67 28 22 20 20 4d 41 54 43 48 3a 20 22 20 2b 20  g("  MATCH: " + 
3d30: 73 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  sValue);.       
3d40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3d50: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
3d60: 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f   { "iNode1": iNo
3d70: 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47  de1, "dNode": dG
3d80: 72 61 70 68 5b 64 4e 6f 64 65 5b 73 56 61 6c 75  raph[dNode[sValu
3d90: 65 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  e]] };.         
3da0: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75         bTokenFou
3db0: 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  nd = true;.     
3dc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3dd0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65   }.        // re
3de0: 67 65 78 20 76 61 6c 75 65 20 61 72 63 73 0a 20  gex value arcs. 
3df0: 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65         if (dToke
3e00: 6e 5b 22 73 54 79 70 65 22 5d 20 21 3d 20 22 49  n["sType"] != "I
3e10: 4e 46 4f 22 20 20 26 26 20 20 64 54 6f 6b 65 6e  NFO"  &&  dToken
3e20: 5b 22 73 54 79 70 65 22 5d 20 21 3d 20 22 50 55  ["sType"] != "PU
3e30: 4e 43 22 20 20 26 26 20 20 64 54 6f 6b 65 6e 5b  NC"  &&  dToken[
3e40: 22 73 54 79 70 65 22 5d 20 21 3d 20 22 53 49 47  "sType"] != "SIG
3e50: 4e 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  N") {.          
3e60: 20 20 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f    if (dNode.hasO
3e70: 77 6e 50 72 6f 70 65 72 74 79 28 22 3c 72 65 5f  wnProperty("<re_
3e80: 76 61 6c 75 65 3e 22 29 29 20 7b 0a 20 20 20 20  value>")) {.    
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
3ea0: 28 6c 65 74 20 73 52 65 67 65 78 20 69 6e 20 64  (let sRegex in d
3eb0: 4e 6f 64 65 5b 22 3c 72 65 5f 76 61 6c 75 65 3e  Node["<re_value>
3ec0: 22 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  "]) {.          
3ed0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
3ee0: 52 65 67 65 78 2e 69 6e 63 6c 75 64 65 73 28 22  Regex.includes("
3ef0: c2 ac 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ..")) {.        
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 2f 2f 20 6e 6f 20 61 6e 74 69 2d 70 61 74 74 65  // no anti-patte
3f20: 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rn.             
3f30: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
3f40: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e  Token["sValue"].
3f50: 73 65 61 72 63 68 28 73 52 65 67 65 78 29 20 21  search(sRegex) !
3f60: 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20  == -1) {.       
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
3f90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
3fc0: 20 20 4d 41 54 43 48 3a 20 7e 22 20 2b 20 73 52    MATCH: ~" + sR
3fd0: 65 67 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  egex);.         
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31   yield { "iNode1
4020: 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64  ": iNode1, "dNod
4030: 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65  e": dGraph[dNode
4040: 5b 22 3c 72 65 5f 76 61 6c 75 65 3e 22 5d 5b 73  ["<re_value>"][s
4050: 52 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20 20 20  Regex]] };.     
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75         bTokenFou
4080: 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  nd = true;.     
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
40b0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
40c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
40d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68 65            // the
40e0: 72 65 20 69 73 20 61 6e 20 61 6e 74 69 2d 70 61  re is an anti-pa
40f0: 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20  ttern.          
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
4110: 74 20 5b 73 50 61 74 74 65 72 6e 2c 20 73 4e 65  t [sPattern, sNe
4120: 67 50 61 74 74 65 72 6e 5d 20 3d 20 73 52 65 67  gPattern] = sReg
4130: 65 78 2e 73 70 6c 69 74 28 22 c2 ac 22 2c 20 31  ex.split("..", 1
4140: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4150: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
4160: 4e 65 67 50 61 74 74 65 72 6e 20 26 26 20 64 54  NegPattern && dT
4170: 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73  oken["sValue"].s
4180: 65 61 72 63 68 28 73 4e 65 67 50 61 74 74 65 72  earch(sNegPatter
4190: 6e 29 20 21 3d 3d 20 2d 31 29 20 7b 0a 20 20 20  n) !== -1) {.   
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
41c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
41d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 69 66 20 28 21 73 50 61 74 74 65       if (!sPatte
4200: 72 6e 20 7c 7c 20 64 54 6f 6b 65 6e 5b 22 73 56  rn || dToken["sV
4210: 61 6c 75 65 22 5d 2e 73 65 61 72 63 68 28 73 50  alue"].search(sP
4220: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 20  attern) !== -1) 
4230: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4250: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
4280: 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48  ole.log("  MATCH
4290: 3a 20 7e 22 20 2b 20 73 52 65 67 65 78 29 3b 0a  : ~" + sRegex);.
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
42e0: 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64  { "iNode1": iNod
42f0: 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47 72  e1, "dNode": dGr
4300: 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 72 65 5f 76  aph[dNode["<re_v
4310: 61 6c 75 65 3e 22 5d 5b 73 52 65 67 65 78 5d 5d  alue>"][sRegex]]
4320: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   };.            
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
4350: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
4360: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
43a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
43b0: 20 20 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 61        // analysa
43c0: 62 6c 65 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20  ble tokens.     
43d0: 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73     if (dToken["s
43e0: 54 79 70 65 22 5d 2e 73 6c 69 63 65 28 30 2c 34  Type"].slice(0,4
43f0: 29 20 3d 3d 20 22 57 4f 52 44 22 29 20 7b 0a 20  ) == "WORD") {. 
4400: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 6f             // to
4410: 6b 65 6e 20 6c 65 6d 6d 61 73 0a 20 20 20 20 20  ken lemmas.     
4420: 20 20 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65         if (dNode
4430: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
4440: 22 3c 6c 65 6d 6d 61 73 3e 22 29 29 20 7b 0a 20  "<lemmas>")) {. 
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
4460: 6f 72 20 28 6c 65 74 20 73 4c 65 6d 6d 61 20 6f  or (let sLemma o
4470: 66 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  f _oSpellChecker
4480: 2e 67 65 74 4c 65 6d 6d 61 28 64 54 6f 6b 65 6e  .getLemma(dToken
4490: 5b 22 73 56 61 6c 75 65 22 5d 29 29 20 7b 0a 20  ["sValue"])) {. 
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 20 69 66 20 28 64 4e 6f 64 65 5b 22 3c 6c     if (dNode["<l
44c0: 65 6d 6d 61 73 3e 22 5d 2e 68 61 73 4f 77 6e 50  emmas>"].hasOwnP
44d0: 72 6f 70 65 72 74 79 28 73 4c 65 6d 6d 61 29 29  roperty(sLemma))
44e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
44f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
4500: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
4530: 28 22 20 20 4d 41 54 43 48 3a 20 3e 22 20 2b 20  ("  MATCH: >" + 
4540: 73 4c 65 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20  sLemma);.       
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4570: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
4580: 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f   { "iNode1": iNo
4590: 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47  de1, "dNode": dG
45a0: 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 6c 65 6d  raph[dNode["<lem
45b0: 6d 61 73 3e 22 5d 5b 73 4c 65 6d 6d 61 5d 5d 20  mas>"][sLemma]] 
45c0: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  };.             
45d0: 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65             bToke
45e0: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4620: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4630: 20 2f 2f 20 72 65 67 65 78 20 6d 6f 72 70 68 20   // regex morph 
4640: 61 72 63 73 0a 20 20 20 20 20 20 20 20 20 20 20  arcs.           
4650: 20 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77   if (dNode.hasOw
4660: 6e 50 72 6f 70 65 72 74 79 28 22 3c 72 65 5f 6d  nProperty("<re_m
4670: 6f 72 70 68 3e 22 29 29 20 7b 0a 20 20 20 20 20  orph>")) {.     
4680: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
4690: 6c 65 74 20 73 52 65 67 65 78 20 69 6e 20 64 4e  let sRegex in dN
46a0: 6f 64 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22  ode["<re_morph>"
46b0: 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]) {.           
46c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 52           if (!sR
46d0: 65 67 65 78 2e 69 6e 63 6c 75 64 65 73 28 22 c2  egex.includes(".
46e0: ac 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  .")) {.         
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4700: 2f 20 6e 6f 20 61 6e 74 69 2d 70 61 74 74 65 72  / no anti-patter
4710: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
4720: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 4d            let lM
4730: 6f 72 70 68 20 3d 20 64 54 6f 6b 65 6e 2e 5f 67  orph = dToken._g
4740: 65 74 28 22 6c 4d 6f 72 70 68 22 2c 20 5f 6f 53  et("lMorph", _oS
4750: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d  pellChecker.getM
4760: 6f 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56 61  orph(dToken["sVa
4770: 6c 75 65 22 5d 29 29 3b 0a 20 20 20 20 20 20 20  lue"]));.       
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d 65   if (lMorph.some
47a0: 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d  (sMorph  =>  (sM
47b0: 6f 72 70 68 2e 73 65 61 72 63 68 28 73 52 65 67  orph.search(sReg
47c0: 65 78 29 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a  ex) !== -1))) {.
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
47f0: 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20  bDebug) {.      
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
4820: 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20  e.log("  MATCH: 
4830: 40 22 20 2b 20 73 52 65 67 65 78 29 3b 0a 20 20  @" + sRegex);.  
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20          yield { 
4880: 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31  "iNode1": iNode1
4890: 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47 72 61 70  , "dNode": dGrap
48a0: 68 5b 64 4e 6f 64 65 5b 22 3c 72 65 5f 6d 6f 72  h[dNode["<re_mor
48b0: 70 68 3e 22 5d 5b 73 52 65 67 65 78 5d 5d 20 7d  ph>"][sRegex]] }
48c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 54                bT
48e0: 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65  okenFound = true
48f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4900: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 2f 2f 20 74 68 65 72 65 20 69 73 20 61 6e 20   // there is an 
4950: 61 6e 74 69 2d 70 61 74 74 65 72 6e 0a 20 20 20  anti-pattern.   
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 6c 65 74 20 5b 73 50 61 74 74 65       let [sPatte
4980: 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 5d  rn, sNegPattern]
4990: 20 3d 20 73 52 65 67 65 78 2e 73 70 6c 69 74 28   = sRegex.split(
49a0: 22 c2 ac 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  "..", 1);.      
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65 72    if (sNegPatter
49d0: 6e 20 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20  n == "*") {.    
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49f0: 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 6c 20 6d          // all m
4a00: 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6d 75 73 74  orphologies must
4a10: 20 6d 61 74 63 68 20 77 69 74 68 20 3c 73 50 61   match with <sPa
4a20: 74 74 65 72 6e 3e 0a 20 20 20 20 20 20 20 20 20  ttern>.         
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 20 20 20 69 66 20 28 73 50 61 74 74 65 72 6e 29     if (sPattern)
4a50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20     let lMorph = 
4a80: 64 54 6f 6b 65 6e 2e 67 6c 5f 67 65 74 28 22 6c  dToken.gl_get("l
4a90: 4d 6f 72 70 68 22 2c 20 5f 6f 53 70 65 6c 6c 43  Morph", _oSpellC
4aa0: 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28  hecker.getMorph(
4ab0: 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d  dToken["sValue"]
4ac0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c      if (lMorph.l
4af0: 65 6e 67 74 68 20 3e 20 30 20 20 26 26 20 20 6c  ength > 0  &&  l
4b00: 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d 6f 72  Morph.every(sMor
4b10: 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e  ph  =>  (sMorph.
4b20: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
4b30: 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20   !== -1))) {.   
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
4ba0: 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 40 22 20  og("  MATCH: @" 
4bb0: 2b 20 73 52 65 67 65 78 29 3b 0a 20 20 20 20 20  + sRegex);.     
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69 4e       yield { "iN
4c10: 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22  ode1": iNode1, "
4c20: 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68 5b 64  dNode": dGraph[d
4c30: 4e 6f 64 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e  Node["<re_morph>
4c40: 22 5d 5b 73 52 65 67 65 78 5d 5d 20 7d 3b 0a 20  "][sRegex]] };. 
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d     bTokenFound =
4c80: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4ce0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d      let lMorph =
4d10: 20 64 54 6f 6b 65 6e 2e 67 6c 5f 67 65 74 28 22   dToken.gl_get("
4d20: 6c 4d 6f 72 70 68 22 2c 20 5f 6f 53 70 65 6c 6c  lMorph", _oSpell
4d30: 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68  Checker.getMorph
4d40: 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  (dToken["sValue"
4d50: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ]));.           
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e   if (sNegPattern
4d80: 20 20 26 26 20 20 6c 4d 6f 72 70 68 2e 73 6f 6d    &&  lMorph.som
4d90: 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73  e(sMorph  =>  (s
4da0: 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65  Morph.search(sNe
4db0: 67 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  gPattern) !== -1
4dc0: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ))) {.          
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
4e30: 50 61 74 74 65 72 6e 20 20 7c 7c 20 20 6c 4d 6f  Pattern  ||  lMo
4e40: 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20  rph.some(sMorph 
4e50: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
4e60: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
4e70: 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20  = -1))) {.      
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
4ea0: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
4ed0: 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48  ole.log("  MATCH
4ee0: 3a 20 40 22 20 2b 20 73 52 65 67 65 78 29 3b 0a  : @" + sRegex);.
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65    yield { "iNode
4f40: 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f  1": iNode1, "dNo
4f50: 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64  de": dGraph[dNod
4f60: 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22 5d 5b  e["<re_morph>"][
4f70: 73 52 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20 20  sRegex]] };.    
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b              bTok
4fa0: 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a  enFound = true;.
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5010: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5030: 2f 2f 20 74 6f 6b 65 6e 20 74 61 67 73 0a 20 20  // token tags.  
5040: 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e        if (dToken
5050: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
5060: 22 74 61 67 73 22 29 20 26 26 20 64 4e 6f 64 65  "tags") && dNode
5070: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
5080: 22 3c 74 61 67 73 3e 22 29 29 20 7b 0a 20 20 20  "<tags>")) {.   
5090: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
50a0: 74 20 73 54 61 67 20 69 6e 20 64 54 6f 6b 65 6e  t sTag in dToken
50b0: 5b 22 74 61 67 73 22 5d 29 20 7b 0a 20 20 20 20  ["tags"]) {.    
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
50d0: 64 4e 6f 64 65 5b 22 3c 74 61 67 73 3e 22 5d 2e  dNode["<tags>"].
50e0: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73  hasOwnProperty(s
50f0: 54 61 67 29 29 20 7b 0a 20 20 20 20 20 20 20 20  Tag)) {.        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5110: 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20  bDebug) {.      
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
5140: 20 4d 41 54 43 48 3a 20 2f 22 20 2b 20 73 54 61   MATCH: /" + sTa
5150: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
5160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69                yi
5180: 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20  eld { "iNode1": 
5190: 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a  iNode1, "dNode":
51a0: 20 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c   dGraph[dNode["<
51b0: 74 61 67 73 3e 22 5d 5b 73 54 61 67 5d 5d 20 7d  tags>"][sTag]] }
51c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
51d0: 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e        bTokenFoun
51e0: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
51f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5210: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20 6d    }.        // m
5220: 65 74 61 20 61 72 63 20 28 66 6f 72 20 74 6f 6b  eta arc (for tok
5230: 65 6e 20 74 79 70 65 29 0a 20 20 20 20 20 20 20  en type).       
5240: 20 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77   if (dNode.hasOw
5250: 6e 50 72 6f 70 65 72 74 79 28 22 3c 6d 65 74 61  nProperty("<meta
5260: 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  >")) {.         
5270: 20 20 20 66 6f 72 20 28 6c 65 74 20 73 4d 65 74     for (let sMet
5280: 61 20 69 6e 20 64 4e 6f 64 65 5b 22 3c 6d 65 74  a in dNode["<met
5290: 61 3e 22 5d 29 20 7b 0a 20 20 20 20 20 20 20 20  a>"]) {.        
52a0: 20 20 20 20 20 20 20 20 2f 2f 20 6e 6f 20 72 65          // no re
52b0: 67 65 78 20 68 65 72 65 2c 20 77 65 20 6a 75 73  gex here, we jus
52c0: 74 20 73 65 61 72 63 68 20 69 66 20 3c 64 4e 6f  t search if <dNo
52d0: 64 65 5b 22 73 54 79 70 65 22 5d 3e 20 65 78 69  de["sType"]> exi
52e0: 73 74 73 20 77 69 74 68 69 6e 20 3c 73 4d 65 74  sts within <sMet
52f0: 61 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a>.             
5300: 20 20 20 69 66 20 28 73 4d 65 74 61 20 3d 3d 20     if (sMeta == 
5310: 22 2a 22 20 7c 7c 20 64 54 6f 6b 65 6e 5b 22 73  "*" || dToken["s
5320: 54 79 70 65 22 5d 20 3d 3d 20 73 4d 65 74 61 29  Type"] == sMeta)
5330: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5340: 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75         if (bDebu
5350: 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g) {.           
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
5370: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43  sole.log("  MATC
5380: 48 3a 20 2a 22 20 2b 20 73 4d 65 74 61 29 3b 0a  H: *" + sMeta);.
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
53b0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
53c0: 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64  { "iNode1": iNod
53d0: 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47 72  e1, "dNode": dGr
53e0: 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 6d 65 74 61  aph[dNode["<meta
53f0: 3e 22 5d 5b 73 4d 65 74 61 5d 5d 20 7d 3b 0a 20  >"][sMeta]] };. 
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d     bTokenFound =
5420: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
5430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5440: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
5450: 20 28 73 4d 65 74 61 2e 69 6e 63 6c 75 64 65 73   (sMeta.includes
5460: 28 22 c2 ac 22 29 29 20 7b 0a 20 20 20 20 20 20  ("..")) {.      
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5480: 20 28 21 73 4d 65 74 61 2e 69 6e 63 6c 75 64 65   (!sMeta.include
5490: 73 28 64 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22  s(dToken["sType"
54a0: 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ])) {.          
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
54c0: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
54f0: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 2a 22  log("  MATCH: *"
5500: 20 2b 20 73 4d 65 74 61 29 3b 0a 20 20 20 20 20   + sMeta);.     
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
5540: 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69  ld { "iNode1": i
5550: 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20  Node1, "dNode": 
5560: 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 6d  dGraph[dNode["<m
5570: 65 74 61 3e 22 5d 5b 73 4d 65 74 61 5d 5d 20 7d  eta>"][sMeta]] }
5580: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5590: 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e            bToken
55a0: 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20  Found = true;.  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
55d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
55e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
55f0: 20 20 20 20 20 20 69 66 20 28 21 62 54 6f 6b 65        if (!bToke
5600: 6e 46 6f 75 6e 64 20 20 26 26 20 20 64 50 6f 69  nFound  &&  dPoi
5610: 6e 74 65 72 2e 68 61 73 4f 77 6e 50 72 6f 70 65  nter.hasOwnPrope
5620: 72 74 79 28 22 62 4b 65 65 70 22 29 29 20 7b 0a  rty("bKeep")) {.
5630: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
5640: 64 20 64 50 6f 69 6e 74 65 72 3b 0a 20 20 20 20  d dPointer;.    
5650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f      }.        //
5660: 20 4a 55 4d 50 0a 20 20 20 20 20 20 20 20 2f 2f   JUMP.        //
5670: 20 57 61 72 6e 69 6e 67 21 20 52 65 63 75 72 73   Warning! Recurs
5680: 73 69 6f 6e 21 0a 20 20 20 20 20 20 20 20 69 66  sion!.        if
5690: 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72   (dNode.hasOwnPr
56a0: 6f 70 65 72 74 79 73 28 22 3c 3e 22 29 29 20 7b  opertys("<>")) {
56b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
56c0: 20 64 50 6f 69 6e 74 65 72 32 20 3d 20 7b 20 22   dPointer2 = { "
56d0: 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c  iNode1": iNode1,
56e0: 20 22 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68   "dNode": dGraph
56f0: 5b 64 4e 6f 64 65 5b 22 3c 3e 22 5d 5d 2c 20 22  [dNode["<>"]], "
5700: 62 4b 65 65 70 22 3a 20 54 72 75 65 20 7d 3b 0a  bKeep": True };.
5710: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
5720: 64 2a 20 74 68 69 73 2e 5f 67 65 74 4e 65 78 74  d* this._getNext
5730: 50 6f 69 6e 74 65 72 73 28 64 54 6f 6b 65 6e 2c  Pointers(dToken,
5740: 20 64 47 72 61 70 68 2c 20 64 50 6f 69 6e 74 65   dGraph, dPointe
5750: 72 32 2c 20 62 44 65 62 75 67 29 3b 0a 20 20 20  r2, bDebug);.   
5760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
5770: 20 20 70 61 72 73 65 47 72 61 70 68 20 28 64 47    parseGraph (dG
5780: 72 61 70 68 2c 20 73 43 6f 75 6e 74 72 79 3d 22  raph, sCountry="
5790: 24 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75 6c  ${country_defaul
57a0: 74 7d 22 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75  t}", dOptions=nu
57b0: 6c 6c 2c 20 62 53 68 6f 77 52 75 6c 65 49 64 3d  ll, bShowRuleId=
57c0: 66 61 6c 73 65 2c 20 62 44 65 62 75 67 3d 66 61  false, bDebug=fa
57d0: 6c 73 65 2c 20 62 43 6f 6e 74 65 78 74 3d 66 61  lse, bContext=fa
57e0: 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  lse) {.        /
57f0: 2f 20 70 61 72 73 65 20 67 72 61 70 68 20 77 69  / parse graph wi
5800: 74 68 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 20 74  th tokens from t
5810: 68 65 20 74 65 78 74 20 61 6e 64 20 65 78 65 63  he text and exec
5820: 75 74 65 20 61 63 74 69 6f 6e 73 20 65 6e 63 6f  ute actions enco
5830: 75 6e 74 65 72 65 64 0a 20 20 20 20 20 20 20 20  untered.        
5840: 6c 65 74 20 6c 50 6f 69 6e 74 65 72 20 3d 20 5b  let lPointer = [
5850: 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62  ];.        let b
5860: 54 61 67 41 6e 64 52 65 77 72 69 74 65 20 3d 20  TagAndRewrite = 
5870: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 66  false;.        f
5880: 6f 72 20 28 6c 65 74 20 5b 69 54 6f 6b 65 6e 2c  or (let [iToken,
5890: 20 64 54 6f 6b 65 6e 5d 20 69 6e 20 74 68 69 73   dToken] in this
58a0: 2e 6c 54 6f 6b 65 6e 2e 65 6e 74 72 69 65 73 28  .lToken.entries(
58b0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
58c0: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
58e0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 54 4f 4b 45  onsole.log("TOKE
58f0: 4e 3a 20 22 20 2b 20 64 54 6f 6b 65 6e 5b 22 73  N: " + dToken["s
5900: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20  Value"]);.      
5910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5920: 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 61 72 63      // check arc
5930: 73 20 66 6f 72 20 65 61 63 68 20 65 78 69 73 74  s for each exist
5940: 69 6e 67 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  ing pointer.    
5950: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 4e 65 78          let lNex
5960: 74 50 6f 69 6e 74 65 72 20 3d 20 5b 5d 3b 0a 20  tPointer = [];. 
5970: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
5980: 6c 65 74 20 64 50 6f 69 6e 74 65 72 20 6f 66 20  let dPointer of 
5990: 6c 50 6f 69 6e 74 65 72 29 20 7b 0a 20 20 20 20  lPointer) {.    
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65 78              lNex
59b0: 74 50 6f 69 6e 74 65 72 2e 70 75 73 68 28 2e 2e  tPointer.push(..
59c0: 2e 74 68 69 73 2e 5f 67 65 74 4e 65 78 74 50 6f  .this._getNextPo
59d0: 69 6e 74 65 72 73 28 64 54 6f 6b 65 6e 2c 20 64  inters(dToken, d
59e0: 47 72 61 70 68 2c 20 64 50 6f 69 6e 74 65 72 2c  Graph, dPointer,
59f0: 20 62 44 65 62 75 67 29 29 3b 0a 20 20 20 20 20   bDebug));.     
5a00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5a10: 20 20 20 20 20 6c 50 6f 69 6e 74 65 72 20 3d 20       lPointer = 
5a20: 6c 4e 65 78 74 50 6f 69 6e 74 65 72 3b 0a 20 20  lNextPointer;.  
5a30: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 68 65            // che
5a40: 63 6b 20 61 72 63 73 20 6f 66 20 66 69 72 73 74  ck arcs of first
5a50: 20 6e 6f 64 65 73 0a 20 20 20 20 20 20 20 20 20   nodes.         
5a60: 20 20 20 6c 50 6f 69 6e 74 65 72 2e 70 75 73 68     lPointer.push
5a70: 28 2e 2e 2e 74 68 69 73 2e 5f 67 65 74 4e 65 78  (...this._getNex
5a80: 74 50 6f 69 6e 74 65 72 73 28 64 54 6f 6b 65 6e  tPointers(dToken
5a90: 2c 20 64 47 72 61 70 68 2c 20 7b 20 22 69 4e 6f  , dGraph, { "iNo
5aa0: 64 65 31 22 3a 20 69 54 6f 6b 65 6e 2c 20 22 64  de1": iToken, "d
5ab0: 4e 6f 64 65 22 3a 20 64 47 72 61 70 68 5b 30 5d  Node": dGraph[0]
5ac0: 20 7d 2c 20 62 44 65 62 75 67 29 29 3b 0a 20 20   }, bDebug));.  
5ad0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 68 65            // che
5ae0: 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 72  ck if there is r
5af0: 75 6c 65 73 20 74 6f 20 63 68 65 63 6b 20 66 6f  ules to check fo
5b00: 72 20 65 61 63 68 20 70 6f 69 6e 74 65 72 0a 20  r each pointer. 
5b10: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
5b20: 6c 65 74 20 64 50 6f 69 6e 74 65 72 20 6f 66 20  let dPointer of 
5b30: 6c 50 6f 69 6e 74 65 72 29 20 7b 0a 20 20 20 20  lPointer) {.    
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 69 66              //if
5b50: 20 62 44 65 62 75 67 3a 0a 20 20 20 20 20 20 20   bDebug:.       
5b60: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 63           //    c
5b70: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 2b 22 2c 20  onsole.log("+", 
5b80: 64 50 6f 69 6e 74 65 72 29 3b 0a 20 20 20 20 20  dPointer);.     
5b90: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
5ba0: 50 6f 69 6e 74 65 72 5b 22 64 4e 6f 64 65 22 5d  Pointer["dNode"]
5bb0: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
5bc0: 22 3c 72 75 6c 65 73 3e 22 29 29 20 7b 0a 20 20  "<rules>")) {.  
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 6c 65 74 20 62 43 68 61 6e 67 65 20 3d 20    let bChange = 
5bf0: 74 68 69 73 2e 5f 65 78 65 63 75 74 65 41 63 74  this._executeAct
5c00: 69 6f 6e 73 28 64 47 72 61 70 68 2c 20 64 50 6f  ions(dGraph, dPo
5c10: 69 6e 74 65 72 5b 22 64 4e 6f 64 65 22 5d 5b 22  inter["dNode"]["
5c20: 3c 72 75 6c 65 73 3e 22 5d 2c 20 64 50 6f 69 6e  <rules>"], dPoin
5c30: 74 65 72 5b 22 69 4e 6f 64 65 31 22 5d 2d 31 2c  ter["iNode1"]-1,
5c40: 20 69 54 6f 6b 65 6e 2c 20 64 4f 70 74 2c 20 73   iToken, dOpt, s
5c50: 43 6f 75 6e 74 72 79 2c 20 62 53 68 6f 77 52 75  Country, bShowRu
5c60: 6c 65 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43  leId, bDebug, bC
5c70: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5c90: 28 62 43 68 61 6e 67 65 29 20 7b 0a 20 20 20 20  (bChange) {.    
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 20 20 62 54 61 67 41 6e 64 52 65 77 72 69      bTagAndRewri
5cc0: 74 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  te = true;.     
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5cf0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
5d00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5d10: 20 20 20 69 66 20 28 62 54 61 67 41 6e 64 52 65     if (bTagAndRe
5d20: 77 72 69 74 65 29 20 7b 0a 20 20 20 20 20 20 20  write) {.       
5d30: 20 20 20 20 20 74 68 69 73 2e 72 65 77 72 69 74       this.rewrit
5d40: 65 46 72 6f 6d 54 61 67 73 28 62 44 65 62 75 67  eFromTags(bDebug
5d50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5d60: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
5d70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
5d80: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 74 68 69 73 29  onsole.log(this)
5d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5da0: 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e      return this.
5db0: 73 53 65 6e 74 65 6e 63 65 3b 0a 20 20 20 20 7d  sSentence;.    }
5dc0: 0a 0a 20 20 20 20 5f 65 78 65 63 75 74 65 41 63  ..    _executeAc
5dd0: 74 69 6f 6e 73 20 28 64 47 72 61 70 68 2c 20 64  tions (dGraph, d
5de0: 4e 6f 64 65 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73  Node, nTokenOffs
5df0: 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20  et, nLastToken, 
5e00: 64 4f 70 74 69 6f 6e 73 2c 20 73 43 6f 75 6e 74  dOptions, sCount
5e10: 72 79 2c 20 62 53 68 6f 77 52 75 6c 65 49 64 2c  ry, bShowRuleId,
5e20: 20 62 44 65 62 75 67 2c 20 62 43 6f 6e 74 65 78   bDebug, bContex
5e30: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  t) {.        // 
5e40: 65 78 65 63 75 74 65 20 61 63 74 69 6f 6e 73 20  execute actions 
5e50: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 44 41 52  found in the DAR
5e60: 47 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62 43  G.        let bC
5e70: 68 61 6e 67 65 20 3d 20 66 61 6c 73 65 3b 0a 20  hange = false;. 
5e80: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
5e90: 5b 73 4c 69 6e 65 49 64 2c 20 6e 65 78 74 4e 6f  [sLineId, nextNo
5ea0: 64 65 4b 65 79 5d 20 6f 66 20 4f 62 6a 65 63 74  deKey] of Object
5eb0: 2e 65 6e 74 72 69 65 73 28 64 4e 6f 64 65 29 29  .entries(dNode))
5ec0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
5ed0: 65 74 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e  et bCondMemo = n
5ee0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
5ef0: 20 66 6f 72 20 28 6c 65 74 20 73 52 75 6c 65 49   for (let sRuleI
5f00: 64 20 69 6e 20 64 47 72 61 70 68 5b 6e 65 78 74  d in dGraph[next
5f10: 4e 6f 64 65 4b 65 79 5d 29 20 7b 0a 20 20 20 20  NodeKey]) {.    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
5f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5f40: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
5f50: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
5f70: 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 3e 54 52 59  ole.log("   >TRY
5f80: 3a 20 22 20 2b 20 73 52 75 6c 65 49 64 29 3b 0a  : " + sRuleId);.
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5fb0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5b 73            let [s
5fc0: 4f 70 74 69 6f 6e 2c 20 73 46 75 6e 63 43 6f 6e  Option, sFuncCon
5fd0: 64 2c 20 63 41 63 74 69 6f 6e 54 79 70 65 2c 20  d, cActionType, 
5fe0: 73 57 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d 20  sWhat, ...eAct] 
5ff0: 3d 20 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68  = gc_rules_graph
6000: 2e 64 52 75 6c 65 5b 73 52 75 6c 65 49 64 5d 3b  .dRule[sRuleId];
6010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6020: 20 20 20 20 20 2f 2f 20 53 75 67 67 65 73 74 69       // Suggesti
6030: 6f 6e 20 20 20 20 5b 20 6f 70 74 69 6f 6e 2c 20  on    [ option, 
6040: 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 2d 22 2c 20  condition, "-", 
6050: 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67 67  replacement/sugg
6060: 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 2c 20 69  estion/action, i
6070: 54 6f 6b 65 6e 53 74 61 72 74 2c 20 69 54 6f 6b  TokenStart, iTok
6080: 65 6e 45 6e 64 2c 20 63 53 74 61 72 74 4c 69 6d  enEnd, cStartLim
6090: 69 74 2c 20 63 45 6e 64 4c 69 6d 69 74 2c 20 62  it, cEndLimit, b
60a0: 43 61 73 65 53 76 74 79 2c 20 6e 50 72 69 6f 72  CaseSvty, nPrior
60b0: 69 74 79 2c 20 73 4d 65 73 73 61 67 65 2c 20 73  ity, sMessage, s
60c0: 55 52 4c 20 5d 0a 20 20 20 20 20 20 20 20 20 20  URL ].          
60d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 65 78            // Tex
60e0: 74 50 72 6f 63 65 73 73 6f 72 20 5b 20 6f 70 74  tProcessor [ opt
60f0: 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20  ion, condition, 
6100: 22 7e 22 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74  "~", replacement
6110: 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69  /suggestion/acti
6120: 6f 6e 2c 20 69 54 6f 6b 65 6e 53 74 61 72 74 2c  on, iTokenStart,
6130: 20 69 54 6f 6b 65 6e 45 6e 64 2c 20 62 43 61 73   iTokenEnd, bCas
6140: 65 53 76 74 79 20 5d 0a 20 20 20 20 20 20 20 20  eSvty ].        
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 44              // D
6160: 69 73 61 6d 62 69 67 75 61 74 6f 72 20 5b 20 6f  isambiguator [ o
6170: 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e  ption, condition
6180: 2c 20 22 3d 22 2c 20 72 65 70 6c 61 63 65 6d 65  , "=", replaceme
6190: 6e 74 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61 63  nt/suggestion/ac
61a0: 74 69 6f 6e 20 5d 0a 20 20 20 20 20 20 20 20 20  tion ].         
61b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 61             // Ta
61c0: 67 20 20 20 20 20 20 20 20 20 20 20 5b 20 6f 70  g           [ op
61d0: 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c  tion, condition,
61e0: 20 22 2f 22 2c 20 72 65 70 6c 61 63 65 6d 65 6e   "/", replacemen
61f0: 74 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61 63 74  t/suggestion/act
6200: 69 6f 6e 2c 20 69 54 6f 6b 65 6e 53 74 61 72 74  ion, iTokenStart
6210: 2c 20 69 54 6f 6b 65 6e 45 6e 64 20 5d 0a 20 20  , iTokenEnd ].  
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 2f 2f 20 49 6d 6d 75 6e 69 74 79 20 20 20    // Immunity   
6240: 20 20 20 5b 20 6f 70 74 69 6f 6e 2c 20 63 6f 6e     [ option, con
6250: 64 69 74 69 6f 6e 2c 20 22 25 22 2c 20 22 22 2c  dition, "%", "",
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 20 20 20 20 20 20 20 20 20 20 69 54 6f 6b              iTok
6280: 65 6e 53 74 61 72 74 2c 20 69 54 6f 6b 65 6e 45  enStart, iTokenE
6290: 6e 64 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20  nd ].           
62a0: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 65 73 74           // Test
62b0: 20 20 20 20 20 20 20 20 20 20 5b 20 6f 70 74 69            [ opti
62c0: 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 22  on, condition, "
62d0: 3e 22 2c 20 22 22 20 5d 0a 20 20 20 20 20 20 20  >", "" ].       
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
62f0: 28 21 73 4f 70 74 69 6f 6e 20 7c 7c 20 64 4f 70  (!sOption || dOp
6300: 74 69 6f 6e 73 2e 67 6c 5f 67 65 74 28 73 4f 70  tions.gl_get(sOp
6310: 74 69 6f 6e 2c 20 66 61 6c 73 65 29 29 20 7b 0a  tion, false)) {.
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 20 20 20 20 20 62 43 6f 6e 64 4d 65 6d          bCondMem
6340: 6f 20 3d 20 21 73 46 75 6e 63 43 6f 6e 64 20 7c  o = !sFuncCond |
6350: 7c 20 6f 45 76 61 6c 46 75 6e 63 5b 73 46 75 6e  | oEvalFunc[sFun
6360: 63 43 6f 6e 64 5d 28 74 68 69 73 2e 6c 54 6f 6b  cCond](this.lTok
6370: 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  en, nTokenOffset
6380: 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 73 43  , nLastToken, sC
6390: 6f 75 6e 74 72 79 2c 20 62 43 6f 6e 64 4d 65 6d  ountry, bCondMem
63a0: 6f 2c 20 74 68 69 73 2e 64 54 61 67 73 2c 20 74  o, this.dTags, t
63b0: 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 2c 20 74  his.sSentence, t
63c0: 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 30 29 3b  his.sSentence0);
63d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
63e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 43 6f           if (bCo
63f0: 6e 64 4d 65 6d 6f 29 20 7b 0a 20 20 20 20 20 20  ndMemo) {.      
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 20 20 20 20 69 66 20 28 63 41 63 74 69 6f        if (cActio
6420: 6e 54 79 70 65 20 3d 3d 20 22 2d 22 29 20 7b 0a  nType == "-") {.
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 2f 2f 20 67 72 61 6d 6d 61 72 20 65 72 72 6f 72  // grammar error
6460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 6c 65 74 20 5b 69 54 6f 6b 65 6e 53 74 61 72   let [iTokenStar
6490: 74 2c 20 69 54 6f 6b 65 6e 45 6e 64 2c 20 63 53  t, iTokenEnd, cS
64a0: 74 61 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64 4c  tartLimit, cEndL
64b0: 69 6d 69 74 2c 20 62 43 61 73 65 53 76 74 79 2c  imit, bCaseSvty,
64c0: 20 6e 50 72 69 6f 72 69 74 79 2c 20 73 4d 65 73   nPriority, sMes
64d0: 73 61 67 65 2c 20 73 55 52 4c 5d 20 3d 20 65 41  sage, sURL] = eA
64e0: 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct;.            
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 72      let nTokenEr
6510: 72 6f 72 53 74 61 72 74 20 3d 20 28 69 54 6f 6b  rorStart = (iTok
6520: 65 6e 53 74 61 72 74 20 3e 20 30 29 20 3f 20 6e  enStart > 0) ? n
6530: 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 69 54  TokenOffset + iT
6540: 6f 6b 65 6e 53 74 61 72 74 20 3a 20 6e 4c 61 73  okenStart : nLas
6550: 74 54 6f 6b 65 6e 20 2b 20 69 54 6f 6b 65 6e 53  tToken + iTokenS
6560: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tart;.          
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 6c        if (this.l
6590: 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f  Token[nTokenErro
65a0: 72 53 74 61 72 74 5d 2e 68 61 73 4f 77 6e 50 72  rStart].hasOwnPr
65b0: 6f 70 65 72 74 79 28 22 62 49 6d 6d 75 6e 65 22  operty("bImmune"
65c0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 54 6f           let nTo
65f0: 6b 65 6e 45 72 72 6f 72 45 6e 64 20 3d 20 28 69  kenErrorEnd = (i
6600: 54 6f 6b 65 6e 45 6e 64 20 3e 20 30 29 20 3f 20  TokenEnd > 0) ? 
6610: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 69  nTokenOffset + i
6620: 54 6f 6b 65 6e 45 6e 64 20 3a 20 6e 4c 61 73 74  TokenEnd : nLast
6630: 54 6f 6b 65 6e 20 2b 20 69 54 6f 6b 65 6e 45 6e  Token + iTokenEn
6640: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f         let nErro
6670: 72 53 74 61 72 74 20 3d 20 74 68 69 73 2e 6e 4f  rStart = this.nO
6680: 66 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67  ffsetWithinParag
6690: 72 61 70 68 20 2b 20 28 28 63 53 74 61 72 74 4c  raph + ((cStartL
66a0: 69 6d 69 74 20 3d 3d 20 22 3c 22 29 20 3f 20 74  imit == "<") ? t
66b0: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  his.lToken[nToke
66c0: 6e 45 72 72 6f 72 53 74 61 72 74 5d 5b 22 6e 53  nErrorStart]["nS
66d0: 74 61 72 74 22 5d 20 3a 20 74 68 69 73 2e 6c 54  tart"] : this.lT
66e0: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72  oken[nTokenError
66f0: 53 74 61 72 74 5d 5b 22 6e 45 6e 64 22 5d 29 3b  Start]["nEnd"]);
6700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72 45       let nErrorE
6730: 6e 64 20 3d 20 74 68 69 73 2e 6e 4f 66 66 73 65  nd = this.nOffse
6740: 74 57 69 74 68 69 6e 50 61 72 61 67 72 61 70 68  tWithinParagraph
6750: 20 2b 20 28 28 63 45 6e 64 4c 69 6d 69 74 20 3d   + ((cEndLimit =
6760: 3d 20 22 3e 22 29 20 3f 20 74 68 69 73 2e 6c 54  = ">") ? this.lT
6770: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72  oken[nTokenError
6780: 45 6e 64 5d 5b 22 6e 45 6e 64 22 5d 20 3a 20 74  End]["nEnd"] : t
6790: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  his.lToken[nToke
67a0: 6e 45 72 72 6f 72 45 6e 64 5d 5b 22 6e 53 74 61  nErrorEnd]["nSta
67b0: 72 74 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rt"]);.         
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74             if (t
67e0: 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28 6e  his.dError.has(n
67f0: 45 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20 6e  ErrorStart) || n
6800: 50 72 69 6f 72 69 74 79 20 3e 20 74 68 69 73 2e  Priority > this.
6810: 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e 67  dErrorPriority.g
6820: 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20  et(nErrorStart, 
6830: 2d 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  -1)) {.         
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6860: 68 69 73 2e 64 45 72 72 6f 72 5b 6e 45 72 72 6f  his.dError[nErro
6870: 72 53 74 61 72 74 5d 20 3d 20 74 68 69 73 2e 5f  rStart] = this._
6880: 63 72 65 61 74 65 45 72 72 6f 72 46 72 6f 6d 54  createErrorFromT
6890: 6f 6b 65 6e 73 28 73 57 68 61 74 2c 20 6e 54 6f  okens(sWhat, nTo
68a0: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
68b0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 45 72 72  Token, nTokenErr
68c0: 6f 72 53 74 61 72 74 2c 20 6e 45 72 72 6f 72 53  orStart, nErrorS
68d0: 74 61 72 74 2c 20 6e 45 72 72 6f 72 45 6e 64 2c  tart, nErrorEnd,
68e0: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
68f0: 64 2c 20 62 43 61 73 65 53 76 74 79 2c 20 73 4d  d, bCaseSvty, sM
6900: 65 73 73 61 67 65 2c 20 73 55 52 4c 2c 20 62 53  essage, sURL, bS
6910: 68 6f 77 52 75 6c 65 49 64 2c 20 73 4f 70 74 69  howRuleId, sOpti
6920: 6f 6e 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  on, bContext);. 
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72 72         this.dErr
6960: 6f 72 50 72 69 6f 72 69 74 79 5b 6e 45 72 72 6f  orPriority[nErro
6970: 72 53 74 61 72 74 5d 20 3d 20 6e 50 72 69 6f 72  rStart] = nPrior
6980: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
69b0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
69f0: 6f 67 28 22 20 20 20 20 4e 45 57 5f 45 52 52 4f  og("    NEW_ERRO
6a00: 52 3a 20 20 7b 7d 20 20 7b 7d 3a 20 20 7b 7d 22  R:  {}  {}:  {}"
6a10: 2e 66 6f 72 6d 61 74 28 73 52 75 6c 65 49 64 2c  .format(sRuleId,
6a20: 20 73 4c 69 6e 65 49 64 2c 20 74 68 69 73 2e 64   sLineId, this.d
6a30: 45 72 72 6f 72 5b 6e 45 72 72 6f 72 53 74 61 72  Error[nErrorStar
6a40: 74 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t]));.          
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 65 6c 73 65 20 69 66 20 28 63 41 63 74 69    else if (cActi
6b00: 6f 6e 54 79 70 65 20 3d 3d 20 22 7e 22 29 20 7b  onType == "~") {
6b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 2f 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73   // text process
6b40: 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  or.             
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 53 74 61     let nTokenSta
6b70: 72 74 20 3d 20 28 65 41 63 74 5b 30 5d 20 3e 20  rt = (eAct[0] > 
6b80: 30 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65  0) ? nTokenOffse
6b90: 74 20 2b 20 65 41 63 74 5b 30 5d 20 3a 20 6e 4c  t + eAct[0] : nL
6ba0: 61 73 74 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b  astToken + eAct[
6bb0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0];.            
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 6e      let nTokenEn
6be0: 64 20 3d 20 28 65 41 63 74 5b 31 5d 20 3e 20 30  d = (eAct[1] > 0
6bf0: 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  ) ? nTokenOffset
6c00: 20 2b 20 65 41 63 74 5b 31 5d 20 3a 20 6e 4c 61   + eAct[1] : nLa
6c10: 73 74 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 31  stToken + eAct[1
6c20: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 20 20 20 74 68 69 73 2e 5f 74 61 67 41 6e 64 50     this._tagAndP
6c50: 72 65 70 61 72 65 54 6f 6b 65 6e 46 6f 72 52 65  repareTokenForRe
6c60: 77 72 69 74 69 6e 67 28 73 57 68 61 74 2c 20 6e  writing(sWhat, n
6c70: 54 6f 6b 65 6e 53 74 61 72 74 2c 20 6e 54 6f 6b  TokenStart, nTok
6c80: 65 6e 45 6e 64 2c 20 6e 54 6f 6b 65 6e 4f 66 66  enEnd, nTokenOff
6c90: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c  set, nLastToken,
6ca0: 20 65 41 63 74 5b 32 5d 2c 20 62 44 65 62 75 67   eAct[2], bDebug
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 20 20 20 62 43 68 61 6e 67 65 20 3d 20 74 72 75     bChange = tru
6ce0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
6d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
6d40: 28 22 20 20 20 20 54 45 58 54 5f 50 52 4f 43 45  ("    TEXT_PROCE
6d50: 53 53 4f 52 3a 20 20 22 20 2b 20 73 52 75 6c 65  SSOR:  " + sRule
6d60: 49 64 20 2b 20 22 20 22 20 2b 20 73 4c 69 6e 65  Id + " " + sLine
6d70: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Id);.           
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
6da0: 2e 6c 6f 67 28 22 20 20 20 20 20 20 20 22 20 2b  .log("       " +
6db0: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f   this.lToken[nTo
6dc0: 6b 65 6e 53 74 61 72 74 5d 5b 22 73 56 61 6c 75  kenStart]["sValu
6dd0: 65 22 5d 20 2b 20 22 20 3a 20 22 20 2b 20 74 68  e"] + " : " + th
6de0: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
6df0: 45 6e 64 5d 5b 22 73 56 61 6c 75 65 22 5d 20 2b  End]["sValue"] +
6e00: 20 22 20 20 3e 20 22 2c 20 73 57 68 61 74 29 3b   "  > ", sWhat);
6e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
6e70: 65 20 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70  e if (cActionTyp
6e80: 65 20 3d 3d 20 22 3d 22 29 20 7b 0a 20 20 20 20  e == "=") {.    
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
6eb0: 69 73 61 6d 62 69 67 75 61 74 69 6f 6e 0a 20 20  isambiguation.  
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 45                oE
6ee0: 76 61 6c 46 75 6e 63 5b 73 57 68 61 74 5d 28 74  valFunc[sWhat](t
6ef0: 68 69 73 2e 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  his.lToken, nTok
6f00: 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74 54  enOffset, nLastT
6f10: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f30: 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75         if (bDebu
6f40: 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g) {.           
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
6f70: 2e 6c 6f 67 28 22 20 20 20 20 44 49 53 41 4d 42  .log("    DISAMB
6f80: 49 47 55 41 54 4f 52 3a 20 20 7b 7d 20 7b 7d 20  IGUATOR:  {} {} 
6f90: 28 7b 7d 29 20 20 7b 7d 3a 7b 7d 22 2e 66 6f 72  ({})  {}:{}".for
6fa0: 6d 61 74 28 73 52 75 6c 65 49 64 2c 20 73 4c 69  mat(sRuleId, sLi
6fb0: 6e 65 49 64 2c 20 73 57 68 61 74 2c 20 74 68 69  neId, sWhat, thi
6fc0: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f  s.lToken[nTokenO
6fd0: 66 66 73 65 74 2b 31 5d 5b 22 73 56 61 6c 75 65  ffset+1]["sValue
6fe0: 22 5d 2c 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b  "], this.lToken[
6ff0: 6e 4c 61 73 74 54 6f 6b 65 6e 5d 5b 22 73 56 61  nLastToken]["sVa
7000: 6c 75 65 22 5d 29 29 3b 0a 20 20 20 20 20 20 20  lue"]));.       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 41       else if (cA
7070: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 3e 22  ctionType == ">"
7080: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 20 20 2f 2f 20 77 65 20 64 6f 20 6e 6f 74      // we do not
70b0: 68 69 6e 67 2c 20 74 68 69 73 20 74 65 73 74 20  hing, this test 
70c0: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 64 69 74  is just a condit
70d0: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 61 6c 6c  ion to apply all
70e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 63 74 69 6f   following actio
70f0: 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns.             
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
7120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
7150: 28 22 20 20 20 20 43 4f 4e 44 5f 4f 4b 3a 20 20  ("    COND_OK:  
7160: 22 20 2b 20 73 52 75 6c 65 49 64 20 2b 20 22 20  " + sRuleId + " 
7170: 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20  " + sLineId);.  
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
71e0: 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d  f (cActionType =
71f0: 3d 20 22 2f 22 29 20 7b 0a 20 20 20 20 20 20 20  = "/") {.       
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 61 67 0a           // Tag.
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 6c 65 74 20 6e 54 6f 6b 65 6e 53 74 61 72 74 20  let nTokenStart 
7250: 3d 20 28 65 41 63 74 5b 30 5d 20 3e 20 30 29 20  = (eAct[0] > 0) 
7260: 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b  ? nTokenOffset +
7270: 20 65 41 63 74 5b 30 5d 20 3a 20 6e 4c 61 73 74   eAct[0] : nLast
7280: 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 30 5d 3b  Token + eAct[0];
7290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 6e 64 20 3d   let nTokenEnd =
72c0: 20 28 65 41 63 74 5b 31 5d 20 3e 20 30 29 20 3f   (eAct[1] > 0) ?
72d0: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20   nTokenOffset + 
72e0: 65 41 63 74 5b 31 5d 20 3a 20 6e 4c 61 73 74 54  eAct[1] : nLastT
72f0: 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 31 5d 3b 0a  oken + eAct[1];.
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 6e 54 6f  for (let i = nTo
7330: 6b 65 6e 53 74 61 72 74 3b 20 69 20 3c 3d 20 6e  kenStart; i <= n
7340: 54 6f 6b 65 6e 45 6e 64 3b 20 69 2b 2b 29 20 7b  TokenEnd; i++) {
7350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 6c 54       if (this.lT
7380: 6f 6b 65 6e 5b 69 5d 2e 68 61 73 4f 77 6e 50 72  oken[i].hasOwnPr
7390: 6f 70 65 72 74 79 28 22 74 61 67 73 22 29 29 20  operty("tags")) 
73a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c            this.l
73d0: 54 6f 6b 65 6e 5b 69 5d 5b 22 74 61 67 73 22 5d  Token[i]["tags"]
73e0: 2e 61 64 64 28 2e 2e 2e 73 57 68 61 74 2e 73 70  .add(...sWhat.sp
73f0: 6c 69 74 28 22 7c 22 29 29 0a 20 20 20 20 20 20  lit("|")).      
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
7420: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
7450: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 74  his.lToken[i]["t
7460: 61 67 73 22 5d 20 3d 20 6e 65 77 20 53 65 74 28  ags"] = new Set(
7470: 73 57 68 61 74 2e 73 70 6c 69 74 28 22 7c 22 29  sWhat.split("|")
7480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
74f0: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7520: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 20 54 41  sole.log("    TA
7530: 47 3a 20 20 22 20 2b 20 73 52 75 6c 65 49 64 20  G:  " + sRuleId 
7540: 2b 20 22 20 22 20 2b 20 73 4c 69 6e 65 49 64 29  + " " + sLineId)
7550: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
7580: 67 28 22 20 20 20 20 20 20 20 22 20 2b 20 73 57  g("       " + sW
7590: 68 61 74 20 2b 20 22 20 3e 20 22 20 2b 20 74 68  hat + " > " + th
75a0: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
75b0: 53 74 61 72 74 5d 5b 22 73 56 61 6c 75 65 22 5d  Start]["sValue"]
75c0: 20 2b 20 22 20 3a 20 22 20 2b 20 74 68 69 73 2e   + " : " + this.
75d0: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 6e 64  lToken[nTokenEnd
75e0: 5d 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20  ]["sValue"]);.  
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 69 66 20 28 21 74 68 69 73 2e 64 54 61 67 73 2e  if (!this.dTags.
7640: 68 61 73 28 73 57 68 61 74 29 29 20 7b 0a 20 20  has(sWhat)) {.  
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 74 68 69 73 2e 64 54 61 67 73 2e 73 65 74    this.dTags.set
7680: 28 73 57 68 61 74 2c 20 5b 6e 54 6f 6b 65 6e 53  (sWhat, [nTokenS
7690: 74 61 72 74 2c 20 6e 54 6f 6b 65 6e 53 74 61 72  tart, nTokenStar
76a0: 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t]);.           
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 74 68 69 73 2e 64 54 61 67 73 2e 73 65 74    this.dTags.set
7700: 28 73 57 68 61 74 2c 20 5b 4d 61 74 68 2e 6d 69  (sWhat, [Math.mi
7710: 6e 28 6e 54 6f 6b 65 6e 53 74 61 72 74 2c 20 74  n(nTokenStart, t
7720: 68 69 73 2e 64 54 61 67 73 2e 67 65 74 28 73 57  his.dTags.get(sW
7730: 68 61 74 29 5b 30 5d 29 2c 20 4d 61 74 68 2e 6d  hat)[0]), Math.m
7740: 61 78 28 6e 54 6f 6b 65 6e 45 6e 64 2c 20 74 68  ax(nTokenEnd, th
7750: 69 73 2e 64 54 61 67 73 2e 67 65 74 28 73 57 68  is.dTags.get(sWh
7760: 61 74 29 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20  at)[1])]);.     
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
77d0: 63 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22  cActionType == "
77e0: 25 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  %") {.          
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 20 20 20 20 20 2f 2f 20 69 6d 6d 75 6e 69 74        // immunit
7810: 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a    if (bDebug) {.
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
7870: 22 20 20 20 20 49 4d 4d 55 4e 49 54 59 3a 5c 6e  "    IMMUNITY:\n
7880: 20 20 20 20 20 20 22 20 2b 20 5f 72 75 6c 65 73        " + _rules
7890: 5f 67 72 61 70 68 2e 64 52 75 6c 65 5b 73 52 75  _graph.dRule[sRu
78a0: 6c 65 49 64 5d 29 3b 3b 0a 20 20 20 20 20 20 20  leId]);;.       
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 20 20 20 20 6e 54 6f 6b 65             nToke
78f0: 6e 53 74 61 72 74 20 3d 20 28 65 41 63 74 5b 30  nStart = (eAct[0
7900: 5d 20 3e 20 30 29 20 3f 20 6e 54 6f 6b 65 6e 4f  ] > 0) ? nTokenO
7910: 66 66 73 65 74 20 2b 20 65 41 63 74 5b 30 5d 20  ffset + eAct[0] 
7920: 3a 20 6e 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 65  : nLastToken + e
7930: 41 63 74 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  Act[0];.        
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 45 6e          nTokenEn
7960: 64 20 3d 20 28 65 41 63 74 5b 31 5d 20 3e 20 30  d = (eAct[1] > 0
7970: 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  ) ? nTokenOffset
7980: 20 2b 20 65 41 63 74 5b 31 5d 20 3a 20 6e 4c 61   + eAct[1] : nLa
7990: 73 74 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 31  stToken + eAct[1
79a0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 20 69 66 20 28 6e 54 6f 6b 65 6e 45 6e 64     if (nTokenEnd
79d0: 20 2d 20 6e 54 6f 6b 65 6e 53 74 61 72 74 20 3d   - nTokenStart =
79e0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 0) {.         
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
7a10: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 53 74 61  lToken[nTokenSta
7a20: 72 74 5d 5b 22 62 49 6d 6d 75 6e 65 22 5d 20 3d  rt]["bImmune"] =
7a30: 20 54 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   True.          
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 45            let nE
7a60: 72 72 6f 72 53 74 61 72 74 20 3d 20 74 68 69 73  rrorStart = this
7a70: 2e 6e 4f 66 66 73 65 74 57 69 74 68 69 6e 50 61  .nOffsetWithinPa
7a80: 72 61 67 72 61 70 68 20 2b 20 74 68 69 73 2e 6c  ragraph + this.l
7a90: 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 53 74 61 72  Token[nTokenStar
7aa0: 74 5d 5b 22 6e 53 74 61 72 74 22 5d 3b 0a 20 20  t]["nStart"];.  
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 69 66 20 28 6e 45 72 72 6f 72 53 74 61 72    if (nErrorStar
7ae0: 74 20 69 6e 20 74 68 69 73 2e 64 45 72 72 6f 72  t in this.dError
7af0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
7b20: 2e 64 45 72 72 6f 72 2e 64 65 6c 65 74 65 28 6e  .dError.delete(n
7b30: 45 72 72 6f 72 53 74 61 72 74 29 3b 0a 20 20 20  ErrorStart);.   
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 6e 54 6f  for (let i = nTo
7bc0: 6b 65 6e 53 74 61 72 74 3b 20 20 69 20 3c 3d 20  kenStart;  i <= 
7bd0: 6e 54 6f 6b 65 6e 45 6e 64 3b 20 20 69 2b 2b 29  nTokenEnd;  i++)
7be0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
7c10: 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 62 49 6d 6d 75  lToken[i]["bImmu
7c20: 6e 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20  ne"] = true;.   
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72 53       let nErrorS
7c60: 74 61 72 74 20 3d 20 74 68 69 73 2e 6e 4f 66 66  tart = this.nOff
7c70: 73 65 74 57 69 74 68 69 6e 50 61 72 61 67 72 61  setWithinParagra
7c80: 70 68 20 2b 20 74 68 69 73 2e 6c 54 6f 6b 65 6e  ph + this.lToken
7c90: 5b 69 5d 5b 22 6e 53 74 61 72 74 22 5d 3b 0a 20  [i]["nStart"];. 
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
7cd0: 64 45 72 72 6f 72 2e 68 61 73 28 6e 45 72 72 6f  dError.has(nErro
7ce0: 72 53 74 61 72 74 29 29 20 7b 0a 20 20 20 20 20  rStart)) {.     
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72 72         this.dErr
7d20: 6f 72 2e 64 65 6c 65 74 65 28 6e 45 72 72 6f 72  or.delete(nError
7d30: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
7df0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 23 20 65 72  onsole.log("# er
7e00: 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 61 63 74  ror: unknown act
7e10: 69 6f 6e 20 61 74 20 22 20 2b 20 73 4c 69 6e 65  ion at " + sLine
7e20: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Id);.           
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7e50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 41       else if (cA
7e80: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 3e 22  ctionType == ">"
7e90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7ee0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 20 43  nsole.log("    C
7ef0: 4f 4e 44 5f 42 52 45 41 4b 3a 20 20 22 20 2b 20  OND_BREAK:  " + 
7f00: 73 52 75 6c 65 49 64 20 2b 20 22 20 22 20 2b 20  sRuleId + " " + 
7f10: 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20 20 20  sLineId);.      
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7f80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7f90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
7fb0: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7fd0: 73 6f 6c 65 2e 6c 6f 67 28 22 45 72 72 6f 72 3a  sole.log("Error:
7fe0: 20 22 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75   ", sLineId, sRu
7ff0: 6c 65 49 64 2c 20 74 68 69 73 2e 73 53 65 6e 74  leId, this.sSent
8000: 65 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  ence);.         
8010: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
8020: 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20  le.error(e);.   
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8040: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
8060: 65 74 75 72 6e 20 62 43 68 61 6e 67 65 3b 0a 20  eturn bChange;. 
8070: 20 20 20 7d 0a 0a 20 20 20 20 5f 63 72 65 61 74     }..    _creat
8080: 65 45 72 72 6f 72 46 72 6f 6d 52 65 67 65 78 20  eErrorFromRegex 
8090: 28 73 54 65 78 74 2c 20 73 54 65 78 74 30 2c 20  (sText, sText0, 
80a0: 73 53 75 67 67 2c 20 6e 4f 66 66 73 65 74 2c 20  sSugg, nOffset, 
80b0: 6d 2c 20 69 47 72 6f 75 70 2c 20 73 4c 69 6e 65  m, iGroup, sLine
80c0: 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 62 55 70  Id, sRuleId, bUp
80d0: 70 65 72 63 61 73 65 2c 20 73 4d 73 67 2c 20 73  percase, sMsg, s
80e0: 55 52 4c 2c 20 62 53 68 6f 77 52 75 6c 65 49 64  URL, bShowRuleId
80f0: 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74  , sOption, bCont
8100: 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  ext) {.        l
8110: 65 74 20 6e 53 74 61 72 74 20 3d 20 6e 4f 66 66  et nStart = nOff
8120: 73 65 74 20 2b 20 6d 2e 73 74 61 72 74 28 69 47  set + m.start(iG
8130: 72 6f 75 70 29 3b 0a 20 20 20 20 20 20 20 20 6c  roup);.        l
8140: 65 74 20 6e 45 6e 64 20 3d 20 6e 4f 66 66 73 65  et nEnd = nOffse
8150: 74 20 2b 20 6d 2e 65 6e 64 28 69 47 72 6f 75 70  t + m.end(iGroup
8160: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 75  );.        // su
8170: 67 67 65 73 74 69 6f 6e 73 0a 20 20 20 20 20 20  ggestions.      
8180: 20 20 6c 65 74 20 6c 53 75 67 67 20 3d 20 5b 5d    let lSugg = []
8190: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 53  ;.        if (sS
81a0: 75 67 67 2e 73 74 61 72 74 73 57 69 74 68 28 22  ugg.startsWith("
81b0: 3d 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  =")) {.         
81c0: 20 20 20 73 53 75 67 67 20 3d 20 6f 45 76 61 6c     sSugg = oEval
81d0: 46 75 6e 63 5b 73 53 75 67 67 2e 73 6c 69 63 65  Func[sSugg.slice
81e0: 28 31 29 5d 28 73 54 65 78 74 2c 20 6d 29 3b 0a  (1)](sText, m);.
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 53 75 67              lSug
8200: 67 20 3d 20 28 73 53 75 67 67 29 20 3f 20 73 53  g = (sSugg) ? sS
8210: 75 67 67 2e 73 70 6c 69 74 28 22 7c 22 29 20 3a  ugg.split("|") :
8220: 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65   [];.        } e
8230: 6c 73 65 20 69 66 20 28 73 53 75 67 67 20 3d 3d  lse if (sSugg ==
8240: 20 22 5f 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "_") {.        
8250: 20 20 20 20 6c 53 75 67 67 20 3d 20 5b 5d 3b 0a      lSugg = [];.
8260: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
8270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 53 75  .            lSu
8280: 67 67 20 3d 20 73 53 75 67 67 2e 67 6c 5f 65 78  gg = sSugg.gl_ex
8290: 70 61 6e 64 28 6d 29 2e 73 70 6c 69 74 28 22 7c  pand(m).split("|
82a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
82b0: 20 20 20 20 20 20 69 66 20 28 62 55 70 70 65 72        if (bUpper
82c0: 63 61 73 65 20 26 26 20 6c 53 75 67 67 2e 6c 65  case && lSugg.le
82d0: 6e 67 74 68 20 3e 20 30 20 26 26 20 6d 5b 69 47  ngth > 0 && m[iG
82e0: 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29  roup].slice(0,1)
82f0: 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28  .gl_isUpperCase(
8300: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
8310: 20 6c 53 75 67 67 20 3d 20 63 61 70 69 74 61 6c   lSugg = capital
8320: 69 7a 65 41 72 72 61 79 28 6c 53 75 67 67 29 3b  izeArray(lSugg);
8330: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8340: 20 20 20 2f 2f 20 4d 65 73 73 61 67 65 0a 20 20     // Message.  
8350: 20 20 20 20 20 20 6c 65 74 20 73 4d 65 73 73 61        let sMessa
8360: 67 65 20 3d 20 28 73 4d 73 67 2e 73 74 61 72 74  ge = (sMsg.start
8370: 73 57 69 74 68 28 22 3d 22 29 29 20 3f 20 6f 45  sWith("=")) ? oE
8380: 76 61 6c 46 75 6e 63 5b 73 4d 73 67 2e 73 6c 69  valFunc[sMsg.sli
8390: 63 65 28 31 29 5d 28 73 54 65 78 74 2c 20 6d 29  ce(1)](sText, m)
83a0: 20 3a 20 73 4d 73 67 2e 67 6c 5f 65 78 70 61 6e   : sMsg.gl_expan
83b0: 64 28 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d(m);.        if
83c0: 20 28 62 53 68 6f 77 52 75 6c 65 49 64 29 20 7b   (bShowRuleId) {
83d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4d 65  .            sMe
83e0: 73 73 61 67 65 20 2b 3d 20 22 20 20 23 23 20 22  ssage += "  ## "
83f0: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 20 23   + sLineId + " #
8400: 20 22 20 2b 20 73 52 75 6c 65 49 64 3b 0a 20 20   " + sRuleId;.  
8410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8420: 2f 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  //.        retur
8430: 6e 20 74 68 69 73 2e 5f 63 72 65 61 74 65 45 72  n this._createEr
8440: 72 6f 72 28 6e 53 74 61 72 74 2c 20 6e 45 6e 64  ror(nStart, nEnd
8450: 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65  , sLineId, sRule
8460: 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 73 4d 65  Id, sOption, sMe
8470: 73 73 61 67 65 2c 20 6c 53 75 67 67 2c 20 73 55  ssage, lSugg, sU
8480: 52 4c 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  RL, bContext);. 
8490: 20 20 20 7d 0a 0a 20 20 20 20 5f 63 72 65 61 74     }..    _creat
84a0: 65 45 72 72 6f 72 46 72 6f 6d 54 6f 6b 65 6e 73  eErrorFromTokens
84b0: 20 28 73 65 6c 66 2c 20 73 53 75 67 67 2c 20 6e   (self, sSugg, n
84c0: 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61  TokenOffset, nLa
84d0: 73 74 54 6f 6b 65 6e 2c 20 69 46 69 72 73 74 54  stToken, iFirstT
84e0: 6f 6b 65 6e 2c 20 6e 53 74 61 72 74 2c 20 6e 45  oken, nStart, nE
84f0: 6e 64 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  nd, sLineId, sRu
8500: 6c 65 49 64 2c 20 62 43 61 73 65 53 76 74 79 2c  leId, bCaseSvty,
8510: 20 73 4d 73 67 2c 20 73 55 52 4c 2c 20 62 53 68   sMsg, sURL, bSh
8520: 6f 77 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f  owRuleId, sOptio
8530: 6e 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a 20  n, bContext) {. 
8540: 20 20 20 20 20 20 20 2f 2f 20 73 75 67 67 65 73         // sugges
8550: 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 6c 65  tions.        le
8560: 74 20 6c 53 75 67 67 20 3d 20 5b 5d 3b 0a 20 20  t lSugg = [];.  
8570: 20 20 20 20 20 20 69 66 20 28 73 53 75 67 67 2e        if (sSugg.
8580: 73 74 61 72 74 73 57 69 74 68 28 22 3d 22 29 29  startsWith("="))
8590: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
85a0: 53 75 67 67 20 3d 20 6f 45 76 61 6c 46 75 6e 63  Sugg = oEvalFunc
85b0: 5b 73 53 75 67 67 2e 73 6c 69 63 65 28 31 29 5d  [sSugg.slice(1)]
85c0: 28 73 65 6c 66 2e 6c 54 6f 6b 65 6e 2c 20 6e 54  (self.lToken, nT
85d0: 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73  okenOffset, nLas
85e0: 74 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  tToken);.       
85f0: 20 20 20 20 20 6c 53 75 67 67 20 3d 20 28 73 53       lSugg = (sS
8600: 75 67 67 29 20 3f 20 73 53 75 67 67 2e 73 70 6c  ugg) ? sSugg.spl
8610: 69 74 28 22 7c 22 29 20 3a 20 5b 5d 3b 0a 20 20  it("|") : [];.  
8620: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
8630: 28 73 53 75 67 67 20 3d 3d 20 22 5f 22 29 20 7b  (sSugg == "_") {
8640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 53 75  .            lSu
8650: 67 67 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20  gg = [];.       
8660: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
8670: 20 20 20 20 20 20 6c 53 75 67 67 20 3d 20 73 65        lSugg = se
8680: 6c 66 2e 5f 65 78 70 61 6e 64 28 73 53 75 67 67  lf._expand(sSugg
8690: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
86a0: 6e 4c 61 73 74 54 6f 6b 65 6e 29 2e 73 70 6c 69  nLastToken).spli
86b0: 74 28 22 7c 22 29 3b 0a 20 20 20 20 20 20 20 20  t("|");.        
86c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 43  }.        if (bC
86d0: 61 73 65 53 76 74 79 20 26 26 20 6c 53 75 67 67  aseSvty && lSugg
86e0: 2e 6c 65 6e 67 74 68 20 3e 20 30 20 26 26 20 73  .length > 0 && s
86f0: 65 6c 66 2e 6c 54 6f 6b 65 6e 5b 69 46 69 72 73  elf.lToken[iFirs
8700: 74 54 6f 6b 65 6e 5d 5b 22 73 56 61 6c 75 65 22  tToken]["sValue"
8710: 5d 2e 73 6c 69 63 65 28 30 2c 31 29 2e 69 73 75  ].slice(0,1).isu
8720: 70 70 65 72 28 29 29 20 7b 0a 20 20 20 20 20 20  pper()) {.      
8730: 20 20 20 20 20 20 6c 53 75 67 67 20 3d 20 63 61        lSugg = ca
8740: 70 69 74 61 6c 69 7a 65 41 72 72 61 79 28 6c 53  pitalizeArray(lS
8750: 75 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ugg);.        }.
8760: 20 20 20 20 20 20 20 20 2f 2f 20 4d 65 73 73 61          // Messa
8770: 67 65 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73  ge.        let s
8780: 4d 65 73 73 61 67 65 20 3d 20 28 73 4d 73 67 2e  Message = (sMsg.
8790: 73 74 61 72 74 73 57 69 74 68 28 22 3d 22 29 29  startsWith("="))
87a0: 20 3f 20 6f 45 76 61 6c 46 75 6e 63 5b 73 4d 73   ? oEvalFunc[sMs
87b0: 67 2e 73 6c 69 63 65 28 31 29 5d 28 73 65 6c 66  g.slice(1)](self
87c0: 2e 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f  .lToken, nTokenO
87d0: 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65  ffset, nLastToke
87e0: 6e 29 20 3a 20 73 65 6c 66 2e 5f 65 78 70 61 6e  n) : self._expan
87f0: 64 28 73 4d 73 67 2c 20 6e 54 6f 6b 65 6e 4f 66  d(sMsg, nTokenOf
8800: 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e  fset, nLastToken
8810: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 62  );.        if (b
8820: 53 68 6f 77 52 75 6c 65 49 64 29 20 7b 0a 20 20  ShowRuleId) {.  
8830: 20 20 20 20 20 20 20 20 20 20 73 4d 65 73 73 61            sMessa
8840: 67 65 20 2b 3d 20 22 20 23 23 20 22 20 2b 20 73  ge += " ## " + s
8850: 4c 69 6e 65 49 64 20 2b 20 22 20 23 20 22 20 2b  LineId + " # " +
8860: 20 73 52 75 6c 65 49 64 3b 0a 20 20 20 20 20 20   sRuleId;.      
8870: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 0a 20    }.        //. 
8880: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
8890: 69 73 2e 5f 63 72 65 61 74 65 45 72 72 6f 72 28  is._createError(
88a0: 6e 53 74 61 72 74 2c 20 6e 45 6e 64 2c 20 73 4c  nStart, nEnd, sL
88b0: 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20  ineId, sRuleId, 
88c0: 73 4f 70 74 69 6f 6e 2c 20 73 4d 65 73 73 61 67  sOption, sMessag
88d0: 65 2c 20 6c 53 75 67 67 2c 20 73 55 52 4c 2c 20  e, lSugg, sURL, 
88e0: 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  bContext);.    }
88f0: 0a 0a 20 20 20 20 5f 63 72 65 61 74 65 45 72 72  ..    _createErr
8900: 6f 72 20 28 6e 53 74 61 72 74 2c 20 6e 45 6e 64  or (nStart, nEnd
8910: 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65  , sLineId, sRule
8920: 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 73 4d 65  Id, sOption, sMe
8930: 73 73 61 67 65 2c 20 6c 53 75 67 67 2c 20 73 55  ssage, lSugg, sU
8940: 52 4c 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a  RL, bContext) {.
8950: 20 20 20 20 20 20 20 20 6f 45 72 72 20 3d 20 7b          oErr = {
8960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 53  .            "nS
8970: 74 61 72 74 22 3a 20 6e 53 74 61 72 74 2c 0a 20  tart": nStart,. 
8980: 20 20 20 20 20 20 20 20 20 20 20 22 6e 45 6e 64             "nEnd
8990: 22 3a 20 6e 45 6e 64 2c 0a 20 20 20 20 20 20 20  ": nEnd,.       
89a0: 20 20 20 20 20 22 73 4c 69 6e 65 49 64 22 3a 20       "sLineId": 
89b0: 73 4c 69 6e 65 49 64 2c 0a 20 20 20 20 20 20 20  sLineId,.       
89c0: 20 20 20 20 20 22 73 52 75 6c 65 49 64 22 3a 20       "sRuleId": 
89d0: 73 52 75 6c 65 49 64 2c 0a 20 20 20 20 20 20 20  sRuleId,.       
89e0: 20 20 20 20 20 22 73 54 79 70 65 22 3a 20 73 4f       "sType": sO
89f0: 70 74 69 6f 6e 20 7c 7c 20 22 6e 6f 74 79 70 65  ption || "notype
8a00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ",.            "
8a10: 73 4d 65 73 73 61 67 65 22 3a 20 73 4d 65 73 73  sMessage": sMess
8a20: 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
8a30: 20 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22 3a   "aSuggestions":
8a40: 20 6c 53 75 67 67 2c 0a 20 20 20 20 20 20 20 20   lSugg,.        
8a50: 20 20 20 20 22 55 52 4c 22 3a 20 73 55 52 4c 0a      "URL": sURL.
8a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a70: 20 20 69 66 20 28 62 43 6f 6e 74 65 78 74 29 20    if (bContext) 
8a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 45  {.            oE
8a90: 72 72 5b 27 73 55 6e 64 65 72 6c 69 6e 65 64 27  rr['sUnderlined'
8aa0: 5d 20 3d 20 73 65 6c 66 2e 73 54 65 78 74 30 2e  ] = self.sText0.
8ab0: 73 6c 69 63 65 28 6e 53 74 61 72 74 2c 20 6e 45  slice(nStart, nE
8ac0: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
8ad0: 20 6f 45 72 72 5b 27 73 42 65 66 6f 72 65 27 5d   oErr['sBefore']
8ae0: 20 3d 20 73 65 6c 66 2e 73 54 65 78 74 30 2e 73   = self.sText0.s
8af0: 6c 69 63 65 28 4d 61 74 68 2e 6d 61 78 28 30 2c  lice(Math.max(0,
8b00: 6e 53 74 61 72 74 2d 38 30 29 2c 20 6e 53 74 61  nStart-80), nSta
8b10: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
8b20: 20 6f 45 72 72 5b 27 73 41 66 74 65 72 27 5d 20   oErr['sAfter'] 
8b30: 3d 20 73 65 6c 66 2e 73 54 65 78 74 30 2e 73 6c  = self.sText0.sl
8b40: 69 63 65 28 6e 45 6e 64 2c 20 6e 45 6e 64 2b 38  ice(nEnd, nEnd+8
8b50: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
8b60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 45 72        return oEr
8b70: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 65  r;.    }..    _e
8b80: 78 70 61 6e 64 20 28 73 54 65 78 74 2c 20 6e 54  xpand (sText, nT
8b90: 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73  okenOffset, nLas
8ba0: 74 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20  tToken) {.      
8bb0: 20 20 6c 65 74 20 6d 3b 0a 20 20 20 20 20 20 20    let m;.       
8bc0: 20 77 68 69 6c 65 20 28 28 6d 20 3d 20 2f 5c 5c   while ((m = /\\
8bd0: 28 2d 3f 5b 30 2d 39 5d 2b 29 2f 2e 65 78 65 63  (-?[0-9]+)/.exec
8be0: 28 73 54 65 78 74 29 29 20 21 3d 3d 20 6e 75 6c  (sText)) !== nul
8bf0: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
8c00: 20 69 66 20 28 6d 5b 31 5d 2e 73 6c 69 63 65 28   if (m[1].slice(
8c10: 30 2c 31 29 20 3d 3d 20 22 2d 22 29 20 7b 0a 20  0,1) == "-") {. 
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8c30: 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72 65 70  Text = sText.rep
8c40: 6c 61 63 65 28 6d 5b 30 5d 2c 20 73 65 6c 66 2e  lace(m[0], self.
8c50: 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65  lToken[nLastToke
8c60: 6e 2b 70 61 72 73 65 49 6e 74 28 6d 5b 31 5d 2c  n+parseInt(m[1],
8c70: 31 30 29 2b 31 5d 5b 22 73 56 61 6c 75 65 22 5d  10)+1]["sValue"]
8c80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8c90: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
8ca0: 20 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20          sText = 
8cb0: 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 6d 5b  sText.replace(m[
8cc0: 30 5d 2c 20 73 65 6c 66 2e 6c 54 6f 6b 65 6e 5b  0], self.lToken[
8cd0: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 70 61 72  nTokenOffset+par
8ce0: 73 65 49 6e 74 28 6d 5b 31 5d 2c 31 30 29 5d 5b  seInt(m[1],10)][
8cf0: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
8d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
8d20: 72 6e 20 73 54 65 78 74 3b 0a 20 20 20 20 7d 0a  rn sText;.    }.
8d30: 0a 20 20 20 20 72 65 77 72 69 74 65 54 65 78 74  .    rewriteText
8d40: 20 28 73 54 65 78 74 2c 20 73 52 65 70 6c 2c 20   (sText, sRepl, 
8d50: 69 47 72 6f 75 70 2c 20 6d 2c 20 62 55 70 70 65  iGroup, m, bUppe
8d60: 72 63 61 73 65 29 20 7b 0a 20 20 20 20 20 20 20  rcase) {.       
8d70: 20 2f 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73   // text process
8d80: 6f 72 3a 20 77 72 69 74 65 20 73 52 65 70 6c 20  or: write sRepl 
8d90: 69 6e 20 73 54 65 78 74 20 61 74 20 69 47 72 6f  in sText at iGro
8da0: 75 70 20 70 6f 73 69 74 69 6f 6e 22 0a 20 20 20  up position".   
8db0: 20 20 20 20 20 6c 65 74 20 6c 6e 20 3d 20 6d 2e       let ln = m.
8dc0: 65 6e 64 5b 69 47 72 6f 75 70 5d 20 2d 20 6d 2e  end[iGroup] - m.
8dd0: 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 3b 0a 20  start[iGroup];. 
8de0: 20 20 20 20 20 20 20 6c 65 74 20 73 4e 65 77 20         let sNew 
8df0: 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  = "";.        if
8e00: 20 28 73 52 65 70 6c 20 3d 3d 3d 20 22 2a 22 29   (sRepl === "*")
8e10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
8e20: 4e 65 77 20 3d 20 22 20 22 2e 72 65 70 65 61 74  New = " ".repeat
8e30: 28 6c 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (ln);.        }.
8e40: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
8e50: 28 73 52 65 70 6c 20 3d 3d 3d 20 22 3e 22 20 7c  (sRepl === ">" |
8e60: 7c 20 73 52 65 70 6c 20 3d 3d 3d 20 22 5f 22 20  | sRepl === "_" 
8e70: 7c 7c 20 73 52 65 70 6c 20 3d 3d 3d 20 22 7e 22  || sRepl === "~"
8e80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8e90: 73 4e 65 77 20 3d 20 73 52 65 70 6c 20 2b 20 22  sNew = sRepl + "
8ea0: 20 22 2e 72 65 70 65 61 74 28 6c 6e 2d 31 29 3b   ".repeat(ln-1);
8eb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8ec0: 20 20 20 65 6c 73 65 20 69 66 20 28 73 52 65 70     else if (sRep
8ed0: 6c 20 3d 3d 3d 20 22 40 22 29 20 7b 0a 20 20 20  l === "@") {.   
8ee0: 20 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20           sNew = 
8ef0: 22 40 22 2e 72 65 70 65 61 74 28 6c 6e 29 3b 0a  "@".repeat(ln);.
8f00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f10: 20 20 65 6c 73 65 20 69 66 20 28 73 52 65 70 6c    else if (sRepl
8f20: 2e 73 6c 69 63 65 28 30 2c 31 29 20 3d 3d 3d 20  .slice(0,1) === 
8f30: 22 3d 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "=") {.         
8f40: 20 20 20 73 4e 65 77 20 3d 20 6f 45 76 61 6c 46     sNew = oEvalF
8f50: 75 6e 63 5b 73 52 65 70 6c 2e 73 6c 69 63 65 28  unc[sRepl.slice(
8f60: 31 29 5d 28 73 54 65 78 74 2c 20 6d 29 3b 0a 20  1)](sText, m);. 
8f70: 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 20             sNew 
8f80: 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72 65 70  = sNew + " ".rep
8f90: 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e 67  eat(ln-sNew.leng
8fa0: 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  th);.           
8fb0: 20 69 66 20 28 62 55 70 70 65 72 63 61 73 65 20   if (bUppercase 
8fc0: 26 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73 6c 69  && m[iGroup].sli
8fd0: 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70 70  ce(0,1).gl_isUpp
8fe0: 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20  erCase()) {.    
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77              sNew
9000: 20 3d 20 73 4e 65 77 2e 67 6c 5f 74 6f 43 61 70   = sNew.gl_toCap
9010: 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20  italize();.     
9020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9030: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
9040: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73 52 65        sNew = sRe
9050: 70 6c 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29 3b  pl.gl_expand(m);
9060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65  .            sNe
9070: 77 20 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72  w = sNew + " ".r
9080: 65 70 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65  epeat(ln-sNew.le
9090: 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d  ngth);.        }
90a0: 0a 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f  .        //conso
90b0: 6c 65 2e 6c 6f 67 28 22 5c 6e 22 2b 73 54 65 78  le.log("\n"+sTex
90c0: 74 2b 22 5c 6e 73 74 61 72 74 3a 20 22 2b 6d 2e  t+"\nstart: "+m.
90d0: 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 2b 22 20  start[iGroup]+" 
90e0: 65 6e 64 3a 22 2b 6d 2e 65 6e 64 5b 69 47 72 6f  end:"+m.end[iGro
90f0: 75 70 5d 29 0a 20 20 20 20 20 20 20 20 72 65 74  up]).        ret
9100: 75 72 6e 20 73 54 65 78 74 2e 73 6c 69 63 65 28  urn sText.slice(
9110: 30 2c 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75  0, m.start[iGrou
9120: 70 5d 29 20 2b 20 73 4e 65 77 20 2b 20 73 54 65  p]) + sNew + sTe
9130: 78 74 2e 73 6c 69 63 65 28 6d 2e 65 6e 64 5b 69  xt.slice(m.end[i
9140: 47 72 6f 75 70 5d 29 3b 0a 20 20 20 20 7d 0a 0a  Group]);.    }..
9150: 20 20 20 20 5f 74 61 67 41 6e 64 50 72 65 70 61      _tagAndPrepa
9160: 72 65 54 6f 6b 65 6e 46 6f 72 52 65 77 72 69 74  reTokenForRewrit
9170: 69 6e 67 20 28 73 57 68 61 74 2c 20 6e 54 6f 6b  ing (sWhat, nTok
9180: 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 2c 20  enRewriteStart, 
9190: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e 64  nTokenRewriteEnd
91a0: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
91b0: 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 62 43 61 73  nLastToken, bCas
91c0: 65 53 76 74 79 2c 20 62 44 65 62 75 67 29 20 7b  eSvty, bDebug) {
91d0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 65 78 74  .        // text
91e0: 20 70 72 6f 63 65 73 73 6f 72 3a 20 72 65 77 72   processor: rewr
91f0: 69 74 65 20 74 6f 6b 65 6e 73 20 62 65 74 77 65  ite tokens betwe
9200: 65 6e 20 3c 6e 54 6f 6b 65 6e 52 65 77 72 69 74  en <nTokenRewrit
9210: 65 53 74 61 72 74 3e 20 61 6e 64 20 3c 6e 54 6f  eStart> and <nTo
9220: 6b 65 6e 52 65 77 72 69 74 65 45 6e 64 3e 20 70  kenRewriteEnd> p
9230: 6f 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  osition.        
9240: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
9250: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
9260: 65 2e 6c 6f 67 28 22 20 20 20 20 20 53 54 41 52  e.log("     STAR
9270: 54 3a 20 24 7b 6e 54 6f 6b 65 6e 52 65 77 72 69  T: ${nTokenRewri
9280: 74 65 53 74 61 72 74 7d 20 2d 20 45 4e 44 3a 20  teStart} - END: 
9290: 24 7b 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45  ${nTokenRewriteE
92a0: 6e 64 7d 20 20 22 29 3b 0a 20 20 20 20 20 20 20  nd}  ");.       
92b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73   }.        if (s
92c0: 57 68 61 74 20 3d 3d 3d 20 22 2a 22 29 20 7b 0a  What === "*") {.
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 70              // p
92e0: 75 72 67 65 20 74 65 78 74 0a 20 20 20 20 20 20  urge text.      
92f0: 20 20 20 20 20 20 69 66 20 28 6e 54 6f 6b 65 6e        if (nToken
9300: 52 65 77 72 69 74 65 45 6e 64 20 2d 20 6e 54 6f  RewriteEnd - nTo
9310: 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 20  kenRewriteStart 
9320: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
9330: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f          this.lTo
9340: 6b 65 6e 5b 6e 54 6f 6b 65 6e 52 65 77 72 69 74  ken[nTokenRewrit
9350: 65 53 74 61 72 74 5d 5b 22 62 54 6f 52 65 6d 6f  eStart]["bToRemo
9360: 76 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20  ve"] = true;.   
9370: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
9380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9390: 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 6e    for (let i = n
93a0: 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72  TokenRewriteStar
93b0: 74 3b 20 20 69 20 3c 3d 20 6e 54 6f 6b 65 6e 52  t;  i <= nTokenR
93c0: 65 77 72 69 74 65 45 6e 64 3b 20 20 69 2b 2b 29  ewriteEnd;  i++)
93d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
93e0: 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b         this.lTok
93f0: 65 6e 5b 69 5d 5b 22 62 54 6f 52 65 6d 6f 76 65  en[i]["bToRemove
9400: 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  "] = true;.     
9410: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9420: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9430: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
9440: 65 20 69 66 20 28 73 57 68 61 74 20 3d 3d 3d 20  e if (sWhat === 
9450: 22 e2 90 a3 22 29 20 7b 0a 20 20 20 20 20 20 20  "...") {.       
9460: 20 20 20 20 20 2f 2f 20 6d 65 72 67 65 20 74 6f       // merge to
9470: 6b 65 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20  kens.           
9480: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f   this.lToken[nTo
9490: 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 5d  kenRewriteStart]
94a0: 5b 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22 5d 20  ["nMergeUntil"] 
94b0: 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45  = nTokenRewriteE
94c0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
94d0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 73        else if (s
94e0: 57 68 61 74 20 3d 3d 3d 20 22 5f 22 29 20 7b 0a  What === "_") {.
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6e              // n
9500: 65 75 74 72 61 6c 69 7a 65 64 20 74 6f 6b 65 6e  eutralized token
9510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
9520: 28 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e  (nTokenRewriteEn
9530: 64 20 2d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74  d - nTokenRewrit
9540: 65 53 74 61 72 74 20 3d 3d 20 30 29 20 7b 0a 20  eStart == 0) {. 
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
9560: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  his.lToken[nToke
9570: 6e 52 65 77 72 69 74 65 53 74 61 72 74 5d 5b 22  nRewriteStart]["
9580: 73 4e 65 77 56 61 6c 75 65 22 5d 20 3d 20 22 5f  sNewValue"] = "_
9590: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ";.            }
95a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
95b0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
95c0: 20 69 20 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69   i = nTokenRewri
95d0: 74 65 53 74 61 72 74 3b 20 20 69 20 3c 3d 20 6e  teStart;  i <= n
95e0: 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e 64 3b  TokenRewriteEnd;
95f0: 20 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20    i++) {.       
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
9610: 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 73 4e 65  s.lToken[i]["sNe
9620: 77 56 61 6c 75 65 22 5d 20 3d 20 22 5f 22 3b 0a  wValue"] = "_";.
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
9650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9660: 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20    else {.       
9670: 20 20 20 20 20 69 66 20 28 73 57 68 61 74 2e 73       if (sWhat.s
9680: 74 61 72 74 73 57 69 74 68 28 22 3d 22 29 29 20  tartsWith("=")) 
9690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
96a0: 20 20 73 57 68 61 74 20 3d 20 6f 45 76 61 6c 46    sWhat = oEvalF
96b0: 75 6e 63 5b 73 57 68 61 74 2e 73 6c 69 63 65 28  unc[sWhat.slice(
96c0: 31 29 5d 28 74 68 69 73 2e 6c 54 6f 6b 65 6e 2c  1)](this.lToken,
96d0: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e   nTokenOffset, n
96e0: 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  LastToken);.    
96f0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9710: 20 73 57 68 61 74 20 3d 20 74 68 69 73 2e 5f 65   sWhat = this._e
9720: 78 70 61 6e 64 28 73 57 68 61 74 2c 20 6e 54 6f  xpand(sWhat, nTo
9730: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
9740: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
9750: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9760: 20 20 6c 65 74 20 62 55 70 70 65 72 63 61 73 65    let bUppercase
9770: 20 3d 20 62 43 61 73 65 53 76 74 79 20 26 26 20   = bCaseSvty && 
9780: 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b  this.lToken[nTok
9790: 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 5d 5b  enRewriteStart][
97a0: 22 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28  "sValue"].slice(
97b0: 30 2c 31 29 2e 69 73 75 70 70 65 72 28 29 3b 0a  0,1).isupper();.
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
97d0: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e 64  nTokenRewriteEnd
97e0: 20 2d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65   - nTokenRewrite
97f0: 53 74 61 72 74 20 3d 3d 20 30 29 20 7b 0a 20 20  Start == 0) {.  
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
9810: 20 6f 6e 65 20 74 6f 6b 65 6e 0a 20 20 20 20 20   one token.     
9820: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
9830: 55 70 70 65 72 63 61 73 65 29 20 7b 0a 20 20 20  Uppercase) {.   
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 73 57 68 61 74 20 3d 20 73 57 68 61 74 2e 67   sWhat = sWhat.g
9860: 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29  l_toCapitalize()
9870: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9880: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
9890: 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b      this.lToken[
98a0: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
98b0: 72 74 5d 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d  rt]["sNewValue"]
98c0: 20 3d 20 73 57 68 61 74 3b 0a 20 20 20 20 20 20   = sWhat;.      
98d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
98e0: 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
98f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 65             // se
9900: 76 65 72 61 6c 20 74 6f 6b 65 6e 73 0a 20 20 20  veral tokens.   
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
9920: 20 6c 54 6f 6b 65 6e 56 61 6c 75 65 20 3d 20 73   lTokenValue = s
9930: 57 68 61 74 2e 73 70 6c 69 74 28 22 7c 22 29 3b  What.split("|");
9940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9950: 20 69 66 20 28 6c 54 6f 6b 65 6e 56 61 6c 75 65   if (lTokenValue
9960: 2e 6c 65 6e 67 74 68 20 21 3d 20 28 6e 54 6f 6b  .length != (nTok
9970: 65 6e 52 65 77 72 69 74 65 45 6e 64 20 2d 20 6e  enRewriteEnd - n
9980: 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72  TokenRewriteStar
9990: 74 20 2b 20 31 29 29 20 7b 0a 20 20 20 20 20 20  t + 1)) {.      
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
99b0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45 72 72 6f 72  nsole.log("Error
99c0: 2e 20 54 65 78 74 20 70 72 6f 63 65 73 73 6f 72  . Text processor
99d0: 3a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 6c  : number of repl
99e0: 61 63 65 6d 65 6e 74 73 20 21 3d 20 6e 75 6d 62  acements != numb
99f0: 65 72 20 6f 66 20 74 6f 6b 65 6e 73 2e 22 29 3b  er of tokens.");
9a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
9a40: 65 74 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20  et j = 0;.      
9a50: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
9a60: 65 74 20 69 20 3d 20 6e 54 6f 6b 65 6e 52 65 77  et i = nTokenRew
9a70: 72 69 74 65 53 74 61 72 74 3b 20 20 69 20 3c 3d  riteStart;  i <=
9a80: 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e   nTokenRewriteEn
9a90: 64 3b 20 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20  d;  i++) {.     
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
9ab0: 65 74 20 73 56 61 6c 75 65 20 3d 20 6c 54 6f 6b  et sValue = lTok
9ac0: 65 6e 56 61 6c 75 65 5b 6a 5d 3b 0a 20 20 20 20  enValue[j];.    
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 69 66 20 28 21 73 56 61 6c 75 65 20 7c 7c 20 73  if (!sValue || s
9af0: 56 61 6c 75 65 20 3d 3d 3d 20 22 2a 22 29 20 7b  Value === "*") {
9b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b10: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54           this.lT
9b20: 6f 6b 65 6e 5b 69 5d 5b 22 62 54 6f 52 65 6d 6f  oken[i]["bToRemo
9b30: 76 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20  ve"] = true;.   
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 20 69 66 20 28 62 55 70 70 65 72 63 61 73 65    if (bUppercase
9b80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 73 56 61 6c 75 65 20 3d 20 73 56 61 6c 75 65 2e  sValue = sValue.
9bb0: 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28  gl_toCapitalize(
9bc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
9bd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e       this.lToken
9c00: 5b 69 5d 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d  [i]["sNewValue"]
9c10: 20 3d 20 73 56 61 6c 75 65 3b 0a 20 20 20 20 20   = sValue;.     
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9c40: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
9c50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9c60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9c70: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
9c80: 65 77 72 69 74 65 46 72 6f 6d 54 61 67 73 20 28  ewriteFromTags (
9c90: 73 65 6c 66 2c 20 62 44 65 62 75 67 3d 66 61 6c  self, bDebug=fal
9ca0: 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  se) {.        //
9cb0: 20 72 65 77 72 69 74 65 20 74 68 65 20 73 65 6e   rewrite the sen
9cc0: 74 65 6e 63 65 2c 20 6d 6f 64 69 66 79 20 74 6f  tence, modify to
9cd0: 6b 65 6e 73 2c 20 70 75 72 67 65 20 74 68 65 20  kens, purge the 
9ce0: 74 6f 6b 65 6e 20 6c 69 73 74 0a 20 20 20 20 20  token list.     
9cf0: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
9d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
9d10: 73 6f 6c 65 2e 6c 6f 67 28 22 52 45 57 52 49 54  sole.log("REWRIT
9d20: 45 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  E");.        }. 
9d30: 20 20 20 20 20 20 20 6c 65 74 20 6c 4e 65 77 54         let lNewT
9d40: 6f 6b 65 6e 20 3d 20 5b 5d 3b 0a 20 20 20 20 20  oken = [];.     
9d50: 20 20 20 6c 65 74 20 6e 4d 65 72 67 65 55 6e 74     let nMergeUnt
9d60: 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  il = 0;.        
9d70: 6c 65 74 20 64 54 6f 6b 65 6e 4d 65 72 67 65 72  let dTokenMerger
9d80: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   = null;.       
9d90: 20 66 6f 72 20 28 6c 65 74 20 5b 69 54 6f 6b 65   for (let [iToke
9da0: 6e 2c 20 64 54 6f 6b 65 6e 5d 20 69 6e 20 74 68  n, dToken] in th
9db0: 69 73 2e 6c 54 6f 6b 65 6e 2e 65 6e 74 72 69 65  is.lToken.entrie
9dc0: 73 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  s()) {.         
9dd0: 20 20 20 6c 65 74 20 62 4b 65 65 70 54 6f 6b 65     let bKeepToke
9de0: 6e 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  n = true;.      
9df0: 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e        if (dToken
9e00: 5b 22 73 54 79 70 65 22 5d 20 21 3d 20 22 49 4e  ["sType"] != "IN
9e10: 46 4f 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  FO") {.         
9e20: 20 20 20 20 20 20 20 69 66 20 28 6e 4d 65 72 67         if (nMerg
9e30: 65 55 6e 74 69 6c 20 26 26 20 69 54 6f 6b 65 6e  eUntil && iToken
9e40: 20 3c 3d 20 6e 4d 65 72 67 65 55 6e 74 69 6c 29   <= nMergeUntil)
9e50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
9e60: 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 4d 65 72         dTokenMer
9e70: 67 65 72 5b 22 73 56 61 6c 75 65 22 5d 20 2b 3d  ger["sValue"] +=
9e80: 20 22 20 22 2e 72 65 70 65 61 74 28 64 54 6f 6b   " ".repeat(dTok
9e90: 65 6e 5b 22 6e 53 74 61 72 74 22 5d 20 2d 20 64  en["nStart"] - d
9ea0: 54 6f 6b 65 6e 4d 65 72 67 65 72 5b 22 6e 45 6e  TokenMerger["nEn
9eb0: 64 22 5d 29 20 2b 20 64 54 6f 6b 65 6e 5b 22 73  d"]) + dToken["s
9ec0: 56 61 6c 75 65 22 5d 3b 0a 20 20 20 20 20 20 20  Value"];.       
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f               dTo
9ee0: 6b 65 6e 4d 65 72 67 65 72 5b 22 6e 45 6e 64 22  kenMerger["nEnd"
9ef0: 5d 20 3d 20 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64  ] = dToken["nEnd
9f00: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
9f10: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
9f20: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
9f40: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 45 52  nsole.log("  MER
9f50: 47 45 44 20 54 4f 4b 45 4e 3a 20 22 20 2b 20 64  GED TOKEN: " + d
9f60: 54 6f 6b 65 6e 4d 65 72 67 65 72 5b 22 73 56 61  TokenMerger["sVa
9f70: 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20 20  lue"]);.        
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 62 4b 65 65 70 54 6f 6b 65 6e 20 3d 20 66    bKeepToken = f
9fb0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alse;.          
9fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9fd0: 20 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b          if (dTok
9fe0: 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74  en.hasOwnPropert
9ff0: 79 28 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22 29  y("nMergeUntil")
a000: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
a010: 20 20 20 20 20 20 20 20 69 66 20 28 69 54 6f 6b          if (iTok
a020: 65 6e 20 3e 20 6e 4d 65 72 67 65 55 6e 74 69 6c  en > nMergeUntil
a030: 29 20 7b 20 2f 2f 20 74 68 69 73 20 74 6f 6b 65  ) { // this toke
a040: 6e 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  n is not already
a050: 20 6d 65 72 67 65 64 20 77 69 74 68 20 61 20 70   merged with a p
a060: 72 65 76 69 6f 75 73 20 74 6f 6b 65 6e 0a 20 20  revious token.  
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 20 20 20 20 20 20 64 54 6f 6b 65 6e 4d 65 72 67        dTokenMerg
a090: 65 72 20 3d 20 64 54 6f 6b 65 6e 3b 0a 20 20 20  er = dToken;.   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
a0c0: 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65         if (dToke
a0d0: 6e 5b 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22 5d  n["nMergeUntil"]
a0e0: 20 3e 20 6e 4d 65 72 67 65 55 6e 74 69 6c 29 20   > nMergeUntil) 
a0f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a100: 20 20 20 20 20 20 20 20 20 20 6e 4d 65 72 67 65            nMerge
a110: 55 6e 74 69 6c 20 3d 20 64 54 6f 6b 65 6e 5b 22  Until = dToken["
a120: 6e 4d 65 72 67 65 55 6e 74 69 6c 22 5d 3b 0a 20  nMergeUntil"];. 
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
a150: 20 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20           delete 
a160: 64 54 6f 6b 65 6e 5b 22 6e 4d 65 72 67 65 55 6e  dToken["nMergeUn
a170: 74 69 6c 22 5d 3b 0a 20 20 20 20 20 20 20 20 20  til"];.         
a180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a190: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
a1a0: 20 28 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50   (dToken.hasOwnP
a1b0: 72 6f 70 65 72 74 79 28 22 62 54 6f 52 65 6d 6f  roperty("bToRemo
a1c0: 76 65 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ve")) {.        
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a1e0: 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20  bDebug) {.      
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
a210: 20 52 45 4d 4f 56 45 44 3a 20 22 20 2b 20 64 54   REMOVED: " + dT
a220: 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b  oken["sValue"]);
a230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a250: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
a260: 73 53 65 6e 74 65 6e 63 65 20 3d 20 74 68 69 73  sSentence = this
a270: 2e 73 53 65 6e 74 65 6e 63 65 2e 73 6c 69 63 65  .sSentence.slice
a280: 28 30 2c 20 64 54 6f 6b 65 6e 5b 22 6e 53 74 61  (0, dToken["nSta
a290: 72 74 22 5d 29 20 2b 20 22 20 22 2e 72 65 70 65  rt"]) + " ".repe
a2a0: 61 74 28 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22  at(dToken["nEnd"
a2b0: 5d 20 2d 20 64 54 6f 6b 65 6e 5b 22 6e 53 74 61  ] - dToken["nSta
a2c0: 72 74 22 5d 29 20 2b 20 74 68 69 73 2e 73 53 65  rt"]) + this.sSe
a2d0: 6e 74 65 6e 63 65 2e 73 6c 69 63 65 28 64 54 6f  ntence.slice(dTo
a2e0: 6b 65 6e 5b 22 6e 45 6e 64 22 5d 29 3b 0a 20 20  ken["nEnd"]);.  
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 62 4b 65 65 70 54 6f 6b 65 6e 20 3d 20 66    bKeepToken = f
a310: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alse;.          
a320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a340: 20 20 2f 2f 0a 20 20 20 20 20 20 20 20 20 20 20    //.           
a350: 20 69 66 20 28 62 4b 65 65 70 54 6f 6b 65 6e 29   if (bKeepToken)
a360: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a370: 20 20 20 6c 4e 65 77 54 6f 6b 65 6e 2e 70 75 73     lNewToken.pus
a380: 68 28 64 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  h(dToken);.     
a390: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
a3a0: 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70  Token.hasOwnProp
a3b0: 65 72 74 79 28 22 73 4e 65 77 56 61 6c 75 65 22  erty("sNewValue"
a3c0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
a3d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65 77 72           // rewr
a3e0: 69 74 65 20 74 6f 6b 65 6e 20 61 6e 64 20 73 65  ite token and se
a3f0: 6e 74 65 6e 63 65 0a 20 20 20 20 20 20 20 20 20  ntence.         
a400: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
a410: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 64 54 6f   console.log(dTo
a440: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 20 2b 20  ken["sValue"] + 
a450: 22 20 2d 3e 20 22 20 2b 20 64 54 6f 6b 65 6e 5b  " -> " + dToken[
a460: 22 73 4e 65 77 56 61 6c 75 65 22 5d 29 3b 0a 20  "sNewValue"]);. 
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
a490: 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b           dToken[
a4a0: 22 73 52 65 61 6c 56 61 6c 75 65 22 5d 20 3d 20  "sRealValue"] = 
a4b0: 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d  dToken["sValue"]
a4c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a4d0: 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22 73 56        dToken["sV
a4e0: 61 6c 75 65 22 5d 20 3d 20 64 54 6f 6b 65 6e 5b  alue"] = dToken[
a4f0: 22 73 4e 65 77 56 61 6c 75 65 22 5d 3b 0a 20 20  "sNewValue"];.  
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 6e 44 69 66 66 4c 65 6e 20 3d 20 64 54 6f    nDiffLen = dTo
a520: 6b 65 6e 5b 22 73 52 65 61 6c 56 61 6c 75 65 22  ken["sRealValue"
a530: 5d 2e 6c 65 6e 67 74 68 20 2d 20 64 54 6f 6b 65  ].length - dToke
a540: 6e 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d 2e 6c  n["sNewValue"].l
a550: 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20 20  ength;.         
a560: 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 52             sNewR
a570: 65 70 6c 20 3d 20 28 6e 44 69 66 66 4c 65 6e 20  epl = (nDiffLen 
a580: 3e 3d 20 30 29 20 3f 20 64 54 6f 6b 65 6e 5b 22  >= 0) ? dToken["
a590: 73 4e 65 77 56 61 6c 75 65 22 5d 20 2b 20 22 20  sNewValue"] + " 
a5a0: 22 2e 72 65 70 65 61 74 28 6e 44 69 66 66 4c 65  ".repeat(nDiffLe
a5b0: 6e 29 20 3a 20 64 54 6f 6b 65 6e 5b 22 73 4e 65  n) : dToken["sNe
a5c0: 77 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28 30  wValue"].slice(0
a5d0: 2c 20 64 54 6f 6b 65 6e 5b 22 73 52 65 61 6c 56  , dToken["sRealV
a5e0: 61 6c 75 65 22 5d 2e 6c 65 6e 67 74 68 29 3b 0a  alue"].length);.
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74 65 6e      this.sSenten
a610: 63 65 20 3d 20 74 68 69 73 2e 73 53 65 6e 74 65  ce = this.sSente
a620: 6e 63 65 2e 73 6c 69 63 65 28 30 2c 64 54 6f 6b  nce.slice(0,dTok
a630: 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29 20 2b 20  en["nStart"]) + 
a640: 73 4e 65 77 52 65 70 6c 20 2b 20 74 68 69 73 2e  sNewRepl + this.
a650: 73 53 65 6e 74 65 6e 63 65 2e 73 6c 69 63 65 28  sSentence.slice(
a660: 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 29 3b  dToken["nEnd"]);
a670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a680: 20 20 20 20 20 64 65 6c 65 74 65 20 64 54 6f 6b       delete dTok
a690: 65 6e 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d 3b  en["sNewValue"];
a6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
a6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
a6d0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
a6e0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
a700: 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 64 65 6c  is.dTokenPos.del
a710: 65 74 65 28 64 54 6f 6b 65 6e 5b 22 6e 53 74 61  ete(dToken["nSta
a720: 72 74 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rt"]);.         
a730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a740: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
a750: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
a760: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
a770: 2e 6c 6f 67 28 74 68 69 73 2e 61 73 53 74 72 69  .log(this.asStri
a780: 6e 67 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ng());.         
a790: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
a7a0: 6c 65 2e 6c 6f 67 28 64 54 6f 6b 65 6e 29 3b 0a  le.log(dToken);.
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
a7d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a7e0: 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a    if (bDebug) {.
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
a800: 6f 6c 65 2e 6c 6f 67 28 22 20 20 54 45 58 54 20  ole.log("  TEXT 
a810: 52 45 57 52 49 54 45 44 3a 20 22 20 2b 20 74 68  REWRITED: " + th
a820: 69 73 2e 73 53 65 6e 74 65 6e 63 65 29 3b 0a 20  is.sSentence);. 
a830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a840: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 2e 63 6c 65   this.lToken.cle
a850: 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20 74 68  ar();.        th
a860: 69 73 2e 6c 54 6f 6b 65 6e 20 3d 20 6c 4e 65 77  is.lToken = lNew
a870: 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 0a 7d 3b  Token;.    }..};
a880: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 43 6f 6d 6d  ...//////// Comm
a890: 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 66 75  on functions..fu
a8a0: 6e 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 28 73  nction option (s
a8b0: 4f 70 74 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65  Opt) {.    // re
a8c0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 6f 70 74  turn true if opt
a8d0: 69 6f 6e 20 73 4f 70 74 20 69 73 20 61 63 74 69  ion sOpt is acti
a8e0: 76 65 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 64  ve.    return _d
a8f0: 4f 70 74 69 6f 6e 73 2e 67 65 74 28 73 4f 70 74  Options.get(sOpt
a900: 29 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20  );.}...//////// 
a910: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 67 65 74  functions to get
a920: 20 74 65 78 74 20 6f 75 74 73 69 64 65 20 70 61   text outside pa
a930: 74 74 65 72 6e 20 73 63 6f 70 65 0a 0a 2f 2f 20  ttern scope..// 
a940: 77 61 72 6e 69 6e 67 3a 20 63 68 65 63 6b 20 63  warning: check c
a950: 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 2e 70 79 20  ompile_rules.py 
a960: 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 68 6f  to understand ho
a970: 77 20 69 74 20 77 6f 72 6b 73 0a 0a 66 75 6e 63  w it works..func
a980: 74 69 6f 6e 20 6e 65 78 74 77 6f 72 64 20 28 73  tion nextword (s
a990: 2c 20 69 53 74 61 72 74 2c 20 6e 29 20 7b 0a 20  , iStart, n) {. 
a9a0: 20 20 20 2f 2f 20 67 65 74 20 74 68 65 20 6e 74     // get the nt
a9b0: 68 20 77 6f 72 64 20 6f 66 20 74 68 65 20 69 6e  h word of the in
a9c0: 70 75 74 20 73 74 72 69 6e 67 20 6f 72 20 65 6d  put string or em
a9d0: 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 6c  pty string.    l
a9e0: 65 74 20 7a 20 3d 20 6e 65 77 20 52 65 67 45 78  et z = new RegEx
a9f0: 70 28 22 5e 28 3f 3a 20 2b 5b 61 2d 7a c3 a0 2d  p("^(?: +[a-z..-
aa00: c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30  ..A-Z..-....-..0
aa10: 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d  -9..-....-.....-
aa20: ef ac 86 25 5f 2d 5d 2b 29 7b 22 20 2b 20 28 6e  ...%_-]+){" + (n
aa30: 2d 31 29 2e 74 6f 53 74 72 69 6e 67 28 29 20 2b  -1).toString() +
aa40: 20 22 7d 20 2b 28 5b 61 2d 7a c3 a0 2d c3 b6 41   "} +([a-z..-..A
aa50: 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3  -Z..-....-..0-9.
aa60: 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86  .-....-.....-...
aa70: 25 5f 2d 5d 2b 29 22 2c 20 22 69 67 22 29 3b 0a  %_-]+)", "ig");.
aa80: 20 20 20 20 6c 65 74 20 6d 20 3d 20 7a 2e 65 78      let m = z.ex
aa90: 65 63 28 73 2e 73 6c 69 63 65 28 69 53 74 61 72  ec(s.slice(iStar
aaa0: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29  t));.    if (!m)
aab0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
aac0: 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  n null;.    }.  
aad0: 20 20 72 65 74 75 72 6e 20 5b 69 53 74 61 72 74    return [iStart
aae0: 20 2b 20 7a 2e 6c 61 73 74 49 6e 64 65 78 20 2d   + z.lastIndex -
aaf0: 20 6d 5b 31 5d 2e 6c 65 6e 67 74 68 2c 20 6d 5b   m[1].length, m[
ab00: 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  1]];.}..function
ab10: 20 70 72 65 76 77 6f 72 64 20 28 73 2c 20 69 45   prevword (s, iE
ab20: 6e 64 2c 20 6e 29 20 7b 0a 20 20 20 20 2f 2f 20  nd, n) {.    // 
ab30: 67 65 74 20 74 68 65 20 28 2d 29 6e 74 68 20 77  get the (-)nth w
ab40: 6f 72 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ord of the input
ab50: 20 73 74 72 69 6e 67 20 6f 72 20 65 6d 70 74 79   string or empty
ab60: 20 73 74 72 69 6e 67 0a 20 20 20 20 6c 65 74 20   string.    let 
ab70: 7a 20 3d 20 6e 65 77 20 52 65 67 45 78 70 28 22  z = new RegExp("
ab80: 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d  ([a-z..-..A-Z..-
ab90: c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4  ....-..0-9..-...
aba0: 80 2d ca af ef ac 81 2d ef ac 86 25 5f 2d 5d 2b  .-.....-...%_-]+
abb0: 29 20 2b 28 3f 3a 5b 61 2d 7a c3 a0 2d c3 b6 41  ) +(?:[a-z..-..A
abc0: 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3  -Z..-....-..0-9.
abd0: 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86  .-....-.....-...
abe0: 25 5f 2d 5d 2b 20 2b 29 7b 22 20 2b 20 28 6e 2d  %_-]+ +){" + (n-
abf0: 31 29 2e 74 6f 53 74 72 69 6e 67 28 29 20 2b 20  1).toString() + 
ac00: 22 7d 24 22 2c 20 22 69 22 29 3b 0a 20 20 20 20  "}$", "i");.    
ac10: 6c 65 74 20 6d 20 3d 20 7a 2e 65 78 65 63 28 73  let m = z.exec(s
ac20: 2e 73 6c 69 63 65 28 30 2c 20 69 45 6e 64 29 29  .slice(0, iEnd))
ac30: 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20 7b 0a  ;.    if (!m) {.
ac40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
ac50: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ull;.    }.    r
ac60: 65 74 75 72 6e 20 5b 6d 2e 69 6e 64 65 78 2c 20  eturn [m.index, 
ac70: 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74 69  m[1]];.}..functi
ac80: 6f 6e 20 6e 65 78 74 77 6f 72 64 31 20 28 73 2c  on nextword1 (s,
ac90: 20 69 53 74 61 72 74 29 20 7b 0a 20 20 20 20 2f   iStart) {.    /
aca0: 2f 20 67 65 74 20 6e 65 78 74 20 77 6f 72 64 20  / get next word 
acb0: 28 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 29 0a 20  (optimization). 
acc0: 20 20 20 6c 65 74 20 5f 7a 4e 65 78 74 57 6f 72     let _zNextWor
acd0: 64 20 3d 20 6e 65 77 20 52 65 67 45 78 70 20 28  d = new RegExp (
ace0: 22 5e 20 2b 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d  "^ +([a-z..-..A-
acf0: 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98  Z..-....-..0-9..
ad00: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 5f  -....-.....-..._
ad10: 5d 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d  ][a-z..-..A-Z..-
ad20: c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4  ....-..0-9..-...
ad30: 80 2d ca af ef ac 81 2d ef ac 86 5f 2d 5d 2a 29  .-.....-..._-]*)
ad40: 22 2c 20 22 69 67 22 29 3b 0a 20 20 20 20 6c 65  ", "ig");.    le
ad50: 74 20 6d 20 3d 20 5f 7a 4e 65 78 74 57 6f 72 64  t m = _zNextWord
ad60: 2e 65 78 65 63 28 73 2e 73 6c 69 63 65 28 69 53  .exec(s.slice(iS
ad70: 74 61 72 74 29 29 3b 0a 20 20 20 20 69 66 20 28  tart));.    if (
ad80: 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  !m) {.        re
ad90: 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d  turn null;.    }
ada0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 69 53 74  .    return [iSt
adb0: 61 72 74 20 2b 20 5f 7a 4e 65 78 74 57 6f 72 64  art + _zNextWord
adc0: 2e 6c 61 73 74 49 6e 64 65 78 20 2d 20 6d 5b 31  .lastIndex - m[1
add0: 5d 2e 6c 65 6e 67 74 68 2c 20 6d 5b 31 5d 5d 3b  ].length, m[1]];
ade0: 0a 7d 0a 0a 63 6f 6e 73 74 20 5f 7a 50 72 65 76  .}..const _zPrev
adf0: 57 6f 72 64 20 3d 20 6e 65 77 20 52 65 67 45 78  Word = new RegEx
ae00: 70 20 28 22 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d  p ("([a-z..-..A-
ae10: 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98  Z..-....-..0-9..
ae20: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 5f  -....-.....-..._
ae30: 5d 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d  ][a-z..-..A-Z..-
ae40: c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4  ....-..0-9..-...
ae50: 80 2d ca af ef ac 81 2d ef ac 86 5f 2d 5d 2a 29  .-.....-..._-]*)
ae60: 20 2b 24 22 2c 20 22 69 22 29 3b 0a 0a 66 75 6e   +$", "i");..fun
ae70: 63 74 69 6f 6e 20 70 72 65 76 77 6f 72 64 31 20  ction prevword1 
ae80: 28 73 2c 20 69 45 6e 64 29 20 7b 0a 20 20 20 20  (s, iEnd) {.    
ae90: 2f 2f 20 67 65 74 20 70 72 65 76 69 6f 75 73 20  // get previous 
aea0: 77 6f 72 64 20 28 6f 70 74 69 6d 69 7a 61 74 69  word (optimizati
aeb0: 6f 6e 29 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20  on).    let m = 
aec0: 5f 7a 50 72 65 76 57 6f 72 64 2e 65 78 65 63 28  _zPrevWord.exec(
aed0: 73 2e 73 6c 69 63 65 28 30 2c 20 69 45 6e 64 29  s.slice(0, iEnd)
aee0: 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20 7b  );.    if (!m) {
aef0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
af00: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  null;.    }.    
af10: 72 65 74 75 72 6e 20 5b 6d 2e 69 6e 64 65 78 2c  return [m.index,
af20: 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74   m[1]];.}..funct
af30: 69 6f 6e 20 6c 6f 6f 6b 20 28 73 2c 20 7a 50 61  ion look (s, zPa
af40: 74 74 65 72 6e 2c 20 7a 4e 65 67 50 61 74 74 65  ttern, zNegPatte
af50: 72 6e 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 2f  rn=null) {.    /
af60: 2f 20 73 65 65 6b 20 7a 50 61 74 74 65 72 6e 20  / seek zPattern 
af70: 69 6e 20 73 20 28 62 65 66 6f 72 65 2f 61 66 74  in s (before/aft
af80: 65 72 2f 66 75 6c 6c 74 65 78 74 29 2c 20 69 66  er/fulltext), if
af90: 20 61 6e 74 69 70 61 74 74 65 72 6e 20 7a 4e 65   antipattern zNe
afa0: 67 50 61 74 74 65 72 6e 20 6e 6f 74 20 69 6e 20  gPattern not in 
afb0: 73 0a 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20  s.    try {.    
afc0: 20 20 20 20 69 66 20 28 7a 4e 65 67 50 61 74 74      if (zNegPatt
afd0: 65 72 6e 20 26 26 20 7a 4e 65 67 50 61 74 74 65  ern && zNegPatte
afe0: 72 6e 2e 74 65 73 74 28 73 29 29 20 7b 0a 20 20  rn.test(s)) {.  
aff0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b000: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
b010: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
b020: 20 7a 50 61 74 74 65 72 6e 2e 74 65 73 74 28 73   zPattern.test(s
b030: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74  );.    }.    cat
b040: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
b050: 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65   console.error(e
b060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
b070: 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75  urn false;.}..fu
b080: 6e 63 74 69 6f 6e 20 6c 6f 6f 6b 5f 63 68 6b 31  nction look_chk1
b090: 20 28 64 44 41 2c 20 73 2c 20 6e 4f 66 66 73 65   (dDA, s, nOffse
b0a0: 74 2c 20 7a 50 61 74 74 65 72 6e 2c 20 73 50 61  t, zPattern, sPa
b0b0: 74 74 65 72 6e 47 72 6f 75 70 31 2c 20 73 4e 65  tternGroup1, sNe
b0c0: 67 50 61 74 74 65 72 6e 47 72 6f 75 70 31 3d 6e  gPatternGroup1=n
b0d0: 75 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65  ull) {.    // re
b0e0: 74 75 72 6e 73 20 54 72 75 65 20 69 66 20 73 20  turns True if s 
b0f0: 68 61 73 20 70 61 74 74 65 72 6e 20 7a 50 61 74  has pattern zPat
b100: 74 65 72 6e 20 61 6e 64 20 6d 2e 67 72 6f 75 70  tern and m.group
b110: 28 31 29 20 68 61 73 20 70 61 74 74 65 72 6e 20  (1) has pattern 
b120: 73 50 61 74 74 65 72 6e 47 72 6f 75 70 31 0a 20  sPatternGroup1. 
b130: 20 20 20 6c 65 74 20 6d 20 3d 20 7a 50 61 74 74     let m = zPatt
b140: 65 72 6e 2e 67 6c 5f 65 78 65 63 32 28 73 2c 20  ern.gl_exec2(s, 
b150: 6e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 21  null);.    if (!
b160: 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m) {.        ret
b170: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
b180: 0a 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20  .    try {.     
b190: 20 20 20 6c 65 74 20 73 57 6f 72 64 20 3d 20 6d     let sWord = m
b1a0: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  [1];.        let
b1b0: 20 6e 50 6f 73 20 3d 20 6d 2e 73 74 61 72 74 5b   nPos = m.start[
b1c0: 31 5d 20 2b 20 6e 4f 66 66 73 65 74 3b 0a 20 20  1] + nOffset;.  
b1d0: 20 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61        if (sNegPa
b1e0: 74 74 65 72 6e 47 72 6f 75 70 31 29 20 7b 0a 20  tternGroup1) {. 
b1f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
b200: 6e 20 6d 6f 72 70 68 65 78 28 64 44 41 2c 20 5b  n morphex(dDA, [
b210: 6e 50 6f 73 2c 20 73 57 6f 72 64 5d 2c 20 73 50  nPos, sWord], sP
b220: 61 74 74 65 72 6e 47 72 6f 75 70 31 2c 20 73 4e  atternGroup1, sN
b230: 65 67 50 61 74 74 65 72 6e 47 72 6f 75 70 31 29  egPatternGroup1)
b240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b250: 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 72 70 68      return morph
b260: 28 64 44 41 2c 20 5b 6e 50 6f 73 2c 20 73 57 6f  (dDA, [nPos, sWo
b270: 72 64 5d 2c 20 73 50 61 74 74 65 72 6e 47 72 6f  rd], sPatternGro
b280: 75 70 31 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20  up1, false);.   
b290: 20 7d 0a 20 20 20 20 63 61 74 63 68 20 28 65 29   }.    catch (e)
b2a0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f   {.        conso
b2b0: 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20  le.error(e);.   
b2c0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
b2d0: 65 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f 2f  e;.    }.}...///
b2e0: 2f 2f 2f 2f 2f 20 41 6e 61 6c 79 73 65 20 67 72  ///// Analyse gr
b2f0: 6f 75 70 73 20 66 6f 72 20 72 65 67 65 78 20 72  oups for regex r
b300: 75 6c 65 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 64  ules..function d
b310: 69 73 70 6c 61 79 49 6e 66 6f 20 28 64 54 6f 6b  isplayInfo (dTok
b320: 65 6e 50 6f 73 2c 20 61 57 6f 72 64 29 20 7b 0a  enPos, aWord) {.
b330: 20 20 20 20 2f 2f 20 66 6f 72 20 64 65 62 75 67      // for debug
b340: 67 69 6e 67 3a 20 69 6e 66 6f 20 6f 66 20 77 6f  ging: info of wo
b350: 72 64 0a 20 20 20 20 69 66 20 28 21 61 57 6f 72  rd.    if (!aWor
b360: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d) {.        con
b370: 73 6f 6c 65 2e 6c 6f 67 28 22 3e 20 6e 6f 74 68  sole.log("> noth
b380: 69 6e 67 20 74 6f 20 66 69 6e 64 22 29 3b 0a 20  ing to find");. 
b390: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
b3a0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  ue;.    }.    le
b3b0: 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65  t lMorph = _oSpe
b3c0: 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72  llChecker.getMor
b3d0: 70 68 28 61 57 6f 72 64 5b 31 5d 29 3b 0a 20 20  ph(aWord[1]);.  
b3e0: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e    if (lMorph.len
b3f0: 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20 20  gth === 0) {.   
b400: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
b410: 28 22 3e 20 6e 6f 74 20 69 6e 20 64 69 63 74 69  ("> not in dicti
b420: 6f 6e 61 72 79 22 29 3b 0a 20 20 20 20 20 20 20  onary");.       
b430: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
b440: 20 20 7d 0a 20 20 20 20 69 66 20 28 64 54 6f 6b    }.    if (dTok
b450: 65 6e 50 6f 73 2e 68 61 73 28 61 57 6f 72 64 5b  enPos.has(aWord[
b460: 30 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 63  0])) {.        c
b470: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 44 41 3a 20  onsole.log("DA: 
b480: 22 20 2b 20 64 54 6f 6b 65 6e 50 6f 73 2e 67 65  " + dTokenPos.ge
b490: 74 28 61 57 6f 72 64 5b 30 5d 29 29 3b 0a 20 20  t(aWord[0]));.  
b4a0: 20 20 7d 0a 20 20 20 20 63 6f 6e 73 6f 6c 65 2e    }.    console.
b4b0: 6c 6f 67 28 22 46 53 41 3a 20 22 20 2b 20 6c 4d  log("FSA: " + lM
b4c0: 6f 72 70 68 29 3b 0a 20 20 20 20 72 65 74 75 72  orph);.    retur
b4d0: 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74  n true;.}..funct
b4e0: 69 6f 6e 20 6d 6f 72 70 68 20 28 64 54 6f 6b 65  ion morph (dToke
b4f0: 6e 50 6f 73 2c 20 61 57 6f 72 64 2c 20 73 50 61  nPos, aWord, sPa
b500: 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65  ttern, sNegPatte
b510: 72 6e 2c 20 62 4e 6f 57 6f 72 64 3d 66 61 6c 73  rn, bNoWord=fals
b520: 65 29 20 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c  e) {.    // anal
b530: 79 73 65 20 61 20 74 75 70 6c 65 20 28 70 6f 73  yse a tuple (pos
b540: 69 74 69 6f 6e 2c 20 77 6f 72 64 29 2c 20 72 65  ition, word), re
b550: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6e 6f  turns true if no
b560: 74 20 73 4e 65 67 50 61 74 74 65 72 6e 20 69 6e  t sNegPattern in
b570: 20 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69   word morphologi
b580: 65 73 20 61 6e 64 20 73 50 61 74 74 65 72 6e 20  es and sPattern 
b590: 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f  in word morpholo
b5a0: 67 69 65 73 20 28 64 69 73 61 6d 62 69 67 75 61  gies (disambigua
b5b0: 74 69 6f 6e 20 6f 6e 29 0a 20 20 20 20 69 66 20  tion on).    if 
b5c0: 28 21 61 57 6f 72 64 29 20 7b 0a 20 20 20 20 20  (!aWord) {.     
b5d0: 20 20 20 72 65 74 75 72 6e 20 62 4e 6f 57 6f 72     return bNoWor
b5e0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74  d;.    }.    let
b5f0: 20 6c 4d 6f 72 70 68 20 3d 20 28 64 54 6f 6b 65   lMorph = (dToke
b600: 6e 50 6f 73 2e 68 61 73 28 61 57 6f 72 64 5b 30  nPos.has(aWord[0
b610: 5d 29 20 20 26 26 20 20 64 54 6f 6b 65 6e 50 6f  ])  &&  dTokenPo
b620: 73 2e 67 65 74 28 61 57 6f 72 64 5b 30 5d 29 29  s.get(aWord[0]))
b630: 2e 68 61 73 28 22 6c 4d 6f 72 70 68 22 29 20 3f  .has("lMorph") ?
b640: 20 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28 61   dTokenPos.get(a
b650: 57 6f 72 64 5b 30 5d 29 5b 22 6c 4d 6f 72 70 68  Word[0])["lMorph
b660: 22 5d 20 3a 20 5f 6f 53 70 65 6c 6c 43 68 65 63  "] : _oSpellChec
b670: 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 61 57 6f  ker.getMorph(aWo
b680: 72 64 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28  rd[1]);.    if (
b690: 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d  lMorph.length ==
b6a0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72  = 0) {.        r
b6b0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
b6c0: 20 7d 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50   }.    if (sNegP
b6d0: 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20  attern) {.      
b6e0: 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61 74    // check negat
b6f0: 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20  ive condition.  
b700: 20 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61        if (sNegPa
b710: 74 74 65 72 6e 20 3d 3d 3d 20 22 2a 22 29 20 7b  ttern === "*") {
b720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
b730: 61 6c 6c 20 6d 6f 72 70 68 20 6d 75 73 74 20 6d  all morph must m
b740: 61 74 63 68 20 73 50 61 74 74 65 72 6e 0a 20 20  atch sPattern.  
b750: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b760: 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d   lMorph.every(sM
b770: 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70  orph  =>  (sMorp
b780: 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  h.search(sPatter
b790: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20  n) !== -1));.   
b7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
b7b0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
b7c0: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d    if (lMorph.som
b7d0: 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73  e(sMorph  =>  (s
b7e0: 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65  Morph.search(sNe
b7f0: 67 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  gPattern) !== -1
b800: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ))) {.          
b810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
b820: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
b830: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b840: 7d 0a 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20  }.    // search 
b850: 73 50 61 74 74 65 72 6e 0a 20 20 20 20 72 65 74  sPattern.    ret
b860: 75 72 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28  urn lMorph.some(
b870: 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f  sMorph  =>  (sMo
b880: 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74 74  rph.search(sPatt
b890: 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d  ern) !== -1));.}
b8a0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 61 6e 61 6c 79  ..function analy
b8b0: 73 65 20 28 73 57 6f 72 64 2c 20 73 50 61 74 74  se (sWord, sPatt
b8c0: 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e  ern, sNegPattern
b8d0: 29 20 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79  ) {.    // analy
b8e0: 73 65 20 61 20 77 6f 72 64 2c 20 72 65 74 75 72  se a word, retur
b8f0: 6e 73 20 54 72 75 65 20 69 66 20 6e 6f 74 20 73  ns True if not s
b900: 4e 65 67 50 61 74 74 65 72 6e 20 69 6e 20 77 6f  NegPattern in wo
b910: 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  rd morphologies 
b920: 61 6e 64 20 73 50 61 74 74 65 72 6e 20 69 6e 20  and sPattern in 
b930: 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65  word morphologie
b940: 73 20 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f  s (disambiguatio
b950: 6e 20 6f 66 66 29 0a 20 20 20 20 6c 65 74 20 6c  n off).    let l
b960: 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43  Morph = _oSpellC
b970: 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28  hecker.getMorph(
b980: 73 57 6f 72 64 29 3b 0a 20 20 20 20 69 66 20 28  sWord);.    if (
b990: 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d  lMorph.length ==
b9a0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72  = 0) {.        r
b9b0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
b9c0: 20 7d 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50   }.    if (sNegP
b9d0: 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20  attern) {.      
b9e0: 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61 74    // check negat
b9f0: 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20  ive condition.  
ba00: 20 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61        if (sNegPa
ba10: 74 74 65 72 6e 20 3d 3d 3d 20 22 2a 22 29 20 7b  ttern === "*") {
ba20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
ba30: 61 6c 6c 20 6d 6f 72 70 68 20 6d 75 73 74 20 6d  all morph must m
ba40: 61 74 63 68 20 73 50 61 74 74 65 72 6e 0a 20 20  atch sPattern.  
ba50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ba60: 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d   lMorph.every(sM
ba70: 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70  orph  =>  (sMorp
ba80: 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  h.search(sPatter
ba90: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20  n) !== -1));.   
baa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
bab0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
bac0: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d    if (lMorph.som
bad0: 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73  e(sMorph  =>  (s
bae0: 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65  Morph.search(sNe
baf0: 67 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  gPattern) !== -1
bb00: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ))) {.          
bb10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
bb20: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
bb30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
bb40: 7d 0a 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20  }.    // search 
bb50: 73 50 61 74 74 65 72 6e 0a 20 20 20 20 72 65 74  sPattern.    ret
bb60: 75 72 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28  urn lMorph.some(
bb70: 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f  sMorph  =>  (sMo
bb80: 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74 74  rph.search(sPatt
bb90: 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d  ern) !== -1));.}
bba0: 0a 0a 0a 2f 2f 2f 2f 20 41 6e 61 6c 79 73 65 20  ...//// Analyse 
bbb0: 74 6f 6b 65 6e 73 20 66 6f 72 20 67 72 61 70 68  tokens for graph
bbc0: 20 72 75 6c 65 73 0a 0a 66 75 6e 63 74 69 6f 6e   rules..function
bbd0: 20 67 5f 76 61 6c 75 65 20 28 64 54 6f 6b 65 6e   g_value (dToken
bbe0: 2c 20 73 56 61 6c 75 65 73 2c 20 6e 4c 65 66 74  , sValues, nLeft
bbf0: 3d 6e 75 6c 6c 2c 20 6e 52 69 67 68 74 3d 6e 75  =null, nRight=nu
bc00: 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 74 65 73  ll) {.    // tes
bc10: 74 20 69 66 20 3c 64 54 6f 6b 65 6e 5b 27 73 56  t if <dToken['sV
bc20: 61 6c 75 65 27 5d 3e 20 69 73 20 69 6e 20 73 56  alue']> is in sV
bc30: 61 6c 75 65 73 20 28 65 61 63 68 20 76 61 6c 75  alues (each valu
bc40: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 70 61  e should be sepa
bc50: 72 61 74 65 64 20 77 69 74 68 20 7c 29 0a 20 20  rated with |).  
bc60: 20 20 6c 65 74 20 73 56 61 6c 75 65 20 3d 20 28    let sValue = (
bc70: 6e 4c 65 66 74 20 3d 3d 3d 20 6e 75 6c 6c 29 20  nLeft === null) 
bc80: 3f 20 22 7c 22 2b 64 54 6f 6b 65 6e 5b 22 73 56  ? "|"+dToken["sV
bc90: 61 6c 75 65 22 5d 2b 22 7c 22 20 3a 20 22 7c 22  alue"]+"|" : "|"
bca0: 2b 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  +dToken["sValue"
bcb0: 5d 2e 73 6c 69 63 65 28 6e 4c 65 66 74 2c 20 6e  ].slice(nLeft, n
bcc0: 52 69 67 68 74 29 2b 22 7c 22 3b 0a 20 20 20 20  Right)+"|";.    
bcd0: 69 66 20 28 73 56 61 6c 75 65 73 2e 69 6e 63 6c  if (sValues.incl
bce0: 75 64 65 73 28 73 56 61 6c 75 65 73 29 29 20 7b  udes(sValues)) {
bcf0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bd00: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
bd10: 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  if (dToken["sVal
bd20: 75 65 22 5d 2e 73 6c 69 63 65 28 30 2c 32 29 2e  ue"].slice(0,2).
bd30: 67 6c 5f 69 73 54 69 74 6c 65 28 29 29 20 7b 20  gl_isTitle()) { 
bd40: 2f 2f 20 77 65 20 74 65 73 74 20 6f 6e 6c 79 20  // we test only 
bd50: 32 20 66 69 72 73 74 20 63 68 61 72 73 2c 20 74  2 first chars, t
bd60: 6f 20 6d 61 6b 65 20 76 61 6c 69 64 20 77 6f 72  o make valid wor
bd70: 64 73 20 73 75 63 68 20 61 73 20 22 4c 61 69 73  ds such as "Lais
bd80: 73 65 7a 2d 6c 65 73 22 2c 20 22 50 61 73 73 65  sez-les", "Passe
bd90: 2d 70 61 72 74 6f 75 74 22 2e 0a 20 20 20 20 20  -partout"..     
bda0: 20 20 20 69 66 20 28 73 56 61 6c 75 65 73 2e 69     if (sValues.i
bdb0: 6e 63 6c 75 64 65 73 28 73 56 61 6c 75 65 2e 74  ncludes(sValue.t
bdc0: 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 29 20 7b  oLowerCase())) {
bdd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
bde0: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20  urn true;.      
bdf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
be00: 73 65 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73  se if (dToken["s
be10: 56 61 6c 75 65 22 5d 2e 67 6c 5f 69 73 55 70 70  Value"].gl_isUpp
be20: 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20  erCase()) {.    
be30: 20 20 20 20 2f 2f 69 66 20 73 56 61 6c 75 65 2e      //if sValue.
be40: 6c 6f 77 65 72 28 29 20 69 6e 20 73 56 61 6c 75  lower() in sValu
be50: 65 73 3a 0a 20 20 20 20 20 20 20 20 2f 2f 20 20  es:.        //  
be60: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
be70: 20 20 20 20 20 20 20 73 56 61 6c 75 65 20 3d 20         sValue = 
be80: 22 7c 22 2b 73 56 61 6c 75 65 2e 73 6c 69 63 65  "|"+sValue.slice
be90: 28 31 29 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c  (1).gl_toCapital
bea0: 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ize();.        i
beb0: 66 20 28 73 56 61 6c 75 65 73 2e 69 6e 63 6c 75  f (sValues.inclu
bec0: 64 65 73 28 73 56 61 6c 75 65 29 29 20 7b 0a 20  des(sValue)) {. 
bed0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
bee0: 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  n true;.        
bef0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
bf00: 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e  rn false;.}..fun
bf10: 63 74 69 6f 6e 20 67 5f 6d 6f 72 70 68 20 28 64  ction g_morph (d
bf20: 54 6f 6b 65 6e 2c 20 73 50 61 74 74 65 72 6e 2c  Token, sPattern,
bf30: 20 73 4e 65 67 50 61 74 74 65 72 6e 3d 22 22 2c   sNegPattern="",
bf40: 20 6e 4c 65 66 74 3d 6e 75 6c 6c 2c 20 6e 52 69   nLeft=null, nRi
bf50: 67 68 74 3d 6e 75 6c 6c 2c 20 62 4d 65 6d 6f 72  ght=null, bMemor
bf60: 69 7a 65 4d 6f 72 70 68 3d 74 72 75 65 29 20 7b  izeMorph=true) {
bf70: 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20  .    // analyse 
bf80: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
bf90: 54 72 75 65 20 69 66 20 3c 73 4e 65 67 50 61 74  True if <sNegPat
bfa0: 74 65 72 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f 72  tern> not in mor
bfb0: 70 68 6f 6c 6f 67 69 65 73 20 61 6e 64 20 3c 73  phologies and <s
bfc0: 50 61 74 74 65 72 6e 3e 20 69 6e 20 6d 6f 72 70  Pattern> in morp
bfd0: 68 6f 6c 6f 67 69 65 73 0a 20 20 20 20 6c 65 74  hologies.    let
bfe0: 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 69 66 20   lMorph;.    if 
bff0: 28 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72  (dToken.hasOwnPr
c000: 6f 70 65 72 74 79 28 22 6c 4d 6f 72 70 68 22 29  operty("lMorph")
c010: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 4d 6f 72  ) {.        lMor
c020: 70 68 20 3d 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f  ph = dToken["lMo
c030: 72 70 68 22 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rph"];.    }.   
c040: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
c050: 69 66 20 28 6e 4c 65 66 74 20 21 3d 3d 20 6e 75  if (nLeft !== nu
c060: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
c070: 20 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65    lMorph = _oSpe
c080: 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72  llChecker.getMor
c090: 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75  ph(dToken["sValu
c0a0: 65 22 5d 2e 73 6c 69 63 65 28 6e 4c 65 66 74 2c  e"].slice(nLeft,
c0b0: 20 6e 52 69 67 68 74 29 29 3b 0a 20 20 20 20 20   nRight));.     
c0c0: 20 20 20 20 20 20 20 69 66 20 28 62 4d 65 6d 6f         if (bMemo
c0d0: 72 69 7a 65 4d 6f 72 70 68 29 20 7b 0a 20 20 20  rizeMorph) {.   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f               dTo
c0f0: 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20  ken["lMorph"] = 
c100: 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 20 20 20 20  lMorph;.        
c110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
c120: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
c130: 20 20 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70     lMorph = _oSp
c140: 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f  ellChecker.getMo
c150: 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  rph(dToken["sVal
c160: 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  ue"]);.        }
c170: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6c  .    }.    if (l
c180: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 20  Morph.length == 
c190: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
c1a0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
c1b0: 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65  .    // check ne
c1c0: 67 61 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e  gative condition
c1d0: 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74  .    if (sNegPat
c1e0: 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tern) {.        
c1f0: 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20  if (sNegPattern 
c200: 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20  == "*") {.      
c210: 20 20 20 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72        // all mor
c220: 70 68 20 6d 75 73 74 20 6d 61 74 63 68 20 73 50  ph must match sP
c230: 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20  attern.         
c240: 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68     return lMorph
c250: 2e 65 76 65 72 79 28 73 4d 6f 72 70 68 20 20 3d  .every(sMorph  =
c260: 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63  >  (sMorph.searc
c270: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
c280: 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  -1));.        }.
c290: 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20          else {. 
c2a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c             if (l
c2b0: 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70  Morph.some(sMorp
c2c0: 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73  h  =>  (sMorph.s
c2d0: 65 61 72 63 68 28 73 4e 65 67 50 61 74 74 65 72  earch(sNegPatter
c2e0: 6e 29 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20  n) !== -1))) {. 
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
c300: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
c310: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
c330: 2f 20 73 65 61 72 63 68 20 73 50 61 74 74 65 72  / search sPatter
c340: 6e 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f  n.    return lMo
c350: 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20  rph.some(sMorph 
c360: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
c370: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
c380: 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74  = -1));.}..funct
c390: 69 6f 6e 20 67 5f 61 6e 61 6c 79 73 65 20 28 64  ion g_analyse (d
c3a0: 54 6f 6b 65 6e 2c 20 73 50 61 74 74 65 72 6e 2c  Token, sPattern,
c3b0: 20 73 4e 65 67 50 61 74 74 65 72 6e 3d 22 22 2c   sNegPattern="",
c3c0: 20 6e 4c 65 66 74 3d 6e 75 6c 6c 2c 20 6e 52 69   nLeft=null, nRi
c3d0: 67 68 74 3d 6e 75 6c 6c 2c 20 62 4d 65 6d 6f 72  ght=null, bMemor
c3e0: 69 7a 65 4d 6f 72 70 68 3d 74 72 75 65 29 20 7b  izeMorph=true) {
c3f0: 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20  .    // analyse 
c400: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
c410: 54 72 75 65 20 69 66 20 3c 73 4e 65 67 50 61 74  True if <sNegPat
c420: 74 65 72 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f 72  tern> not in mor
c430: 70 68 6f 6c 6f 67 69 65 73 20 61 6e 64 20 3c 73  phologies and <s
c440: 50 61 74 74 65 72 6e 3e 20 69 6e 20 6d 6f 72 70  Pattern> in morp
c450: 68 6f 6c 6f 67 69 65 73 0a 20 20 20 20 69 66 20  hologies.    if 
c460: 28 6e 4c 65 66 74 20 21 3d 3d 20 6e 75 6c 6c 29  (nLeft !== null)
c470: 20 7b 0a 20 20 20 20 20 20 20 20 6c 4d 6f 72 70   {.        lMorp
c480: 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b  h = _oSpellCheck
c490: 65 72 2e 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b  er.getMorph(dTok
c4a0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 6c 69  en["sValue"].sli
c4b0: 63 65 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  ce(nLeft, nRight
c4c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ));.        if (
c4d0: 62 4d 65 6d 6f 72 69 7a 65 4d 6f 72 70 68 29 20  bMemorizeMorph) 
c4e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 54  {.            dT
c4f0: 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d  oken["lMorph"] =
c500: 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 20 20 20   lMorph;.       
c510: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
c520: 20 20 20 20 20 20 20 20 6c 4d 6f 72 70 68 20 3d          lMorph =
c530: 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e   _oSpellChecker.
c540: 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 5b  getMorph(dToken[
c550: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
c560: 7d 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68  }.    if (lMorph
c570: 2e 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b 0a  .length == 0) {.
c580: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
c590: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
c5a0: 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61 74 69 76  // check negativ
c5b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20  e condition.    
c5c0: 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 29  if (sNegPattern)
c5d0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73   {.        if (s
c5e0: 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d 20 22 2a  NegPattern == "*
c5f0: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
c600: 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68 20 6d 75   // all morph mu
c610: 73 74 20 6d 61 74 63 68 20 73 50 61 74 74 65 72  st match sPatter
c620: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  n.            re
c630: 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 65 76 65 72  turn lMorph.ever
c640: 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73  y(sMorph  =>  (s
c650: 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50 61  Morph.search(sPa
c660: 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b  ttern) !== -1));
c670: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c680: 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
c690: 20 20 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68        if (lMorph
c6a0: 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e  .some(sMorph  =>
c6b0: 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68    (sMorph.search
c6c0: 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20 21 3d  (sNegPattern) !=
c6d0: 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20  = -1))) {.      
c6e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c6f0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
c700: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c710: 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20 73 65 61      }.    // sea
c720: 72 63 68 20 73 50 61 74 74 65 72 6e 0a 20 20 20  rch sPattern.   
c730: 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 73   return lMorph.s
c740: 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20  ome(sMorph  =>  
c750: 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73  (sMorph.search(s
c760: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
c770: 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67  );.}..function g
c780: 5f 6d 65 72 67 65 64 5f 61 6e 61 6c 79 73 65 20  _merged_analyse 
c790: 28 64 54 6f 6b 65 6e 31 2c 20 64 54 6f 6b 65 6e  (dToken1, dToken
c7a0: 32 2c 20 63 4d 65 72 67 65 72 2c 20 73 50 61 74  2, cMerger, sPat
c7b0: 74 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72  tern, sNegPatter
c7c0: 6e 3d 22 22 2c 20 62 53 65 74 4d 6f 72 70 68 3d  n="", bSetMorph=
c7d0: 74 72 75 65 29 20 7b 0a 20 20 20 20 2f 2f 20 6d  true) {.    // m
c7e0: 65 72 67 65 20 74 77 6f 20 74 6f 6b 65 6e 20 76  erge two token v
c7f0: 61 6c 75 65 73 2c 20 72 65 74 75 72 6e 20 54 72  alues, return Tr
c800: 75 65 20 69 66 20 3c 73 4e 65 67 50 61 74 74 65  ue if <sNegPatte
c810: 72 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f 72 70 68  rn> not in morph
c820: 6f 6c 6f 67 69 65 73 20 61 6e 64 20 3c 73 50 61  ologies and <sPa
c830: 74 74 65 72 6e 3e 20 69 6e 20 6d 6f 72 70 68 6f  ttern> in morpho
c840: 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62 69 67  logies (disambig
c850: 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20 20 20 20  uation off).    
c860: 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53  let lMorph = _oS
c870: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d  pellChecker.getM
c880: 6f 72 70 68 28 64 54 6f 6b 65 6e 31 5b 22 73 56  orph(dToken1["sV
c890: 61 6c 75 65 22 5d 20 2b 20 63 4d 65 72 67 65 72  alue"] + cMerger
c8a0: 20 2b 20 64 54 6f 6b 65 6e 32 5b 22 73 56 61 6c   + dToken2["sVal
c8b0: 75 65 22 5d 29 3b 0a 20 20 20 20 69 66 20 28 6c  ue"]);.    if (l
c8c0: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 20  Morph.length == 
c8d0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
c8e0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
c8f0: 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65  .    // check ne
c900: 67 61 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e  gative condition
c910: 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74  .    if (sNegPat
c920: 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tern) {.        
c930: 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20  if (sNegPattern 
c940: 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20  == "*") {.      
c950: 20 20 20 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72        // all mor
c960: 70 68 20 6d 75 73 74 20 6d 61 74 63 68 20 73 50  ph must match sP
c970: 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20  attern.         
c980: 20 20 20 6c 65 74 20 62 52 65 73 75 6c 74 20 3d     let bResult =
c990: 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d   lMorph.every(sM
c9a0: 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70  orph  =>  (sMorp
c9b0: 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  h.search(sPatter
c9c0: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20  n) !== -1));.   
c9d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 52 65           if (bRe
c9e0: 73 75 6c 74 20 26 26 20 62 53 65 74 4d 6f 72 70  sult && bSetMorp
c9f0: 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h) {.           
ca00: 20 20 20 20 20 64 54 6f 6b 65 6e 31 5b 22 6c 4d       dToken1["lM
ca10: 6f 72 70 68 22 5d 20 3d 20 6c 4d 6f 72 70 68 3b  orph"] = lMorph;
ca20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ca30: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
ca40: 6e 20 62 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  n bResult;.     
ca50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
ca60: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
ca70: 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28  if (lMorph.some(
ca80: 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f  sMorph  =>  (sMo
ca90: 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65 67 50  rph.search(sNegP
caa0: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29  attern) !== -1))
cab0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
cac0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
cad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
cae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
caf0: 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50      // search sP
cb00: 61 74 74 65 72 6e 0a 20 20 20 20 6c 65 74 20 62  attern.    let b
cb10: 52 65 73 75 6c 74 20 3d 20 6c 4d 6f 72 70 68 2e  Result = lMorph.
cb20: 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20  some(sMorph  => 
cb30: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
cb40: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
cb50: 29 29 3b 0a 20 20 20 20 69 66 20 28 62 52 65 73  ));.    if (bRes
cb60: 75 6c 74 20 26 26 20 62 53 65 74 4d 6f 72 70 68  ult && bSetMorph
cb70: 29 20 7b 0a 20 20 20 20 20 20 20 20 64 54 6f 6b  ) {.        dTok
cb80: 65 6e 31 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20  en1["lMorph"] = 
cb90: 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 7d 0a 20 20  lMorph;.    }.  
cba0: 20 20 72 65 74 75 72 6e 20 62 52 65 73 75 6c 74    return bResult
cbb0: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f  ;.}..function g_
cbc0: 74 61 67 5f 62 65 66 6f 72 65 20 28 64 54 6f 6b  tag_before (dTok
cbd0: 65 6e 2c 20 64 54 61 67 73 2c 20 73 54 61 67 29  en, dTags, sTag)
cbe0: 20 7b 0a 20 20 20 20 69 66 20 28 64 54 61 67 73   {.    if (dTags
cbf0: 2e 68 61 73 28 73 54 61 67 29 29 20 7b 0a 20 20  .has(sTag)) {.  
cc00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
cc10: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
cc20: 20 28 64 54 6f 6b 65 6e 5b 22 69 22 5d 20 3e 20   (dToken["i"] > 
cc30: 64 54 61 67 73 5b 73 54 61 67 5d 5b 30 5d 29 20  dTags[sTag][0]) 
cc40: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
cc50: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20   true;.    }.   
cc60: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d   return false;.}
cc70: 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 74 61 67  ..function g_tag
cc80: 5f 61 66 74 65 72 20 28 64 54 6f 6b 65 6e 2c 20  _after (dToken, 
cc90: 64 54 61 67 73 2c 20 73 54 61 67 29 20 7b 0a 20  dTags, sTag) {. 
cca0: 20 20 20 69 66 20 28 64 54 61 67 73 2e 68 61 73     if (dTags.has
ccb0: 28 73 54 61 67 29 29 20 7b 0a 20 20 20 20 20 20  (sTag)) {.      
ccc0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
ccd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 64 54      }.    if (dT
cce0: 6f 6b 65 6e 5b 22 69 22 5d 20 3c 20 64 54 61 67  oken["i"] < dTag
ccf0: 73 5b 73 54 61 67 5d 5b 31 5d 29 20 7b 0a 20 20  s[sTag][1]) {.  
cd00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
cd10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
cd20: 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75  urn false;.}..fu
cd30: 6e 63 74 69 6f 6e 20 67 5f 74 61 67 20 28 64 54  nction g_tag (dT
cd40: 6f 6b 65 6e 2c 20 73 54 61 67 29 20 7b 0a 20 20  oken, sTag) {.  
cd50: 20 20 72 65 74 75 72 6e 20 64 54 6f 6b 65 6e 2e    return dToken.
cd60: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22  hasOwnProperty("
cd70: 74 61 67 73 22 29 20 26 26 20 64 54 6f 6b 65 6e  tags") && dToken
cd80: 5b 22 74 61 67 73 22 5d 2e 68 61 73 28 73 54 61  ["tags"].has(sTa
cd90: 67 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  g);.}..function 
cda0: 67 5f 73 70 61 63 65 5f 62 65 74 77 65 65 6e 5f  g_space_between_
cdb0: 74 6f 6b 65 6e 73 20 28 64 54 6f 6b 65 6e 31 2c  tokens (dToken1,
cdc0: 20 64 54 6f 6b 65 6e 32 2c 20 6e 4d 69 6e 2c 20   dToken2, nMin, 
cdd0: 6e 4d 61 78 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20  nMax=null) {.   
cde0: 20 6c 65 74 20 6e 53 70 61 63 65 20 3d 20 64 54   let nSpace = dT
cdf0: 6f 6b 65 6e 32 5b 22 6e 53 74 61 72 74 22 5d 20  oken2["nStart"] 
ce00: 2d 20 64 54 6f 6b 65 6e 31 5b 22 6e 45 6e 64 22  - dToken1["nEnd"
ce10: 5d 0a 20 20 20 20 69 66 20 28 6e 53 70 61 63 65  ].    if (nSpace
ce20: 20 3c 20 6e 4d 69 6e 29 20 7b 0a 20 20 20 20 20   < nMin) {.     
ce30: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
ce40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e  .    }.    if (n
ce50: 4d 61 78 20 21 3d 3d 20 6e 75 6c 6c 20 26 26 20  Max !== null && 
ce60: 6e 53 70 61 63 65 20 3e 20 6e 4d 61 78 29 20 7b  nSpace > nMax) {
ce70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ce80: 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  false;.    }.   
ce90: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a   return true;.}.
cea0: 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 74 6f 6b 65  .function g_toke
ceb0: 6e 20 28 6c 54 6f 6b 65 6e 2c 20 69 29 20 7b 0a  n (lToken, i) {.
cec0: 20 20 20 20 69 66 20 28 69 20 3c 20 30 29 20 7b      if (i < 0) {
ced0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cee0: 6c 54 6f 6b 65 6e 5b 30 5d 3b 0a 20 20 20 20 7d  lToken[0];.    }
cef0: 0a 20 20 20 20 69 66 20 28 69 20 3e 3d 20 6c 54  .    if (i >= lT
cf00: 6f 6b 65 6e 2e 6c 65 6e 67 74 68 29 20 7b 0a 20  oken.length) {. 
cf10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 54         return lT
cf20: 6f 6b 65 6e 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a  oken[-1];.    }.
cf30: 20 20 20 20 72 65 74 75 72 6e 20 6c 54 6f 6b 65      return lToke
cf40: 6e 5b 69 5d 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  n[i];.}...//////
cf50: 2f 2f 20 44 69 73 61 6d 62 69 67 75 61 74 6f 72  // Disambiguator
cf60: 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 65 6c 65 63  ..function selec
cf70: 74 20 28 64 54 6f 6b 65 6e 50 6f 73 2c 20 6e 50  t (dTokenPos, nP
cf80: 6f 73 2c 20 73 57 6f 72 64 2c 20 73 50 61 74 74  os, sWord, sPatt
cf90: 65 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75  ern, lDefault=nu
cfa0: 6c 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 21 73  ll) {.    if (!s
cfb0: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
cfc0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
cfd0: 20 7d 0a 20 20 20 20 69 66 20 28 64 54 6f 6b 65   }.    if (dToke
cfe0: 6e 50 6f 73 2e 68 61 73 28 6e 50 6f 73 29 29 20  nPos.has(nPos)) 
cff0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d000: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20   true;.    }.   
d010: 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f   let lMorph = _o
d020: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
d030: 4d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20 20  Morph(sWord);.  
d040: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e    if (lMorph.len
d050: 67 74 68 20 3d 3d 3d 20 30 20 20 7c 7c 20 20 6c  gth === 0  ||  l
d060: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d  Morph.length ===
d070: 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65   1) {.        re
d080: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
d090: 0a 20 20 20 20 6c 65 74 20 6c 53 65 6c 65 63 74  .    let lSelect
d0a0: 20 3d 20 6c 4d 6f 72 70 68 2e 66 69 6c 74 65 72   = lMorph.filter
d0b0: 28 20 73 4d 6f 72 70 68 20 3d 3e 20 73 4d 6f 72  ( sMorph => sMor
d0c0: 70 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65  ph.search(sPatte
d0d0: 72 6e 29 20 21 3d 3d 20 2d 31 20 29 3b 0a 20 20  rn) !== -1 );.  
d0e0: 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65    if (lSelect.le
d0f0: 6e 67 74 68 20 3e 20 30 29 20 7b 0a 20 20 20 20  ngth > 0) {.    
d100: 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e      if (lSelect.
d110: 6c 65 6e 67 74 68 20 21 3d 20 6c 4d 6f 72 70 68  length != lMorph
d120: 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20  .length) {.     
d130: 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 50 6f 73         dTokenPos
d140: 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 53 65 6c 65  .set(nPos, lSele
d150: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
d160: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6c 44     } else if (lD
d170: 65 66 61 75 6c 74 29 20 7b 0a 20 20 20 20 20 20  efault) {.      
d180: 20 20 64 54 6f 6b 65 6e 50 6f 73 2e 73 65 74 28    dTokenPos.set(
d190: 6e 50 6f 73 2c 20 6c 44 65 66 61 75 6c 29 3b 0a  nPos, lDefaul);.
d1a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
d1b0: 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69   true;.}..functi
d1c0: 6f 6e 20 65 78 63 6c 75 64 65 20 28 64 54 6f 6b  on exclude (dTok
d1d0: 65 6e 50 6f 73 2c 20 6e 50 6f 73 2c 20 73 57 6f  enPos, nPos, sWo
d1e0: 72 64 2c 20 73 50 61 74 74 65 72 6e 2c 20 6c 44  rd, sPattern, lD
d1f0: 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20 7b 0a 20  efault=null) {. 
d200: 20 20 20 69 66 20 28 21 73 57 6f 72 64 29 20 7b     if (!sWord) {
d210: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d220: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
d230: 69 66 20 28 64 54 6f 6b 65 6e 50 6f 73 2e 68 61  if (dTokenPos.ha
d240: 73 28 6e 50 6f 73 29 29 20 7b 0a 20 20 20 20 20  s(nPos)) {.     
d250: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
d260: 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 4d      }.    let lM
d270: 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68  orph = _oSpellCh
d280: 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73  ecker.getMorph(s
d290: 57 6f 72 64 29 3b 0a 20 20 20 20 69 66 20 28 6c  Word);.    if (l
d2a0: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d  Morph.length ===
d2b0: 20 30 20 20 7c 7c 20 20 6c 4d 6f 72 70 68 2e 6c   0  ||  lMorph.l
d2c0: 65 6e 67 74 68 20 3d 3d 3d 20 31 29 20 7b 0a 20  ength === 1) {. 
d2d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
d2e0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  ue;.    }.    le
d2f0: 74 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d 6f 72  t lSelect = lMor
d300: 70 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f 72 70  ph.filter( sMorp
d310: 68 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65 61 72  h => sMorph.sear
d320: 63 68 28 73 50 61 74 74 65 72 6e 29 20 3d 3d 3d  ch(sPattern) ===
d330: 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 20 28 6c   -1 );.    if (l
d340: 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 3e 20  Select.length > 
d350: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  0) {.        if 
d360: 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20  (lSelect.length 
d370: 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68  != lMorph.length
d380: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d390: 64 54 6f 6b 65 6e 50 6f 73 2e 73 65 74 28 6e 50  dTokenPos.set(nP
d3a0: 6f 73 2c 20 6c 53 65 6c 65 63 74 29 3b 0a 20 20  os, lSelect);.  
d3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
d3c0: 73 65 20 69 66 20 28 6c 44 65 66 61 75 6c 74 29  se if (lDefault)
d3d0: 20 7b 0a 20 20 20 20 20 20 20 20 64 54 6f 6b 65   {.        dToke
d3e0: 6e 50 6f 73 2e 73 65 74 28 6e 50 6f 73 2c 20 6c  nPos.set(nPos, l
d3f0: 44 65 66 61 75 6c 74 29 3b 0a 20 20 20 20 7d 0a  Default);.    }.
d400: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
d410: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 64 65 66  .}..function def
d420: 69 6e 65 20 28 64 54 6f 6b 65 6e 50 6f 73 2c 20  ine (dTokenPos, 
d430: 6e 50 6f 73 2c 20 6c 4d 6f 72 70 68 29 20 7b 0a  nPos, lMorph) {.
d440: 20 20 20 20 64 54 6f 6b 65 6e 50 6f 73 2e 73 65      dTokenPos.se
d450: 74 28 6e 50 6f 73 2c 20 6c 4d 6f 72 70 68 29 3b  t(nPos, lMorph);
d460: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65  .    return true
d470: 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 20 44 69 73 61 6d  ;.}...//// Disam
d480: 62 69 67 75 61 74 69 6f 6e 20 66 6f 72 20 67 72  biguation for gr
d490: 61 70 68 20 72 75 6c 65 73 0a 0a 66 75 6e 63 74  aph rules..funct
d4a0: 69 6f 6e 20 67 5f 73 65 6c 65 63 74 20 28 64 54  ion g_select (dT
d4b0: 6f 6b 65 6e 2c 20 73 50 61 74 74 65 72 6e 2c 20  oken, sPattern, 
d4c0: 6c 44 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20 7b  lDefault=null) {
d4d0: 0a 20 20 20 20 2f 2f 20 73 65 6c 65 63 74 20 6d  .    // select m
d4e0: 6f 72 70 68 6f 6c 6f 67 69 65 73 20 66 6f 72 20  orphologies for 
d4f0: 3c 64 54 6f 6b 65 6e 3e 20 61 63 63 6f 72 64 69  <dToken> accordi
d500: 6e 67 20 74 6f 20 3c 73 50 61 74 74 65 72 6e 3e  ng to <sPattern>
d510: 2c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  , always return 
d520: 74 72 75 65 0a 20 20 20 20 6c 65 74 20 6c 4d 6f  true.    let lMo
d530: 72 70 68 20 3d 20 28 64 54 6f 6b 65 6e 2e 68 61  rph = (dToken.ha
d540: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 6c 4d  sOwnProperty("lM
d550: 6f 72 70 68 22 29 29 20 3f 20 64 54 6f 6b 65 6e  orph")) ? dToken
d560: 5b 22 6c 4d 6f 72 70 68 22 5d 20 3a 20 5f 6f 53  ["lMorph"] : _oS
d570: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d  pellChecker.getM
d580: 6f 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56 61  orph(dToken["sVa
d590: 6c 75 65 22 5d 29 3b 0a 20 20 20 20 69 66 20 28  lue"]);.    if (
d5a0: 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d  lMorph.length ==
d5b0: 3d 20 30 20 20 7c 7c 20 6c 4d 6f 72 70 68 2e 6c  = 0  || lMorph.l
d5c0: 65 6e 67 74 68 20 3d 3d 3d 20 31 29 20 7b 0a 20  ength === 1) {. 
d5d0: 20 20 20 20 20 20 20 69 66 20 28 6c 44 65 66 61         if (lDefa
d5e0: 75 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ult) {.         
d5f0: 20 20 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70     dToken["lMorp
d600: 68 22 5d 20 3d 20 6c 44 65 66 61 75 6c 74 3b 0a  h"] = lDefault;.
d610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d620: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
d630: 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 53 65     }.    let lSe
d640: 6c 65 63 74 20 3d 20 6c 4d 6f 72 70 68 2e 66 69  lect = lMorph.fi
d650: 6c 74 65 72 28 20 73 4d 6f 72 70 68 20 3d 3e 20  lter( sMorph => 
d660: 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50  sMorph.search(sP
d670: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 20 29  attern) !== -1 )
d680: 3b 0a 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63  ;.    if (lSelec
d690: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  t) {.        if 
d6a0: 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20  (lSelect.length 
d6b0: 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68  != lMorph.length
d6c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d6d0: 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d  dToken["lMorph"]
d6e0: 20 3d 20 6c 53 65 6c 65 63 74 3b 0a 20 20 20 20   = lSelect;.    
d6f0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
d700: 20 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b   if (lDefault) {
d710: 0a 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b  .        dToken[
d720: 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66  "lMorph"] = lDef
d730: 61 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ault;.    }.    
d740: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
d750: 66 75 6e 63 74 69 6f 6e 20 67 5f 65 78 63 6c 75  function g_exclu
d760: 64 65 20 28 64 54 6f 6b 65 6e 2c 20 73 50 61 74  de (dToken, sPat
d770: 74 65 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e  tern, lDefault=n
d780: 75 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 73 65  ull) {.    // se
d790: 6c 65 63 74 20 6d 6f 72 70 68 6f 6c 6f 67 69 65  lect morphologie
d7a0: 73 20 66 6f 72 20 3c 64 54 6f 6b 65 6e 3e 20 61  s for <dToken> a
d7b0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 3c 73 50 61  ccording to <sPa
d7c0: 74 74 65 72 6e 3e 2c 20 61 6c 77 61 79 73 20 72  ttern>, always r
d7d0: 65 74 75 72 6e 20 74 72 75 65 0a 20 20 20 20 6c  eturn true.    l
d7e0: 65 74 20 6c 4d 6f 72 70 68 20 3d 20 28 64 54 6f  et lMorph = (dTo
d7f0: 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72  ken.hasOwnProper
d800: 74 79 28 22 6c 4d 6f 72 70 68 22 29 29 20 3f 20  ty("lMorph")) ? 
d810: 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d  dToken["lMorph"]
d820: 20 3a 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65   : _oSpellChecke
d830: 72 2e 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b 65  r.getMorph(dToke
d840: 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20  n["sValue"]);.  
d850: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e    if (lMorph.len
d860: 67 74 68 20 3d 3d 3d 20 30 20 20 7c 7c 20 6c 4d  gth === 0  || lM
d870: 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20  orph.length === 
d880: 31 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  1) {.        if 
d890: 28 6c 44 65 66 61 75 6c 74 29 20 7b 0a 20 20 20  (lDefault) {.   
d8a0: 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b           dToken[
d8b0: 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66  "lMorph"] = lDef
d8c0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ault;.        }.
d8d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
d8e0: 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  rue;.    }.    l
d8f0: 65 74 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d 6f  et lSelect = lMo
d900: 72 70 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f 72  rph.filter( sMor
d910: 70 68 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65 61  ph => sMorph.sea
d920: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 3d 3d  rch(sPattern) ==
d930: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 20 28  = -1 );.    if (
d940: 6c 53 65 6c 65 63 74 29 20 7b 0a 20 20 20 20 20  lSelect) {.     
d950: 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c     if (lSelect.l
d960: 65 6e 67 74 68 20 21 3d 20 6c 4d 6f 72 70 68 2e  ength != lMorph.
d970: 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20  length) {.      
d980: 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c 4d        dToken["lM
d990: 6f 72 70 68 22 5d 20 3d 20 6c 53 65 6c 65 63 74  orph"] = lSelect
d9a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d9b0: 7d 20 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61  } else if (lDefa
d9c0: 75 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64  ult) {.        d
d9d0: 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20  Token["lMorph"] 
d9e0: 3d 20 6c 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  = lDefault;.    
d9f0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  }.    return tru
da00: 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67  e;.}..function g
da10: 5f 64 65 66 69 6e 65 20 28 64 54 6f 6b 65 6e 2c  _define (dToken,
da20: 20 6c 4d 6f 72 70 68 29 20 7b 0a 20 20 20 20 2f   lMorph) {.    /
da30: 2f 20 73 65 74 20 6d 6f 72 70 68 6f 6c 6f 67 69  / set morphologi
da40: 65 73 20 6f 66 20 3c 64 54 6f 6b 65 6e 3e 2c 20  es of <dToken>, 
da50: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 72  always return tr
da60: 75 65 0a 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c  ue.    dToken["l
da70: 4d 6f 72 70 68 22 5d 20 3d 20 6c 4d 6f 72 70 68  Morph"] = lMorph
da80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  ;.    return tru
da90: 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67  e;.}..function g
daa0: 5f 64 65 66 69 6e 65 5f 66 72 6f 6d 20 28 64 54  _define_from (dT
dab0: 6f 6b 65 6e 2c 20 6e 4c 65 66 74 3d 6e 75 6c 6c  oken, nLeft=null
dac0: 2c 20 6e 52 69 67 68 74 3d 6e 75 6c 6c 29 20 7b  , nRight=null) {
dad0: 0a 20 20 20 20 69 66 20 28 6e 4c 65 66 74 20 21  .    if (nLeft !
dae0: 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  == null) {.     
daf0: 20 20 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70     dToken["lMorp
db00: 68 22 5d 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65  h"] = _oSpellChe
db10: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 64 54  cker.getMorph(dT
db20: 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73  oken["sValue"].s
db30: 6c 69 63 65 28 6e 4c 65 66 74 2c 20 6e 52 69 67  lice(nLeft, nRig
db40: 68 74 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ht));.    } else
db50: 20 7b 0a 20 20 20 20 20 20 20 20 64 54 6f 6b 65   {.        dToke
db60: 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 5f 6f  n["lMorph"] = _o
db70: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
db80: 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56  Morph(dToken["sV
db90: 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 7d 0a 20  alue"]);.    }. 
dba0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
dbb0: 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 47 52 41  }...//////// GRA
dbc0: 4d 4d 41 52 20 43 48 45 43 4b 45 52 20 50 4c 55  MMAR CHECKER PLU
dbd0: 47 49 4e 53 0a 0a 24 7b 70 6c 75 67 69 6e 73 4a  GINS..${pluginsJ
dbe0: 53 7d 0a 0a 0a 2f 2f 20 67 65 6e 65 72 61 74 65  S}...// generate
dbf0: 64 20 63 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 65  d code, do not e
dc00: 64 69 74 0a 63 6f 6e 73 74 20 6f 45 76 61 6c 46  dit.const oEvalF
dc10: 75 6e 63 20 3d 20 7b 0a 20 20 20 20 2f 2f 20 63  unc = {.    // c
dc20: 61 6c 6c 61 62 6c 65 73 20 66 6f 72 20 72 65 67  allables for reg
dc30: 65 78 20 72 75 6c 65 73 0a 24 7b 63 61 6c 6c 61  ex rules.${calla
dc40: 62 6c 65 73 4a 53 7d 0a 0a 20 20 20 20 2f 2f 20  blesJS}..    // 
dc50: 63 61 6c 6c 61 62 6c 65 73 20 66 6f 72 20 67 72  callables for gr
dc60: 61 70 68 20 72 75 6c 65 73 0a 24 7b 67 72 61 70  aph rules.${grap
dc70: 68 5f 63 61 6c 6c 61 62 6c 65 73 4a 53 7d 0a 7d  h_callablesJS}.}
dc80: 0a 0a 0a 69 66 20 28 74 79 70 65 6f 66 28 65 78  ...if (typeof(ex
dc90: 70 6f 72 74 73 29 20 21 3d 3d 20 27 75 6e 64 65  ports) !== 'unde
dca0: 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 65 78  fined') {.    ex
dcb0: 70 6f 72 74 73 2e 6c 61 6e 67 20 3d 20 67 63 5f  ports.lang = gc_
dcc0: 65 6e 67 69 6e 65 2e 6c 61 6e 67 3b 0a 20 20 20  engine.lang;.   
dcd0: 20 65 78 70 6f 72 74 73 2e 6c 6f 63 61 6c 65 73   exports.locales
dce0: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 6f 63   = gc_engine.loc
dcf0: 61 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74  ales;.    export
dd00: 73 2e 70 6b 67 20 3d 20 67 63 5f 65 6e 67 69 6e  s.pkg = gc_engin
dd10: 65 2e 70 6b 67 3b 0a 20 20 20 20 65 78 70 6f 72  e.pkg;.    expor
dd20: 74 73 2e 6e 61 6d 65 20 3d 20 67 63 5f 65 6e 67  ts.name = gc_eng
dd30: 69 6e 65 2e 6e 61 6d 65 3b 0a 20 20 20 20 65 78  ine.name;.    ex
dd40: 70 6f 72 74 73 2e 76 65 72 73 69 6f 6e 20 3d 20  ports.version = 
dd50: 67 63 5f 65 6e 67 69 6e 65 2e 76 65 72 73 69 6f  gc_engine.versio
dd60: 6e 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 61  n;.    exports.a
dd70: 75 74 68 6f 72 20 3d 20 67 63 5f 65 6e 67 69 6e  uthor = gc_engin
dd80: 65 2e 61 75 74 68 6f 72 3b 0a 20 20 20 20 2f 2f  e.author;.    //
dd90: 20 69 6e 69 74 0a 20 20 20 20 65 78 70 6f 72 74   init.    export
dda0: 73 2e 6c 6f 61 64 20 3d 20 67 63 5f 65 6e 67 69  s.load = gc_engi
ddb0: 6e 65 2e 6c 6f 61 64 3b 0a 20 20 20 20 65 78 70  ne.load;.    exp
ddc0: 6f 72 74 73 2e 67 65 74 53 70 65 6c 6c 43 68 65  orts.getSpellChe
ddd0: 63 6b 65 72 20 3d 20 67 63 5f 65 6e 67 69 6e 65  cker = gc_engine
dde0: 2e 67 65 74 53 70 65 6c 6c 43 68 65 63 6b 65 72  .getSpellChecker
ddf0: 3b 0a 20 20 20 20 2f 2f 20 73 65 6e 74 65 6e 63  ;.    // sentenc
de00: 65 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 5f 7a  e.    exports._z
de10: 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 20 3d 20  EndOfSentence = 
de20: 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a 45 6e 64 4f  gc_engine._zEndO
de30: 66 53 65 6e 74 65 6e 63 65 3b 0a 20 20 20 20 65  fSentence;.    e
de40: 78 70 6f 72 74 73 2e 5f 7a 42 65 67 69 6e 4f 66  xports._zBeginOf
de50: 50 61 72 61 67 72 61 70 68 20 3d 20 67 63 5f 65  Paragraph = gc_e
de60: 6e 67 69 6e 65 2e 5f 7a 42 65 67 69 6e 4f 66 50  ngine._zBeginOfP
de70: 61 72 61 67 72 61 70 68 3b 0a 20 20 20 20 65 78  aragraph;.    ex
de80: 70 6f 72 74 73 2e 5f 7a 45 6e 64 4f 66 50 61 72  ports._zEndOfPar
de90: 61 67 72 61 70 68 20 3d 20 67 63 5f 65 6e 67 69  agraph = gc_engi
dea0: 6e 65 2e 5f 7a 45 6e 64 4f 66 50 61 72 61 67 72  ne._zEndOfParagr
deb0: 61 70 68 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  aph;.    exports
dec0: 2e 67 65 74 53 65 6e 74 65 6e 63 65 42 6f 75 6e  .getSentenceBoun
ded0: 64 61 72 69 65 73 20 3d 20 67 63 5f 65 6e 67 69  daries = gc_engi
dee0: 6e 65 2e 67 65 74 53 65 6e 74 65 6e 63 65 42 6f  ne.getSentenceBo
def0: 75 6e 64 61 72 69 65 73 3b 0a 20 20 20 20 2f 2f  undaries;.    //
df00: 20 72 75 6c 65 73 0a 20 20 20 20 65 78 70 6f 72   rules.    expor
df10: 74 73 2e 69 67 6e 6f 72 65 52 75 6c 65 20 3d 20  ts.ignoreRule = 
df20: 67 63 5f 65 6e 67 69 6e 65 2e 69 67 6e 6f 72 65  gc_engine.ignore
df30: 52 75 6c 65 3b 0a 20 20 20 20 65 78 70 6f 72 74  Rule;.    export
df40: 73 2e 72 65 73 65 74 49 67 6e 6f 72 65 52 75 6c  s.resetIgnoreRul
df50: 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72  es = gc_engine.r
df60: 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 3b  esetIgnoreRules;
df70: 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 72 65 61  .    exports.rea
df80: 63 74 69 76 61 74 65 52 75 6c 65 20 3d 20 67 63  ctivateRule = gc
df90: 5f 65 6e 67 69 6e 65 2e 72 65 61 63 74 69 76 61  _engine.reactiva
dfa0: 74 65 52 75 6c 65 3b 0a 20 20 20 20 65 78 70 6f  teRule;.    expo
dfb0: 72 74 73 2e 6c 69 73 74 52 75 6c 65 73 20 3d 20  rts.listRules = 
dfc0: 67 63 5f 65 6e 67 69 6e 65 2e 6c 69 73 74 52 75  gc_engine.listRu
dfd0: 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  les;.    exports
dfe0: 2e 67 65 74 52 75 6c 65 73 20 3d 20 67 63 5f 65  .getRules = gc_e
dff0: 6e 67 69 6e 65 2e 67 65 74 52 75 6c 65 73 3b 0a  ngine.getRules;.
e000: 20 20 20 20 2f 2f 20 6f 70 74 69 6f 6e 73 0a 20      // options. 
e010: 20 20 20 65 78 70 6f 72 74 73 2e 73 65 74 4f 70     exports.setOp
e020: 74 69 6f 6e 20 3d 20 67 63 5f 65 6e 67 69 6e 65  tion = gc_engine
e030: 2e 73 65 74 4f 70 74 69 6f 6e 3b 0a 20 20 20 20  .setOption;.    
e040: 65 78 70 6f 72 74 73 2e 73 65 74 4f 70 74 69 6f  exports.setOptio
e050: 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 73  ns = gc_engine.s
e060: 65 74 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65  etOptions;.    e
e070: 78 70 6f 72 74 73 2e 67 65 74 4f 70 74 69 6f 6e  xports.getOption
e080: 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 67 65  s = gc_engine.ge
e090: 74 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65 78  tOptions;.    ex
e0a0: 70 6f 72 74 73 2e 67 65 74 44 65 66 61 75 6c 74  ports.getDefault
e0b0: 4f 70 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67  Options = gc_eng
e0c0: 69 6e 65 2e 67 65 74 44 65 66 61 75 6c 74 4f 70  ine.getDefaultOp
e0d0: 74 69 6f 6e 73 3b 0a 20 20 20 20 65 78 70 6f 72  tions;.    expor
e0e0: 74 73 2e 72 65 73 65 74 4f 70 74 69 6f 6e 73 20  ts.resetOptions 
e0f0: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65 73 65  = gc_engine.rese
e100: 74 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 2f 2f  tOptions;.    //
e110: 20 6f 74 68 65 72 0a 20 20 20 20 65 78 70 6f 72   other.    expor
e120: 74 73 2e 54 65 78 74 50 61 72 73 65 72 20 3d 20  ts.TextParser = 
e130: 54 65 78 74 50 61 72 73 65 72 3b 0a 7d 0a        TextParser;.}.