• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1(function webpackUniversalModuleDefinition(root, factory) {
2	if(typeof exports === 'object' && typeof module === 'object')
3		module.exports = factory(require("katex"));
4	else if(typeof define === 'function' && define.amd)
5		define(["katex"], factory);
6	else {
7		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
8		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
9	}
10})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
11return /******/ (function(modules) { // webpackBootstrap
12/******/ 	// The module cache
13/******/ 	var installedModules = {};
14/******/
15/******/ 	// The require function
16/******/ 	function __webpack_require__(moduleId) {
17/******/
18/******/ 		// Check if module is in cache
19/******/ 		if(installedModules[moduleId]) {
20/******/ 			return installedModules[moduleId].exports;
21/******/ 		}
22/******/ 		// Create a new module (and put it into the cache)
23/******/ 		var module = installedModules[moduleId] = {
24/******/ 			i: moduleId,
25/******/ 			l: false,
26/******/ 			exports: {}
27/******/ 		};
28/******/
29/******/ 		// Execute the module function
30/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31/******/
32/******/ 		// Flag the module as loaded
33/******/ 		module.l = true;
34/******/
35/******/ 		// Return the exports of the module
36/******/ 		return module.exports;
37/******/ 	}
38/******/
39/******/
40/******/ 	// expose the modules object (__webpack_modules__)
41/******/ 	__webpack_require__.m = modules;
42/******/
43/******/ 	// expose the module cache
44/******/ 	__webpack_require__.c = installedModules;
45/******/
46/******/ 	// define getter function for harmony exports
47/******/ 	__webpack_require__.d = function(exports, name, getter) {
48/******/ 		if(!__webpack_require__.o(exports, name)) {
49/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
50/******/ 		}
51/******/ 	};
52/******/
53/******/ 	// define __esModule on exports
54/******/ 	__webpack_require__.r = function(exports) {
55/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
56/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
57/******/ 		}
58/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
59/******/ 	};
60/******/
61/******/ 	// create a fake namespace object
62/******/ 	// mode & 1: value is a module id, require it
63/******/ 	// mode & 2: merge all properties of value into the ns
64/******/ 	// mode & 4: return value when already ns object
65/******/ 	// mode & 8|1: behave like require
66/******/ 	__webpack_require__.t = function(value, mode) {
67/******/ 		if(mode & 1) value = __webpack_require__(value);
68/******/ 		if(mode & 8) return value;
69/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
70/******/ 		var ns = Object.create(null);
71/******/ 		__webpack_require__.r(ns);
72/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
73/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
74/******/ 		return ns;
75/******/ 	};
76/******/
77/******/ 	// getDefaultExport function for compatibility with non-harmony modules
78/******/ 	__webpack_require__.n = function(module) {
79/******/ 		var getter = module && module.__esModule ?
80/******/ 			function getDefault() { return module['default']; } :
81/******/ 			function getModuleExports() { return module; };
82/******/ 		__webpack_require__.d(getter, 'a', getter);
83/******/ 		return getter;
84/******/ 	};
85/******/
86/******/ 	// Object.prototype.hasOwnProperty.call
87/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
88/******/
89/******/ 	// __webpack_public_path__
90/******/ 	__webpack_require__.p = "";
91/******/
92/******/
93/******/ 	// Load entry module and return exports
94/******/ 	return __webpack_require__(__webpack_require__.s = 1);
95/******/ })
96/************************************************************************/
97/******/ ([
98/* 0 */
99/***/ (function(module, exports) {
100
101module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
102
103/***/ }),
104/* 1 */
105/***/ (function(module, __webpack_exports__, __webpack_require__) {
106
107"use strict";
108__webpack_require__.r(__webpack_exports__);
109/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
110/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
111/* eslint-disable */
112
113/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
114
115/* vim: set ts=2 et sw=2 tw=80: */
116
117/*************************************************************
118 *
119 *  KaTeX mhchem.js
120 *
121 *  This file implements a KaTeX version of mhchem version 3.3.0.
122 *  It is adapted from MathJax/extensions/TeX/mhchem.js
123 *  It differs from the MathJax version as follows:
124 *    1. The interface is changed so that it can be called from KaTeX, not MathJax.
125 *    2. \rlap and \llap are replaced with \mathrlap and \mathllap.
126 *    3. Four lines of code are edited in order to use \raisebox instead of \raise.
127 *    4. The reaction arrow code is simplified. All reaction arrows are rendered
128 *       using KaTeX extensible arrows instead of building non-extensible arrows.
129 *    5. \tripledash vertical alignment is slightly adjusted.
130 *
131 *    This code, as other KaTeX code, is released under the MIT license.
132 *
133 * /*************************************************************
134 *
135 *  MathJax/extensions/TeX/mhchem.js
136 *
137 *  Implements the \ce command for handling chemical formulas
138 *  from the mhchem LaTeX package.
139 *
140 *  ---------------------------------------------------------------------
141 *
142 *  Copyright (c) 2011-2015 The MathJax Consortium
143 *  Copyright (c) 2015-2018 Martin Hensel
144 *
145 *  Licensed under the Apache License, Version 2.0 (the "License");
146 *  you may not use this file except in compliance with the License.
147 *  You may obtain a copy of the License at
148 *
149 *      http://www.apache.org/licenses/LICENSE-2.0
150 *
151 *  Unless required by applicable law or agreed to in writing, software
152 *  distributed under the License is distributed on an "AS IS" BASIS,
153 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154 *  See the License for the specific language governing permissions and
155 *  limitations under the License.
156 */
157//
158// Coding Style
159//   - use '' for identifiers that can by minified/uglified
160//   - use "" for strings that need to stay untouched
161// version: "3.3.0" for MathJax and KaTeX
162// Add \ce, \pu, and \tripledash to the KaTeX macros.
163katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\ce", function (context) {
164  return chemParse(context.consumeArgs(1)[0], "ce");
165});
166
167katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\pu", function (context) {
168  return chemParse(context.consumeArgs(1)[0], "pu");
169}); //  Needed for \bond for the ~ forms
170//  Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not
171//  a mathematical minus, U+2212. So we need that extra 0.56.
172
173
174katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" + "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}");
175
176 //
177//  This is the main function for handing the \ce and \pu commands.
178//  It takes the argument to \ce or \pu and returns the corresponding TeX string.
179//
180
181var chemParse = function chemParse(tokens, stateMachine) {
182  // Recreate the argument string from KaTeX's array of tokens.
183  var str = "";
184  var expectedLoc = tokens[tokens.length - 1].loc.start;
185
186  for (var i = tokens.length - 1; i >= 0; i--) {
187    if (tokens[i].loc.start > expectedLoc) {
188      // context.consumeArgs has eaten a space.
189      str += " ";
190      expectedLoc = tokens[i].loc.start;
191    }
192
193    str += tokens[i].text;
194    expectedLoc += tokens[i].text.length;
195  }
196
197  var tex = texify.go(mhchemParser.go(str, stateMachine));
198  return tex;
199}; //
200// Core parser for mhchem syntax  (recursive)
201//
202
203/** @type {MhchemParser} */
204
205
206var mhchemParser = {
207  //
208  // Parses mchem \ce syntax
209  //
210  // Call like
211  //   go("H2O");
212  //
213  go: function go(input, stateMachine) {
214    if (!input) {
215      return [];
216    }
217
218    if (stateMachine === undefined) {
219      stateMachine = 'ce';
220    }
221
222    var state = '0'; //
223    // String buffers for parsing:
224    //
225    // buffer.a == amount
226    // buffer.o == element
227    // buffer.b == left-side superscript
228    // buffer.p == left-side subscript
229    // buffer.q == right-side subscript
230    // buffer.d == right-side superscript
231    //
232    // buffer.r == arrow
233    // buffer.rdt == arrow, script above, type
234    // buffer.rd == arrow, script above, content
235    // buffer.rqt == arrow, script below, type
236    // buffer.rq == arrow, script below, content
237    //
238    // buffer.text_
239    // buffer.rm
240    // etc.
241    //
242    // buffer.parenthesisLevel == int, starting at 0
243    // buffer.sb == bool, space before
244    // buffer.beginsWithBond == bool
245    //
246    // These letters are also used as state names.
247    //
248    // Other states:
249    // 0 == begin of main part (arrow/operator unlikely)
250    // 1 == next entity
251    // 2 == next entity (arrow/operator unlikely)
252    // 3 == next atom
253    // c == macro
254    //
255
256    /** @type {Buffer} */
257
258    var buffer = {};
259    buffer['parenthesisLevel'] = 0;
260    input = input.replace(/\n/g, " ");
261    input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-");
262    input = input.replace(/[\u2026]/g, "..."); //
263    // Looks through mhchemParser.transitions, to execute a matching action
264    // (recursive)
265    //
266
267    var lastInput;
268    var watchdog = 10;
269    /** @type {ParserOutput[]} */
270
271    var output = [];
272
273    while (true) {
274      if (lastInput !== input) {
275        watchdog = 10;
276        lastInput = input;
277      } else {
278        watchdog--;
279      } //
280      // Find actions in transition table
281      //
282
283
284      var machine = mhchemParser.stateMachines[stateMachine];
285      var t = machine.transitions[state] || machine.transitions['*'];
286
287      iterateTransitions: for (var i = 0; i < t.length; i++) {
288        var matches = mhchemParser.patterns.match_(t[i].pattern, input);
289
290        if (matches) {
291          //
292          // Execute actions
293          //
294          var task = t[i].task;
295
296          for (var iA = 0; iA < task.action_.length; iA++) {
297            var o; //
298            // Find and execute action
299            //
300
301            if (machine.actions[task.action_[iA].type_]) {
302              o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);
303            } else if (mhchemParser.actions[task.action_[iA].type_]) {
304              o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);
305            } else {
306              throw ["MhchemBugA", "mhchem bug A. Please report. (" + task.action_[iA].type_ + ")"]; // Trying to use non-existing action
307            } //
308            // Add output
309            //
310
311
312            mhchemParser.concatArray(output, o);
313          } //
314          // Set next state,
315          // Shorten input,
316          // Continue with next character
317          //   (= apply only one transition per position)
318          //
319
320
321          state = task.nextState || state;
322
323          if (input.length > 0) {
324            if (!task.revisit) {
325              input = matches.remainder;
326            }
327
328            if (!task.toContinue) {
329              break iterateTransitions;
330            }
331          } else {
332            return output;
333          }
334        }
335      } //
336      // Prevent infinite loop
337      //
338
339
340      if (watchdog <= 0) {
341        throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character
342      }
343    }
344  },
345  concatArray: function concatArray(a, b) {
346    if (b) {
347      if (Array.isArray(b)) {
348        for (var iB = 0; iB < b.length; iB++) {
349          a.push(b[iB]);
350        }
351      } else {
352        a.push(b);
353      }
354    }
355  },
356  patterns: {
357    //
358    // Matching patterns
359    // either regexps or function that return null or {match_:"a", remainder:"bc"}
360    //
361    patterns: {
362      // property names must not look like integers ("2") for correct property traversal order, later on
363      'empty': /^$/,
364      'else': /^./,
365      'else2': /^./,
366      'space': /^\s/,
367      'space A': /^\s(?=[A-Z\\$])/,
368      'space$': /^\s$/,
369      'a-z': /^[a-z]/,
370      'x': /^x/,
371      'x$': /^x$/,
372      'i$': /^i$/,
373      'letters': /^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/,
374      '\\greek': /^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/,
375      'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,
376      '$one lowercase latin letter$ $': /^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/,
377      'one lowercase greek letter $': /^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/,
378      'digits': /^[0-9]+/,
379      '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/,
380      '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/,
381      '(-)(9.,9)(e)(99)': function e99(input) {
382        var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/);
383
384        if (m && m[0]) {
385          return {
386            match_: m.splice(1),
387            remainder: input.substr(m[0].length)
388          };
389        }
390
391        return null;
392      },
393      '(-)(9)^(-9)': function _(input) {
394        var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/);
395
396        if (m && m[0]) {
397          return {
398            match_: m.splice(1),
399            remainder: input.substr(m[0].length)
400          };
401        }
402
403        return null;
404      },
405      'state of aggregation $': function stateOfAggregation$(input) {
406        // ... or crystal system
407        var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat)
408
409        if (a && a.remainder.match(/^($|[\s,;\)\]\}])/)) {
410          return a;
411        } //  AND end of 'phrase'
412
413
414        var m = input.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/); // OR crystal system ($o$) (\ca$c$)
415
416        if (m) {
417          return {
418            match_: m[0],
419            remainder: input.substr(m[0].length)
420          };
421        }
422
423        return null;
424      },
425      '_{(state of aggregation)}$': /^_\{(\([a-z]{1,3}\))\}/,
426      '{[(': /^(?:\\\{|\[|\()/,
427      ')]}': /^(?:\)|\]|\\\})/,
428      ', ': /^[,;]\s*/,
429      ',': /^[,;]/,
430      '.': /^[.]/,
431      '. ': /^([.\u22C5\u00B7\u2022])\s*/,
432      '...': /^\.\.\.(?=$|[^.])/,
433      '* ': /^([*])\s*/,
434      '^{(...)}': function _(input) {
435        return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}");
436      },
437      '^($...$)': function $$(input) {
438        return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", "");
439      },
440      '^a': /^\^([0-9]+|[^\\_])/,
441      '^\\x{}{}': function x(input) {
442        return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
443      },
444      '^\\x{}': function x(input) {
445        return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "");
446      },
447      '^\\x': /^\^(\\[a-zA-Z]+)\s*/,
448      '^(-1)': /^\^(-?\d+)/,
449      '\'': /^'/,
450      '_{(...)}': function _(input) {
451        return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}");
452      },
453      '_($...$)': function _$$(input) {
454        return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", "");
455      },
456      '_9': /^_([+\-]?[0-9]+|[^\\])/,
457      '_\\x{}{}': function _X(input) {
458        return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
459      },
460      '_\\x{}': function _X(input) {
461        return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "");
462      },
463      '_\\x': /^_(\\[a-zA-Z]+)\s*/,
464      '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/,
465      '{}': /^\{\}/,
466      '{...}': function _(input) {
467        return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", "");
468      },
469      '{(...)}': function _(input) {
470        return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}");
471      },
472      '$...$': function $$(input) {
473        return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
474      },
475      '${(...)}$': function $$(input) {
476        return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$");
477      },
478      '$(...)$': function $$(input) {
479        return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$");
480      },
481      '=<>': /^[=<>]/,
482      '#': /^[#\u2261]/,
483      '+': /^\+/,
484      '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/,
485      // -space -, -; -] -/ -$ -state-of-aggregation
486      '-9': /^-(?=[0-9])/,
487      '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,
488      '-': /^-/,
489      'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,
490      'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,
491      'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,
492      '\\bond{(...)}': function bond(input) {
493        return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}");
494      },
495      '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,
496      'CMT': /^[CMT](?=\[)/,
497      '[(...)]': function _(input) {
498        return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]");
499      },
500      '1st-level escape': /^(&|\\\\|\\hline)\s*/,
501      '\\,': /^(?:\\[,\ ;:])/,
502      // \\x - but output no space before
503      '\\x{}{}': function x(input) {
504        return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
505      },
506      '\\x{}': function x(input) {
507        return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "");
508      },
509      '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/,
510      '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,
511      'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,
512      // only those with numbers in front, because the others will be formatted correctly anyway
513      'others': /^[\/~|]/,
514      '\\frac{(...)}': function frac(input) {
515        return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}");
516      },
517      '\\overset{(...)}': function overset(input) {
518        return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}");
519      },
520      "\\underset{(...)}": function underset(input) {
521        return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}");
522      },
523      "\\underbrace{(...)}": function underbrace(input) {
524        return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}");
525      },
526      '\\color{(...)}0': function color0(input) {
527        return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}");
528      },
529      '\\color{(...)}{(...)}1': function color1(input) {
530        return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}");
531      },
532      '\\color(...){(...)}2': function color2(input) {
533        return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}");
534      },
535      '\\ce{(...)}': function ce(input) {
536        return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}");
537      },
538      'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
539      'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
540      // 0 could be oxidation or charge
541      'roman numeral': /^[IVX]+/,
542      '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,
543      'amount': function amount(input) {
544        var match; // e.g. 2, 0.5, 1/2, -2, n/2, +;  $a$ could be added later in parsing
545
546        match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/);
547
548        if (match) {
549          return {
550            match_: match[0],
551            remainder: input.substr(match[0].length)
552          };
553        }
554
555        var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
556
557        if (a) {
558          // e.g. $2n-1$, $-$
559          match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/);
560
561          if (match) {
562            return {
563              match_: match[0],
564              remainder: input.substr(match[0].length)
565            };
566          }
567        }
568
569        return null;
570      },
571      'amount2': function amount2(input) {
572        return this['amount'](input);
573      },
574      '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,
575      'formula$': function formula$(input) {
576        if (input.match(/^\([a-z]+\)$/)) {
577          return null;
578        } // state of aggregation = no formula
579
580
581        var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);
582
583        if (match) {
584          return {
585            match_: match[0],
586            remainder: input.substr(match[0].length)
587          };
588        }
589
590        return null;
591      },
592      'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,
593      '/': /^\s*(\/)\s*/,
594      '//': /^\s*(\/\/)\s*/,
595      '*': /^\s*[*.]\s*/
596    },
597    findObserveGroups: function findObserveGroups(input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {
598      /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */
599      var _match = function _match(input, pattern) {
600        if (typeof pattern === "string") {
601          if (input.indexOf(pattern) !== 0) {
602            return null;
603          }
604
605          return pattern;
606        } else {
607          var match = input.match(pattern);
608
609          if (!match) {
610            return null;
611          }
612
613          return match[0];
614        }
615      };
616      /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */
617
618
619      var _findObserveGroups = function _findObserveGroups(input, i, endChars) {
620        var braces = 0;
621
622        while (i < input.length) {
623          var a = input.charAt(i);
624
625          var match = _match(input.substr(i), endChars);
626
627          if (match !== null && braces === 0) {
628            return {
629              endMatchBegin: i,
630              endMatchEnd: i + match.length
631            };
632          } else if (a === "{") {
633            braces++;
634          } else if (a === "}") {
635            if (braces === 0) {
636              throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"];
637            } else {
638              braces--;
639            }
640          }
641
642          i++;
643        }
644
645        if (braces > 0) {
646          return null;
647        }
648
649        return null;
650      };
651
652      var match = _match(input, begExcl);
653
654      if (match === null) {
655        return null;
656      }
657
658      input = input.substr(match.length);
659      match = _match(input, begIncl);
660
661      if (match === null) {
662        return null;
663      }
664
665      var e = _findObserveGroups(input, match.length, endIncl || endExcl);
666
667      if (e === null) {
668        return null;
669      }
670
671      var match1 = input.substring(0, endIncl ? e.endMatchEnd : e.endMatchBegin);
672
673      if (!(beg2Excl || beg2Incl)) {
674        return {
675          match_: match1,
676          remainder: input.substr(e.endMatchEnd)
677        };
678      } else {
679        var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);
680
681        if (group2 === null) {
682          return null;
683        }
684        /** @type {string[]} */
685
686
687        var matchRet = [match1, group2.match_];
688        return {
689          match_: combine ? matchRet.join("") : matchRet,
690          remainder: group2.remainder
691        };
692      }
693    },
694    //
695    // Matching function
696    // e.g. match("a", input) will look for the regexp called "a" and see if it matches
697    // returns null or {match_:"a", remainder:"bc"}
698    //
699    match_: function match_(m, input) {
700      var pattern = mhchemParser.patterns.patterns[m];
701
702      if (pattern === undefined) {
703        throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern
704      } else if (typeof pattern === "function") {
705        return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser
706      } else {
707        // RegExp
708        var match = input.match(pattern);
709
710        if (match) {
711          var mm;
712
713          if (match[2]) {
714            mm = [match[1], match[2]];
715          } else if (match[1]) {
716            mm = match[1];
717          } else {
718            mm = match[0];
719          }
720
721          return {
722            match_: mm,
723            remainder: input.substr(match[0].length)
724          };
725        }
726
727        return null;
728      }
729    }
730  },
731  //
732  // Generic state machine actions
733  //
734  actions: {
735    'a=': function a(buffer, m) {
736      buffer.a = (buffer.a || "") + m;
737    },
738    'b=': function b(buffer, m) {
739      buffer.b = (buffer.b || "") + m;
740    },
741    'p=': function p(buffer, m) {
742      buffer.p = (buffer.p || "") + m;
743    },
744    'o=': function o(buffer, m) {
745      buffer.o = (buffer.o || "") + m;
746    },
747    'q=': function q(buffer, m) {
748      buffer.q = (buffer.q || "") + m;
749    },
750    'd=': function d(buffer, m) {
751      buffer.d = (buffer.d || "") + m;
752    },
753    'rm=': function rm(buffer, m) {
754      buffer.rm = (buffer.rm || "") + m;
755    },
756    'text=': function text(buffer, m) {
757      buffer.text_ = (buffer.text_ || "") + m;
758    },
759    'insert': function insert(buffer, m, a) {
760      return {
761        type_: a
762      };
763    },
764    'insert+p1': function insertP1(buffer, m, a) {
765      return {
766        type_: a,
767        p1: m
768      };
769    },
770    'insert+p1+p2': function insertP1P2(buffer, m, a) {
771      return {
772        type_: a,
773        p1: m[0],
774        p2: m[1]
775      };
776    },
777    'copy': function copy(buffer, m) {
778      return m;
779    },
780    'rm': function rm(buffer, m) {
781      return {
782        type_: 'rm',
783        p1: m || ""
784      };
785    },
786    'text': function text(buffer, m) {
787      return mhchemParser.go(m, 'text');
788    },
789    '{text}': function text(buffer, m) {
790      var ret = ["{"];
791      mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));
792      ret.push("}");
793      return ret;
794    },
795    'tex-math': function texMath(buffer, m) {
796      return mhchemParser.go(m, 'tex-math');
797    },
798    'tex-math tight': function texMathTight(buffer, m) {
799      return mhchemParser.go(m, 'tex-math tight');
800    },
801    'bond': function bond(buffer, m, k) {
802      return {
803        type_: 'bond',
804        kind_: k || m
805      };
806    },
807    'color0-output': function color0Output(buffer, m) {
808      return {
809        type_: 'color0',
810        color: m[0]
811      };
812    },
813    'ce': function ce(buffer, m) {
814      return mhchemParser.go(m);
815    },
816    '1/2': function _(buffer, m) {
817      /** @type {ParserOutput[]} */
818      var ret = [];
819
820      if (m.match(/^[+\-]/)) {
821        ret.push(m.substr(0, 1));
822        m = m.substr(1);
823      }
824
825      var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);
826      n[1] = n[1].replace(/\$/g, "");
827      ret.push({
828        type_: 'frac',
829        p1: n[1],
830        p2: n[2]
831      });
832
833      if (n[3]) {
834        n[3] = n[3].replace(/\$/g, "");
835        ret.push({
836          type_: 'tex-math',
837          p1: n[3]
838        });
839      }
840
841      return ret;
842    },
843    '9,9': function _(buffer, m) {
844      return mhchemParser.go(m, '9,9');
845    }
846  },
847  //
848  // createTransitions
849  // convert  { 'letter': { 'state': { action_: 'output' } } }  to  { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }
850  // with expansion of 'a|b' to 'a' and 'b' (at 2 places)
851  //
852  createTransitions: function createTransitions(o) {
853    var pattern, state;
854    /** @type {string[]} */
855
856    var stateArray;
857    var i; //
858    // 1. Collect all states
859    //
860
861    /** @type {Transitions} */
862
863    var transitions = {};
864
865    for (pattern in o) {
866      for (state in o[pattern]) {
867        stateArray = state.split("|");
868        o[pattern][state].stateArray = stateArray;
869
870        for (i = 0; i < stateArray.length; i++) {
871          transitions[stateArray[i]] = [];
872        }
873      }
874    } //
875    // 2. Fill states
876    //
877
878
879    for (pattern in o) {
880      for (state in o[pattern]) {
881        stateArray = o[pattern][state].stateArray || [];
882
883        for (i = 0; i < stateArray.length; i++) {
884          //
885          // 2a. Normalize actions into array:  'text=' ==> [{type_:'text='}]
886          // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)
887          //
888
889          /** @type {any} */
890          var p = o[pattern][state];
891
892          if (p.action_) {
893            p.action_ = [].concat(p.action_);
894
895            for (var k = 0; k < p.action_.length; k++) {
896              if (typeof p.action_[k] === "string") {
897                p.action_[k] = {
898                  type_: p.action_[k]
899                };
900              }
901            }
902          } else {
903            p.action_ = [];
904          } //
905          // 2.b Multi-insert
906          //
907
908
909          var patternArray = pattern.split("|");
910
911          for (var j = 0; j < patternArray.length; j++) {
912            if (stateArray[i] === '*') {
913              // insert into all
914              for (var t in transitions) {
915                transitions[t].push({
916                  pattern: patternArray[j],
917                  task: p
918                });
919              }
920            } else {
921              transitions[stateArray[i]].push({
922                pattern: patternArray[j],
923                task: p
924              });
925            }
926          }
927        }
928      }
929    }
930
931    return transitions;
932  },
933  stateMachines: {}
934}; //
935// Definition of state machines
936//
937
938mhchemParser.stateMachines = {
939  //
940  // \ce state machines
941  //
942  //#region ce
943  'ce': {
944    // main parser
945    transitions: mhchemParser.createTransitions({
946      'empty': {
947        '*': {
948          action_: 'output'
949        }
950      },
951      'else': {
952        '0|1|2': {
953          action_: 'beginsWithBond=false',
954          revisit: true,
955          toContinue: true
956        }
957      },
958      'oxidation$': {
959        '0': {
960          action_: 'oxidation-output'
961        }
962      },
963      'CMT': {
964        'r': {
965          action_: 'rdt=',
966          nextState: 'rt'
967        },
968        'rd': {
969          action_: 'rqt=',
970          nextState: 'rdt'
971        }
972      },
973      'arrowUpDown': {
974        '0|1|2|as': {
975          action_: ['sb=false', 'output', 'operator'],
976          nextState: '1'
977        }
978      },
979      'uprightEntities': {
980        '0|1|2': {
981          action_: ['o=', 'output'],
982          nextState: '1'
983        }
984      },
985      'orbital': {
986        '0|1|2|3': {
987          action_: 'o=',
988          nextState: 'o'
989        }
990      },
991      '->': {
992        '0|1|2|3': {
993          action_: 'r=',
994          nextState: 'r'
995        },
996        'a|as': {
997          action_: ['output', 'r='],
998          nextState: 'r'
999        },
1000        '*': {
1001          action_: ['output', 'r='],
1002          nextState: 'r'
1003        }
1004      },
1005      '+': {
1006        'o': {
1007          action_: 'd= kv',
1008          nextState: 'd'
1009        },
1010        'd|D': {
1011          action_: 'd=',
1012          nextState: 'd'
1013        },
1014        'q': {
1015          action_: 'd=',
1016          nextState: 'qd'
1017        },
1018        'qd|qD': {
1019          action_: 'd=',
1020          nextState: 'qd'
1021        },
1022        'dq': {
1023          action_: ['output', 'd='],
1024          nextState: 'd'
1025        },
1026        '3': {
1027          action_: ['sb=false', 'output', 'operator'],
1028          nextState: '0'
1029        }
1030      },
1031      'amount': {
1032        '0|2': {
1033          action_: 'a=',
1034          nextState: 'a'
1035        }
1036      },
1037      'pm-operator': {
1038        '0|1|2|a|as': {
1039          action_: ['sb=false', 'output', {
1040            type_: 'operator',
1041            option: '\\pm'
1042          }],
1043          nextState: '0'
1044        }
1045      },
1046      'operator': {
1047        '0|1|2|a|as': {
1048          action_: ['sb=false', 'output', 'operator'],
1049          nextState: '0'
1050        }
1051      },
1052      '-$': {
1053        'o|q': {
1054          action_: ['charge or bond', 'output'],
1055          nextState: 'qd'
1056        },
1057        'd': {
1058          action_: 'd=',
1059          nextState: 'd'
1060        },
1061        'D': {
1062          action_: ['output', {
1063            type_: 'bond',
1064            option: "-"
1065          }],
1066          nextState: '3'
1067        },
1068        'q': {
1069          action_: 'd=',
1070          nextState: 'qd'
1071        },
1072        'qd': {
1073          action_: 'd=',
1074          nextState: 'qd'
1075        },
1076        'qD|dq': {
1077          action_: ['output', {
1078            type_: 'bond',
1079            option: "-"
1080          }],
1081          nextState: '3'
1082        }
1083      },
1084      '-9': {
1085        '3|o': {
1086          action_: ['output', {
1087            type_: 'insert',
1088            option: 'hyphen'
1089          }],
1090          nextState: '3'
1091        }
1092      },
1093      '- orbital overlap': {
1094        'o': {
1095          action_: ['output', {
1096            type_: 'insert',
1097            option: 'hyphen'
1098          }],
1099          nextState: '2'
1100        },
1101        'd': {
1102          action_: ['output', {
1103            type_: 'insert',
1104            option: 'hyphen'
1105          }],
1106          nextState: '2'
1107        }
1108      },
1109      '-': {
1110        '0|1|2': {
1111          action_: [{
1112            type_: 'output',
1113            option: 1
1114          }, 'beginsWithBond=true', {
1115            type_: 'bond',
1116            option: "-"
1117          }],
1118          nextState: '3'
1119        },
1120        '3': {
1121          action_: {
1122            type_: 'bond',
1123            option: "-"
1124          }
1125        },
1126        'a': {
1127          action_: ['output', {
1128            type_: 'insert',
1129            option: 'hyphen'
1130          }],
1131          nextState: '2'
1132        },
1133        'as': {
1134          action_: [{
1135            type_: 'output',
1136            option: 2
1137          }, {
1138            type_: 'bond',
1139            option: "-"
1140          }],
1141          nextState: '3'
1142        },
1143        'b': {
1144          action_: 'b='
1145        },
1146        'o': {
1147          action_: {
1148            type_: '- after o/d',
1149            option: false
1150          },
1151          nextState: '2'
1152        },
1153        'q': {
1154          action_: {
1155            type_: '- after o/d',
1156            option: false
1157          },
1158          nextState: '2'
1159        },
1160        'd|qd|dq': {
1161          action_: {
1162            type_: '- after o/d',
1163            option: true
1164          },
1165          nextState: '2'
1166        },
1167        'D|qD|p': {
1168          action_: ['output', {
1169            type_: 'bond',
1170            option: "-"
1171          }],
1172          nextState: '3'
1173        }
1174      },
1175      'amount2': {
1176        '1|3': {
1177          action_: 'a=',
1178          nextState: 'a'
1179        }
1180      },
1181      'letters': {
1182        '0|1|2|3|a|as|b|p|bp|o': {
1183          action_: 'o=',
1184          nextState: 'o'
1185        },
1186        'q|dq': {
1187          action_: ['output', 'o='],
1188          nextState: 'o'
1189        },
1190        'd|D|qd|qD': {
1191          action_: 'o after d',
1192          nextState: 'o'
1193        }
1194      },
1195      'digits': {
1196        'o': {
1197          action_: 'q=',
1198          nextState: 'q'
1199        },
1200        'd|D': {
1201          action_: 'q=',
1202          nextState: 'dq'
1203        },
1204        'q': {
1205          action_: ['output', 'o='],
1206          nextState: 'o'
1207        },
1208        'a': {
1209          action_: 'o=',
1210          nextState: 'o'
1211        }
1212      },
1213      'space A': {
1214        'b|p|bp': {}
1215      },
1216      'space': {
1217        'a': {
1218          nextState: 'as'
1219        },
1220        '0': {
1221          action_: 'sb=false'
1222        },
1223        '1|2': {
1224          action_: 'sb=true'
1225        },
1226        'r|rt|rd|rdt|rdq': {
1227          action_: 'output',
1228          nextState: '0'
1229        },
1230        '*': {
1231          action_: ['output', 'sb=true'],
1232          nextState: '1'
1233        }
1234      },
1235      '1st-level escape': {
1236        '1|2': {
1237          action_: ['output', {
1238            type_: 'insert+p1',
1239            option: '1st-level escape'
1240          }]
1241        },
1242        '*': {
1243          action_: ['output', {
1244            type_: 'insert+p1',
1245            option: '1st-level escape'
1246          }],
1247          nextState: '0'
1248        }
1249      },
1250      '[(...)]': {
1251        'r|rt': {
1252          action_: 'rd=',
1253          nextState: 'rd'
1254        },
1255        'rd|rdt': {
1256          action_: 'rq=',
1257          nextState: 'rdq'
1258        }
1259      },
1260      '...': {
1261        'o|d|D|dq|qd|qD': {
1262          action_: ['output', {
1263            type_: 'bond',
1264            option: "..."
1265          }],
1266          nextState: '3'
1267        },
1268        '*': {
1269          action_: [{
1270            type_: 'output',
1271            option: 1
1272          }, {
1273            type_: 'insert',
1274            option: 'ellipsis'
1275          }],
1276          nextState: '1'
1277        }
1278      },
1279      '. |* ': {
1280        '*': {
1281          action_: ['output', {
1282            type_: 'insert',
1283            option: 'addition compound'
1284          }],
1285          nextState: '1'
1286        }
1287      },
1288      'state of aggregation $': {
1289        '*': {
1290          action_: ['output', 'state of aggregation'],
1291          nextState: '1'
1292        }
1293      },
1294      '{[(': {
1295        'a|as|o': {
1296          action_: ['o=', 'output', 'parenthesisLevel++'],
1297          nextState: '2'
1298        },
1299        '0|1|2|3': {
1300          action_: ['o=', 'output', 'parenthesisLevel++'],
1301          nextState: '2'
1302        },
1303        '*': {
1304          action_: ['output', 'o=', 'output', 'parenthesisLevel++'],
1305          nextState: '2'
1306        }
1307      },
1308      ')]}': {
1309        '0|1|2|3|b|p|bp|o': {
1310          action_: ['o=', 'parenthesisLevel--'],
1311          nextState: 'o'
1312        },
1313        'a|as|d|D|q|qd|qD|dq': {
1314          action_: ['output', 'o=', 'parenthesisLevel--'],
1315          nextState: 'o'
1316        }
1317      },
1318      ', ': {
1319        '*': {
1320          action_: ['output', 'comma'],
1321          nextState: '0'
1322        }
1323      },
1324      '^_': {
1325        // ^ and _ without a sensible argument
1326        '*': {}
1327      },
1328      '^{(...)}|^($...$)': {
1329        '0|1|2|as': {
1330          action_: 'b=',
1331          nextState: 'b'
1332        },
1333        'p': {
1334          action_: 'b=',
1335          nextState: 'bp'
1336        },
1337        '3|o': {
1338          action_: 'd= kv',
1339          nextState: 'D'
1340        },
1341        'q': {
1342          action_: 'd=',
1343          nextState: 'qD'
1344        },
1345        'd|D|qd|qD|dq': {
1346          action_: ['output', 'd='],
1347          nextState: 'D'
1348        }
1349      },
1350      '^a|^\\x{}{}|^\\x{}|^\\x|\'': {
1351        '0|1|2|as': {
1352          action_: 'b=',
1353          nextState: 'b'
1354        },
1355        'p': {
1356          action_: 'b=',
1357          nextState: 'bp'
1358        },
1359        '3|o': {
1360          action_: 'd= kv',
1361          nextState: 'd'
1362        },
1363        'q': {
1364          action_: 'd=',
1365          nextState: 'qd'
1366        },
1367        'd|qd|D|qD': {
1368          action_: 'd='
1369        },
1370        'dq': {
1371          action_: ['output', 'd='],
1372          nextState: 'd'
1373        }
1374      },
1375      '_{(state of aggregation)}$': {
1376        'd|D|q|qd|qD|dq': {
1377          action_: ['output', 'q='],
1378          nextState: 'q'
1379        }
1380      },
1381      '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': {
1382        '0|1|2|as': {
1383          action_: 'p=',
1384          nextState: 'p'
1385        },
1386        'b': {
1387          action_: 'p=',
1388          nextState: 'bp'
1389        },
1390        '3|o': {
1391          action_: 'q=',
1392          nextState: 'q'
1393        },
1394        'd|D': {
1395          action_: 'q=',
1396          nextState: 'dq'
1397        },
1398        'q|qd|qD|dq': {
1399          action_: ['output', 'q='],
1400          nextState: 'q'
1401        }
1402      },
1403      '=<>': {
1404        '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': {
1405          action_: [{
1406            type_: 'output',
1407            option: 2
1408          }, 'bond'],
1409          nextState: '3'
1410        }
1411      },
1412      '#': {
1413        '0|1|2|3|a|as|o': {
1414          action_: [{
1415            type_: 'output',
1416            option: 2
1417          }, {
1418            type_: 'bond',
1419            option: "#"
1420          }],
1421          nextState: '3'
1422        }
1423      },
1424      '{}': {
1425        '*': {
1426          action_: {
1427            type_: 'output',
1428            option: 1
1429          },
1430          nextState: '1'
1431        }
1432      },
1433      '{...}': {
1434        '0|1|2|3|a|as|b|p|bp': {
1435          action_: 'o=',
1436          nextState: 'o'
1437        },
1438        'o|d|D|q|qd|qD|dq': {
1439          action_: ['output', 'o='],
1440          nextState: 'o'
1441        }
1442      },
1443      '$...$': {
1444        'a': {
1445          action_: 'a='
1446        },
1447        // 2$n$
1448        '0|1|2|3|as|b|p|bp|o': {
1449          action_: 'o=',
1450          nextState: 'o'
1451        },
1452        // not 'amount'
1453        'as|o': {
1454          action_: 'o='
1455        },
1456        'q|d|D|qd|qD|dq': {
1457          action_: ['output', 'o='],
1458          nextState: 'o'
1459        }
1460      },
1461      '\\bond{(...)}': {
1462        '*': {
1463          action_: [{
1464            type_: 'output',
1465            option: 2
1466          }, 'bond'],
1467          nextState: "3"
1468        }
1469      },
1470      '\\frac{(...)}': {
1471        '*': {
1472          action_: [{
1473            type_: 'output',
1474            option: 1
1475          }, 'frac-output'],
1476          nextState: '3'
1477        }
1478      },
1479      '\\overset{(...)}': {
1480        '*': {
1481          action_: [{
1482            type_: 'output',
1483            option: 2
1484          }, 'overset-output'],
1485          nextState: '3'
1486        }
1487      },
1488      "\\underset{(...)}": {
1489        '*': {
1490          action_: [{
1491            type_: 'output',
1492            option: 2
1493          }, 'underset-output'],
1494          nextState: '3'
1495        }
1496      },
1497      "\\underbrace{(...)}": {
1498        '*': {
1499          action_: [{
1500            type_: 'output',
1501            option: 2
1502          }, 'underbrace-output'],
1503          nextState: '3'
1504        }
1505      },
1506      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
1507        '*': {
1508          action_: [{
1509            type_: 'output',
1510            option: 2
1511          }, 'color-output'],
1512          nextState: '3'
1513        }
1514      },
1515      '\\color{(...)}0': {
1516        '*': {
1517          action_: [{
1518            type_: 'output',
1519            option: 2
1520          }, 'color0-output']
1521        }
1522      },
1523      '\\ce{(...)}': {
1524        '*': {
1525          action_: [{
1526            type_: 'output',
1527            option: 2
1528          }, 'ce'],
1529          nextState: '3'
1530        }
1531      },
1532      '\\,': {
1533        '*': {
1534          action_: [{
1535            type_: 'output',
1536            option: 1
1537          }, 'copy'],
1538          nextState: '1'
1539        }
1540      },
1541      '\\x{}{}|\\x{}|\\x': {
1542        '0|1|2|3|a|as|b|p|bp|o|c0': {
1543          action_: ['o=', 'output'],
1544          nextState: '3'
1545        },
1546        '*': {
1547          action_: ['output', 'o=', 'output'],
1548          nextState: '3'
1549        }
1550      },
1551      'others': {
1552        '*': {
1553          action_: [{
1554            type_: 'output',
1555            option: 1
1556          }, 'copy'],
1557          nextState: '3'
1558        }
1559      },
1560      'else2': {
1561        'a': {
1562          action_: 'a to o',
1563          nextState: 'o',
1564          revisit: true
1565        },
1566        'as': {
1567          action_: ['output', 'sb=true'],
1568          nextState: '1',
1569          revisit: true
1570        },
1571        'r|rt|rd|rdt|rdq': {
1572          action_: ['output'],
1573          nextState: '0',
1574          revisit: true
1575        },
1576        '*': {
1577          action_: ['output', 'copy'],
1578          nextState: '3'
1579        }
1580      }
1581    }),
1582    actions: {
1583      'o after d': function oAfterD(buffer, m) {
1584        var ret;
1585
1586        if ((buffer.d || "").match(/^[0-9]+$/)) {
1587          var tmp = buffer.d;
1588          buffer.d = undefined;
1589          ret = this['output'](buffer);
1590          buffer.b = tmp;
1591        } else {
1592          ret = this['output'](buffer);
1593        }
1594
1595        mhchemParser.actions['o='](buffer, m);
1596        return ret;
1597      },
1598      'd= kv': function dKv(buffer, m) {
1599        buffer.d = m;
1600        buffer.dType = 'kv';
1601      },
1602      'charge or bond': function chargeOrBond(buffer, m) {
1603        if (buffer['beginsWithBond']) {
1604          /** @type {ParserOutput[]} */
1605          var ret = [];
1606          mhchemParser.concatArray(ret, this['output'](buffer));
1607          mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-"));
1608          return ret;
1609        } else {
1610          buffer.d = m;
1611        }
1612      },
1613      '- after o/d': function afterOD(buffer, m, isAfterD) {
1614        var c1 = mhchemParser.patterns.match_('orbital', buffer.o || "");
1615        var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || "");
1616        var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || "");
1617        var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || "");
1618        var hyphenFollows = m === "-" && (c1 && c1.remainder === "" || c2 || c3 || c4);
1619
1620        if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {
1621          buffer.o = '$' + buffer.o + '$';
1622        }
1623        /** @type {ParserOutput[]} */
1624
1625
1626        var ret = [];
1627
1628        if (hyphenFollows) {
1629          mhchemParser.concatArray(ret, this['output'](buffer));
1630          ret.push({
1631            type_: 'hyphen'
1632          });
1633        } else {
1634          c1 = mhchemParser.patterns.match_('digits', buffer.d || "");
1635
1636          if (isAfterD && c1 && c1.remainder === '') {
1637            mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));
1638            mhchemParser.concatArray(ret, this['output'](buffer));
1639          } else {
1640            mhchemParser.concatArray(ret, this['output'](buffer));
1641            mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-"));
1642          }
1643        }
1644
1645        return ret;
1646      },
1647      'a to o': function aToO(buffer) {
1648        buffer.o = buffer.a;
1649        buffer.a = undefined;
1650      },
1651      'sb=true': function sbTrue(buffer) {
1652        buffer.sb = true;
1653      },
1654      'sb=false': function sbFalse(buffer) {
1655        buffer.sb = false;
1656      },
1657      'beginsWithBond=true': function beginsWithBondTrue(buffer) {
1658        buffer['beginsWithBond'] = true;
1659      },
1660      'beginsWithBond=false': function beginsWithBondFalse(buffer) {
1661        buffer['beginsWithBond'] = false;
1662      },
1663      'parenthesisLevel++': function parenthesisLevel(buffer) {
1664        buffer['parenthesisLevel']++;
1665      },
1666      'parenthesisLevel--': function parenthesisLevel(buffer) {
1667        buffer['parenthesisLevel']--;
1668      },
1669      'state of aggregation': function stateOfAggregation(buffer, m) {
1670        return {
1671          type_: 'state of aggregation',
1672          p1: mhchemParser.go(m, 'o')
1673        };
1674      },
1675      'comma': function comma(buffer, m) {
1676        var a = m.replace(/\s*$/, '');
1677        var withSpace = a !== m;
1678
1679        if (withSpace && buffer['parenthesisLevel'] === 0) {
1680          return {
1681            type_: 'comma enumeration L',
1682            p1: a
1683          };
1684        } else {
1685          return {
1686            type_: 'comma enumeration M',
1687            p1: a
1688          };
1689        }
1690      },
1691      'output': function output(buffer, m, entityFollows) {
1692        // entityFollows:
1693        //   undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)
1694        //   1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)
1695        //   2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as)
1696
1697        /** @type {ParserOutput | ParserOutput[]} */
1698        var ret;
1699
1700        if (!buffer.r) {
1701          ret = [];
1702
1703          if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {//ret = [];
1704          } else {
1705            if (buffer.sb) {
1706              ret.push({
1707                type_: 'entitySkip'
1708              });
1709            }
1710
1711            if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows !== 2) {
1712              buffer.o = buffer.a;
1713              buffer.a = undefined;
1714            } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {
1715              buffer.o = buffer.a;
1716              buffer.d = buffer.b;
1717              buffer.q = buffer.p;
1718              buffer.a = buffer.b = buffer.p = undefined;
1719            } else {
1720              if (buffer.o && buffer.dType === 'kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) {
1721                buffer.dType = 'oxidation';
1722              } else if (buffer.o && buffer.dType === 'kv' && !buffer.q) {
1723                buffer.dType = undefined;
1724              }
1725            }
1726
1727            ret.push({
1728              type_: 'chemfive',
1729              a: mhchemParser.go(buffer.a, 'a'),
1730              b: mhchemParser.go(buffer.b, 'bd'),
1731              p: mhchemParser.go(buffer.p, 'pq'),
1732              o: mhchemParser.go(buffer.o, 'o'),
1733              q: mhchemParser.go(buffer.q, 'pq'),
1734              d: mhchemParser.go(buffer.d, buffer.dType === 'oxidation' ? 'oxidation' : 'bd'),
1735              dType: buffer.dType
1736            });
1737          }
1738        } else {
1739          // r
1740
1741          /** @type {ParserOutput[]} */
1742          var rd;
1743
1744          if (buffer.rdt === 'M') {
1745            rd = mhchemParser.go(buffer.rd, 'tex-math');
1746          } else if (buffer.rdt === 'T') {
1747            rd = [{
1748              type_: 'text',
1749              p1: buffer.rd || ""
1750            }];
1751          } else {
1752            rd = mhchemParser.go(buffer.rd);
1753          }
1754          /** @type {ParserOutput[]} */
1755
1756
1757          var rq;
1758
1759          if (buffer.rqt === 'M') {
1760            rq = mhchemParser.go(buffer.rq, 'tex-math');
1761          } else if (buffer.rqt === 'T') {
1762            rq = [{
1763              type_: 'text',
1764              p1: buffer.rq || ""
1765            }];
1766          } else {
1767            rq = mhchemParser.go(buffer.rq);
1768          }
1769
1770          ret = {
1771            type_: 'arrow',
1772            r: buffer.r,
1773            rd: rd,
1774            rq: rq
1775          };
1776        }
1777
1778        for (var p in buffer) {
1779          if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') {
1780            delete buffer[p];
1781          }
1782        }
1783
1784        return ret;
1785      },
1786      'oxidation-output': function oxidationOutput(buffer, m) {
1787        var ret = ["{"];
1788        mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));
1789        ret.push("}");
1790        return ret;
1791      },
1792      'frac-output': function fracOutput(buffer, m) {
1793        return {
1794          type_: 'frac-ce',
1795          p1: mhchemParser.go(m[0]),
1796          p2: mhchemParser.go(m[1])
1797        };
1798      },
1799      'overset-output': function oversetOutput(buffer, m) {
1800        return {
1801          type_: 'overset',
1802          p1: mhchemParser.go(m[0]),
1803          p2: mhchemParser.go(m[1])
1804        };
1805      },
1806      'underset-output': function undersetOutput(buffer, m) {
1807        return {
1808          type_: 'underset',
1809          p1: mhchemParser.go(m[0]),
1810          p2: mhchemParser.go(m[1])
1811        };
1812      },
1813      'underbrace-output': function underbraceOutput(buffer, m) {
1814        return {
1815          type_: 'underbrace',
1816          p1: mhchemParser.go(m[0]),
1817          p2: mhchemParser.go(m[1])
1818        };
1819      },
1820      'color-output': function colorOutput(buffer, m) {
1821        return {
1822          type_: 'color',
1823          color1: m[0],
1824          color2: mhchemParser.go(m[1])
1825        };
1826      },
1827      'r=': function r(buffer, m) {
1828        buffer.r = m;
1829      },
1830      'rdt=': function rdt(buffer, m) {
1831        buffer.rdt = m;
1832      },
1833      'rd=': function rd(buffer, m) {
1834        buffer.rd = m;
1835      },
1836      'rqt=': function rqt(buffer, m) {
1837        buffer.rqt = m;
1838      },
1839      'rq=': function rq(buffer, m) {
1840        buffer.rq = m;
1841      },
1842      'operator': function operator(buffer, m, p1) {
1843        return {
1844          type_: 'operator',
1845          kind_: p1 || m
1846        };
1847      }
1848    }
1849  },
1850  'a': {
1851    transitions: mhchemParser.createTransitions({
1852      'empty': {
1853        '*': {}
1854      },
1855      '1/2$': {
1856        '0': {
1857          action_: '1/2'
1858        }
1859      },
1860      'else': {
1861        '0': {
1862          nextState: '1',
1863          revisit: true
1864        }
1865      },
1866      '$(...)$': {
1867        '*': {
1868          action_: 'tex-math tight',
1869          nextState: '1'
1870        }
1871      },
1872      ',': {
1873        '*': {
1874          action_: {
1875            type_: 'insert',
1876            option: 'commaDecimal'
1877          }
1878        }
1879      },
1880      'else2': {
1881        '*': {
1882          action_: 'copy'
1883        }
1884      }
1885    }),
1886    actions: {}
1887  },
1888  'o': {
1889    transitions: mhchemParser.createTransitions({
1890      'empty': {
1891        '*': {}
1892      },
1893      '1/2$': {
1894        '0': {
1895          action_: '1/2'
1896        }
1897      },
1898      'else': {
1899        '0': {
1900          nextState: '1',
1901          revisit: true
1902        }
1903      },
1904      'letters': {
1905        '*': {
1906          action_: 'rm'
1907        }
1908      },
1909      '\\ca': {
1910        '*': {
1911          action_: {
1912            type_: 'insert',
1913            option: 'circa'
1914          }
1915        }
1916      },
1917      '\\x{}{}|\\x{}|\\x': {
1918        '*': {
1919          action_: 'copy'
1920        }
1921      },
1922      '${(...)}$|$(...)$': {
1923        '*': {
1924          action_: 'tex-math'
1925        }
1926      },
1927      '{(...)}': {
1928        '*': {
1929          action_: '{text}'
1930        }
1931      },
1932      'else2': {
1933        '*': {
1934          action_: 'copy'
1935        }
1936      }
1937    }),
1938    actions: {}
1939  },
1940  'text': {
1941    transitions: mhchemParser.createTransitions({
1942      'empty': {
1943        '*': {
1944          action_: 'output'
1945        }
1946      },
1947      '{...}': {
1948        '*': {
1949          action_: 'text='
1950        }
1951      },
1952      '${(...)}$|$(...)$': {
1953        '*': {
1954          action_: 'tex-math'
1955        }
1956      },
1957      '\\greek': {
1958        '*': {
1959          action_: ['output', 'rm']
1960        }
1961      },
1962      '\\,|\\x{}{}|\\x{}|\\x': {
1963        '*': {
1964          action_: ['output', 'copy']
1965        }
1966      },
1967      'else': {
1968        '*': {
1969          action_: 'text='
1970        }
1971      }
1972    }),
1973    actions: {
1974      'output': function output(buffer) {
1975        if (buffer.text_) {
1976          /** @type {ParserOutput} */
1977          var ret = {
1978            type_: 'text',
1979            p1: buffer.text_
1980          };
1981
1982          for (var p in buffer) {
1983            delete buffer[p];
1984          }
1985
1986          return ret;
1987        }
1988      }
1989    }
1990  },
1991  'pq': {
1992    transitions: mhchemParser.createTransitions({
1993      'empty': {
1994        '*': {}
1995      },
1996      'state of aggregation $': {
1997        '*': {
1998          action_: 'state of aggregation'
1999        }
2000      },
2001      'i$': {
2002        '0': {
2003          nextState: '!f',
2004          revisit: true
2005        }
2006      },
2007      '(KV letters),': {
2008        '0': {
2009          action_: 'rm',
2010          nextState: '0'
2011        }
2012      },
2013      'formula$': {
2014        '0': {
2015          nextState: 'f',
2016          revisit: true
2017        }
2018      },
2019      '1/2$': {
2020        '0': {
2021          action_: '1/2'
2022        }
2023      },
2024      'else': {
2025        '0': {
2026          nextState: '!f',
2027          revisit: true
2028        }
2029      },
2030      '${(...)}$|$(...)$': {
2031        '*': {
2032          action_: 'tex-math'
2033        }
2034      },
2035      '{(...)}': {
2036        '*': {
2037          action_: 'text'
2038        }
2039      },
2040      'a-z': {
2041        'f': {
2042          action_: 'tex-math'
2043        }
2044      },
2045      'letters': {
2046        '*': {
2047          action_: 'rm'
2048        }
2049      },
2050      '-9.,9': {
2051        '*': {
2052          action_: '9,9'
2053        }
2054      },
2055      ',': {
2056        '*': {
2057          action_: {
2058            type_: 'insert+p1',
2059            option: 'comma enumeration S'
2060          }
2061        }
2062      },
2063      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
2064        '*': {
2065          action_: 'color-output'
2066        }
2067      },
2068      '\\color{(...)}0': {
2069        '*': {
2070          action_: 'color0-output'
2071        }
2072      },
2073      '\\ce{(...)}': {
2074        '*': {
2075          action_: 'ce'
2076        }
2077      },
2078      '\\,|\\x{}{}|\\x{}|\\x': {
2079        '*': {
2080          action_: 'copy'
2081        }
2082      },
2083      'else2': {
2084        '*': {
2085          action_: 'copy'
2086        }
2087      }
2088    }),
2089    actions: {
2090      'state of aggregation': function stateOfAggregation(buffer, m) {
2091        return {
2092          type_: 'state of aggregation subscript',
2093          p1: mhchemParser.go(m, 'o')
2094        };
2095      },
2096      'color-output': function colorOutput(buffer, m) {
2097        return {
2098          type_: 'color',
2099          color1: m[0],
2100          color2: mhchemParser.go(m[1], 'pq')
2101        };
2102      }
2103    }
2104  },
2105  'bd': {
2106    transitions: mhchemParser.createTransitions({
2107      'empty': {
2108        '*': {}
2109      },
2110      'x$': {
2111        '0': {
2112          nextState: '!f',
2113          revisit: true
2114        }
2115      },
2116      'formula$': {
2117        '0': {
2118          nextState: 'f',
2119          revisit: true
2120        }
2121      },
2122      'else': {
2123        '0': {
2124          nextState: '!f',
2125          revisit: true
2126        }
2127      },
2128      '-9.,9 no missing 0': {
2129        '*': {
2130          action_: '9,9'
2131        }
2132      },
2133      '.': {
2134        '*': {
2135          action_: {
2136            type_: 'insert',
2137            option: 'electron dot'
2138          }
2139        }
2140      },
2141      'a-z': {
2142        'f': {
2143          action_: 'tex-math'
2144        }
2145      },
2146      'x': {
2147        '*': {
2148          action_: {
2149            type_: 'insert',
2150            option: 'KV x'
2151          }
2152        }
2153      },
2154      'letters': {
2155        '*': {
2156          action_: 'rm'
2157        }
2158      },
2159      '\'': {
2160        '*': {
2161          action_: {
2162            type_: 'insert',
2163            option: 'prime'
2164          }
2165        }
2166      },
2167      '${(...)}$|$(...)$': {
2168        '*': {
2169          action_: 'tex-math'
2170        }
2171      },
2172      '{(...)}': {
2173        '*': {
2174          action_: 'text'
2175        }
2176      },
2177      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
2178        '*': {
2179          action_: 'color-output'
2180        }
2181      },
2182      '\\color{(...)}0': {
2183        '*': {
2184          action_: 'color0-output'
2185        }
2186      },
2187      '\\ce{(...)}': {
2188        '*': {
2189          action_: 'ce'
2190        }
2191      },
2192      '\\,|\\x{}{}|\\x{}|\\x': {
2193        '*': {
2194          action_: 'copy'
2195        }
2196      },
2197      'else2': {
2198        '*': {
2199          action_: 'copy'
2200        }
2201      }
2202    }),
2203    actions: {
2204      'color-output': function colorOutput(buffer, m) {
2205        return {
2206          type_: 'color',
2207          color1: m[0],
2208          color2: mhchemParser.go(m[1], 'bd')
2209        };
2210      }
2211    }
2212  },
2213  'oxidation': {
2214    transitions: mhchemParser.createTransitions({
2215      'empty': {
2216        '*': {}
2217      },
2218      'roman numeral': {
2219        '*': {
2220          action_: 'roman-numeral'
2221        }
2222      },
2223      '${(...)}$|$(...)$': {
2224        '*': {
2225          action_: 'tex-math'
2226        }
2227      },
2228      'else': {
2229        '*': {
2230          action_: 'copy'
2231        }
2232      }
2233    }),
2234    actions: {
2235      'roman-numeral': function romanNumeral(buffer, m) {
2236        return {
2237          type_: 'roman numeral',
2238          p1: m || ""
2239        };
2240      }
2241    }
2242  },
2243  'tex-math': {
2244    transitions: mhchemParser.createTransitions({
2245      'empty': {
2246        '*': {
2247          action_: 'output'
2248        }
2249      },
2250      '\\ce{(...)}': {
2251        '*': {
2252          action_: ['output', 'ce']
2253        }
2254      },
2255      '{...}|\\,|\\x{}{}|\\x{}|\\x': {
2256        '*': {
2257          action_: 'o='
2258        }
2259      },
2260      'else': {
2261        '*': {
2262          action_: 'o='
2263        }
2264      }
2265    }),
2266    actions: {
2267      'output': function output(buffer) {
2268        if (buffer.o) {
2269          /** @type {ParserOutput} */
2270          var ret = {
2271            type_: 'tex-math',
2272            p1: buffer.o
2273          };
2274
2275          for (var p in buffer) {
2276            delete buffer[p];
2277          }
2278
2279          return ret;
2280        }
2281      }
2282    }
2283  },
2284  'tex-math tight': {
2285    transitions: mhchemParser.createTransitions({
2286      'empty': {
2287        '*': {
2288          action_: 'output'
2289        }
2290      },
2291      '\\ce{(...)}': {
2292        '*': {
2293          action_: ['output', 'ce']
2294        }
2295      },
2296      '{...}|\\,|\\x{}{}|\\x{}|\\x': {
2297        '*': {
2298          action_: 'o='
2299        }
2300      },
2301      '-|+': {
2302        '*': {
2303          action_: 'tight operator'
2304        }
2305      },
2306      'else': {
2307        '*': {
2308          action_: 'o='
2309        }
2310      }
2311    }),
2312    actions: {
2313      'tight operator': function tightOperator(buffer, m) {
2314        buffer.o = (buffer.o || "") + "{" + m + "}";
2315      },
2316      'output': function output(buffer) {
2317        if (buffer.o) {
2318          /** @type {ParserOutput} */
2319          var ret = {
2320            type_: 'tex-math',
2321            p1: buffer.o
2322          };
2323
2324          for (var p in buffer) {
2325            delete buffer[p];
2326          }
2327
2328          return ret;
2329        }
2330      }
2331    }
2332  },
2333  '9,9': {
2334    transitions: mhchemParser.createTransitions({
2335      'empty': {
2336        '*': {}
2337      },
2338      ',': {
2339        '*': {
2340          action_: 'comma'
2341        }
2342      },
2343      'else': {
2344        '*': {
2345          action_: 'copy'
2346        }
2347      }
2348    }),
2349    actions: {
2350      'comma': function comma() {
2351        return {
2352          type_: 'commaDecimal'
2353        };
2354      }
2355    }
2356  },
2357  //#endregion
2358  //
2359  // \pu state machines
2360  //
2361  //#region pu
2362  'pu': {
2363    transitions: mhchemParser.createTransitions({
2364      'empty': {
2365        '*': {
2366          action_: 'output'
2367        }
2368      },
2369      'space$': {
2370        '*': {
2371          action_: ['output', 'space']
2372        }
2373      },
2374      '{[(|)]}': {
2375        '0|a': {
2376          action_: 'copy'
2377        }
2378      },
2379      '(-)(9)^(-9)': {
2380        '0': {
2381          action_: 'number^',
2382          nextState: 'a'
2383        }
2384      },
2385      '(-)(9.,9)(e)(99)': {
2386        '0': {
2387          action_: 'enumber',
2388          nextState: 'a'
2389        }
2390      },
2391      'space': {
2392        '0|a': {}
2393      },
2394      'pm-operator': {
2395        '0|a': {
2396          action_: {
2397            type_: 'operator',
2398            option: '\\pm'
2399          },
2400          nextState: '0'
2401        }
2402      },
2403      'operator': {
2404        '0|a': {
2405          action_: 'copy',
2406          nextState: '0'
2407        }
2408      },
2409      '//': {
2410        'd': {
2411          action_: 'o=',
2412          nextState: '/'
2413        }
2414      },
2415      '/': {
2416        'd': {
2417          action_: 'o=',
2418          nextState: '/'
2419        }
2420      },
2421      '{...}|else': {
2422        '0|d': {
2423          action_: 'd=',
2424          nextState: 'd'
2425        },
2426        'a': {
2427          action_: ['space', 'd='],
2428          nextState: 'd'
2429        },
2430        '/|q': {
2431          action_: 'q=',
2432          nextState: 'q'
2433        }
2434      }
2435    }),
2436    actions: {
2437      'enumber': function enumber(buffer, m) {
2438        /** @type {ParserOutput[]} */
2439        var ret = [];
2440
2441        if (m[0] === "+-" || m[0] === "+/-") {
2442          ret.push("\\pm ");
2443        } else if (m[0]) {
2444          ret.push(m[0]);
2445        }
2446
2447        if (m[1]) {
2448          mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));
2449
2450          if (m[2]) {
2451            if (m[2].match(/[,.]/)) {
2452              mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));
2453            } else {
2454              ret.push(m[2]);
2455            }
2456          }
2457
2458          m[3] = m[4] || m[3];
2459
2460          if (m[3]) {
2461            m[3] = m[3].trim();
2462
2463            if (m[3] === "e" || m[3].substr(0, 1) === "*") {
2464              ret.push({
2465                type_: 'cdot'
2466              });
2467            } else {
2468              ret.push({
2469                type_: 'times'
2470              });
2471            }
2472          }
2473        }
2474
2475        if (m[3]) {
2476          ret.push("10^{" + m[5] + "}");
2477        }
2478
2479        return ret;
2480      },
2481      'number^': function number(buffer, m) {
2482        /** @type {ParserOutput[]} */
2483        var ret = [];
2484
2485        if (m[0] === "+-" || m[0] === "+/-") {
2486          ret.push("\\pm ");
2487        } else if (m[0]) {
2488          ret.push(m[0]);
2489        }
2490
2491        mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));
2492        ret.push("^{" + m[2] + "}");
2493        return ret;
2494      },
2495      'operator': function operator(buffer, m, p1) {
2496        return {
2497          type_: 'operator',
2498          kind_: p1 || m
2499        };
2500      },
2501      'space': function space() {
2502        return {
2503          type_: 'pu-space-1'
2504        };
2505      },
2506      'output': function output(buffer) {
2507        /** @type {ParserOutput | ParserOutput[]} */
2508        var ret;
2509        var md = mhchemParser.patterns.match_('{(...)}', buffer.d || "");
2510
2511        if (md && md.remainder === '') {
2512          buffer.d = md.match_;
2513        }
2514
2515        var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || "");
2516
2517        if (mq && mq.remainder === '') {
2518          buffer.q = mq.match_;
2519        }
2520
2521        if (buffer.d) {
2522          buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C");
2523          buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F");
2524        }
2525
2526        if (buffer.q) {
2527          // fraction
2528          buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C");
2529          buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F");
2530          var b5 = {
2531            d: mhchemParser.go(buffer.d, 'pu'),
2532            q: mhchemParser.go(buffer.q, 'pu')
2533          };
2534
2535          if (buffer.o === '//') {
2536            ret = {
2537              type_: 'pu-frac',
2538              p1: b5.d,
2539              p2: b5.q
2540            };
2541          } else {
2542            ret = b5.d;
2543
2544            if (b5.d.length > 1 || b5.q.length > 1) {
2545              ret.push({
2546                type_: ' / '
2547              });
2548            } else {
2549              ret.push({
2550                type_: '/'
2551              });
2552            }
2553
2554            mhchemParser.concatArray(ret, b5.q);
2555          }
2556        } else {
2557          // no fraction
2558          ret = mhchemParser.go(buffer.d, 'pu-2');
2559        }
2560
2561        for (var p in buffer) {
2562          delete buffer[p];
2563        }
2564
2565        return ret;
2566      }
2567    }
2568  },
2569  'pu-2': {
2570    transitions: mhchemParser.createTransitions({
2571      'empty': {
2572        '*': {
2573          action_: 'output'
2574        }
2575      },
2576      '*': {
2577        '*': {
2578          action_: ['output', 'cdot'],
2579          nextState: '0'
2580        }
2581      },
2582      '\\x': {
2583        '*': {
2584          action_: 'rm='
2585        }
2586      },
2587      'space': {
2588        '*': {
2589          action_: ['output', 'space'],
2590          nextState: '0'
2591        }
2592      },
2593      '^{(...)}|^(-1)': {
2594        '1': {
2595          action_: '^(-1)'
2596        }
2597      },
2598      '-9.,9': {
2599        '0': {
2600          action_: 'rm=',
2601          nextState: '0'
2602        },
2603        '1': {
2604          action_: '^(-1)',
2605          nextState: '0'
2606        }
2607      },
2608      '{...}|else': {
2609        '*': {
2610          action_: 'rm=',
2611          nextState: '1'
2612        }
2613      }
2614    }),
2615    actions: {
2616      'cdot': function cdot() {
2617        return {
2618          type_: 'tight cdot'
2619        };
2620      },
2621      '^(-1)': function _(buffer, m) {
2622        buffer.rm += "^{" + m + "}";
2623      },
2624      'space': function space() {
2625        return {
2626          type_: 'pu-space-2'
2627        };
2628      },
2629      'output': function output(buffer) {
2630        /** @type {ParserOutput | ParserOutput[]} */
2631        var ret = [];
2632
2633        if (buffer.rm) {
2634          var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || "");
2635
2636          if (mrm && mrm.remainder === '') {
2637            ret = mhchemParser.go(mrm.match_, 'pu');
2638          } else {
2639            ret = {
2640              type_: 'rm',
2641              p1: buffer.rm
2642            };
2643          }
2644        }
2645
2646        for (var p in buffer) {
2647          delete buffer[p];
2648        }
2649
2650        return ret;
2651      }
2652    }
2653  },
2654  'pu-9,9': {
2655    transitions: mhchemParser.createTransitions({
2656      'empty': {
2657        '0': {
2658          action_: 'output-0'
2659        },
2660        'o': {
2661          action_: 'output-o'
2662        }
2663      },
2664      ',': {
2665        '0': {
2666          action_: ['output-0', 'comma'],
2667          nextState: 'o'
2668        }
2669      },
2670      '.': {
2671        '0': {
2672          action_: ['output-0', 'copy'],
2673          nextState: 'o'
2674        }
2675      },
2676      'else': {
2677        '*': {
2678          action_: 'text='
2679        }
2680      }
2681    }),
2682    actions: {
2683      'comma': function comma() {
2684        return {
2685          type_: 'commaDecimal'
2686        };
2687      },
2688      'output-0': function output0(buffer) {
2689        /** @type {ParserOutput[]} */
2690        var ret = [];
2691        buffer.text_ = buffer.text_ || "";
2692
2693        if (buffer.text_.length > 4) {
2694          var a = buffer.text_.length % 3;
2695
2696          if (a === 0) {
2697            a = 3;
2698          }
2699
2700          for (var i = buffer.text_.length - 3; i > 0; i -= 3) {
2701            ret.push(buffer.text_.substr(i, 3));
2702            ret.push({
2703              type_: '1000 separator'
2704            });
2705          }
2706
2707          ret.push(buffer.text_.substr(0, a));
2708          ret.reverse();
2709        } else {
2710          ret.push(buffer.text_);
2711        }
2712
2713        for (var p in buffer) {
2714          delete buffer[p];
2715        }
2716
2717        return ret;
2718      },
2719      'output-o': function outputO(buffer) {
2720        /** @type {ParserOutput[]} */
2721        var ret = [];
2722        buffer.text_ = buffer.text_ || "";
2723
2724        if (buffer.text_.length > 4) {
2725          var a = buffer.text_.length - 3;
2726
2727          for (var i = 0; i < a; i += 3) {
2728            ret.push(buffer.text_.substr(i, 3));
2729            ret.push({
2730              type_: '1000 separator'
2731            });
2732          }
2733
2734          ret.push(buffer.text_.substr(i));
2735        } else {
2736          ret.push(buffer.text_);
2737        }
2738
2739        for (var p in buffer) {
2740          delete buffer[p];
2741        }
2742
2743        return ret;
2744      }
2745    } //#endregion
2746
2747  }
2748}; //
2749// texify: Take MhchemParser output and convert it to TeX
2750//
2751
2752/** @type {Texify} */
2753
2754var texify = {
2755  go: function go(input, isInner) {
2756    // (recursive, max 4 levels)
2757    if (!input) {
2758      return "";
2759    }
2760
2761    var res = "";
2762    var cee = false;
2763
2764    for (var i = 0; i < input.length; i++) {
2765      var inputi = input[i];
2766
2767      if (typeof inputi === "string") {
2768        res += inputi;
2769      } else {
2770        res += texify._go2(inputi);
2771
2772        if (inputi.type_ === '1st-level escape') {
2773          cee = true;
2774        }
2775      }
2776    }
2777
2778    if (!isInner && !cee && res) {
2779      res = "{" + res + "}";
2780    }
2781
2782    return res;
2783  },
2784  _goInner: function _goInner(input) {
2785    if (!input) {
2786      return input;
2787    }
2788
2789    return texify.go(input, true);
2790  },
2791  _go2: function _go2(buf) {
2792    /** @type {undefined | string} */
2793    var res;
2794
2795    switch (buf.type_) {
2796      case 'chemfive':
2797        res = "";
2798        var b5 = {
2799          a: texify._goInner(buf.a),
2800          b: texify._goInner(buf.b),
2801          p: texify._goInner(buf.p),
2802          o: texify._goInner(buf.o),
2803          q: texify._goInner(buf.q),
2804          d: texify._goInner(buf.d)
2805        }; //
2806        // a
2807        //
2808
2809        if (b5.a) {
2810          if (b5.a.match(/^[+\-]/)) {
2811            b5.a = "{" + b5.a + "}";
2812          }
2813
2814          res += b5.a + "\\,";
2815        } //
2816        // b and p
2817        //
2818
2819
2820        if (b5.b || b5.p) {
2821          res += "{\\vphantom{X}}";
2822          res += "^{\\hphantom{" + (b5.b || "") + "}}_{\\hphantom{" + (b5.p || "") + "}}";
2823          res += "{\\vphantom{X}}";
2824          res += "^{\\smash[t]{\\vphantom{2}}\\mathllap{" + (b5.b || "") + "}}";
2825          res += "_{\\vphantom{2}\\mathllap{\\smash[t]{" + (b5.p || "") + "}}}";
2826        } //
2827        // o
2828        //
2829
2830
2831        if (b5.o) {
2832          if (b5.o.match(/^[+\-]/)) {
2833            b5.o = "{" + b5.o + "}";
2834          }
2835
2836          res += b5.o;
2837        } //
2838        // q and d
2839        //
2840
2841
2842        if (buf.dType === 'kv') {
2843          if (b5.d || b5.q) {
2844            res += "{\\vphantom{X}}";
2845          }
2846
2847          if (b5.d) {
2848            res += "^{" + b5.d + "}";
2849          }
2850
2851          if (b5.q) {
2852            res += "_{\\smash[t]{" + b5.q + "}}";
2853          }
2854        } else if (buf.dType === 'oxidation') {
2855          if (b5.d) {
2856            res += "{\\vphantom{X}}";
2857            res += "^{" + b5.d + "}";
2858          }
2859
2860          if (b5.q) {
2861            res += "{\\vphantom{X}}";
2862            res += "_{\\smash[t]{" + b5.q + "}}";
2863          }
2864        } else {
2865          if (b5.q) {
2866            res += "{\\vphantom{X}}";
2867            res += "_{\\smash[t]{" + b5.q + "}}";
2868          }
2869
2870          if (b5.d) {
2871            res += "{\\vphantom{X}}";
2872            res += "^{" + b5.d + "}";
2873          }
2874        }
2875
2876        break;
2877
2878      case 'rm':
2879        res = "\\mathrm{" + buf.p1 + "}";
2880        break;
2881
2882      case 'text':
2883        if (buf.p1.match(/[\^_]/)) {
2884          buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}");
2885          res = "\\mathrm{" + buf.p1 + "}";
2886        } else {
2887          res = "\\text{" + buf.p1 + "}";
2888        }
2889
2890        break;
2891
2892      case 'roman numeral':
2893        res = "\\mathrm{" + buf.p1 + "}";
2894        break;
2895
2896      case 'state of aggregation':
2897        res = "\\mskip2mu " + texify._goInner(buf.p1);
2898        break;
2899
2900      case 'state of aggregation subscript':
2901        res = "\\mskip1mu " + texify._goInner(buf.p1);
2902        break;
2903
2904      case 'bond':
2905        res = texify._getBond(buf.kind_);
2906
2907        if (!res) {
2908          throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"];
2909        }
2910
2911        break;
2912
2913      case 'frac':
2914        var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}";
2915        res = "\\mathchoice{\\textstyle" + c + "}{" + c + "}{" + c + "}{" + c + "}";
2916        break;
2917
2918      case 'pu-frac':
2919        var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
2920        res = "\\mathchoice{\\textstyle" + d + "}{" + d + "}{" + d + "}{" + d + "}";
2921        break;
2922
2923      case 'tex-math':
2924        res = buf.p1 + " ";
2925        break;
2926
2927      case 'frac-ce':
2928        res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
2929        break;
2930
2931      case 'overset':
2932        res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
2933        break;
2934
2935      case 'underset':
2936        res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
2937        break;
2938
2939      case 'underbrace':
2940        res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}";
2941        break;
2942
2943      case 'color':
2944        res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}";
2945        break;
2946
2947      case 'color0':
2948        res = "\\color{" + buf.color + "}";
2949        break;
2950
2951      case 'arrow':
2952        var b6 = {
2953          rd: texify._goInner(buf.rd),
2954          rq: texify._goInner(buf.rq)
2955        };
2956
2957        var arrow = "\\x" + texify._getArrow(buf.r);
2958
2959        if (b6.rq) {
2960          arrow += "[{" + b6.rq + "}]";
2961        }
2962
2963        if (b6.rd) {
2964          arrow += "{" + b6.rd + "}";
2965        } else {
2966          arrow += "{}";
2967        }
2968
2969        res = arrow;
2970        break;
2971
2972      case 'operator':
2973        res = texify._getOperator(buf.kind_);
2974        break;
2975
2976      case '1st-level escape':
2977        res = buf.p1 + " "; // &, \\\\, \\hlin
2978
2979        break;
2980
2981      case 'space':
2982        res = " ";
2983        break;
2984
2985      case 'entitySkip':
2986        res = "~";
2987        break;
2988
2989      case 'pu-space-1':
2990        res = "~";
2991        break;
2992
2993      case 'pu-space-2':
2994        res = "\\mkern3mu ";
2995        break;
2996
2997      case '1000 separator':
2998        res = "\\mkern2mu ";
2999        break;
3000
3001      case 'commaDecimal':
3002        res = "{,}";
3003        break;
3004
3005      case 'comma enumeration L':
3006        res = "{" + buf.p1 + "}\\mkern6mu ";
3007        break;
3008
3009      case 'comma enumeration M':
3010        res = "{" + buf.p1 + "}\\mkern3mu ";
3011        break;
3012
3013      case 'comma enumeration S':
3014        res = "{" + buf.p1 + "}\\mkern1mu ";
3015        break;
3016
3017      case 'hyphen':
3018        res = "\\text{-}";
3019        break;
3020
3021      case 'addition compound':
3022        res = "\\,{\\cdot}\\,";
3023        break;
3024
3025      case 'electron dot':
3026        res = "\\mkern1mu \\bullet\\mkern1mu ";
3027        break;
3028
3029      case 'KV x':
3030        res = "{\\times}";
3031        break;
3032
3033      case 'prime':
3034        res = "\\prime ";
3035        break;
3036
3037      case 'cdot':
3038        res = "\\cdot ";
3039        break;
3040
3041      case 'tight cdot':
3042        res = "\\mkern1mu{\\cdot}\\mkern1mu ";
3043        break;
3044
3045      case 'times':
3046        res = "\\times ";
3047        break;
3048
3049      case 'circa':
3050        res = "{\\sim}";
3051        break;
3052
3053      case '^':
3054        res = "uparrow";
3055        break;
3056
3057      case 'v':
3058        res = "downarrow";
3059        break;
3060
3061      case 'ellipsis':
3062        res = "\\ldots ";
3063        break;
3064
3065      case '/':
3066        res = "/";
3067        break;
3068
3069      case ' / ':
3070        res = "\\,/\\,";
3071        break;
3072
3073      default:
3074        assertNever(buf);
3075        throw ["MhchemBugT", "mhchem bug T. Please report."];
3076      // Missing texify rule or unknown MhchemParser output
3077    }
3078
3079    assertString(res);
3080    return res;
3081  },
3082  _getArrow: function _getArrow(a) {
3083    switch (a) {
3084      case "->":
3085        return "rightarrow";
3086
3087      case "\u2192":
3088        return "rightarrow";
3089
3090      case "\u27F6":
3091        return "rightarrow";
3092
3093      case "<-":
3094        return "leftarrow";
3095
3096      case "<->":
3097        return "leftrightarrow";
3098
3099      case "<-->":
3100        return "rightleftarrows";
3101
3102      case "<=>":
3103        return "rightleftharpoons";
3104
3105      case "\u21CC":
3106        return "rightleftharpoons";
3107
3108      case "<=>>":
3109        return "rightequilibrium";
3110
3111      case "<<=>":
3112        return "leftequilibrium";
3113
3114      default:
3115        assertNever(a);
3116        throw ["MhchemBugT", "mhchem bug T. Please report."];
3117    }
3118  },
3119  _getBond: function _getBond(a) {
3120    switch (a) {
3121      case "-":
3122        return "{-}";
3123
3124      case "1":
3125        return "{-}";
3126
3127      case "=":
3128        return "{=}";
3129
3130      case "2":
3131        return "{=}";
3132
3133      case "#":
3134        return "{\\equiv}";
3135
3136      case "3":
3137        return "{\\equiv}";
3138
3139      case "~":
3140        return "{\\tripledash}";
3141
3142      case "~-":
3143        return "{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";
3144
3145      case "~=":
3146        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";
3147
3148      case "~--":
3149        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";
3150
3151      case "-~-":
3152        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";
3153
3154      case "...":
3155        return "{{\\cdot}{\\cdot}{\\cdot}}";
3156
3157      case "....":
3158        return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";
3159
3160      case "->":
3161        return "{\\rightarrow}";
3162
3163      case "<-":
3164        return "{\\leftarrow}";
3165
3166      case "<":
3167        return "{<}";
3168
3169      case ">":
3170        return "{>}";
3171
3172      default:
3173        assertNever(a);
3174        throw ["MhchemBugT", "mhchem bug T. Please report."];
3175    }
3176  },
3177  _getOperator: function _getOperator(a) {
3178    switch (a) {
3179      case "+":
3180        return " {}+{} ";
3181
3182      case "-":
3183        return " {}-{} ";
3184
3185      case "=":
3186        return " {}={} ";
3187
3188      case "<":
3189        return " {}<{} ";
3190
3191      case ">":
3192        return " {}>{} ";
3193
3194      case "<<":
3195        return " {}\\ll{} ";
3196
3197      case ">>":
3198        return " {}\\gg{} ";
3199
3200      case "\\pm":
3201        return " {}\\pm{} ";
3202
3203      case "\\approx":
3204        return " {}\\approx{} ";
3205
3206      case "$\\approx$":
3207        return " {}\\approx{} ";
3208
3209      case "v":
3210        return " \\downarrow{} ";
3211
3212      case "(v)":
3213        return " \\downarrow{} ";
3214
3215      case "^":
3216        return " \\uparrow{} ";
3217
3218      case "(^)":
3219        return " \\uparrow{} ";
3220
3221      default:
3222        assertNever(a);
3223        throw ["MhchemBugT", "mhchem bug T. Please report."];
3224    }
3225  }
3226}; //
3227// Helpers for code anaylsis
3228// Will show type error at calling position
3229//
3230
3231/** @param {number} a */
3232
3233function assertNever(a) {}
3234/** @param {string} a */
3235
3236
3237function assertString(a) {}
3238
3239/***/ })
3240/******/ ])["default"];
3241});